# SitDown
使用 JavaScript 将 HTML 转换为 Markdown。支持 GitHub Flavored Markdown 规范。也支持大部分的微信、知乎、CSDN、掘金的 HTML。
借鉴了 turndown (opens new window)。
这个项目基于 TSDX (opens new window)。
# 安装
npm:
npm install sitdown
# 使用
// Node
var { Sitdown } = require('sitdown')
var sitdown = new Sitdown()
var markdown = sitdown.HTMLToMD('<h1>Hello world!</h1>')
// 浏览器
import { Sitdown } from 'sitdown/src.esm'
var sitdown = new Sitdown()
var markdown = sitdown.HTMLToMD('<h1>Hello world!</h1>')
Sitdown 还接受 DOM 节点作为输入 (元素节点、文档节点或文档片段节点):
var markdown = sitdown.HTMLToMD(document.getElementById('content'))
# 选项
选项可以在实例化时传递给构造函数。例如:
var sitdown = new Sitdown({ option: 'value' })
| 选项 | 有效值 | 默认值 |
|---|---|---|
headingStyle | setext 或 atx | atx |
hr | 任意 专用的换行 (opens new window) | * * * |
bulletListMarker | -, +, 或 * | * |
codeBlockStyle | indented 或 fenced | indented |
fence | ``` 或 ~~~ | ``` | |
emDelimiter | _ 或 * | _ |
strongDelimiter | ** 或 __ | ** |
linkStyle | inlined 或 referenced | inlined |
linkReferenceStyle | full, collapsed, 或 shortcut | full |
keepFilter | style, ['style','div'], 或 a function | ['style','div'] |
# 进阶选项
| 选项 | 有效值 | 默认值 |
|---|---|---|
blankReplacement | 规则替换函数 | 参考下面的 特殊的规则 |
keepReplacement | 规则替换函数 | 参考下面的 特殊的规则 |
defaultReplacement | 规则替换函数 | 参考下面的 特殊的规则 |
# 方法
# addRule(key, rule)
key 参数是规则的唯一名称,便于参考。例子:
sitdown.service.addRule('strikethrough', {
filter: ['del', 's', 'strike'],
replacement: function (content) {
return '~' + content + '~'
}
})
addRule 返回 service 实例便于链式调用。
参考下面的 拓展规则。
# keep(filter)
确定要保留哪些元素并将其渲染为 HTML。默认情况下,Sitdown 不保留任何元素。筛选器参数的工作方式类似于规则筛选器(请参考下面筛选器上的部分)。例子:
sitdown.service.keep(['del', 'ins'])
sitdown.HTMLToMD('<p>Hello <del>world</del><ins>World</ins></p>') // 'Hello <del>world</del><ins>World</ins>'
这将在转换时渲染 <del> 和 <ins> 元素为 HTML。
keep 可以多次调用,新添加的保留筛选器优先于旧筛选器。保留筛选器将被标准的 CommonMark 规则和任意添加的规则覆盖。要保留通常由这些规则处理的元素,请添加具有所需行为的规则。
keep 返回 service 实例便于链式调用。
# remove(filter)
确定要完全删除的元素,即转换为空字符串。默认情况下,Sitdown 不会删除任何元素。筛选器参数的工作方式类似于规则筛选器(请参阅下面筛选器上的部分)。例子:
sitdown.service.remove('del')
sitdown.HTMLToMD('<p>Hello <del>world</del><ins>World</ins></p>') // 'Hello World'
这将删除 <del> 元素和它的内容。
remove 可以多次调用,新添加的删除筛选器优先于旧筛选器。删除筛选器将被保留筛选器、标准的 CommonMark 规则和任何添加的规则覆盖。要删除通常由这些规则处理的元素,请添加具有所需行为的规则。
remove 返回 service 实例便于链式调用
# use(plugin|array)
使用插件或插件数组。例子:
import { Sitdown } from 'sitdown';
import { applyJuejinRule } from '@sitdown/juejin';
let sitdown = new Sitdown({
keepFilter: ['style'],
codeBlockStyle: 'fenced',
bulletListMarker: '-',
hr: '---',
});
sitdown.use(applyJuejinRule);
use 返回 service 实例便于链式调用
参考下面的插件部分。
# 规则拓展
可以通过添加规则来扩展 Sitdown。规则是具有 filter 和 replacement 属性的纯 JavaScript 对象。例如,用于转换 <p> 元素的规则如下所示:
{
filter: 'p',
replacement: function (content) {
return '\n\n' + content + '\n\n'
}
}
筛选器选择 <p> 元素,替换函数返回由两个换行分隔的 <p> 内容。
# filter String|Array|Function
筛选器属性确定是否应将元素替换为规则的 replacement 函数。只需使用标签名称或标签名称数组即可选择 DOM 节点:
filter: 'p'将选择<p>元素filter: ['em', 'i']将选择<em>或<i>元素
或者,筛选器可以是一个函数,根据是否应替换给定节点来返回布尔值。该函数传递一个 DOM 节点以及 Sitdown 选项。例如,当 linkStyle 选项为 inlined 时,以下规则选择 <a> 元素(带 href):
filter: function (node, options) {
return (
options.linkStyle === 'inlined' &&
node.nodeName === 'A' &&
node.getAttribute('href')
)
}
# replacement Function
替换函数确定元素的转换方式。它应返回给定节点的 Markdown 字符串。该函数传递节点的内容、节点本身和 Sitdown 选项。
以下规则显示了如何转换 <em> 元素:
rules.emphasis = {
filter: ['em', 'i'],
replacement: function (content, node, options) {
return options.emDelimiter + content + options.emDelimiter
}
}
# 特殊的规则
空白规则 确定如何处理空白元素。它覆盖每个规则 (即使那些通过 addRule 添加的规则)。如果节点仅包含空格,并且不是 <a>,<td>,<th>或 void 元素,则该节点为空。可以使用 blankReplacement 选项自定义其行为。
保留规则 确定如何处理不应转换的元素,即在 Markdown 输出中渲染为 HTML。默认情况下,不会保留任何元素。块级元素将通过空白行与周围内容分隔。其行为可以使用 keepReplacement 选项进行自定义。
删除规则 确定要完全删除哪些元素。默认情况下,不会删除任何元素。
默认规则 处理任意其他规则无法识别的节点。默认情况下,它输出节点的文本内容(如果是块级元素,则用空白行分隔)。其行为可以通过 defaultReplacement 选项进行自定义。
# 规则优先级
Sitdown 会遍放规则集,并选取与 filter 匹配的第一个规则。下面的列表描述了优先级的顺序:
- 空白规则
- 添加的规则(可选的)
- Commonmark 规则
- 保留规则
- 删除规则
- 默认规则
# 插件
插件 API 为开发人员提供了一种应用多个扩展的便捷方法。插件只是使用 sitdown.service 调用的函数。
# 转义 Markdown 字符
Sitdown 使用后斜杠 (\) 来转义 HTML 输入中的 Markdown 字符。这可确保在输出编译回 HTML 时,这些字符不会解释为 Markdown。例如, <h1>1. Hello world</h1> 需要被转义成 1\. Hello world,否则它将被解释为一个列表项,而不是一个标题。
为了避免将每个 HTML 元素的内容解析为 Markdown 的复杂性和性能影响,Sitdown 使用一组正则表达式来转义潜在的 Markdown 语法。因此,转义规则可能相当具有入侵性。
# 本地开发
下面是你可能会发现有用的命令列表。
# npm start 或 yarn start
以开发/监视模式运行项目。你的项目将在更改时重新构建。TSDX 有一个特殊的记录器,方便你打印错误消息和格式化的兼容 VSC 的问题选项卡。
如果进行编辑,将重新构建你的库。
# npm run build 或 yarn build
将包打包到 dist 文件夹。
该软件包经过优化,并可输出成多种格式(Common JS、UMD 和 ES 模块)。
# npm test 或 yarn test
在监视模式下运行测试程序(Jest)。 默认情况下,运行自上次提交以来更改的文件。
# License
Sitdown 版规归 © 2020+ mdnice 所有,并用 MIT license 发布。