Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/mistune/plugins/formatting.py: 61%

67 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-07-01 06:54 +0000

1import re 

2from ..helpers import PREVENT_BACKSLASH 

3 

4__all__ = ["strikethrough", "mark", "insert", "superscript", "subscript"] 

5 

6_STRIKE_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\~|[^\s~])~~(?!~)') 

7_MARK_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\=|[^\s=])==(?!=)') 

8_INSERT_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\\^|[^\s^])\^\^(?!\^)') 

9 

10SUPERSCRIPT_PATTERN = r'\^(?:' + PREVENT_BACKSLASH + r'\\\^|\S|\\ )+?\^' 

11SUBSCRIPT_PATTERN = r'~(?:' + PREVENT_BACKSLASH + r'\\~|\S|\\ )+?~' 

12 

13 

14def parse_strikethrough(inline, m, state): 

15 return _parse_to_end(inline, m, state, 'strikethrough', _STRIKE_END) 

16 

17 

18def render_strikethrough(renderer, text): 

19 return '<del>' + text + '</del>' 

20 

21 

22def parse_mark(inline, m, state): 

23 return _parse_to_end(inline, m, state, 'mark', _MARK_END) 

24 

25 

26def render_mark(renderer, text): 

27 return '<mark>' + text + '</mark>' 

28 

29 

30def parse_insert(inline, m, state): 

31 return _parse_to_end(inline, m, state, 'insert', _INSERT_END) 

32 

33 

34def render_insert(renderer, text): 

35 return '<ins>' + text + '</ins>' 

36 

37 

38def parse_superscript(inline, m, state): 

39 return _parse_script(inline, m, state, 'superscript') 

40 

41 

42def render_superscript(renderer, text): 

43 return '<sup>' + text + '</sup>' 

44 

45 

46def parse_subscript(inline, m, state): 

47 return _parse_script(inline, m, state, 'subscript') 

48 

49 

50def render_subscript(renderer, text): 

51 return '<sub>' + text + '</sub>' 

52 

53 

54def _parse_to_end(inline, m, state, tok_type, end_pattern): 

55 pos = m.end() 

56 m1 = end_pattern.search(state.src, pos) 

57 if not m1: 

58 return 

59 end_pos = m1.end() 

60 text = state.src[pos:end_pos-2] 

61 new_state = state.copy() 

62 new_state.src = text 

63 children = inline.render(new_state) 

64 state.append_token({'type': tok_type, 'children': children}) 

65 return end_pos 

66 

67 

68def _parse_script(inline, m, state, tok_type): 

69 text = m.group(0) 

70 new_state = state.copy() 

71 new_state.src = text[1:-1].replace('\\ ', ' ') 

72 children = inline.render(new_state) 

73 state.append_token({ 

74 'type': tok_type, 

75 'children': children 

76 }) 

77 return m.end() 

78 

79 

80def strikethrough(md): 

81 """A mistune plugin to support strikethrough. Spec defined by 

82 GitHub flavored Markdown and commonly used by many parsers: 

83 

84 .. code-block:: text 

85 

86 ~~This was mistaken text~~ 

87 

88 It will be converted into HTML: 

89 

90 .. code-block:: html 

91 

92 <del>This was mistaken text</del> 

93 

94 :param md: Markdown instance 

95 """ 

96 md.inline.register( 

97 'strikethrough', 

98 r'~~(?=[^\s~])', 

99 parse_strikethrough, 

100 before='link', 

101 ) 

102 if md.renderer and md.renderer.NAME == 'html': 

103 md.renderer.register('strikethrough', render_strikethrough) 

104 

105 

106def mark(md): 

107 """A mistune plugin to add ``<mark>`` tag. Spec defined at 

108 https://facelessuser.github.io/pymdown-extensions/extensions/mark/: 

109 

110 .. code-block:: text 

111 

112 ==mark me== ==mark \\=\\= equal== 

113 

114 :param md: Markdown instance 

115 """ 

116 md.inline.register( 

117 'mark', 

118 r'==(?=[^\s=])', 

119 parse_mark, 

120 before='link', 

121 ) 

122 if md.renderer and md.renderer.NAME == 'html': 

123 md.renderer.register('mark', render_mark) 

124 

125 

126def insert(md): 

127 """A mistune plugin to add ``<ins>`` tag. Spec defined at 

128 https://facelessuser.github.io/pymdown-extensions/extensions/caret/#insert: 

129 

130 .. code-block:: text 

131 

132 ^^insert me^^ 

133 

134 :param md: Markdown instance 

135 """ 

136 md.inline.register( 

137 'insert', 

138 r'\^\^(?=[^\s\^])', 

139 parse_insert, 

140 before='link', 

141 ) 

142 if md.renderer and md.renderer.NAME == 'html': 

143 md.renderer.register('insert', render_insert) 

144 

145 

146def superscript(md): 

147 """A mistune plugin to add ``<sup>`` tag. Spec defined at 

148 https://pandoc.org/MANUAL.html#superscripts-and-subscripts: 

149 

150 .. code-block:: text 

151 

152 2^10^ is 1024. 

153 

154 :param md: Markdown instance 

155 """ 

156 md.inline.register('superscript', SUPERSCRIPT_PATTERN, parse_superscript, before='linebreak') 

157 if md.renderer and md.renderer.NAME == 'html': 

158 md.renderer.register('superscript', render_superscript) 

159 

160 

161def subscript(md): 

162 """A mistune plugin to add ``<sub>`` tag. Spec defined at 

163 https://pandoc.org/MANUAL.html#superscripts-and-subscripts: 

164 

165 .. code-block:: text 

166 

167 H~2~O is a liquid. 

168 

169 :param md: Markdown instance 

170 """ 

171 md.inline.register('subscript', SUBSCRIPT_PATTERN, parse_subscript, before='linebreak') 

172 if md.renderer and md.renderer.NAME == 'html': 

173 md.renderer.register('subscript', render_subscript)