xref: /plugin/combo/syntax/math.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
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