2013-09-30 2 views
1

Я использую питон уценку сделать следующее:прилагая текст etree элемента HTML уценки

Когда есть выражение вида [test], я хочу сделать это как

<span>[<a>test</a>]</span> 

К что конец, я применяю расширение к inlinePatterns уценки в:

PATTERN = r'\[(test)\]' 

class PerceptionPattern(Pattern): 
    def handleMatch(self, m): 
     span = etree.Element('span') 
     anchor = etree.SubElement(span, "a") 
     span.text = markdown.util.AtomicString("[") 
     span.tail = markdown.util.AtomicString("]") 

     anchor.text = m.group(2) 
     return span 

class TestExtension(markdown.extensions.Extension): 
    """Adds cite extension to Markdown class""" 

    def extendMarkdown(self, md, md_globals): 
     """Modifies inline patterns""" 
     md.inlinePatterns.add('test', PerceptionPattern(PATTERN), '<not_strong') 

Однако это возвращение

<span>[]<a>test</a></span> 

Я не уверен .tail - правильный атрибут, но я не нахожу правильный синтаксис.

Как я могу это сделать?


Полная программа

from markdown.inlinepatterns import Pattern 
from markdown.util import etree 
from markdown import Markdown 
import markdown 

PATTERN = r'\[(test)\]' 


class TestPattern(Pattern): 
    def handleMatch(self, m): 
     span = etree.Element('span') 
     anchor = etree.SubElement(span, "a") 
     span.text = markdown.util.AtomicString("[") 
     span.tail = markdown.util.AtomicString("]") 
     #anchor.tail = markdown.util.AtomicString("]") 

     anchor.text = m.group(2) 
     return span 


class TestExtension(markdown.extensions.Extension): 
    def extendMarkdown(self, md, md_globals): 
     """Modifies inline patterns""" 
     md.inlinePatterns.add('test_pattern', TestPattern(PATTERN), '<not_strong') 

md = Markdown(extensions=[TestExtension()]) 

print md.convert(u'[test]') 
+2

Можете ли вы включить полную программу, которая демонстрирует проблему? См. Http://SSCCE.ORG/. –

+0

@ Robᵩ, добавлен полный пример, спасибо за ссылку. –

ответ

0

Мне кажется, что реализация синтаксиса [test] не лучший выбор, как это уже в use как документировано большинства реализаций (в том числе в Python, которых вы пытаясь изменить/расширить).

Кроме того, выход, который вы пытаетесь достичь, уже возможен с прямой уценкой (минус иначе бесполезный диапазон). Просто выполните: \[[test]()\]. То есть: выйдите из литеральных скобок и вставьте ссылку уценки между ними (с пустым URL-адресом, если это то, что вы хотите). См. output на Babelmark.

Конечно, я понимаю, что ваш пример может быть просто упрощенной реализацией чего-то более сложного, который является частью более крупной системы и требует простого синтаксиса, который может использоваться авторами-экспертами по разузнанию. Поэтому, чтобы ответить на интересующий вас вопрос:

Я предполагаю, что диапазон позволяет вам вставлять скобки в виде текста (например, умный). Однако закрывающая скобка будет хвостом якоря, а не пролетом. Вы хотите, чтобы он появился после закрывающего тега привязки, но не после тега закрытия закрытия.

>>> from markdown.util import etree 
>>> span = etree.Element('span') 
>>> anchor = etree.SubElement(span, 'a') 
>>> span.text = '[' 
>>> anchor.tail = ']' 
>>> anchor.text = 'test' 
>>> etree.tostring(span) 
'<span>[<a>test</a>]</span>' 

Ваш код должен быть вывод так: <span>[<a>test</a></span>]. Обратите внимание, что закрывающая скоба представляет собой хвост на пролете здесь, а не хвост на якоре.

Конечно, похоже, что вы не получаете ни одного из вышеприведенных в качестве вывода. Казалось бы, уценка как-то возится. Обтекание скобок в AtomicString() - это правильный ход, чтобы избежать ошибочного принятия других синтаксиса , но я не уверен, как хвост span добавляется к тексту в вашем примере.

Вы пытались вставить свой inlinePattern раньше? Возможно, перед любыми шаблонами, связанными с скобками? Скажем перед шаблоном «ссылки» ('<reference'). Посмотрите, поможет ли это.

Edit: Оказывается, что существует недавно обнаружили ошибку в Python-Markdown, который делает странные вещи, когда inlinePattern возвращает сложный элемент; в частности, элемент с детьми, особенно когда задействованы хвосты.Вы можете найти дополнительную информацию в этом comment в соответствующем отчете об ошибке. Когда эта проблема будет решена, ваш код будет работать с одной настройкой, на которую хвост элемента вы помещаете закрывающую скобку (как я объяснял выше). Пока эта ошибка не будет исправлена, я боюсь, что это не сработает. Вам придётся прибегнуть к решениям, которые не требуют расширения (ускользая от скобок).

Смежные вопросы