xref: /plugin/combo/syntax/math.php (revision 21913ab3235d516e2fa19c7e3929b555b3a2bda1)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
35f891b7eSNickeauuse 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
175f891b7eSNickeau    const TAG = "math";
185f891b7eSNickeau
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;
1295f891b7eSNickeau
1305f891b7eSNickeau                /**
1315f891b7eSNickeau                 * CSS
1325f891b7eSNickeau                 */
1338aa9d0e6Sgerardnico                PluginUtility::getSnippetManager()->upsertCssSnippetForBar(self::TAG);
1345f891b7eSNickeau
1355f891b7eSNickeau                /**
1365f891b7eSNickeau                 * Javascript config
1375f891b7eSNickeau                 */
1385f891b7eSNickeau                $headHtmlElement = <<<EOD
1395f891b7eSNickeauMathJax.Hub.Config({
1405f891b7eSNickeau    showProcessingMessages: true,
1415f891b7eSNickeau    extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
1425f891b7eSNickeau    jax: ["input/TeX", "output/HTML-CSS"],
1435f891b7eSNickeau    tex2jax: {
1445f891b7eSNickeau        inlineMath: [ ["<math>","</math>"]],
1455f891b7eSNickeau        displayMath: [ ["<MATH>","</MATH>"] ],
1465f891b7eSNickeau        processEscapes: true,
1475f891b7eSNickeau        scale:120
1485f891b7eSNickeau    },
1495f891b7eSNickeau    "HTML-CSS": { fonts: ["TeX"] }
1505f891b7eSNickeau});
1515f891b7eSNickeauEOD;
1525f891b7eSNickeau
153*21913ab3SNickeau                PluginUtility::getSnippetManager()->upsertTagsForBar(self::TAG,
1545f891b7eSNickeau                    array("script" => [
1555f891b7eSNickeau                        array(
1565f891b7eSNickeau                            "type" => "text/x-mathjax-config",
1575f891b7eSNickeau                            "_data" => $headHtmlElement
1585f891b7eSNickeau                        ),
1595f891b7eSNickeau                        array(
1605f891b7eSNickeau                            "type" => "text/javascript",
1615f891b7eSNickeau                            "src" => "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js",
1625f891b7eSNickeau                            "async" => true
1635f891b7eSNickeau                        )
1645f891b7eSNickeau                    ])
1655f891b7eSNickeau                );
1665f891b7eSNickeau
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