Я создаю пользовательское расширение уценки в python, которое анализирует пользовательский ввод на основе @
и в конце пробела \s
(или конечной строки). У меня нет проблем с генерацией правильного HTML следующим образом:
INPUT: @username
ВЫХОД: <p><a href="/user/username">@Username</a></p>
Но это правильно, если в моем теге нет другого слова после. Если что-то приходит после того, как я генерирую грязное HTML как:
INPUT: @username as said something
ВЫХОД: <p><a href="/user/username">@Username</a>as said something</p>
Как видите, между концом моего тега </a>
и словом as
отсутствует пробел. Я пробовал много разных вещей с treepreprocessors
и Postprocessor
, но мне не нужно заставлять их работать так, как я бы.
Текущий полный код:
from markdown.util import AtomicString, etree
from markdown.extensions import Extension
from markdown.inlinepatterns import InlineProcessor
USERNAME_RE = r'(@)(.*?)(\s|$)'
class UsernamePattern(InlineProcessor):
""" Return a link to User page based on '/user/<username> """
def handleMatch(self, m, data):
username = m.group(2)
el = markdown.util.etree.Element("a")
el.set('href', f'/user/{username}')
el.text = markdown.util.AtomicString(m.group(0))
return el, m.start(0), m.end(0)
class UsernameExtension(Extension):
"""
Wrap '@username' to <a href='/user/username'>@username</a>
"""
def extendMarkdown(self, md, md_globals):
md.registerExtension(self)
md.inlinePatterns['usernamelink'] = UsernamePattern(USERNAME_RE, md)
def makeExtension(*args, **kwargs):
return UsernameExtension(*args, **kwargs)
Наилучшим решением было бы добавить пробел, если слово следует за тегом.