Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/mistune/markdown.py: 80%
60 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 06:10 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-03 06:10 +0000
1from .block_parser import BlockParser, expand_leading_tab, cleanup_lines
2from .inline_parser import InlineParser
5class Markdown(object):
6 def __init__(self, renderer, block=None, inline=None, plugins=None):
7 if block is None:
8 block = BlockParser()
10 if inline is None:
11 inline = InlineParser(renderer)
13 self.block = block
14 self.inline = inline
15 self.renderer = inline.renderer
16 self.before_parse_hooks = []
17 self.before_render_hooks = []
18 self.after_render_hooks = []
20 if plugins:
21 for plugin in plugins:
22 plugin(self)
24 def use(self, plugin):
25 plugin(self)
27 def before_parse(self, s, state):
28 s, state = preprocess(s, state)
29 for hook in self.before_parse_hooks:
30 s, state = hook(self, s, state)
31 return s, state
33 def before_render(self, tokens, state):
34 for hook in self.before_render_hooks:
35 tokens = hook(self, tokens, state)
36 return tokens
38 def after_render(self, result, state):
39 for hook in self.after_render_hooks:
40 result = hook(self, result, state)
41 return result
43 def parse(self, s, state=None):
44 if state is None:
45 state = {}
47 s, state = self.before_parse(s, state)
48 tokens = self.block.parse(s, state)
49 tokens = self.before_render(tokens, state)
50 result = self.block.render(tokens, self.inline, state)
51 result = self.after_render(result, state)
52 return result
54 def read(self, filepath, state=None):
55 if state is None:
56 state = {}
58 state['__file__'] = filepath
59 with open(filepath, 'rb') as f:
60 s = f.read()
62 return self.parse(s.decode('utf-8'), state)
64 def __call__(self, s):
65 return self.parse(s)
68def preprocess(s, state):
69 state.update({
70 'def_links': {},
71 'def_footnotes': {},
72 'footnotes': [],
73 })
75 if s is None:
76 s = '\n'
77 else:
78 s = s.replace('\u2424', '\n')
79 s = cleanup_lines(s)
80 s = expand_leading_tab(s)
81 if not s.endswith('\n'):
82 s += '\n'
84 return s, state