Nodejs markdown 处理代码中的 's 硬伤啊

Nodejs markdown 处理代码中的 's 硬伤啊

因为单词后边跟个’s, 你懂的

14 回复

Node.js Markdown 处理代码中的 's 硬伤啊

在使用 Node.js 处理 Markdown 文件时,经常会遇到一个常见的问题:单词后面跟着 's。例如,当 Markdown 文本中出现 “it’s” 或 “John’s” 这样的词组时,Markdown 解析器可能会错误地将其解析为带有斜体或强调效果的文本。这显然不是我们想要的效果。

示例问题

假设我们有以下 Markdown 文本:

It's a beautiful day. John's car is parked outside.

如果我们直接使用 Markdown 解析器来处理这段文本,结果可能是:

It’s a beautiful day. John’s car is parked outside.

很明显,这不是我们期望的结果。

解决方案

为了正确处理这种情况,我们可以使用一些额外的库来确保 's 后缀不会被误解析。一个常用的库是 marked,它是一个快速、灵活的 Markdown 解析器。我们还可以结合使用 rehype-remarkremark-gfm 来进一步增强解析功能。

示例代码

首先,安装必要的依赖包:

npm install marked rehype-remark remark-gfm

然后,编写代码来处理 Markdown:

const marked = require('marked');
const unified = require('unified');
const markdown = require('remark-parse');
const gfm = require('remark-gfm');
const html = require('remark-rehype');
const stringify = require('rehype-stringify');

// 定义 Markdown 文本
const markdownText = `
It's a beautiful day. John's car is parked outside.
`;

// 使用 marked 解析 Markdown
const parsedHtml = marked(markdownText);

console.log(parsedHtml);
// 输出: <p>It's a beautiful day. John's car is parked outside.</p>

// 使用 unified 和 remark-gfm 解析 Markdown
const processed = unified()
  .use(markdown)
  .use(gfm)
  .use(html)
  .use(stringify)
  .processSync(markdownText);

console.log(processed.toString());
// 输出: <p>It's a beautiful day. John's car is parked outside.</p>

解释

  1. marked: 直接使用 marked 库可以简单地将 Markdown 转换为 HTML,但它可能无法正确处理 's 后缀。
  2. unified + remark-gfm: 使用 unified 库结合 remark-gfm 插件可以更灵活地处理 Markdown,并且支持 GitHub Flavored Markdown (GFM),从而更好地处理 's 后缀。

通过这种方式,我们可以确保 's 后缀不会被错误地解析为斜体或强调文本,从而避免了常见的硬伤。


我只是测试一下。

It’s a pig~

毫无压力啊。

// It's a code.
var a = "It's a code.";
var a = 'It\'s a code.';

-. - 都没问题啊。

- It's a pig.
  • It’s a pig.

列表这种咋处理

's ??

it’s not me.

test’s

  • It’s a pig

也果断没问题啊

根据你的描述,问题主要在于 Node.js 中处理 Markdown 时,如何正确处理包含 's 的单词。在 Markdown 中,单引号 ' 和撇号 有时会被混淆或错误解析,导致生成的 HTML 不符合预期。

例如,Markdown 可能会将 “it’s” 错误地解析为斜体格式,而不是简单的文本。这通常是因为 Markdown 解析器默认认为 's 是一种格式标记,比如斜体。

示例代码

假设我们使用流行的 marked 库来处理 Markdown,以下是如何解决这个问题的一个简单方法:

const marked = require('marked');

// 修改 marked 的 renderer 对象,自定义处理规则
marked.setOptions({
    renderer: new marked.Renderer(),
    gfm: true,
    breaks: false,
    pedantic: false,
    sanitize: false,
    smartLists: true,
    smartypants: false // 禁用 smartypants,防止将 's 转换为 &rsquo;s
});

const markdownText = `
Here is a sentence with it's and don't.
`;

const html = marked(markdownText);
console.log(html);

在这个例子中,通过设置 smartypants 选项为 false,可以避免 's 被转换为更复杂的字符,从而保持 Markdown 文本的原始格式。

解释

  • smartypants:该选项控制是否使用 SmartyPants 来转换普通 ASCII 文本为更美观的格式。禁用它可防止 ‘s 被转换为 &rsquo;s

通过这种方式,你可以确保在生成的 HTML 中保留原始的文本格式,避免 's 被错误地解析为格式标记。

如果你使用的是其他 Markdown 解析库,类似的方法也适用,只需查找相应的配置项即可。

回到顶部