diff options
Diffstat (limited to 'src/build/to-html.mjs')
-rw-r--r-- | src/build/to-html.mjs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/build/to-html.mjs b/src/build/to-html.mjs new file mode 100644 index 0000000..786f91d --- /dev/null +++ b/src/build/to-html.mjs @@ -0,0 +1,77 @@ +import {unified} from 'unified'; +import remarkParse from 'remark-parse'; +import remarkGfm from 'remark-gfm'; +import remarkToc from 'remark-toc'; +import remarkDirective from 'remark-directive'; +import remarkMath from 'remark-math'; +import remarkFrontmatter from 'remark-frontmatter'; +import remarkRehype from 'remark-rehype'; +import rehypeSlug from 'rehype-slug'; +import rehypePicture from 'rehype-picture' +import rehypeKaTeX from 'rehype-katex'; +import rehypeRaw from 'rehype-raw'; +import rehypeAutolinkHeadings from 'rehype-autolink-headings'; +import rehypeStringify from 'rehype-stringify'; +import rehypeHighlight from 'rehype-highlight'; +import remarkSpecialBox from './special_box.mjs'; +import remarkRemoveFootnoteHeader from './remove-footnote-header.mjs'; +import {getTocHeading} from './i18n.mjs'; + +const autoLinkOption = { + behavior: 'wrap', + properties: { + tabIndex: 0, + className: 'anchor', + }, +}; + +const pictureOptions = { + 'png': {avif: 'image/avif'} +} + +const generator = unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkToc, {heading: getTocHeading(), tight: true, ordered: true}) + .use(remarkMath) + .use(remarkDirective) + .use(remarkSpecialBox) + .use(remarkFrontmatter, {type: 'toml', marker: '-'}) + .use(remarkRehype, {allowDangerousHtml: true}) + .use(rehypeRaw) + .use(remarkRemoveFootnoteHeader) + .use(rehypePicture, pictureOptions) + .use(rehypeKaTeX) + .use(rehypeSlug) + .use(rehypeHighlight) + .use(rehypeAutolinkHeadings, autoLinkOption) + .use(rehypeStringify); + +const generatorMd = unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkToc, {heading: getTocHeading(), tight: true, ordered: true}) + .use(remarkMath) + .use(remarkDirective) + .use(remarkSpecialBox) + .use(remarkFrontmatter, {type: 'toml', marker: '-'}); + +const generatorHTML = unified() + .use(remarkRehype, {allowDangerousHtml: true}) + .use(rehypeRaw) + .use(remarkRemoveFootnoteHeader) + .use(rehypePicture, pictureOptions) + .use(rehypeKaTeX) + .use(rehypeSlug) + .use(rehypeHighlight) + .use(rehypeAutolinkHeadings, autoLinkOption) + .use(rehypeStringify); + +const toHtml = content => generator.processSync(content); + +export const toMdRaw = content => generatorMd.runSync(generatorMd.parse(content)); +export const mdToHtmlRaw = content => generatorHTML.runSync(content); + +export const toHtmlRaw = content => generator.runSync(generator.parse(content)); +export const toString = content => generator.stringify(content); +export default toHtml; |