Сокращение возможностей уценки в python - PullRequest
3 голосов
/ 29 февраля 2012

Я пишу систему комментариев. Это должна быть система форматирования, подобная stackoverflow.

Пользователи могут использовать некоторый встроенный синтаксис уценки, например полужирный или курсив . Я думал, что смогу решить эту проблему с помощью регулярных выражений.

Но есть еще одна вещь, которую я должен сделать: давая 4 пробела, пользователи могут создавать блоки кода. Я думаю, что я не могу сделать это с помощью регулярных выражений. или разбор идентификаторов слишком сложен для меня :) Кроме того, создание списков с помощью замен регулярных выражений выглядит для меня невозможным.

  • Как лучше всего это сделать?
  • Существуют ли какие-либо библиотеки уценок, которые могут уменьшить его возможности? (например, я попытаюсь удалить поддержку таблиц)
  • Если я должен написать свой собственный синтаксический анализатор, должен ли я написать конечный автомат с нуля? или есть какие-то другие библиотеки, чтобы было проще?

Спасибо, что нашли время, и ваши ответы.

1 Ответ

8 голосов
/ 29 февраля 2012

Я бы просто пошел дальше и использовал 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

Обратите внимание, что я просто скопировал и вставил функцию build_block_processor() по умолчанию изфайл blockprocessors.py, немного его подправил (вставив bp. перед всеми именами из этого модуля) и закомментировал строку, в которую он добавляет процессор блока кода.Результирующая функция затем возвращается в модуль.Подобный метод выглядит выполнимым для inlinepatterns.py, treeprocessor.py, preprocessor.py и postprocessor.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 выглядит так, что его можно взломать.

...