From c754d24b162ecd504f3c4bdd8632045dd0398768 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 27 Nov 2025 05:05:04 +0900 Subject: feat(nuldoc): Djot to Markdown --- services/nuldoc/nuldoc-src/markdown/parse.ts | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 services/nuldoc/nuldoc-src/markdown/parse.ts (limited to 'services/nuldoc/nuldoc-src/markdown/parse.ts') diff --git a/services/nuldoc/nuldoc-src/markdown/parse.ts b/services/nuldoc/nuldoc-src/markdown/parse.ts new file mode 100644 index 0000000..c0875a2 --- /dev/null +++ b/services/nuldoc/nuldoc-src/markdown/parse.ts @@ -0,0 +1,47 @@ +import type { Root as MdastRoot } from "mdast"; +import { unified } from "unified"; +import remarkParse from "remark-parse"; +import remarkGfm from "remark-gfm"; +import remarkDirective from "remark-directive"; +import remarkSmartypants from "remark-smartypants"; +import { parse as parseToml } from "@std/toml"; +import { Config } from "../config.ts"; +import { + createNewDocumentFromMdast, + Document, + PostMetadata, + PostMetadataSchema, +} from "./document.ts"; +import toHtml from "./to_html.ts"; + +export async function parseMarkdownFile( + filePath: string, + config: Config, +): Promise { + try { + const fileContent = await Deno.readTextFile(filePath); + const [, frontmatter, ...rest] = fileContent.split(/^---$/m); + const meta = parseMetadata(frontmatter); + const content = rest.join("---"); + + const processor = unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkDirective) + .use(remarkSmartypants); + + const root = await processor.run(processor.parse(content)) as MdastRoot; + + const doc = createNewDocumentFromMdast(root, meta, filePath, config); + return await toHtml(doc); + } catch (e) { + if (e instanceof Error) { + e.message = `${e.message} in ${filePath}`; + } + throw e; + } +} + +function parseMetadata(s: string): PostMetadata { + return PostMetadataSchema.parse(parseToml(s)); +} -- cgit v1.2.3-70-g09d2