63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
export function setup(helper) {
|
|
if (!helper.markdownIt) {
|
|
return;
|
|
}
|
|
|
|
helper.allowList(["div.hledger-dashboard"]);
|
|
|
|
helper.registerOptions((opts, siteSettings) => {
|
|
opts.features.hledger = siteSettings.hledger_enabled;
|
|
});
|
|
|
|
helper.registerPlugin((md) => {
|
|
if (!md.options.discourse.features.hledger) {
|
|
return;
|
|
}
|
|
|
|
md.block.ruler.before(
|
|
"fence",
|
|
"hledger_dashboard",
|
|
(state, startLine, endLine, silent) => {
|
|
const start = state.bMarks[startLine] + state.tShift[startLine];
|
|
const max = state.eMarks[startLine];
|
|
const opening = state.src.slice(start, max);
|
|
|
|
if (!/^\s*`{3,}hledger\s*$/.test(opening)) {
|
|
return false;
|
|
}
|
|
|
|
let closingLine = startLine + 1;
|
|
let closed = false;
|
|
|
|
for (; closingLine < endLine; closingLine++) {
|
|
const pos = state.bMarks[closingLine] + state.tShift[closingLine];
|
|
const lineMax = state.eMarks[closingLine];
|
|
if (/^\s*`{3,}\s*$/.test(state.src.slice(pos, lineMax))) {
|
|
closed = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!closed) {
|
|
return false;
|
|
}
|
|
|
|
if (silent) {
|
|
return true;
|
|
}
|
|
|
|
const token = state.push("hledger_dashboard", "div", 0);
|
|
token.block = true;
|
|
token.map = [startLine, closingLine + 1];
|
|
state.line = closingLine + 1;
|
|
|
|
return true;
|
|
},
|
|
{ alt: ["paragraph", "reference", "blockquote", "list"] }
|
|
);
|
|
|
|
md.renderer.rules.hledger_dashboard = () =>
|
|
`<div class="hledger-dashboard"></div>\n`;
|
|
});
|
|
}
|