Я пытаюсь добавить грамматику 'emoji' в mistune (markdown parser in python), но, к сожалению, я не добился успеха. Я не настолько опытен с регулярными выражениями, поэтому может быть что-то не так с моим, но я просто не могу понять, что. Мой немного основан на тех, которые я нашел в mistune. Проблема в том, что туманность будет соответствовать только первому шаблону (например, буквально первый в блоке), и каждый шаблон emoji после первого совпадения обрабатывается как обычный текст. Это код, который я придумал:Mistune Markdown парсер только соответствует первому обнаружению моего шаблона эможи
import re
import mistune
class EmojiRenderer(object):
def emoji(self, text):
return "<emoji>%s</emoji>" % text
class EmojiInlineLexer(mistune.InlineLexer):
def __init__(self, **kwargs):
super(EmojiInlineLexer, self).__init__(**kwargs)
self.default_rules.insert(0, "emoji")
self.rules.emoji = re.compile(r'^:([a-zA-Z0-9\+\-_]+):', re.I)
def output_emoji(self, m):
text = self.output(m.group(1))
return self.renderer.emoji(text)
class MarkdownRenderer(mistune.Renderer, EmojiRenderer):
def __init__(self, **kwargs):
super(MarkdownRenderer, self).__init__(**kwargs)
renderer = MarkdownRenderer()
inline = EmojiInlineLexer(renderer=renderer)
markdown = mistune.Markdown(renderer=renderer, inline=inline)
demo_text = """
:thumbs_up: *this works*
this doesn't work :thumbs_down:
:smile: :cry:ing
"""
print(markdown(demo_text))
и это выход:
<p><emoji>thumbs_up</emoji> <em>this works</em></p>
<p>this doesn't work :thumbs_down:</p>
<p><emoji>smile</emoji> :cry:ing</p>
но ожидаемый результат должен быть
<p><emoji>thumbs_up</emoji> <em>this works</em></p>
<p>this doesn't work <emoji>thumbs_down</emoji></p>
<p><emoji>smile</emoji> <emoji>cry</emoji>ing</p>
Я был бы очень признателен любой вход /Помогите.
вы используете '' ^, что означает 'начало строки/line' – Fallenhero
@ Fallenhero Все тот же результат. Я пробовал несколько вариантов регулярного выражения, но все они имели одинаковый результат (или даже не совпадали). –
@Fallenhero на самом деле, Mistune изменяет текст, разделяя уже согласованный текст с передней части строки, поэтому каждое регулярное выражение должно начинаться с '^', чтобы заставить его начинаться в начале строки. См. [Код] (https://github.com/lepture/mistune/blob/master/mistune.py#L563). – Waylan