diff options
author | Daniel Baumann <daniel@debian.org> | 2024-12-01 21:17:14 +0100 |
---|---|---|
committer | Daniel Baumann <daniel@debian.org> | 2024-12-12 11:27:45 +0100 |
commit | bf596cbb426bd672a46484bca3bd07cfa6662919 (patch) | |
tree | 41ef466309f3e567f63e8e68ef272b0a4e214138 /plugins/55/mathjax/syntax | |
parent | Initial commit. (diff) | |
download | dokuwiki-plugins-extra-bf596cbb426bd672a46484bca3bd07cfa6662919.tar.xz dokuwiki-plugins-extra-bf596cbb426bd672a46484bca3bd07cfa6662919.zip |
Adding upstream version 20241201.upstream/20241201upstream
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to 'plugins/55/mathjax/syntax')
-rw-r--r-- | plugins/55/mathjax/syntax/protecttex.php | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/plugins/55/mathjax/syntax/protecttex.php b/plugins/55/mathjax/syntax/protecttex.php new file mode 100644 index 0000000..7d1714c --- /dev/null +++ b/plugins/55/mathjax/syntax/protecttex.php @@ -0,0 +1,161 @@ +<?php +/** + * DokuWiki Plugin mathjax (Syntax Component) + * + * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html + * @author Mark Liffiton <liffiton@gmail.com> + */ + +// must be run within Dokuwiki +if (!defined('DOKU_INC')) die(); + +/** + * Class syntax_plugin_mathjax_protecttex + */ +class syntax_plugin_mathjax_protecttex extends DokuWiki_Syntax_Plugin { + # We need to grab any math before dokuwiki tries to parse it. + # Once it's 'claimed' by this plugin (type: protected), it won't be altered. + + # Set of environments that this plugin will protect from Dokuwiki parsing + # * is escaped to work in regexp below + # Note: "math", "displaymath", and "flalign" environments seem to not be + # recognized by Mathjax... They will still be protected from Dokuwiki, + # but they will not be rendered by MathJax. + private static $ENVIRONMENTS = array( + "math", + "displaymath", + "equation", + "equation\*", + "eqnarray", + "eqnarray\*", + "align", + "align\*", + "flalign", + "flalign\*", + "alignat", + "alignat\*", + "multline", + "multline\*", + "gather", + "gather\*", + ); + + /** + * Syntax Type + * + * Needs to return one of the mode types defined in $PARSER_MODES in parser.php + * + * @return string + */ + public function getType() { + return 'protected'; + } + + /** + * Sort for applying this mode + * + * @return int + */ + public function getSort() { + return 65; + } + + /** + * regexp patterns adapted from jsMath plugin: https://www.dokuwiki.org/plugin:jsmath + * + * @param string $mode + */ + public function connectTo($mode) { + $this->Lexer->addEntryPattern('(?<!\\\\)\$(?=[^\$][^\r\n]*?\$)',$mode,'plugin_mathjax_protecttex'); + $this->Lexer->addEntryPattern('\$\$(?=.*?\$\$)',$mode,'plugin_mathjax_protecttex'); + $this->Lexer->addEntryPattern('\\\\\((?=.*?\\\\\))',$mode,'plugin_mathjax_protecttex'); + $this->Lexer->addEntryPattern('\\\\\[(?=.*?\\\\])',$mode,'plugin_mathjax_protecttex'); + foreach (self::$ENVIRONMENTS as $env) { + $this->Lexer->addEntryPattern('\\\\begin{' . $env . '}(?=.*?\\\\end{' . $env . '})',$mode,'plugin_mathjax_protecttex'); + } + + if ($this->getConf('asciimath')) { + // Protect the default AsciiMath delimiter + $this->Lexer->addEntryPattern('`(?=.*?`)',$mode,'plugin_mathjax_protecttex'); + } + + // Protect specified tags, if any + $conf_mathtags = $this->getConf('mathtags'); + $mathtags = explode(',', $conf_mathtags); + foreach ($mathtags as $tag) { + $tag = trim($tag); + if ($tag == "") { continue; } + $this->Lexer->addEntryPattern('<' . $tag . '.*?>(?=.*?</' . $tag . '>)',$mode,'plugin_mathjax_protecttex'); + } + } + public function postConnect() { + $this->Lexer->addExitPattern('\$(?!\$)','plugin_mathjax_protecttex'); + $this->Lexer->addExitPattern('\\\\\)','plugin_mathjax_protecttex'); + $this->Lexer->addExitPattern('\\\\\]','plugin_mathjax_protecttex'); + foreach (self::$ENVIRONMENTS as $env) { + $this->Lexer->addExitPattern('\\\\end{' . $env . '}','plugin_mathjax_protecttex'); + } + + if ($this->getConf('asciimath')) { + // Protect the default AsciiMath delimiter + $this->Lexer->addExitPattern('`','plugin_mathjax_protecttex'); + } + + // Protect specified tags, if any + $conf_mathtags = $this->getConf('mathtags'); + $mathtags = explode(',', $conf_mathtags); + foreach ($mathtags as $tag) { + $tag = trim($tag); + if ($tag == "") { continue; } + $this->Lexer->addExitPattern('</' . $tag . '>','plugin_mathjax_protecttex'); + } + } + + /** + * Handler to prepare matched data for the rendering process + * + * This function can only pass data to render() via its return value - render() + * may be not be run during the object's current life. + * + * Usually you should only need the $match param. + * + * @param string $match The text matched by the patterns + * @param int $state The lexer state for the match + * @param int $pos The character position of the matched text + * @param Doku_Handler $handler The Doku_Handler object + * @return array Return an array with all data you want to use in render + */ + public function handle($match, $state, $pos, Doku_Handler $handler){ + // Just pass it through... + return $match; + } + + /** + * Handles the actual output creation. + * + * @param $mode string output format being rendered + * @param $renderer Doku_Renderer the current renderer object + * @param $data array data created by handler() + * @return boolean rendered correctly? + */ + public function render($mode, Doku_Renderer $renderer, $data) { + if ($mode == 'xhtml' || $mode == 'odt') { + /** @var Doku_Renderer_xhtml $renderer */ + + // Just pass it through, but escape xml entities... + $renderer->doc .= $renderer->_xmlEntities($data); + return true; + } + if ($mode == 'latexport') { + // Pass math expressions to latexport renderer + $renderer->mathjax_content($data); + return true; + } + + // For all other modes, pass through unchanged. + $renderer->doc .= $data; + return true; + } +} + +// vim:ts=4:sw=4:et: |