1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3*5f891b7eSNickeauuse ComboStrap\SnippetManager; 4007225e5Sgerardnicouse ComboStrap\LogUtility; 5007225e5Sgerardnicouse ComboStrap\PluginUtility; 6007225e5Sgerardnico 7007225e5Sgerardnicoif (!defined('DOKU_INC')) die(); 8007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PluginUtility.php'); 9007225e5Sgerardnico 10007225e5Sgerardnico 11007225e5Sgerardnico/** 12007225e5Sgerardnico * Class syntax_plugin_combo_math 13007225e5Sgerardnico */ 14007225e5Sgerardnicoclass syntax_plugin_combo_math extends DokuWiki_Syntax_Plugin 15007225e5Sgerardnico{ 16007225e5Sgerardnico 17*5f891b7eSNickeau const TAG = "math"; 18*5f891b7eSNickeau 19007225e5Sgerardnico 20007225e5Sgerardnico /** 21007225e5Sgerardnico * syntax_plugin_combo_math constructor. 22007225e5Sgerardnico */ 23007225e5Sgerardnico public function __construct() 24007225e5Sgerardnico { 25007225e5Sgerardnico LogUtility::msg("The math syntax object was instantiated", LogUtility::LVL_MSG_DEBUG); 26007225e5Sgerardnico } 27007225e5Sgerardnico 28007225e5Sgerardnico 29007225e5Sgerardnico /** 30007225e5Sgerardnico * Syntax Type 31007225e5Sgerardnico * 32007225e5Sgerardnico * Protected in order to say that we don't want it to be modified 33007225e5Sgerardnico * The mathjax javascript will take care of the rendering 34007225e5Sgerardnico * 35007225e5Sgerardnico * @return string 36007225e5Sgerardnico */ 37007225e5Sgerardnico public function getType() 38007225e5Sgerardnico { 39007225e5Sgerardnico return 'substition'; 40007225e5Sgerardnico } 41007225e5Sgerardnico 42007225e5Sgerardnico /** 43007225e5Sgerardnico * @return array 44007225e5Sgerardnico * Allow which kind of plugin inside 45007225e5Sgerardnico * 46007225e5Sgerardnico * No one of array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 47007225e5Sgerardnico * because we manage self the content and we call self the parser 48007225e5Sgerardnico */ 49007225e5Sgerardnico public function getAllowedTypes() 50007225e5Sgerardnico { 51007225e5Sgerardnico return array(); 52007225e5Sgerardnico } 53007225e5Sgerardnico 54007225e5Sgerardnico /** 55007225e5Sgerardnico * How Dokuwiki will add P element 56007225e5Sgerardnico * 57007225e5Sgerardnico * * 'normal' - The plugin can be used inside paragraphs 58007225e5Sgerardnico * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 59007225e5Sgerardnico * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 60007225e5Sgerardnico * 61007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::getPType() 62007225e5Sgerardnico */ 63007225e5Sgerardnico function getPType() 64007225e5Sgerardnico { 65007225e5Sgerardnico return 'normal'; 66007225e5Sgerardnico } 67007225e5Sgerardnico 68007225e5Sgerardnico /** 69007225e5Sgerardnico * 70007225e5Sgerardnico * @return int 71007225e5Sgerardnico */ 72007225e5Sgerardnico public function getSort() 73007225e5Sgerardnico { 74007225e5Sgerardnico return 195; 75007225e5Sgerardnico } 76007225e5Sgerardnico 77007225e5Sgerardnico /** 78007225e5Sgerardnico * 79007225e5Sgerardnico * @param string $mode 80007225e5Sgerardnico */ 81007225e5Sgerardnico public function connectTo($mode) 82007225e5Sgerardnico { 83007225e5Sgerardnico 84007225e5Sgerardnico // Add the entry patterns 85007225e5Sgerardnico foreach (self::getTags() as $element) { 86007225e5Sgerardnico 87007225e5Sgerardnico $pattern = PluginUtility::getLeafContainerTagPattern($element); 88007225e5Sgerardnico $this->Lexer->addSpecialPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 89007225e5Sgerardnico 90007225e5Sgerardnico } 91007225e5Sgerardnico 92007225e5Sgerardnico 93007225e5Sgerardnico } 94007225e5Sgerardnico 95007225e5Sgerardnico 96007225e5Sgerardnico /** 97007225e5Sgerardnico * 98007225e5Sgerardnico * @param string $match The text matched by the patterns 99007225e5Sgerardnico * @param int $state The lexer state for the match 100007225e5Sgerardnico * @param int $pos The character position of the matched text 101007225e5Sgerardnico * @param Doku_Handler $handler The Doku_Handler object 102007225e5Sgerardnico * @return array Return an array with all data you want to use in render 103007225e5Sgerardnico */ 104007225e5Sgerardnico public function handle($match, $state, $pos, Doku_Handler $handler) 105007225e5Sgerardnico { 106007225e5Sgerardnico 107007225e5Sgerardnico return array($match); 108007225e5Sgerardnico } 109007225e5Sgerardnico 110007225e5Sgerardnico /** 111007225e5Sgerardnico * Render the output 112007225e5Sgerardnico * @param string $format 113007225e5Sgerardnico * @param Doku_Renderer $renderer 114007225e5Sgerardnico * @param array $data - what the function handle() return'ed 115007225e5Sgerardnico * @return boolean - rendered correctly? (however, returned value is not used at the moment) 116007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::render() 117007225e5Sgerardnico * 118007225e5Sgerardnico * 119007225e5Sgerardnico */ 120007225e5Sgerardnico function render($format, Doku_Renderer $renderer, $data) 121007225e5Sgerardnico { 122007225e5Sgerardnico 123007225e5Sgerardnico list($content) = $data; 124007225e5Sgerardnico switch ($format) { 125007225e5Sgerardnico case 'xhtml': 126007225e5Sgerardnico case 'odt': 127007225e5Sgerardnico /** @var Doku_Renderer_xhtml $renderer */ 128007225e5Sgerardnico $renderer->doc .= $renderer->_xmlEntities($content) . DOKU_LF; 129*5f891b7eSNickeau 130*5f891b7eSNickeau /** 131*5f891b7eSNickeau * CSS 132*5f891b7eSNickeau */ 133*5f891b7eSNickeau PluginUtility::getSnippetManager()->addCssSnippetOnlyOnce(self::TAG); 134*5f891b7eSNickeau 135*5f891b7eSNickeau /** 136*5f891b7eSNickeau * Javascript config 137*5f891b7eSNickeau */ 138*5f891b7eSNickeau $headHtmlElement = <<<EOD 139*5f891b7eSNickeauMathJax.Hub.Config({ 140*5f891b7eSNickeau showProcessingMessages: true, 141*5f891b7eSNickeau extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"], 142*5f891b7eSNickeau jax: ["input/TeX", "output/HTML-CSS"], 143*5f891b7eSNickeau tex2jax: { 144*5f891b7eSNickeau inlineMath: [ ["<math>","</math>"]], 145*5f891b7eSNickeau displayMath: [ ["<MATH>","</MATH>"] ], 146*5f891b7eSNickeau processEscapes: true, 147*5f891b7eSNickeau scale:120 148*5f891b7eSNickeau }, 149*5f891b7eSNickeau "HTML-CSS": { fonts: ["TeX"] } 150*5f891b7eSNickeau}); 151*5f891b7eSNickeauEOD; 152*5f891b7eSNickeau 153*5f891b7eSNickeau PluginUtility::getSnippetManager()->addHeadTagsOnce(self::TAG, 154*5f891b7eSNickeau array("script" => [ 155*5f891b7eSNickeau array( 156*5f891b7eSNickeau "type" => "text/x-mathjax-config", 157*5f891b7eSNickeau "_data" => $headHtmlElement 158*5f891b7eSNickeau ), 159*5f891b7eSNickeau array( 160*5f891b7eSNickeau "type" => "text/javascript", 161*5f891b7eSNickeau "src" => "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js", 162*5f891b7eSNickeau "async" => true 163*5f891b7eSNickeau ) 164*5f891b7eSNickeau ]) 165*5f891b7eSNickeau ); 166*5f891b7eSNickeau 167007225e5Sgerardnico break; 168007225e5Sgerardnico 169007225e5Sgerardnico case 'latexport': 170007225e5Sgerardnico // Pass math expressions to latexport renderer 171007225e5Sgerardnico $renderer->mathjax_content($content); 172007225e5Sgerardnico break; 173007225e5Sgerardnico 174007225e5Sgerardnico default: 175007225e5Sgerardnico $renderer->doc .= $renderer->$data; 176007225e5Sgerardnico break; 177007225e5Sgerardnico 178007225e5Sgerardnico } 179007225e5Sgerardnico 180007225e5Sgerardnico return true; 181007225e5Sgerardnico 182007225e5Sgerardnico } 183007225e5Sgerardnico 184007225e5Sgerardnico static public function getTags() 185007225e5Sgerardnico { 186007225e5Sgerardnico return PluginUtility::getTags(get_called_class()); 187007225e5Sgerardnico } 188007225e5Sgerardnico 189007225e5Sgerardnico public static function getComponentName() 190007225e5Sgerardnico { 191007225e5Sgerardnico return PluginUtility::getTagName(get_called_class()); 192007225e5Sgerardnico } 193007225e5Sgerardnico 194007225e5Sgerardnico} 195007225e5Sgerardnico 196