summaryrefslogtreecommitdiff
path: root/src/build/to-html.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/build/to-html.mjs')
-rw-r--r--src/build/to-html.mjs77
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;