【问题标题】:Reducing capabilities of markdown in python减少python中markdown的功能
【发布时间】:2012-03-18 09:46:19
【问题描述】:

我正在编写一个评论系统。它必须有像stackoverflow这样的格式化系统。

用户可以使用一些内联 markdown 语法,例如 bolditalic。我认为我可以通过使用正则表达式替换来解决这个需求。

但我还必须做另一件事:通过给 4 个空格缩进,用户可以创建代码块。我认为我不能通过使用正则表达式来做到这一点。或者解析 idents 对我来说太高级了 :) 此外,通过使用正则表达式替换来创建列表对我来说似乎是不可能的。

  • 这样做的最佳方法是什么?
  • 是否有任何降价库可以减少它的功能? (例如,我会尝试删除表格支持)
  • 如果我应该编写自己的解析器,我应该从头开始编写一个有限状态机吗?还是有任何其他库可以使其更容易?

感谢您的宝贵时间和您的回复。

【问题讨论】:

  • 解析器生成器有很多选择。你可以看看这个页面,例如:wiki.python.org/moin/LanguageParsing
  • 我正在使用 Markdown 模块(您可以通过 easy_install 获得它),并发现通过编写自定义扩展来为其添加更多功能相当容易。

标签: python parsing stack-overflow markdown markup


【解决方案1】:

我会继续使用python-markdown 并对其进行猴子补丁。您可以编写自己的 def_block_parser() 函数并将其替换为默认函数以禁用某些 Markdown 功能:

from markdown import blockprocessors as bp
def build_block_parser(md_instance, **kwargs):
    """ Build the default block parser used by Markdown. """
    parser = bp.BlockParser(md_instance)
    parser.blockprocessors['empty'] = bp.EmptyBlockProcessor(parser)
    parser.blockprocessors['indent'] = bp.ListIndentProcessor(parser)
    # parser.blockprocessors['code'] = bp.CodeBlockProcessor(parser)
    parser.blockprocessors['hashheader'] = bp.HashHeaderProcessor(parser)
    parser.blockprocessors['setextheader'] = bp.SetextHeaderProcessor(parser)
    parser.blockprocessors['hr'] = bp.HRProcessor(parser)
    parser.blockprocessors['olist'] = bp.OListProcessor(parser)
    parser.blockprocessors['ulist'] = bp.UListProcessor(parser)
    parser.blockprocessors['quote'] = bp.BlockQuoteProcessor(parser)
    parser.blockprocessors['paragraph'] = bp.ParagraphProcessor(parser)
    return parser
bp.build_block_parser = build_block_parser

请注意,我只是从blockprocessors.py 文件中复制并粘贴了默认的build_block_processor() 函数,稍作调整(在该模块的所有名称前插入bp.),并注释掉该行它在其中添加代码块处理器。然后将生成的函数猴子修补回模块中。对于inlinepatterns.pytreeprocessor.pypreprocessor.pypostprocessor.py,类似的方法看起来是可行的,它们各自执行不同类型的处理。

除了像我在上面所做的那样重写设置单个解析器的函数之外,您还可以使用仍然会被调用但不会执行任何操作的无操作子类来修补解析器类本身。这可能更简单:

from markdown import blockprocessors as bp
class NoProcessing(bp.BlockProcessor):
    def test(self, parent, block):
        return False   # never invoke this processor

bp.CodeBlockProcessor = NoProcessing

可能还有其他更明确地允许禁用功能的 Markdown 库,但 python-markdown 看起来很容易破解。

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 2013-07-06
    • 2018-10-29
    • 1970-01-01
    • 2020-03-25
    • 2014-03-08
    • 2016-05-02
    • 2014-09-26
    • 2010-11-30
    相关资源
    最近更新 更多