Misaka HTML_SAFELINK(或hoedown SAFELINK)渲染标志替换?

时间:2016-05-05 00:06:54

标签: python django markdown misaka hoedown

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

render_flags=(misaka.HTML_SAFELINK)

但misaka 2.0文档不再显示作为渲染标记选项(Django应用程序因此而抛出错误):

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

似乎SAFELINK已从haedown本身中移除。显然,HTML_SAFELINK的目的是仅允许链接到安全协议。

对我来说,在当前的misaka 2.0和hoedown渲染标记选项(HTML_SKIP_HTML,HTML_ESCAPE,HTML_HARD_WRAP和HTML_USE_XHTML)中,HTML_SAFELINK有一个合适的替代品。

我能否安全地假设旗帜首先是毫无意义的,并且没有真正的风险将其遗弃?或者在misaka / hoedown还有另一种阻止链接到“不安全”的方式吗?协议

1 个答案:

答案 0 :(得分:0)

唯一的解决方案似乎是创建一个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))