Misaka HTML\u SAFELINK(或hoedown SAFELINK)渲染标志替换?

2024-04-25 20:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在更新一个Python Django应用程序,该应用程序使用了旧版本的misaka,它将自己描述为“基于CFFI的Hoedown绑定,一个快速降价处理库”。我的Django应用程序中的相关代码如下:

render_flags=(misaka.HTML_SAFELINK)

但是misaka 2.0文档不再显示作为呈现标志选项(Django应用程序因此抛出一个错误):

http://misaka.61924.nl/#html-render-flags

似乎SAFELINK已经从hoedown本身移除了。显然,HTML\u SAFELINK的目的是只允许链接到安全协议。你知道吗

在我看来,在当前的misaka 2.0和hoedown render flag选项中,HTML\u SAFELINK没有合适的替代品,这些选项是HTML\u SKIP\u HTML、HTML\u ESCAPE、HTML\u HARD\u WRAP和HTML\u USE\u XHTML。你知道吗

我能不能有把握地假设国旗一开始是毫无意义的,把它排除在外也没有真正的风险?或者在misaka/hoedown中是否有其他方法阻止指向“不安全”协议的链接?你知道吗


Tags: django代码应用程序协议链接html选项render
1条回答
网友
1楼 · 发布于 2024-04-25 20:20:43

唯一的解决方案似乎是创建一个HtmlRenderer子类来复制SAFELINK标志所做的事情。这里是the one I wrote for Liberapay(我已经发送了a proposal to integrate it into Misaka):

import re

from markupsafe import Markup, escape
import misaka as m


url_re = re.compile(r'^(https?|xmpp):')


class CustomRenderer(m.HtmlRenderer):

    def image(self, link, title='', alt=''):
        if url_re.match(link):
            maybe_alt = Markup(' alt="%s"') % alt if alt else ''
            maybe_title = Markup(' title="%s"') % title if title else ''
            return Markup('<img src="%s"%s%s />') % (link, maybe_alt, maybe_title)
        else:
            return escape("![%s](%s)" % (alt, link))

    def link(self, content, link, title=''):
        if url_re.match(link):
            maybe_title = Markup(' title="%s"') % title if title else ''
            return Markup('<a href="%s"%s>' + content + '</a>') % (link, maybe_title)
        else:
            return escape("[%s](%s)" % (content, link))

    def autolink(self, link, is_email):
        if url_re.match(link):
            return Markup('<a href="%s">%s</a>') % (link, link)
        else:
            return escape('<%s>' % link)


renderer = CustomRenderer(flags=m.HTML_SKIP_HTML)
md = m.Markdown(renderer, extensions=('autolink', 'strikethrough', 'no-intra-emphasis'))


def render(markdown):
    return Markup(md(markdown))

相关问题 更多 >