Python-Markdown能否支持Imageboard风格的>>n链接语法?
问题原因
- 块级解析优先级高于内联解析:Python Markdown的解析流程是先执行所有块级解析器,再对块内文本执行内联解析。你写的
>>123在块级解析阶段就会被块引用解析器识别为两层嵌套块引用,原始文本中的>>会被剥离,内联解析阶段根本接触不到原始的>>123字符串,你写的内联规则自然不会生效。 - 内联模式优先级未显式设置:即使规避了块级解析的问题,你注册内联模式时没有指定优先级,默认会排在现有内联规则之后,可能被其他规则抢先处理匹配内容。
解决方法
你需要先在块级解析之前的预处理阶段识别目标语法,避免被块引用解析器误处理,再完成链接转换。以下是可正常运行的修改后代码:
import markdown import xml.etree.ElementTree as ET from markdown.extensions import Extension from markdown.preprocessors import Preprocessor from markdown.inlinepatterns import InlineProcessor import re # 预处理阶段替换匹配的>>数字为占位符,避免被块引用解析 class ImageboardLinkPreprocessor(Preprocessor): IB_LINK_RE = re.compile(r'>>(?P<number>[1-9][0-9]*)') def run(self, lines): new_lines = [] for line in lines: processed = self.IB_LINK_RE.sub(r'{{__IB_LINK__|\g<number>}}', line) new_lines.append(processed) return new_lines # 内联阶段把占位符替换为链接 class ImageboardLinkProcessor(InlineProcessor): def handleMatch(self, match, data): number = match.group('number') element = ET.Element('a', attrib={'href': f'#post-{number}'}) element.text = f'>>{number}' return element, match.start(0), match.end(0) class ImageboardLinkExtension(Extension): def extendMarkdown(self, md): # 预处理器优先级高于块引用解析器(数值越小优先级越高) md.preprocessors.register(ImageboardLinkPreprocessor(md), 'ib_link_pre', 30) # 注册内联处理器匹配占位符 IB_PATTERN = r'{{__IB_LINK__\|(?P<number>[1-9][0-9]*)}}' md.inlinePatterns.register(ImageboardLinkProcessor(IB_PATTERN, md), 'ib_link', 200) # 测试 html = markdown.markdown('>>123\n>>test', extensions=[ImageboardLinkExtension()]) print(html)
运行后>>123会输出链接格式,>>test会保留默认的嵌套块引用行为,符合需求。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

