Source

TracMathJaxPlugin / tracmathjax / tracmathjax.py

Full commit
Kamil Kisiel 7f4e313 


Kamil Kisiel b847611 
Kamil Kisiel dac197b 
Kamil Kisiel 7f4e313 
Kamil Kisiel e84e96a 
Kamil Kisiel dac197b 


















Kamil Kisiel b847611 
Kamil Kisiel 59f5c26 


Kamil Kisiel 6b5d013 

Kamil Kisiel e84e96a 

Kamil Kisiel b847611 
Kamil Kisiel 7f4e313 


Kamil Kisiel b847611 
Kamil Kisiel 7f4e313 




Kamil Kisiel dac197b 




Kamil Kisiel e84e96a 
Kamil Kisiel dac197b 

















from genshi.builder import tag
from genshi.filters import Transformer

from trac.core import Component, implements
from trac.wiki.api import IWikiSyntaxProvider, IWikiMacroProvider
from trac.web.api import ITemplateStreamFilter

MACRO_DESCRIPTION = \
"""Renders a LaTeX using MathJax.

Usage:
{{{
{{{
#!latex
\left( \sum_{k=1}^n a_k b_k \\right)^{\!\!2} \leq
\left( \sum_{k=1}^n a_k^2 \\right) \left( \sum_{k=1}^n b_k^2 \\right)
}}}
}}}

results in output like:
{{{
#!latex
\left( \sum_{k=1}^n a_k b_k \\right)^{\!\!2} \leq
\left( \sum_{k=1}^n a_k^2 \\right) \left( \sum_{k=1}^n b_k^2 \\right)
}}}
"""

MATHJAX_DIR = "MathJax"
MATHJAX_JS = "MathJax.js"

#: Wiki syntax regular expression
WIKI_RE = r"(?P<mathjax_inline>\\\(.*?\\\)|\$\$.*?\$\$|\\\[.*?\\\])"


class TracMathJax(Component):
    implements(IWikiSyntaxProvider,
               IWikiMacroProvider,
               ITemplateStreamFilter)

    # ITemplateStreamFilter methods
    def filter_stream(self, req, method, filename, stream, data):
        address = tag.script(type="text/javascript", src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML")
        stream |= Transformer('.//head').append(address)
        return stream

    # IWikiSyntaxProvider methods
    def get_wiki_syntax(self):
        # Capture text in between MathJax delimiters to keep other wiki syntax
        # from being applied.
        yield (WIKI_RE, self._render_inline)

    def get_link_resolvers(self):
        # we have no link resolvers
        return []

    # IWikiMacroProvider methods
    def get_macros(self):
        return ('latex', 'Latex', 'LaTeX')

    def get_macro_description(self, name):
        return MACRO_DESCRIPTION

    def expand_macro(self, formatter, name, content):
        if name.lower() == "latex":
            return "<p>\\[\n%s\n\\]</p>" % content

    def _render_inline(self, formatter, ns, match):
        """Inline rendering function."""
        return match.group("mathjax_inline")