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 `

References

${ 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 }

`; case 2: return `

${ text }

`; case 3: return `

${ text }

`; default: return `

${ text }

`; } }; renderer.paragraph = function (text) { 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('')
            + `
    ` }; renderer.codespan = function (text, infoString) { return `${ 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 }
    ` } let figureStyles = getStyles('figure'); let imgStyles = getStyles(ENV_STRETCH_IMAGE ? 'image' : 'image_org'); return `
    ${ text }${ subText }
    ` }; renderer.link = function (href, title, text) { if (href.indexOf('https://mp.weixin.qq.com') === 0) { return `${ text }`; } else if (href === text) { return text; } else { if (ENV_USE_REFERENCES) { let ref = addFootnote(title || text, href); return `${ text }[${ ref }]`; } else { return `${ text }`; } } }; renderer.strong = function (text) { return `${ text }`; }; renderer.em = function (text) { return `

    ${ text }

    ` }; renderer.table = function (header, body) { return `${ header }${ body }
    `; }; renderer.tablecell = function (text, flags) { return `${ text }`; }; renderer.hr = function () { return `
    `; }; return renderer } };