Изменить рендеринг внутренних ссылок с помощью python-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-креоль в замену пробелов на _ и как?
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 я попробовал следующий код:
>>> 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-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())