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
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-01 06:54 +0000
1import re
2from ..helpers import PREVENT_BACKSLASH
4__all__ = ["strikethrough", "mark", "insert", "superscript", "subscript"]
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^])\^\^(?!\^)')
10SUPERSCRIPT_PATTERN = r'\^(?:' + PREVENT_BACKSLASH + r'\\\^|\S|\\ )+?\^'
11SUBSCRIPT_PATTERN = r'~(?:' + PREVENT_BACKSLASH + r'\\~|\S|\\ )+?~'
14def parse_strikethrough(inline, m, state):
15 return _parse_to_end(inline, m, state, 'strikethrough', _STRIKE_END)
18def render_strikethrough(renderer, text):
19 return '<del>' + text + '</del>'
22def parse_mark(inline, m, state):
23 return _parse_to_end(inline, m, state, 'mark', _MARK_END)
26def render_mark(renderer, text):
27 return '<mark>' + text + '</mark>'
30def parse_insert(inline, m, state):
31 return _parse_to_end(inline, m, state, 'insert', _INSERT_END)
34def render_insert(renderer, text):
35 return '<ins>' + text + '</ins>'
38def parse_superscript(inline, m, state):
39 return _parse_script(inline, m, state, 'superscript')
42def render_superscript(renderer, text):
43 return '<sup>' + text + '</sup>'
46def parse_subscript(inline, m, state):
47 return _parse_script(inline, m, state, 'subscript')
50def render_subscript(renderer, text):
51 return '<sub>' + text + '</sub>'
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
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()
80def strikethrough(md):
81 """A mistune plugin to support strikethrough. Spec defined by
82 GitHub flavored Markdown and commonly used by many parsers:
84 .. code-block:: text
86 ~~This was mistaken text~~
88 It will be converted into HTML:
90 .. code-block:: html
92 <del>This was mistaken text</del>
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)
106def mark(md):
107 """A mistune plugin to add ``<mark>`` tag. Spec defined at
108 https://facelessuser.github.io/pymdown-extensions/extensions/mark/:
110 .. code-block:: text
112 ==mark me== ==mark \\=\\= equal==
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)
126def insert(md):
127 """A mistune plugin to add ``<ins>`` tag. Spec defined at
128 https://facelessuser.github.io/pymdown-extensions/extensions/caret/#insert:
130 .. code-block:: text
132 ^^insert me^^
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)
146def superscript(md):
147 """A mistune plugin to add ``<sup>`` tag. Spec defined at
148 https://pandoc.org/MANUAL.html#superscripts-and-subscripts:
150 .. code-block:: text
152 2^10^ is 1024.
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)
161def subscript(md):
162 """A mistune plugin to add ``<sub>`` tag. Spec defined at
163 https://pandoc.org/MANUAL.html#superscripts-and-subscripts:
165 .. code-block:: text
167 H~2~O is a liquid.
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)