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 = (base, extend) => Object.assign({}, base, extend); this.buildTheme = 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 = (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 = (title, link) => { footnotes.push([++footnoteIndex, title, link]); return footnoteIndex; }; this.buildFootnotes = () => { let footnoteArray = footnotes.map(x => { if (x[1] === x[2]) { return `[${x[0]}]: ${x[1]}
` } return `[${x[0]}] ${x[1]}: ${x[2]}
` }); return `

引用链接

${footnoteArray.join('\n')}

` }; this.buildAddition = () => { return ` `; } this.setOptions = newOpts => { this.opts = merge(this.opts, newOpts) }; this.hasFootnotes = () => footnotes.length !== 0; this.getRenderer = () => { footnotes = []; footnoteIndex = 0; styleMapping = this.buildTheme(this.opts.theme); let renderer = new marked.Renderer(); FuriganaMD.register(renderer); renderer.heading = (text, level) => { switch (level) { case 1: return `

${text}

`; case 2: return `

${text}

`; case 3: return `

${text}

`; default: return `

${text}

`; } }; renderer.paragraph = text => `

${text}

`; renderer.blockquote = text => { text = text.replace(//, `

`); return `

${text}
` }; renderer.code = (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 = (text, infoString) => `${text}`; renderer.listitem = text => `<%s/>${text}`; renderer.list = (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 = (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 = (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 = text => `${text}`; renderer.em = text => `

    ${text}

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