【问题标题】:Change internal links rendering using python-creole使用 python-creole 更改内部链接呈现
【发布时间】:2011-12-17 21:16:32
【问题描述】:

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

我正在使用 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 以用 _ 替换空格吗?

【问题讨论】:

    标签: python markup bitbucket creole


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想我找到了一种非常肮脏的方法来做到这一点。寻找克里奥尔语源代码,将链接转换为 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>'
      

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-04
        • 2012-05-06
        • 2018-04-23
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        相关资源
        最近更新 更多