2017-02-09 1 views
1

Я пытаюсь добавить грамматику '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> 

Я был бы очень признателен любой вход /Помогите.

+0

вы используете '' ^, что означает 'начало строки/line' – Fallenhero

+0

@ Fallenhero Все тот же результат. Я пробовал несколько вариантов регулярного выражения, но все они имели одинаковый результат (или даже не совпадали). –

+1

@Fallenhero на самом деле, Mistune изменяет текст, разделяя уже согласованный текст с передней части строки, поэтому каждое регулярное выражение должно начинаться с '^', чтобы заставить его начинаться в начале строки. См. [Код] (https://github.com/lepture/mistune/blob/master/mistune.py#L563). – Waylan

ответ

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