You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:09:02