2012-02-28 197 views
3

我在写评论系统。它必须有像stackoverflow的格式化系统。降低python降价能力

用户可以使用一些内联降价语法,如加粗斜体。我认为我可以使用正则表达式替换来解决这个需求。

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

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

感谢您给予时间和您的回复。

+0

当谈到解析器生成器时,有很多选择。你可以看看这个页面,例如:http://wiki.python.org/moin/LanguageParsing – 2012-02-28 21:46:25

+0

我使用降价模块(你可以得到它与easy_install的),发现它很容易添加更多的功能通过编写一个自定义的扩展。 – Frg 2012-02-28 21:54:51

回答

8

我只是继续前进,并使用python-markdown和猴子补丁。您可以在写自己的def_block_parser()功能和替代默认的禁用某些功能降价:

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.py,treeprocessor.py,preprocessor.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 

可能有其他的降价库,更明确地允许被禁用的功能,但python-markdown看起来是相当容易被破解。