__all__ = ['math', 'math_in_quote', 'math_in_list'] BLOCK_MATH_PATTERN = r'^ {0,3}\$\$[ \t]*\n(?P[\s\S]+?)\n\$\$[ \t]*$' INLINE_MATH_PATTERN = r'\$(?!\s)(?P.+?)(?!\s)\$' def parse_block_math(block, m, state): text = m.group('math_text') state.append_token({'type': 'block_math', 'raw': text}) return m.end() + 1 def parse_inline_math(inline, m, state): text = m.group('math_text') state.append_token({'type': 'inline_math', 'raw': text}) return m.end() def render_block_math(renderer, text): return '
$$\n' + text + '\n$$
\n' def render_inline_math(renderer, text): return r'\(' + text + r'\)' def math(md): """A mistune plugin to support math. The syntax is used by many markdown extensions: .. code-block:: text Block math is surrounded by $$: $$ f(a)=f(b) $$ Inline math is surrounded by `$`, such as $f(a)=f(b)$ :param md: Markdown instance """ md.block.register('block_math', BLOCK_MATH_PATTERN, parse_block_math, before='list') md.inline.register('inline_math', INLINE_MATH_PATTERN, parse_inline_math, before='link') if md.renderer and md.renderer.NAME == 'html': md.renderer.register('block_math', render_block_math) md.renderer.register('inline_math', render_inline_math) def math_in_quote(md): """Enable block math plugin in block quote.""" md.block.insert_rule(md.block.block_quote_rules, 'block_math', before='list') def math_in_list(md): """Enable block math plugin in list.""" md.block.insert_rule(md.block.list_rules, 'block_math', before='list')