2017-02-09 3 views
1

mistune (markdown parser in python)에 '그림 이모'문법을 추가하려고했지만 불행히도 성공적이지 않았습니다. 나는 정규 표현식에 익숙하지 않기 때문에 내 문제가있을 수 있지만 무엇을 알아 내지 못하고있다. 내 것은 mistune에서 찾은 것들을 기반으로합니다. 문제는 mistune이 첫 번째 패턴 (글자 그대로 블록의 첫 번째 패턴)과 일치하며 첫 번째 일치 후 모든 이모티콘 패턴이 일반 텍스트로 처리된다는 것입니다. 이것은 내가 가지고 올 한 코드입니다 :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

를 참조 (적어도 그것은 regex101에 않습니다) 내가 파이썬 모르지만이 작동합니다'^''문자열/line' – Fallenhero

+0

의 시작을 의미하는 @ Fallenhero 여전히 같은 출력. 정규 표현식의 몇 가지 변형을 시도했지만 모두 동일한 결과를 보였습니다 (또는 심지어 일치하지 않았습니다). –

+1

@Fallenhero 사실, Mistune은 이미 일치하는 텍스트를 문자열의 앞쪽으로 스트라이핑하여 텍스트를 변경하므로 모든 정규식은 문자열 시작 부분에서 시작되도록 '^'으로 시작해야합니다. [코드] (https://github.com/lepture/mistune/blob/master/mistune.py#L563)를 참조하십시오. – Waylan

답변