标记:已注册图案的处理顺序

2024-09-23 16:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经基于InlineProcessor编写了一个用于标记的python扩展,当模式出现时,它会正确匹配:

自定义扩展名:

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')

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

但是我的扩展正在破坏python标记之外名为attr_list的本机特性

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

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

我不确定是否正确理解Python-Markdown如何在文本上注册/应用模式。我尝试用一个高的数字注册我的模式,将它放在进程的末尾md.inlinePatterns.register(MyPattern(RE, md), 'my_tag', 200),但它不起作用

我已经看过了source code of attr_list extension,它们使用了基于Treeprocessor的类。对于我的MyPattern,是否需要基于Treeprocessor而不是InlineProcessor的类?要想找到一种方法不在元素上应用我的标记,那么该元素如何已经与另一个元素匹配(那里:attr_list


Tags: from标记importredeftag模式el
1条回答
网友
1楼 · 发布于 2024-09-23 16:22:07

您需要一个更严格的正则表达式,它不会导致错误匹配。或者,您可能需要更改所使用的语法,以便它不会与其他合法文本冲突

首先,事件的顺序是正确的。使用示例输入:

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

InlineProcessor得到它时,到目前为止,它已被处理为:

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

请注意,块级标记现在存在(<h3>),但尚未处理attr_list。这就是你的问题。正则表达式正在匹配#FF0000;"},并将其转换为链接:<a href="/FF0000;&quot;}">#FF0000;"}</a>

最后,在完成所有的ILLeEnEclipse之后,运行{{CD3}} TreeProsessor,但是中间的链接不将文本识别为有效的TraceLIST,而忽略它(如它应该)。p>

换句话说,你的问题根本与秩序无关。您不能在attr_list TreeProcessor之后运行内联处理器,因此您需要探索其他替代方案。您至少有两种选择:

  1. 重写正则表达式,使其不具有错误匹配。你可能想尝试使用单词边界之类的东西
  2. 重新考虑你提出的新语法#bar是一种非常模糊的语法,很可能在文本的其他地方再次出现,并导致错误匹配。也许您可以要求将其包装在括号中,或者使用哈希以外的字符

我个人强烈建议第二种选择。阅读一些含有#bar的文本,这在我看来不是一个明显的链接。然而,[#bar](或类似)将更加清楚

相关问题 更多 >