2011-10-29 15 views
3

我的目標是創建bitbucket的wiki瀏覽器的本地可瀏覽的克隆。 頁面使用creole語法編寫。使用python-creole更改內部鏈接呈現

我正在使用python-creole將文件轉換爲html。它工作得相當好,但python-creole和bitbucket渲染內部鏈接的方式有所不同。

在現場到位桶,與像[[system programming]]空間內部鏈接將呈現爲類似<a href="/wiki/system_programming">system programming</a>(空格被替換_),而使用python-克里奧爾這將使到<a href="system programming">system programming</a>

我可以調整蟒蛇克里奧爾到_替換空格和如何?

回答

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

確切的代碼來替換由「空間_'作爲練習留給讀者...

我仍然在尋找更正確的方法來做到這一點在「官方的方式」。

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())