Уценка: заказ на обработку для зарегистрированного шаблона - PullRequest
0 голосов
/ 17 апреля 2020

Я написал расширение python для уценки на основе InlineProcessor, которые правильно совпадают при появлении шаблона:

Пользовательское расширение:

from markdown.util import AtomicString, etree
from markdown.extensions import Extension
from markdown.inlinepatterns import InlineProcessor

RE = r'(#)(\S{3,})'

class MyPattern(InlineProcessor):
    def handleMatch(self, m, data):
        tag = m.group(2)

        el = etree.Element("a")
        el.set('href', f'/{tag}')
        el.text = AtomicString(f'#{tag}')

        return el, m.start(0), m.end(0)

class MyExtension(Extension):
    def extendMarkdown(self, md, md_globals):
        # If processed by attr_list extension, not by this one
        md.inlinePatterns.register(MyPattern(RE, md), 'my_tag', 200)

def makeExtension(*args, **kwargs):
    return MyExtension(*args, **kwargs)

IN: markdown('foo #bar')

OUT: <p>foo <a href="/bar">#bar</a></p>

Но мое расширение нарушает встроенную функцию под названием attr_list дополнительно python уценка.

IN: ### Title {style="color:#FF0000;"}

OUT: <h3>Title {style="color:<a href="/FF0000;&quot;}">#FF0000;"}</a></h3>

I ' Я не уверен, что правильно понимаю, как Python -Markdown регистрирует / применяет шаблоны к тексту. Я пытаюсь зарегистрировать мой шаблон с большим номером, чтобы поместить его в конец процесса md.inlinePatterns.register(MyPattern(RE, md), 'my_tag', 200), но он не выполняет свою работу.

Я смотрю на исходный код расширения attr_list и они используют Treeprocessor основанный класс. Мне нужно было иметь класс Treeprocessor, а не InlineProcessor для моего MyPattern ? Чтобы найти способ не применять мой тег к элементу, который уже сопоставлен с другим (там: attr_list)?

1 Ответ

1 голос
/ 22 апреля 2020

Вам нужно более строгое регулярное выражение, которое не приведет к ложным совпадениям. Или, возможно, вам нужно изменить используемый синтаксис, чтобы он не совпадал с sh с другим допустимым текстом.

Прежде всего, порядок событий правильный. Используя ваш пример ввода:

### Title {style="color:#FF0000;"}

Когда InlineProcessor получает его, пока он был обработан следующим образом:

<h3>Title {style="color:#FF0000;"}</h3>

Обратите внимание, что теперь присутствуют теги уровня блока ( <h3>), но attr_list не был обработан. И это твоя проблема. Ваше регулярное выражение соответствует #FF0000;"} и преобразует его в ссылку: <a href="/FF0000;&quot;}">#FF0000;"}</a>.

Наконец, после того, как все InlinePrecessors будут выполнены, запускается attr_list TreeProsessor, но со ссылкой в ​​середине, он не распознает текст как действительный атрибут attr_list и игнорирует его (как и должно быть).

Другими словами, ваша проблема вообще не имеет ничего общего с порядком. Вы не можете запустить встроенный процессор после attr_list TreeProcessor, поэтому вам нужно изучить другие альтернативы. У вас есть как минимум два варианта:

  1. Переписать ваше регулярное выражение, чтобы не было ложных совпадений. Возможно, вы захотите попробовать использовать границы слов или что-то в этом роде.
  2. Пересмотрите предложенный новый синтаксис. #bar - довольно нечеткий синтаксис, который может повторяться в любом месте текста и приводить к ложным совпадениям. Возможно, вы могли бы потребовать, чтобы он был заключен в квадратные скобки или использовать какой-либо символ, кроме ha sh.

Лично я настоятельно рекомендовал бы второй вариант. Прочитайте какой-нибудь текст с #bar, так что не будет очевидным, что это ссылка. Тем не менее, [#bar] (или аналогичный) будет гораздо более понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...