【问题标题】:Is there a standard approach for parsing inline modifiers in Textile/Markdown是否有在 Textile/Markdown 中解析内联修饰符的标准方法
【发布时间】:2012-07-30 22:29:44
【问题描述】:

我一直在考虑使用 Scala 的解析器组合库(基本上是一个 PEG 解析器)编写一个 Textile 解析器,并且想知道我应该使用哪种方法来解析内联修饰符

This is *bold* text, _italic_ text, +underlined+ text, etc.

在这种情况下,很清楚什么是什么,应该解析什么。但是,有很多边缘情况不是很清楚。仅关注粗体文本:

Which sections get bolded: 
*onomato*poeia* ?
bold *word*, without a space after?
tyr*annos*aurus
a bold word in a (*bracket*)?
How about *This *case?

显然这是主观(哪些东西应该算作粗体)和客观(如何让解析规则正确解析它)的混合体。

我倾向于 PEG 之类的东西

wordChar = [a-zA-Z]
nonWordChar = [^a-zA-Z]
boldStart = nonWordChar ~ * ~ wordChar
boldEnd = wordChar ~ * ~ nonWordChar
boldSection = boldStart ~ rep(not(boldEnd) ~ anyChar) ~ boldEnd

上面的解析如下:

<b>onomato*poeia</b> ?
bold <b>word</b>, without a space after?
tyr*annos*aurus    <- fails because of lack of whitespace
a bold word in a (<b>bracket</b>)?
How about *This *case? <- fails because there is no correct closing *

但是,我不确定此方法是否适用于所有用例,是否适用于所有边缘情况。有没有我可以复制和依赖的标准方法?如果可以避免的话,我宁愿不依赖我的临时未经过深思熟虑的语言规范。

【问题讨论】:

    标签: html parsing markdown markup textile


    【解决方案1】:

    在降价的情况下没有标准,在边缘情况下实现不同。对于 Markdown 的一组选择,您可以查看 peg-markdown,它也在 MultiMarkdown 中使用。当然,在这方面,markdown 比纺织更复杂,因为它使用** 表示粗体,* 表示斜体,从而产生更多关于如何处理 *hello**there** 之类的决定。

    PHP markdown extra 的开发人员 Michel Fortin 有一个 test suite,其中包括一些粗体/斜体的边缘情况。但是,我认为他的决定并没有得到普遍认同,而且许多实现的解析方式不同。

    也就是说,我认为以下决定在降价中是没有争议的:

    • * 仅在下一个字符为非空格时才开始强调。
    • * 仅在前面的字符不是空格时才结束强调。
    • 强调可以出现在一个单词中,因此在 he*ll*o 中,两个 l 被强调(尽管某些 markdown 实现禁用了 _ 字符的此功能,因为下划线在标识符中很常见)。

    【讨论】:

      【解决方案2】:

      经过一段时间的采购,我找到了inline markup recognition rules for reStructuredText

      不遵循markdown的规则;特别是像t*hi*s 这样的东西不会被解析为内联标签,但它非常相似并且具有相似的总体目的。

      这也是一个有点复杂的规范(例如,括号和标点符号的特殊大小写),但它的规范非常好,经过彻底的解释和证明。我发现它的规范是一个非常坚实的基础。

      【讨论】:

      • 我认为,如果您正在编写一个纺织品解析器,您会想看看标准纺织品解析器正在使用什么样的规则,而不是从 reStructuredText 中获取规则。在这种情况下,它们可能重合,但您不应该验证这一点吗?
      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2015-09-06
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多