UNPKG

hackmd-to-html-cli

Version:

A node.js CLI tool for converting HackMD markdown to HTML.

100 lines (96 loc) 3.23 kB
import { MarkdownItYAMLMetadata, Metadata } from './markdown/yamlMetadata' import { MarkdownItContainer } from './markdown/container' import { MarkdownItCheckbox } from './markdown/checkbox' import { MarkdownItExternal } from './markdown/external' import { MarkdownItBlockquoteX } from './markdown/blockquotex' import { MarkdownItFenceX } from './markdown/fencex' import MarkdownIt from 'markdown-it' import MarkdownItSub from 'markdown-it-sub' import MarkdownItSup from 'markdown-it-sup' import MarkdownItFootnote from 'markdown-it-footnote' import MarkdownItDeflist from 'markdown-it-deflist' import MarkdownItAbbr from 'markdown-it-abbr' import MarkdownItEmoji from 'markdown-it-emoji' import MarkdownItIns from 'markdown-it-ins' import MarkdownItMark from 'markdown-it-mark' import MarkdownItImsize from 'markdown-it-imsize' import MarkdownItMathJax3 from 'markdown-it-mathjax3' import MarkdownItTOC from 'markdown-it-table-of-contents' import MarkdownItAnchor from 'markdown-it-anchor' import MarkdownItRuby from 'markdown-it-ruby' export interface ConvertedResult { main: string; metadata: Metadata; } export class Converter { private md: MarkdownIt private metadata?: Metadata constructor(options: MarkdownIt.Options = { html: true, breaks: true, linkify: true, typographer: true }) { // https://hackmd.io/c/codimd-documentation/%2F%40codimd%2Fmarkdown-syntax this.md = new MarkdownIt(options) .use(MarkdownItMathJax3) .use(MarkdownItSub) .use(MarkdownItSup) .use(MarkdownItFootnote) .use(MarkdownItDeflist) .use(MarkdownItAbbr) .use(MarkdownItMark) .use(MarkdownItEmoji.full) .use(MarkdownItIns) .use(MarkdownItImsize) .use(MarkdownItTOC, { markerPattern: /^\[toc\]/im, includeLevel: [1, 2, 3, 4] }) .use(MarkdownItYAMLMetadata, (metadata: Metadata) => { this.metadata = metadata }) .use(MarkdownItAnchor) .use(MarkdownItRuby) .use(MarkdownItContainer) .use(MarkdownItCheckbox) .use(MarkdownItExternal) .use(MarkdownItBlockquoteX) .use(MarkdownItFenceX) } /** * @param markdown markdown text * * @returns ConvertedResult contains `main` and `metadata` * * ``` * ConvertedResult { * main: string; // generated html text * metadata: Metadata; // parsed metadata * } * * Metadata { * title: string; * description: string; * lang: string; * robots: string; * dir: string; * image: string; * } * ``` */ public render(markdown: string): ConvertedResult { const main = this.md.render(markdown) return { main: main, metadata: this.metadata ?? { title: '', description: '', lang: '', robots: '', dir: '', image: '' } } } }