2011-10-29 6 views
3

私の目標は、bitbucketのwikiブラウザのローカルブラウズ可能なクローンを作成することです。 ページはcreole構文を使用して記述されます。python-creoleを使って内部リンクのレンダリングを変更する

私はファイルをHTMLにレンダリングするためにpython-creoleを使用しています。比較的うまく動作しますが、python-creoleとbitbucketが内部リンクをレンダリングする方法には違いがあります。 Bitbucketサイトで

これは<a href="system programming">system programming</a>にレンダリングするのpython-クレオールを使用しながら、[[system programming]]のようなスペースで内部リンクは、(スペースは_に置き換えられます)<a href="/wiki/system_programming">system programming</a>のようなものにレンダリングされます。

python-creoleをスペースで置き換えるように微調整できますか?

答えて

1

私はこれを行うにはかなり汚い方法を見つけたと思う。クレオールソースコードを見ると、HTMLへのリンクをオンコードはここにある: 'でスペースを置き換えるために

>>> 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>' 

正確なコード:私は、次のコードを試してみましたPythonシェルで

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) 

_ 'は読者の練習問題として残されています...

私はまだ「公式な方法」でこれを行うより正しい方法を探しています。

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'^\[email protected]\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()) 
関連する問題