0

假设我有以下降价

# Comman mark is **just great**
You can try CommonMark here.  This dingus is powered by
[commonmark.js](https://github.com/commonmark/commonmark.js), the
JavaScript reference implementation.
## Try CommonMark
1. item one
2. item two
   - sublist
   - sublist

我想获得第一个h1标签和第一个p标签,以便让他们接受帖子的标题和描述。

我不能使用浏览器 API,因为它在 Node 服务器上运行

为了获得第一个h1标签,我使用了commonmark.js.

document.getElementById('btn').addEventListener('click', function (e) {
  let parsed = reader.parse(md);
  let result = writer.render(parsed);

  let walker = parsed.walker();
  let event, node;

  while ((event = walker.next())) {
    node = event.node;

    // h1 tags
    if (event.entering && node.type === 'heading' && node.level == 1) {
      console.log('h1', '--', node?.firstChild?.literal);
    }

    // p tags
    if (event.entering && node.type === 'text') {
      console.log('p', '--', node?.literal);
    }
  }
});

对于上面的降价,我在控制台上得到了输出。

hgjg

可以看到,第一个h1返回的是Common mark is,其实应该是# Comman mark is **just great**

p标签也是一样,我该如何解决这个问题?

现场观看 - https://stackblitz.com/edit/js-vegggl?file=index.js

4

2 回答 2

0

既然您已经在Node.js世界中,我建议您查看统一集体的 评论重新炒作处理器。这些处理器支持分别向/从语法树解析markdownHTML统一集合中的所有此类处理器都支持自定义和第三方“插件”,使您能够检查和操作中间语法树。强大的东西。虽然有点学习曲线。但是,在某些时候,RegEx会与诸如 markdown 之类的非常规语言发生故障。语法树可以节省一天。

于 2022-02-15T22:55:11.833 回答
0
const regex = {
  title: /^#\s+.+/,
  heading: /^#+\s+.+/,
  custom: /\$\$\s*\w+/,
  ol: /\d+\.\s+.*/,
  ul: /\*\s+.*/,
  task: /\*\s+\[.]\s+.*/,
  blockQuote: /\>.*/,
  table: /\|.*/,
  image: /\!\[.+\]\(.+\).*/,
  url: /\[.+\]\(.+\).*/,
  codeBlock: /\`{3}\w+.*/,
};

const isTitle = (str) => regex.title.test(str);
const isHeading = (str) => regex.heading.test(str);
const isCustom = (str) => regex.custom.test(str);
const isOl = (str) => regex.ol.test(str);
const isUl = (str) => regex.ul.test(str);
const isTask = (str) => regex.task.test(str);
const isBlockQuote = (str) => regex.blockQuote.test(str);
const isImage = (str) => regex.image.test(str);
const isUrl = (str) => regex.url.test(str);
const isCodeBlock = (str) => regex.codeBlock.test(str);

export function getMdTitle(md) {
  if (!md) return "";
  let tokens = md.split("\n");
  for (let i = 0; i < tokens.length; i++) {
    if (isTitle(tokens[i])) return tokens[i];
  }
  return "";
}

export function getMdDescription(md) {
  if (!md) return "";
  let tokens = md.split("\n");
  for (let i = 0; i < tokens.length; i++) {
    if (
      isHeading(tokens[i]) ||
      isCustom(tokens[i]) ||
      isOl(tokens[i]) ||
      isUl(tokens[i]) ||
      isTask(tokens[i]) ||
      isBlockQuote(tokens[i]) ||
      isImage(tokens[i]) ||
      isUrl(tokens[i]) ||
      isCodeBlock(tokens[i])
    )
      continue;

    return tokens[i];
  }
  return "";
}
于 2021-10-21T06:04:14.303 回答