File: mdx_math.py

package info (click to toggle)
meep-openmpi 1.25.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 64,556 kB
  • sloc: cpp: 32,214; python: 27,958; lisp: 1,225; makefile: 505; sh: 249; ansic: 131; javascript: 5
file content (60 lines) | stat: -rw-r--r-- 2,298 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
Math extension for Python-Markdown
==================================

Adds support for displaying math formulas using [MathJax](http://www.mathjax.org/).

Author: 2015, Dmitry Shachnev <mitya57@gmail.com>.
"""
import markdown


class MathExtension(markdown.extensions.Extension):
    def __init__(self, *args, **kwargs):
        self.config = {
            "enable_dollar_delimiter": [False, "Enable single-dollar delimiter"],
        }
        super().__init__(*args, **kwargs)

    def extendMarkdown(self, md, md_globals):
        def handle_match_inline(m):
            node = markdown.util.etree.Element("script")
            node.set("type", "math/tex")
            node.text = markdown.util.AtomicString(m.group(3))
            return node

        def handle_match(m):
            node = markdown.util.etree.Element("script")
            node.set("type", "math/tex; mode=display")
            if "\\begin" in m.group(2):
                node.text = markdown.util.AtomicString(
                    m.group(2) + m.group(4) + m.group(5)
                )
            else:
                node.text = markdown.util.AtomicString(m.group(3))
            return node

        configs = self.getConfigs()
        inlinemathpatterns = (
            markdown.inlinepatterns.Pattern(r"(?<!\\|\$)(\$)([^\$]+)(\$)"),  #  $...$
            markdown.inlinepatterns.Pattern(r"(?<!\\)(\\\()(.+?)(\\\))"),  # \(...\)
        )
        mathpatterns = (
            markdown.inlinepatterns.Pattern(r"(?<!\\)(\$\$)([^\$]+)(\$\$)"),  # $$...$$
            markdown.inlinepatterns.Pattern(r"(?<!\\)(\\\[)(.+?)(\\\])"),  # \[...\]
            markdown.inlinepatterns.Pattern(
                r"(?<!\\)(\\begin{([a-z]+?\*?)})(.+?)(\\end{\3})"
            ),
        )
        if not configs["enable_dollar_delimiter"]:
            inlinemathpatterns = inlinemathpatterns[1:]
        for i, pattern in enumerate(inlinemathpatterns):
            pattern.handleMatch = handle_match_inline
            md.inlinePatterns.add("math-inline-%d" % i, pattern, "<escape")
        for i, pattern in enumerate(mathpatterns):
            pattern.handleMatch = handle_match
            md.inlinePatterns.add("math-%d" % i, pattern, "<escape")


def makeExtension(*args, **kwargs):
    return MathExtension(*args, **kwargs)