3

我的目标是为 bitbucket 的 wiki 浏览器创建一个本地可浏览的克隆。页面使用克里奥尔语语法编写。

我正在使用 python-creole 将文件呈现为 html。它工作得比较好,但是 python-creole 和 bitbucket 呈现内部链接的方式有所不同。

在 Bitbucket 网站上,带有空格的内部链接 like[[system programming]]将呈现为<a href="/wiki/system_programming">system programming</a>(空格替换为_),而使用 python-creole 这将呈现为<a href="system programming">system programming</a>.

我可以将 python-creole 调整为用 _ 替换空格吗?如何?

4

2 回答 2

2

Ascobol 的答案有效,但使用类继承更简洁。

这是从我正在制作的 wiki 应用程序中摘录的(略有改动)。它改变了链接和表格的输出。如果您想查看可以覆盖哪些方法,可以查看 python-creole 的源代码。

class WikiLinkHtmlEmitter(HtmlEmitter):
    def link_emit(self, node):
        target = node.content
        if node.children:
            inside = self.emit_children(node)
        else:
            inside = self.html_escape(target)
        m = self.link_rules.addr_re.match(target)
        if m:
            if m.group('extern_addr'):
                return u'<a href="%s">%s</a>' % (
                    self.attr_escape(target), inside)
            elif m.group('inter_wiki'):
                raise NotImplementedError
        if re.match(r'^\S+@\S+$', target):
            target = 'mailto:%s' % target
            return u'<a href="%s">%s</a>' % (
                self.attr_escape(target), inside)

        target = target.lower()
        target = slugify(target)

        target = '/wiki/' + target

        return u'<a href="%s" class="%s">%s</a>' % (
            self.attr_escape(target), classes, inside)

    def table_emit(self, node):
        return u'''
        <table class="table table-bordered table-striped">
            \n%s
        </table>\n''' % self.emit_children(node)

def creole_markup(value):
    document = Parser(value).parse()
    return mark_safe(WikiLinkHtmlEmitter(document).emit())
于 2012-05-11T22:26:34.373 回答
1

我想我找到了一种非常肮脏的方法来做到这一点。寻找克里奥尔源代码,将链接转换为 html 的代码在这里:

def link_emit(self, node):
    target = node.content
    if node.children:
        inside = self.emit_children(node)
    else:
        inside = self.html_escape(target)

    return '<a href="%s">%s</a>' % (
        self.attr_escape(target), inside)

在 python shell 中,我尝试了以下代码:

>>> import creole
>>> from creole.creole2html import emitter
>>> def new_emitter(self, node):
...    return 'blah'
>>> emitter.HtmlEmitter.link_emit = new_emitter
>>> creole.creole2html(u"[[link]]")
u'<p>blah</p>'

用'_'替换空格的确切代码留给读者作为练习......

我仍在寻找以“官方方式”执行此操作的更正确方法。

于 2011-10-29T16:02:09.650 回答