BBCode Treetop解析器和智能标签关闭?

时间:2013-01-22 15:44:08

标签: ruby parsing bbcode treetop peg

我写了一个treetop语法文件,大部分都有效。对于像[b]这样的标签,我想将它们传递给一个函数,该函数具有为该论坛配置的BBCode的哈希值。如果允许粗体,它将返回HTML,否则它将忽略BB代码。

rule tag
  tag:('[' [a-zA-Z]+ ']')
  inner_tag:(
    !('[/' [a-zA-Z]+ ']')
    (tag <ForumBB::TagNode> / .)
  )+
  '[/' [a-zA-Z]+ ']'
end

这不适用于嵌套标记。例如,[b][i]Bold and italics[/i][/b]将无法正确处理,因为它们匹配[/i]的第一个结束标记。

如何在找到标签时查找负片中的结束标签?

我宁愿不必为每种BBCode编写所有规则,因为这是一个动态系统,论坛管理员打开/关闭某些标签。

1 个答案:

答案 0 :(得分:2)

我会说你的解析器不应该与你的业务逻辑有任何关系;如果论坛管理员可以打开或关闭应该在您遍历AST时处理的标记,而不是在解析器中。

您的解析器应该只负责在完全了解其语法的基础上构建最佳语法树。考虑到这一点,我建议为每个有效的BBCode标记创建一个规则,并在解析阶段后处理排除的标记。

我也想知道当你的解析器识别出[z]invalid[/z]之类的无效BBCode时你会怎么做?