"""Markdown filters with mistune Used from markdown.py """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import print_function import re import mistune from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter from pygments.util import ClassNotFound from IPython.nbconvert.filters.strings import add_anchor from IPython.nbconvert.utils.exceptions import ConversionException from IPython.utils.decorators import undoc @undoc class MathBlockGrammar(mistune.BlockGrammar): block_math = re.compile("^\$\$(.*?)\$\$", re.DOTALL) latex_environment = re.compile(r"^\\begin\{([a-z]*\*?)\}(.*?)\\end\{\1\}", re.DOTALL) @undoc class MathBlockLexer(mistune.BlockLexer): default_rules = ['block_math', 'latex_environment'] + mistune.BlockLexer.default_rules def __init__(self, rules=None, **kwargs): if rules is None: rules = MathBlockGrammar() super(MathBlockLexer, self).__init__(rules, **kwargs) def parse_block_math(self, m): """Parse a $$math$$ block""" self.tokens.append({ 'type': 'block_math', 'text': m.group(1) }) def parse_latex_environment(self, m): self.tokens.append({ 'type': 'latex_environment', 'name': m.group(1), 'text': m.group(2) }) @undoc class MathInlineGrammar(mistune.InlineGrammar): math = re.compile("^\$(.+?)\$") text = re.compile(r'^[\s\S]+?(?=[\\%s\n' % \ mistune.escape(code) formatter = HtmlFormatter() return highlight(code, lexer, formatter) def header(self, text, level, raw=None): html = super(IPythonRenderer, self).header(text, level, raw=raw) return add_anchor(html) # Pass math through unaltered - mathjax does the rendering in the browser def block_math(self, text): return '$$%s$$' % text def latex_environment(self, name, text): return r'\begin{%s}%s\end{%s}' % (name, text, name) def inline_math(self, text): return '$%s$' % text def markdown2html_mistune(source): """Convert a markdown string to HTML using mistune""" return MarkdownWithMath(renderer=IPythonRenderer()).render(source)