首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python能支持图像板样式的链接吗?

Python能支持图像板样式的链接吗?
EN

Stack Overflow用户
提问于 2021-09-28 04:27:25
回答 1查看 52关注 0票数 0

我想向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中学到的知识,我编写了一个自定义扩展:

代码语言:javascript
复制
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>。上面的实现有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-28 13:21:54

问题是您的新语法与先前存在的块引号语法冲突。您的分机可能会工作,如果它曾经被调用。然而,由于冲突,这种情况从未发生过。注意,它们是五种类型的处理器。As 记录在案

  • 预处理程序在将源传递给解析器之前对其进行更改。
  • 块处理器处理由空行分隔的文本块。
  • 树处理器修改构造的ElementTree
  • 内联处理器是用于内联元素(如*strong* )的常见树处理器。
  • 在解析器返回之前,后处理器将处理解析器的输出。

这里最重要的是处理器按照这个顺序运行。换句话说,所有块处理器都是在任何内联处理器运行之前运行的。因此,块引号块处理器首先在输入端运行,并移除双角括号,将行的其余部分包装成双blockquote标记。当内联处理器看到文档时,正则表达式将不再匹配,因此永远不会被调用。

也就是说,内联处理器是实现链接语法的正确方法。但是,您需要做两件事中的一件才能让它正常工作。

  1. 更改语法,使其不与任何预先存在的语法发生冲突;或
  2. 改变封锁行为以避免冲突。

就我个人而言,我推荐选项1,但据我所知,您正在尝试实现来自另一个环境的预先存在的语法。因此,如果您想探索选项2,那么我建议可能使块引号语法更严格一些。例如,虽然它不是必需的,但建议的语法总是在块引号中的角括号后面插入一个空格。修改BlockquoteProcessor以要求空间应该相对简单,这将使您的语法不再冲突。

这其实很简单。正如您可能注意到的,整个语法是通过一个相当简单的regex定义的:

代码语言:javascript
复制
RE = re.compile(r'(^|\n)[ ]{0,3}>[ ]?(.*)')

您只需要重写它,这样就不再接受0空格(>而不是>[ ]?)。首先导入现有处理器并将其子类,然后重写regex:

代码语言:javascript
复制
from markdown.blockprocessors import BlockquoteProcessor

class CustomBlockquoteProcessor(BlockquoteProcessor):
    RE = re.compile(r'(^|\n)[ ]{0,3}> (.*)')

最后,您只需要告诉Markdown使用自定义类,而不是默认的。将以下内容添加到extendMarkdown类的ImageboardLinkExtension方法中:

代码语言:javascript
复制
md.parser.blockprocessors.register(CustomBlockQuoteProcessor(md.parser), 'quote', 20)

现在,区块引号语法将不再与您的链接语法冲突,您将有机会在文本上运行您的代码。只是要小心,记住总是包括任何实际的区块引号现在所需的空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69355806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档