【问题标题】:Using Unified to parse Markdown with HTML inside使用 Unified 解析 Markdown,里面有 HTML
【发布时间】: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


    【解决方案1】:

    我也希望那些被解析为 Markdown 元素。

    Markdown 内的 HTML 是允许的,不需要将其解析为 as Markdown,只需将其传递 as-is

    否则不要重新发明轮子:如果您需要可以遍历的对象模型,请将 Markdown 转换为 HTML 并将其加载为 DOMDocument。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2011-04-23
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2014-08-31
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多