我想向Python添加一个额外的语法:如果n是一个正整数,那么>>n应该扩展为<a href="#post-n">n</a>。(双角度括号(>>)是在图板论坛中创建链接的一种传统语法。)
默认情况下,Python将>>n扩展为嵌套的区块引号:<blockquote><blockquote>n</blockquote></blockquote>。有没有办法在>>n之外创建链接,同时保留块引用的其他默认行为?换句话说,如果x是正整数,那么>>x应该扩展到链接中,但是如果x不是正整数,>>x仍然应该扩展为嵌套的块引号。
我读过相关的wiki文章:教程1为Python标记编写扩展。基于我在wiki中学到的知识,我编写了一个自定义扩展:
import markdown
import xml.etree.ElementTree as ET
from markdown.extensions import Extension
from markdown.inlinepatterns import Pattern
class ImageboardLinkPattern(Pattern):
def handleMatch(self, match):
number = match.group('number')
# Create link.
element = ET.Element('a', attrib={'href': f'#post-{number}'})
element.text = f'>>{number}'
return element
class ImageboardLinkExtension(Extension):
def extendMarkdown(self, md):
IMAGEBOARD_LINK_RE = '>>(?P<number>[1-9][0-9]*)'
imageboard_link = ImageboardLinkPattern(IMAGEBOARD_LINK_RE)
md.inlinePatterns['imageboard_link'] = imageboard_link
html = markdown.markdown('>>123',
extensions=[ImageboardLinkExtension()])
print(html)然而,>>123仍然生产<blockquote><blockquote>123</blockquote></blockquote>。上面的实现有什么问题?
发布于 2021-09-28 13:21:54
问题是您的新语法与先前存在的块引号语法冲突。您的分机可能会工作,如果它曾经被调用。然而,由于冲突,这种情况从未发生过。注意,它们是五种类型的处理器。As 记录在案
*strong* )的常见树处理器。这里最重要的是处理器按照这个顺序运行。换句话说,所有块处理器都是在任何内联处理器运行之前运行的。因此,块引号块处理器首先在输入端运行,并移除双角括号,将行的其余部分包装成双blockquote标记。当内联处理器看到文档时,正则表达式将不再匹配,因此永远不会被调用。
也就是说,内联处理器是实现链接语法的正确方法。但是,您需要做两件事中的一件才能让它正常工作。
就我个人而言,我推荐选项1,但据我所知,您正在尝试实现来自另一个环境的预先存在的语法。因此,如果您想探索选项2,那么我建议可能使块引号语法更严格一些。例如,虽然它不是必需的,但建议的语法总是在块引号中的角括号后面插入一个空格。修改BlockquoteProcessor以要求空间应该相对简单,这将使您的语法不再冲突。
这其实很简单。正如您可能注意到的,整个语法是通过一个相当简单的regex定义的:
RE = re.compile(r'(^|\n)[ ]{0,3}>[ ]?(.*)')您只需要重写它,这样就不再接受0空格(>而不是>[ ]?)。首先导入现有处理器并将其子类,然后重写regex:
from markdown.blockprocessors import BlockquoteProcessor
class CustomBlockquoteProcessor(BlockquoteProcessor):
RE = re.compile(r'(^|\n)[ ]{0,3}> (.*)')最后,您只需要告诉Markdown使用自定义类,而不是默认的。将以下内容添加到extendMarkdown类的ImageboardLinkExtension方法中:
md.parser.blockprocessors.register(CustomBlockQuoteProcessor(md.parser), 'quote', 20)现在,区块引号语法将不再与您的链接语法冲突,您将有机会在文本上运行您的代码。只是要小心,记住总是包括任何实际的区块引号现在所需的空间。
https://stackoverflow.com/questions/69355806
复制相似问题