我已经基于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;"}">#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
)
您需要一个更严格的正则表达式,它不会导致错误匹配。或者,您可能需要更改所使用的语法,以便它不会与其他合法文本冲突
首先,事件的顺序是正确的。使用示例输入:
当
InlineProcessor
得到它时,到目前为止,它已被处理为:请注意,块级标记现在存在(
<h3>
),但尚未处理attr_list
。这就是你的问题。正则表达式正在匹配#FF0000;"}
,并将其转换为链接:<a href="/FF0000;"}">#FF0000;"}</a>
最后,在完成所有的ILLeEnEclipse之后,运行{{CD3}} TreeProsessor,但是中间的链接不将文本识别为有效的TraceLIST,而忽略它(如它应该)。p>
换句话说,你的问题根本与秩序无关。您不能在attr_list TreeProcessor之后运行内联处理器,因此您需要探索其他替代方案。您至少有两种选择:
#bar
是一种非常模糊的语法,很可能在文本的其他地方再次出现,并导致错误匹配。也许您可以要求将其包装在括号中,或者使用哈希以外的字符李>我个人强烈建议第二种选择。阅读一些含有
#bar
的文本,这在我看来不是一个明显的链接。然而,[#bar]
(或类似)将更加清楚相关问题 更多 >
编程相关推荐