Изменить рендеринг внутренних ссылок с помощью python-creole - PullRequest
3 голосов
/ 29 октября 2011

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

Я использую python-creole для рендеринга файлов в html. Он работает относительно хорошо, но есть разница между тем, как Python-Creole и Bitbucket рендерит внутренние ссылки.

На сайте Bitbucket внутренняя ссылка с пробелами, такими как [[system programming]], будет отображаться примерно в <a href="/wiki/system_programming">system programming</a> (пробелы заменены на _), а при использовании python-креоль это будет <a href="system programming">system programming</a>.

Можно ли настроить python-креоль в замену пробелов на _ и как?

Ответы [ 2 ]

2 голосов
/ 12 мая 2012

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

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

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

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

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

...