Сначала я подумал, что как передать атрибут класса и значение в синтаксис уценки и Как установить атрибут класса HTML в Markdown? задал вопрос, который я хочу задать здесь , но я хочу знать, как написать расширение Python-markdown , которое выводит элемент span html с определенным атрибутом класса в Django.
Я написал следующее расширение (файл сохранен как "mdx_debatesyntax.py"):
import markdown
from markdown.inlinepatterns import Pattern
PREMISE_RE = r'(\[p )(.*?)\]'
class AttrTagPattern(Pattern):
"""
Return element of type `tag` with a text attribute of group(3)
of a Pattern and with the html attributes defined with the constructor.
"""
def __init__ (self, pattern, tag, attrs):
Pattern.__init__(self, pattern)
self.tag = tag
self.attrs = attrs
def handleMatch(self, m):
el = markdown.util.etree.Element(self.tag)
el.text = m.group(3)
for (key,val) in self.attrs.items():
el.set(key,val)
return el
class DebateSyntaxExtension(markdown.Extension):
def extendMarkdown(self, md, md_globals):
premise_tag = AttrTagPattern(PREMISE_RE, 'span',{'class':'premise'})
md.inlinePatterns.add('premise', premise_tag, '_begin')
def makeExtension(configs=None):
return DebateSyntaxExtension(configs=configs)
И когда я проверяю это напрямую (не через Django), это работает:
import markdown
md = markdown.Markdown(extensions=['debatesyntax'])
md.convert('This is a [p test]!')
Возвращает
u'<p>This is a <span class="premise">test</span>!</p>'
Однако, когда я запускаю это через Django, класс атрибута удаляется, давая мне:
<p>This is a <span>test</span>!</p>
Как предотвратить удаление атрибута класса (или других атрибутов)?
Разрешение
Приложение Django, которое я модифицировал (OSQA), вручную «санировало» HTML. В конце концов, код класса AttrTagPattern работает.