【发布时间】:2021-06-25 23:25:53
【问题描述】:
我正在尝试将 GitHub 风格的 Markdown (GFM) 文本转换为 Markdown AST 节点。因为 GFM 允许像 <img> 这样的 HTML 标签,所以我也希望这些标签也被解析为 Markdown 元素。
现在,我正在使用 Unified + Turndown 的组合来执行此操作。本质上,我正在解析 Markdown,使用 Unified 和几个插件将其全部转换为原始 HTML,然后使用 Turndown 将其转换为原始 Markdown,然后再次使用 Unified 将新的原始 Markdown 解析为 AST 节点,最后解析我想要的节点。
这就是我所拥有的:
import unified from 'unified';
import markdown from 'remark-parse';
import gfm from 'remark-gfm';
import TurndownService from 'turndown';
import remark2rehype from 'remark-rehype';
import html from 'rehype-stringify';
import raw from 'rehype-raw';
import {parseBlocks} from './parser/internal';
import type {Root} from './markdown';
import type {ParsingOptions} from './types';
const {gfm: turndownGfm} = require('turndown-plugin-gfm');
export async function markdownToBlocks(body: string) {
const turndownService = new TurndownService().use(turndownGfm);
const rawHtml = await unified()
.use(markdown)
.use(gfm)
.use(remark2rehype, {allowDangerousHtml: true})
.use(raw)
.use(html)
.process(body);
const rawMarkdown = turndownService.turndown(String(rawHtml));
const root = unified().use(markdown).use(gfm).parse(rawMarkdown);
return parseBlocks(root as unknown as Root);
}
它完全符合我的要求并且完美运行,但是我不禁想到有一个更好的解决方案,它比我现在的做法更有效,因为我已经多次解析它。
任何关于如何通过更少的解析步骤来改进这一点的建议将不胜感激,谢谢!
【问题讨论】:
标签: parsing markdown abstract-syntax-tree