import marked from 'marked' import Prism from 'prismjs' import { helper as helperTpl, tree as treeTpl } from './tpl' import { genTree } from './gen-tree' import { slugify, clearSlugCache } from './slugify' import { emojify } from './emojify' import { toURL, parse } from '../route/hash' import { getBasePath, isResolvePath, getPath } from '../route/util' import { isFn, merge, cached } from '../util/core' let markdownCompiler = marked let contentBase = '' let currentPath = '' let renderer = new marked.Renderer() const TOC = {} let toc = [] /** * Compile markdown content */ export const markdown = cached(text => { let html = '' if (!text) return text html = markdownCompiler(text) html = emojify(html) clearSlugCache() return html }) markdown.renderer = renderer markdown.init = function (config = {}, base = window.location.pathname) { contentBase = getBasePath(base) currentPath = parse().path if (isFn(config)) { markdownCompiler = config(marked, renderer) } else { renderer = merge(renderer, config.renderer) marked.setOptions(merge(config, { renderer })) } } markdown.update = function () { currentPath = parse().path } /** * render anchor tag * @link https://github.com/chjj/marked#overriding-renderer-methods */ renderer.heading = function (text, level) { const slug = slugify(text) const url = toURL(currentPath, { id: slug }) toc.push({ level, slug: url, title: text }) return `${text}` } // highlight code renderer.code = function (code, lang = '') { const hl = Prism.highlight(code, Prism.languages[lang] || Prism.languages.markup) return `
${hl}
` } renderer.link = function (href, title, text) { let blank = '' if (!/:|(\/{2})/.test(href)) { href = toURL(href) } else { blank = ' target="_blank"' } return `${text}` } renderer.paragraph = function (text) { if (/^!>/.test(text)) { return helperTpl('tip', text) } else if (/^\?>/.test(text)) { return helperTpl('warn', text) } return `

${text}

` } renderer.image = function (href, title, text) { let url = href const titleHTML = title ? ` title="${title}"` : '' if (!isResolvePath(href)) { url = getPath(contentBase, href) } return `${text}` } /** * Compile sidebar */ export function sidebar (text, level) { let html = '' if (text) { html = markdown(text) html = html.match(/]*>([\s\S]+)<\/ul>/g)[0] } else { const tree = genTree(toc, level) html = treeTpl(tree, '