2011-10-29 22 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())