1*007225e5Sgerardnico<?php 2*007225e5Sgerardnico 3*007225e5Sgerardnicouse ComboStrap\LogUtility; 4*007225e5Sgerardnicouse ComboStrap\PluginUtility; 5*007225e5Sgerardnico 6*007225e5Sgerardnicoif (!defined('DOKU_INC')) die(); 7*007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PluginUtility.php'); 8*007225e5Sgerardnico 9*007225e5Sgerardnico 10*007225e5Sgerardnico/** 11*007225e5Sgerardnico * Class syntax_plugin_combo_math 12*007225e5Sgerardnico */ 13*007225e5Sgerardnicoclass syntax_plugin_combo_math extends DokuWiki_Syntax_Plugin 14*007225e5Sgerardnico{ 15*007225e5Sgerardnico 16*007225e5Sgerardnico const MATH_EXPRESSION = 'math_expression'; 17*007225e5Sgerardnico const MATH_JAX_DIV_ID = "mathjax_id"; 18*007225e5Sgerardnico const HTML_SCRIPT_MATHJAX = <<<EOD 19*007225e5Sgerardnico<script type="text/x-mathjax-config"> 20*007225e5Sgerardnico MathJax.Hub.Config({ 21*007225e5Sgerardnico showProcessingMessages: true, 22*007225e5Sgerardnico extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"], 23*007225e5Sgerardnico jax: ["input/TeX", "output/HTML-CSS"], 24*007225e5Sgerardnico tex2jax: { 25*007225e5Sgerardnico inlineMath: [ ["<math>","</math>"]], 26*007225e5Sgerardnico displayMath: [ ["<MATH>","</MATH>"] ], 27*007225e5Sgerardnico processEscapes: true, 28*007225e5Sgerardnico scale:120 29*007225e5Sgerardnico }, 30*007225e5Sgerardnico "HTML-CSS": { fonts: ["TeX"] } 31*007225e5Sgerardnico }); 32*007225e5Sgerardnico</script> 33*007225e5Sgerardnico<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js" async></script> 34*007225e5SgerardnicoEOD; 35*007225e5Sgerardnico 36*007225e5Sgerardnico /** 37*007225e5Sgerardnico * syntax_plugin_combo_math constructor. 38*007225e5Sgerardnico */ 39*007225e5Sgerardnico public function __construct() 40*007225e5Sgerardnico { 41*007225e5Sgerardnico LogUtility::msg("The math syntax object was instantiated", LogUtility::LVL_MSG_DEBUG); 42*007225e5Sgerardnico } 43*007225e5Sgerardnico 44*007225e5Sgerardnico 45*007225e5Sgerardnico /** 46*007225e5Sgerardnico * Syntax Type 47*007225e5Sgerardnico * 48*007225e5Sgerardnico * Protected in order to say that we don't want it to be modified 49*007225e5Sgerardnico * The mathjax javascript will take care of the rendering 50*007225e5Sgerardnico * 51*007225e5Sgerardnico * @return string 52*007225e5Sgerardnico */ 53*007225e5Sgerardnico public function getType() 54*007225e5Sgerardnico { 55*007225e5Sgerardnico return 'substition'; 56*007225e5Sgerardnico } 57*007225e5Sgerardnico 58*007225e5Sgerardnico /** 59*007225e5Sgerardnico * @return array 60*007225e5Sgerardnico * Allow which kind of plugin inside 61*007225e5Sgerardnico * 62*007225e5Sgerardnico * No one of array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 63*007225e5Sgerardnico * because we manage self the content and we call self the parser 64*007225e5Sgerardnico */ 65*007225e5Sgerardnico public function getAllowedTypes() 66*007225e5Sgerardnico { 67*007225e5Sgerardnico return array(); 68*007225e5Sgerardnico } 69*007225e5Sgerardnico 70*007225e5Sgerardnico /** 71*007225e5Sgerardnico * How Dokuwiki will add P element 72*007225e5Sgerardnico * 73*007225e5Sgerardnico * * 'normal' - The plugin can be used inside paragraphs 74*007225e5Sgerardnico * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 75*007225e5Sgerardnico * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 76*007225e5Sgerardnico * 77*007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::getPType() 78*007225e5Sgerardnico */ 79*007225e5Sgerardnico function getPType() 80*007225e5Sgerardnico { 81*007225e5Sgerardnico return 'normal'; 82*007225e5Sgerardnico } 83*007225e5Sgerardnico 84*007225e5Sgerardnico /** 85*007225e5Sgerardnico * 86*007225e5Sgerardnico * @return int 87*007225e5Sgerardnico */ 88*007225e5Sgerardnico public function getSort() 89*007225e5Sgerardnico { 90*007225e5Sgerardnico return 195; 91*007225e5Sgerardnico } 92*007225e5Sgerardnico 93*007225e5Sgerardnico /** 94*007225e5Sgerardnico * 95*007225e5Sgerardnico * @param string $mode 96*007225e5Sgerardnico */ 97*007225e5Sgerardnico public function connectTo($mode) 98*007225e5Sgerardnico { 99*007225e5Sgerardnico 100*007225e5Sgerardnico // Add the entry patterns 101*007225e5Sgerardnico foreach (self::getTags() as $element) { 102*007225e5Sgerardnico 103*007225e5Sgerardnico $pattern = PluginUtility::getLeafContainerTagPattern($element); 104*007225e5Sgerardnico $this->Lexer->addSpecialPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 105*007225e5Sgerardnico 106*007225e5Sgerardnico } 107*007225e5Sgerardnico 108*007225e5Sgerardnico 109*007225e5Sgerardnico } 110*007225e5Sgerardnico 111*007225e5Sgerardnico 112*007225e5Sgerardnico /** 113*007225e5Sgerardnico * 114*007225e5Sgerardnico * @param string $match The text matched by the patterns 115*007225e5Sgerardnico * @param int $state The lexer state for the match 116*007225e5Sgerardnico * @param int $pos The character position of the matched text 117*007225e5Sgerardnico * @param Doku_Handler $handler The Doku_Handler object 118*007225e5Sgerardnico * @return array Return an array with all data you want to use in render 119*007225e5Sgerardnico */ 120*007225e5Sgerardnico public function handle($match, $state, $pos, Doku_Handler $handler) 121*007225e5Sgerardnico { 122*007225e5Sgerardnico 123*007225e5Sgerardnico return array($match); 124*007225e5Sgerardnico } 125*007225e5Sgerardnico 126*007225e5Sgerardnico /** 127*007225e5Sgerardnico * Render the output 128*007225e5Sgerardnico * @param string $format 129*007225e5Sgerardnico * @param Doku_Renderer $renderer 130*007225e5Sgerardnico * @param array $data - what the function handle() return'ed 131*007225e5Sgerardnico * @return boolean - rendered correctly? (however, returned value is not used at the moment) 132*007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::render() 133*007225e5Sgerardnico * 134*007225e5Sgerardnico * 135*007225e5Sgerardnico */ 136*007225e5Sgerardnico function render($format, Doku_Renderer $renderer, $data) 137*007225e5Sgerardnico { 138*007225e5Sgerardnico 139*007225e5Sgerardnico list($content) = $data; 140*007225e5Sgerardnico switch ($format) { 141*007225e5Sgerardnico case 'xhtml': 142*007225e5Sgerardnico case 'odt': 143*007225e5Sgerardnico /** @var Doku_Renderer_xhtml $renderer */ 144*007225e5Sgerardnico $renderer->doc .= $renderer->_xmlEntities($content) . DOKU_LF; 145*007225e5Sgerardnico if (!PluginUtility::htmlSnippetAlreadyAdded($renderer->info, $this->getPluginComponent())) { 146*007225e5Sgerardnico $renderer->doc .= '<div id="' . self::MATH_JAX_DIV_ID . '">' . DOKU_LF; 147*007225e5Sgerardnico $renderer->doc .= self::HTML_SCRIPT_MATHJAX; 148*007225e5Sgerardnico $renderer->doc .= '</div>'; 149*007225e5Sgerardnico } 150*007225e5Sgerardnico break; 151*007225e5Sgerardnico 152*007225e5Sgerardnico case 'latexport': 153*007225e5Sgerardnico // Pass math expressions to latexport renderer 154*007225e5Sgerardnico $renderer->mathjax_content($content); 155*007225e5Sgerardnico break; 156*007225e5Sgerardnico 157*007225e5Sgerardnico default: 158*007225e5Sgerardnico $renderer->doc .= $renderer->$data; 159*007225e5Sgerardnico break; 160*007225e5Sgerardnico 161*007225e5Sgerardnico } 162*007225e5Sgerardnico 163*007225e5Sgerardnico return true; 164*007225e5Sgerardnico 165*007225e5Sgerardnico } 166*007225e5Sgerardnico 167*007225e5Sgerardnico static public function getTags() 168*007225e5Sgerardnico { 169*007225e5Sgerardnico return PluginUtility::getTags(get_called_class()); 170*007225e5Sgerardnico } 171*007225e5Sgerardnico 172*007225e5Sgerardnico public static function getComponentName() 173*007225e5Sgerardnico { 174*007225e5Sgerardnico return PluginUtility::getTagName(get_called_class()); 175*007225e5Sgerardnico } 176*007225e5Sgerardnico 177*007225e5Sgerardnico} 178*007225e5Sgerardnico 179