Изменить рендеринг внутренних ссылок с помощью python-creole

#python #markup #bitbucket #creole

#питон #разметка #битбакет #креольский

Вопрос:

Моя цель — создать локально просматриваемый клон вики-браузера bitbucket. Страницы написаны с использованием креольского синтаксиса.

Я использую 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 на замену пробелов на _ и как?

Ответ №1:

Ответ Ascobol работает, но чище использовать наследование классов.

Это (слегка измененная) выдержка из вики-приложения, которое я создаю. Он изменяет выходные данные из ссылок и таблиц. Если вы хотите узнать, какие методы вы можете переопределить, вы можете посмотреть исходный код 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 


Ответ №2:

Я думаю, что нашел довольно грязный способ сделать это. Глядя на исходный код creole, код, который превращает ссылки в 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>'
 

Точный код для замены пробелов на '_' оставлен в качестве упражнения для читателя...

Я все еще ищу более правильный способ сделать это "официальным способом".

, 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:

Я думаю, что нашел довольно грязный способ сделать это. Глядя на исходный код creole, код, который превращает ссылки в html, находится здесь:


В оболочке python я попробовал следующий код:


Точный код для замены пробелов на ‘_’ оставлен в качестве упражнения для читателя…

Я все еще ищу более правильный способ сделать это «официальным способом».