Уценка: восстановление пробела, захваченного в разделителе - PullRequest
2 голосов
/ 14 апреля 2020

Я создаю пользовательское расширение уценки в 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)

Наилучшим решением было бы добавить пробел, если слово следует за тегом.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Я думаю, что \s - это проблема.

Простой тестовый код.

import re

r = r'(@)(.*?)(\s|$)'
print(re.sub(r, "LINKCODE", "@username as said something"))

t = r'(@)(\w*)'
print(re.sub(t, "LINKCODE", "@username as said something"))

выход

LINKCODEas said something
LINKCODE as said something

Так что, возможно, вы могли бы попробовать заменить Ваше регулярное выражение с r'(@)(\w*)' или r'(@)([^\s]*)'? В зависимости от того, какие символы вы разрешаете в имени пользователя.

1 голос
/ 14 апреля 2020

Это
((?=@\w+ \w+)@\w+ |@\w+[^ ])
- это то, что работает для меня.

Вы можете проверить это здесь здесь с примерами ниже. Для каждой части есть подробное объяснение. Если это все еще нуждается в пояснениях, я с радостью помогу вам.

@hello word @hello $ymbol @hello newline foo @hello word foo @hello $ymbol foo @hello newline

Если после @xxx есть слово, оно также соответствует пробелу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...