# TracMathJaxPlugin / tracmathjax / tracmathjax.py

  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 61 62 63 64 65 66 67 68 69 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\\$$.*?\\$$|\$\$.*?\$\$|\\$.*?\\$)" 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="https://c328740.ssl.cf1.rackcdn.com/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 "

\$\n%s\n\$

" % content def _render_inline(self, formatter, ns, match): """Inline rendering function.""" return match.group("mathjax_inline") 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.