DOWER

用 130 行写一个够用的 Markdown 渲染器

后台的 Markdown 渲染器是自己写的,大约 130 行,没有引入任何第三方库。

核心原则:先转义,再渲染

顺序错了就是 XSS 漏洞。所以整个流程是:

  1. 先把围栏代码块抽出来放进占位数组(此时不转义)
  2. 对剩余全文做 htmlspecialchars
  3. 再识别标题、列表、引用、行内样式
  4. 最后把转义好的代码块填回占位符
$md = preg_replace_callback('/

(\w)\n?(.?)

/s', function ($m) use (&$blocks) {
    $blocks[] = '<pre><code>' . e($m[2]) . '</code></pre>';
    return "\n\x01BLOCK" . (count($blocks) - 1) . "\x01\n";
}, $md);

$md = e($md);   // 转义发生在抽取之后

支持范围

| 语法 | 结果 |
|---|---|
| ## 标题 | h2 |
| 粗体 | strong |
| ` 代码 ` | code |
| > 引用 | blockquote |
| - 列表 | ul |

刻意不做的功能:表格、脚注、HTML 内嵌。渲染器越小,越不容易出错。