Python 标记:已注册图案的处理顺序
我已经基于Python 标记:已注册图案的处理顺序,python,markdown,Python,Markdown,我已经基于InlineProcessor编写了一个用于标记的python扩展,当模式出现时,这些扩展会正确匹配: 自定义扩展名: 从markdown.util导入原子字符串,etree 从markdown.extensions导入扩展 从markdown.inlinepatterns导入InlineProcessor RE=r'(#)(\S{3,})' 类MyPattern(InlineProcessor): def handleMatch(自身、m、数据): tag=m.group(2) el
InlineProcessor
编写了一个用于标记的python扩展,当模式出现时,这些扩展会正确匹配:
自定义扩展名:
从markdown.util导入原子字符串,etree
从markdown.extensions导入扩展
从markdown.inlinepatterns导入InlineProcessor
RE=r'(#)(\S{3,})'
类MyPattern(InlineProcessor):
def handleMatch(自身、m、数据):
tag=m.group(2)
el=etree.Element(“a”)
el.set('href',f'/{tag}')
el.text=AtomicString(f'#{tag}')
返回el、m.开始(0)、m.结束(0)
MyExtension类(扩展名):
def扩展标记(自我、md、md_全局):
#如果由attr_列表扩展处理,则不是由此扩展处理
寄存器(MyPattern(RE,md),'my_tag',200)
def makeExtension(*args,**kwargs):
返回MyExtension(*args,**kwargs)
IN:markdown('foo#bar')
OUT:foo
但是,我的扩展正在破坏一个本机特性,该特性被称为python markdown之外的特性
中:###Title{style=“color:#FF0000;”}
OUT:Title{style=“color:
我不确定如何正确理解如何在文本上注册/应用模式。我尝试用一个高数字注册我的模式,以将其放在流程的末尾md.inlinePatterns.register(MyPattern(RE,md),'my_tag',200)
我已经看过了,他们使用了基于
Treeprocessor
的类。我是否需要基于Treeprocessor
而不是InlineProcessor
为我的MyPattern创建一个类,以找到一种方法,在元素与另一个匹配的情况下不将我的标记应用于元素(那里:attr\u list
)?您需要一个更严格的正则表达式,它不会导致错误匹配。或者您可能需要更改您使用的语法,以便它不会与其他合法文本冲突
首先,事件的顺序是正确的。使用示例输入:
### Title {style="color:#FF0000;"}
当InlineProcessor
获取它时,到目前为止,它已被处理为:
<h3>Title {style="color:#FF0000;"}</h3>
Title{style=“color:#FF0000;”
请注意,块级标记现在已存在(
),但尚未处理属性列表。这就是您的问题。您的正则表达式正在匹配\FF0000;“}
,并将其转换为链接:
最后,在所有的内联函数完成后,运行<代码> TraceListBux/CudioTeePrimeor,但是中间的链接不将文本识别为有效的TraceLIST,而忽略它(如应该)。
换句话说,你的问题根本与秩序无关。您不能在attr_list TreeProcessor之后运行内联处理器,因此您需要探索其他替代方案。您至少有两种选择:
重写正则表达式,使其不具有错误匹配。你可能想尝试使用单词边界之类的东西
重新考虑你提出的新语法#bar
是一种非常模糊的语法,很可能在文本的其他地方再次出现,并导致错误匹配。也许您可以要求将其包装在括号中,或者使用哈希以外的字符
我个人强烈建议第二种选择。阅读一些带有#条的文本,我不太清楚这是一个链接。然而,[#bar]
(或类似)将更加清楚。这正是我正在考虑的两种解决方案Treeprocessor
是在所有InlineProcessor
替换和my标记更改语法后应用的,它们会中断解析。通过查看,我们看到它应用于root
,他是我的html
代码。我认为将HEX中的颜色替换为RGB,但这只能推迟到后来的问题。我会听从你的建议,改进我的语法!