3

私の目標は、bitbucketのwikiブラウザのローカルで閲覧可能なクローンを作成することです。ページはクレオール構文を使用して記述されます。

私はpython-creoleを使用してファイルをhtmlにレンダリングしています。比較的正常に動作しますが、python-creoleとbitbucketが内部リンクをレンダリングする方法に違いがあります。

Bitbucketサイトでは、のようなスペースを持つ内部リンクは次の[[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シェルで、次のコードを試しました。

>>> 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 に答える