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

1from .block_parser import BlockParser, expand_leading_tab, cleanup_lines 

2from .inline_parser import InlineParser 

3 

4 

5class Markdown(object): 

6 def __init__(self, renderer, block=None, inline=None, plugins=None): 

7 if block is None: 

8 block = BlockParser() 

9 

10 if inline is None: 

11 inline = InlineParser(renderer) 

12 

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 = [] 

19 

20 if plugins: 

21 for plugin in plugins: 

22 plugin(self) 

23 

24 def use(self, plugin): 

25 plugin(self) 

26 

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 

32 

33 def before_render(self, tokens, state): 

34 for hook in self.before_render_hooks: 

35 tokens = hook(self, tokens, state) 

36 return tokens 

37 

38 def after_render(self, result, state): 

39 for hook in self.after_render_hooks: 

40 result = hook(self, result, state) 

41 return result 

42 

43 def parse(self, s, state=None): 

44 if state is None: 

45 state = {} 

46 

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 

53 

54 def read(self, filepath, state=None): 

55 if state is None: 

56 state = {} 

57 

58 state['__file__'] = filepath 

59 with open(filepath, 'rb') as f: 

60 s = f.read() 

61 

62 return self.parse(s.decode('utf-8'), state) 

63 

64 def __call__(self, s): 

65 return self.parse(s) 

66 

67 

68def preprocess(s, state): 

69 state.update({ 

70 'def_links': {}, 

71 'def_footnotes': {}, 

72 'footnotes': [], 

73 }) 

74 

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' 

83 

84 return s, state