import re
from ..helpers import PREVENT_BACKSLASH
__all__ = ["strikethrough", "mark", "insert", "superscript", "subscript"]
_STRIKE_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\~|[^\s~])~~(?!~)')
_MARK_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\=|[^\s=])==(?!=)')
_INSERT_END = re.compile(r'(?:' + PREVENT_BACKSLASH + r'\\\^|[^\s^])\^\^(?!\^)')
SUPERSCRIPT_PATTERN = r'\^(?:' + PREVENT_BACKSLASH + r'\\\^|\S|\\ )+?\^'
SUBSCRIPT_PATTERN = r'~(?:' + PREVENT_BACKSLASH + r'\\~|\S|\\ )+?~'
def parse_strikethrough(inline, m, state):
return _parse_to_end(inline, m, state, 'strikethrough', _STRIKE_END)
def render_strikethrough(renderer, text):
return '' + text + ''
def parse_mark(inline, m, state):
return _parse_to_end(inline, m, state, 'mark', _MARK_END)
def render_mark(renderer, text):
return '' + text + ''
def parse_insert(inline, m, state):
return _parse_to_end(inline, m, state, 'insert', _INSERT_END)
def render_insert(renderer, text):
return '' + text + ''
def parse_superscript(inline, m, state):
return _parse_script(inline, m, state, 'superscript')
def render_superscript(renderer, text):
return '' + text + ''
def parse_subscript(inline, m, state):
return _parse_script(inline, m, state, 'subscript')
def render_subscript(renderer, text):
return '' + text + ''
def _parse_to_end(inline, m, state, tok_type, end_pattern):
pos = m.end()
m1 = end_pattern.search(state.src, pos)
if not m1:
return
end_pos = m1.end()
text = state.src[pos:end_pos-2]
new_state = state.copy()
new_state.src = text
children = inline.render(new_state)
state.append_token({'type': tok_type, 'children': children})
return end_pos
def _parse_script(inline, m, state, tok_type):
text = m.group(0)
new_state = state.copy()
new_state.src = text[1:-1].replace('\\ ', ' ')
children = inline.render(new_state)
state.append_token({
'type': tok_type,
'children': children
})
return m.end()
def strikethrough(md):
"""A mistune plugin to support strikethrough. Spec defined by
GitHub flavored Markdown and commonly used by many parsers:
.. code-block:: text
~~This was mistaken text~~
It will be converted into HTML:
.. code-block:: html
This was mistaken text
:param md: Markdown instance
"""
md.inline.register(
'strikethrough',
r'~~(?=[^\s~])',
parse_strikethrough,
before='link',
)
if md.renderer and md.renderer.NAME == 'html':
md.renderer.register('strikethrough', render_strikethrough)
def mark(md):
"""A mistune plugin to add ```` tag. Spec defined at
https://facelessuser.github.io/pymdown-extensions/extensions/mark/:
.. code-block:: text
==mark me== ==mark \\=\\= equal==
:param md: Markdown instance
"""
md.inline.register(
'mark',
r'==(?=[^\s=])',
parse_mark,
before='link',
)
if md.renderer and md.renderer.NAME == 'html':
md.renderer.register('mark', render_mark)
def insert(md):
"""A mistune plugin to add ```` tag. Spec defined at
https://facelessuser.github.io/pymdown-extensions/extensions/caret/#insert:
.. code-block:: text
^^insert me^^
:param md: Markdown instance
"""
md.inline.register(
'insert',
r'\^\^(?=[^\s\^])',
parse_insert,
before='link',
)
if md.renderer and md.renderer.NAME == 'html':
md.renderer.register('insert', render_insert)
def superscript(md):
"""A mistune plugin to add ```` tag. Spec defined at
https://pandoc.org/MANUAL.html#superscripts-and-subscripts:
.. code-block:: text
2^10^ is 1024.
:param md: Markdown instance
"""
md.inline.register('superscript', SUPERSCRIPT_PATTERN, parse_superscript, before='linebreak')
if md.renderer and md.renderer.NAME == 'html':
md.renderer.register('superscript', render_superscript)
def subscript(md):
"""A mistune plugin to add ```` tag. Spec defined at
https://pandoc.org/MANUAL.html#superscripts-and-subscripts:
.. code-block:: text
H~2~O is a liquid.
:param md: Markdown instance
"""
md.inline.register('subscript', SUBSCRIPT_PATTERN, parse_subscript, before='linebreak')
if md.renderer and md.renderer.NAME == 'html':
md.renderer.register('subscript', render_subscript)