Skip to content

Instantly share code, notes, and snippets.

@AmatanHead
Created March 2, 2016 22:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AmatanHead/117b9dac6dfe179421e3 to your computer and use it in GitHub Desktop.
Save AmatanHead/117b9dac6dfe179421e3 to your computer and use it in GitHub Desktop.
from funcparserlib.lexer import make_tokenizer, Token, LexerError
from funcparserlib.parser import some, a, maybe, many, finished, skip, \
forward_decl, NoParseError
const = lambda x: lambda _: x
tokval = lambda x: x.value
toktype = lambda t: some(lambda x: x.type == t) >> tokval
op = lambda s: a(Token('Op', s)) >> tokval
op_ = lambda s: skip(op(s))
nop = lambda s: some(lambda t: t.type == 'Op' and t.value != s) >> tokval
nop_ = lambda s: skip(nop(s))
class Tokenizer(object):
tokens = [
('Op', (r'`|~~|\*\*\*|\*\*|\*|######|#####|####|###|##|#|/-|-/',)),
('Text', (r'([^~\\#`*@$\n]|\\[^\n])+',)),
]
def __call__(self, s):
return list(make_tokenizer(self.tokens)(s))
class Parser(object):
tokenizer = Tokenizer()
inlines = forward_decl()
text = toktype('Text')
plain_text_code = many(toktype('Text') | nop('`')) >> ''.join
inline_code = op_('`') + plain_text_code + op_('`') >> (lambda x: '<code>' + x + '</code>')
emphasis = op_('*') + inlines + op_('*') >> (lambda x: '<em>' + x + '</em>')
double_emphasis = op_('**') + inlines + op_('**') >> (lambda x: '<strong>' + x + '</strong>')
triple_emphasis = op_('***') + inlines + op_('***') >> (lambda x: '<u>' + x + '</u>')
strike = op_('~~') + inlines + op_('~~') >> (lambda x: '<s>' + x + '</s>')
cite = op_('/-') + inlines + op_('-/') >> (lambda x: '<cite>' + x + '</cite>')
inlines.define(
triple_emphasis
|
double_emphasis
|
emphasis
|
strike
|
inline_code
|
text
)
start = many(inlines) >> ''.join
def __call__(self, s):
return self.start.parse(self.tokenizer(s))
parser = Parser()
print(parser(input()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment