使用JavaScript将markdown转换为HTML-限制支持的语法

时间:2018-11-19 09:17:10

标签: javascript html syntax markdown

我目前正在使用 marked.js markdown 转换为HTML,因此我的Web应用程序的用户可以创建结构化的内容。我想知道是否有一种方法可以将支持的语法仅限制为一个子集,例如

标题

斜体文本

粗体

  • 仅压入深度为1的列表
  

引号

我想禁止转换具有多级缩进,代码块,列表头的列表...

原因是,我的WebApp应该让用户以特定方式创建内容,如果有可能创建一些疯狂的结构化内容(标头列表,标头中的代码,图像列表...),则有人会当然可以。

2 个答案:

答案 0 :(得分:0)

您有一些不同的选择:

Marked.js使用多步方法来解析Markdown。它使用词法分析器将文档分解为标记,使用解析器将这些标记转换为抽象语法树(AST),并使用渲染器将AST转换为HTML。您可以override中的任何部分来更改语法各部分的处理。

例如,如果您只想忽略列表并将其保留在呈现的HTML之外,则将呈现器中的list函数替换为一个返回空字符串的函数。

或者,如果希望解析器像Markdown所不支持的列表一样工作,则可以从解析器中删除listlistitem方法。在这种情况下,该列表将保留在输出中,但将被视为一个段落。

或者,如果您想支持一个级别的列表,但不支持嵌套列表,则可以将解析器中的list和/或listitem方法替换为自己的实现,将列表解析为您想要的。

请注意,还有一个数字advanced options,它使用上述方法来更改解析器和/或以各种方式呈现。在大多数情况下,这些选项不会提供您所要求的功能,但是浏览source code可能会为您提供一些有关如何实现自己的修改的想法。

但是,有一个sanitize选项,它将接受一个sanitizer函数。您可以提供自己的清理程序,该清理程序从HTML输出中删除了所有不需要的元素。这将导致与覆盖渲染器类似的最终结果,但实现方式有所不同。根据您要完成的工作,一个或另一个可能会更有效。

答案 1 :(得分:0)

另一种可能性是使用Commonmark.js,解析输入蚂蚁而不是遍历解析的树并删除具有/不具有特定类型的所有节点。请参见this example,它对于图像工作正常,但是对于代码块却失败。

此方法的缺点是,解析的markdown源将遍历两次:一次用于编辑,第二次用于呈现。