let WxRenderer = function (opts) {
this.opts = opts;
let ENV_USE_REFERENCES = true;
let ENV_STRETCH_IMAGE = true;
let footnotes = [];
let footnoteIndex = 0;
let styleMapping = null;
let CODE_FONT_FAMILY = "Menlo, Operator Mono, Consolas, Monaco, monospace";
let merge = function (base, extend) {
return Object.assign({}, base, extend)
};
this.buildTheme = function (themeTpl) {
let mapping = {};
let base = merge(themeTpl.BASE, {
'font-family': this.opts.fonts,
'font-size': this.opts.size
});
let base_block = merge(base, {});
for (let ele in themeTpl.inline) {
if (themeTpl.inline.hasOwnProperty(ele)) {
let style = themeTpl.inline[ele];
if (ele === 'codespan') {
style['font-family'] = CODE_FONT_FAMILY;
style['white-space'] = 'normal';
}
mapping[ele] = merge(base, style)
}
}
for (let ele in themeTpl.block) {
if (themeTpl.block.hasOwnProperty(ele)) {
let style = themeTpl.block[ele];
if (ele === 'code') {
style['font-family'] = CODE_FONT_FAMILY
}
mapping[ele] = merge(base_block, style)
}
}
return mapping
};
let getStyles = function (tokenName, addition) {
let arr = [];
let dict = styleMapping[tokenName];
if (!dict) return '';
for (const key in dict) {
arr.push(key + ':' + dict[key])
}
return `style="${arr.join(';') + (addition || '')}"`
};
let addFootnote = function (title, link) {
footnoteIndex += 1;
footnotes.push([footnoteIndex, title, link]);
return footnoteIndex
};
this.buildFootnotes = function () {
let footnoteArray = footnotes.map(function (x) {
if (x[1] === x[2]) {
return `[${x[0]}]
: ${x[1]}
`
}
return `[${x[0]}]
${x[1]}: ${x[2]}
`
});
return `
${footnoteArray.join('\n')}
` }; this.buildAddition = function () { return '' }; this.setOptions = function (newOpts) { this.opts = merge(this.opts, newOpts) }; this.hasFootnotes = function () { return footnotes.length !== 0 }; this.getRenderer = function () { footnotes = []; footnoteIndex = 0; styleMapping = this.buildTheme(this.opts.theme); let renderer = new marked.Renderer(); FuriganaMD.register(renderer); renderer.heading = function (text, level) { switch (level) { case 1: return `${text}
` }; renderer.blockquote = function (text) { text = text.replace(/`); return `
${text}` }; renderer.code = function (text, infoString) { text = text.replace(//g, ">"); let lines = text.split('\n'); let codeLines = []; let numbers = []; for (let i = 0; i < lines.length; i++) { const line = lines[i]; codeLines.push(`
${(line || '
')}
`);
numbers.push('')
}
let lang = infoString || '';
return `` + codeLines.join('') + `
${text}
`
};
renderer.listitem = function (text) {
return `<%s/>${text}`;
};
renderer.list = function (text, ordered, start) {
text = text.replace(/<\/*p.*?>/g, '');
let segments = text.split(`<%s/>`);
if (!ordered) {
text = segments.join('•');
return `${text}
`; } text = segments[0]; for (let i = 1; i < segments.length; i++) { text = text + i + '.' + segments[i]; } return `${text}
`; }; renderer.image = function (href, title, text) { let subText = ''; if (text) { subText = `${text}
` }; renderer.table = function (header, body) { return `