1<?php
2
3/**
4 * DokuWiki Plugin KaTeX (Action Component: load)
5 *
6 * load KaTeX CSS/JavaScript files
7 *
8 * @license GPLv3 https://www.gnu.org/licenses/gpl-3.0.html
9 * @author  H.-H. PENG (Hsins) <hsinspeng@gmail.com>
10 */
11
12// must be run within Dokuwiki
13if ( !defined( 'DOKU_INC' ) ) {
14    die();
15}
16
17/**
18 * Add scripts via an event handler
19 */
20class action_plugin_katex_load extends DokuWiki_Action_Plugin
21{
22
23    // Registers the handlers with DokuWiki's event controller
24    public function register( Doku_Event_Handler $controller )
25    {
26        $controller->register_hook( 'TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'load_styles' );
27        $controller->register_hook( 'TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'load_scripts' );
28    }
29
30    public function load_styles( Doku_Event $event, $param )
31    {
32        $event->data['link'][] = array(
33            'rel'  => 'stylesheet',
34            'href' => $this->_get_resource_url( 'katex.min.css' ),
35        );
36    }
37
38    public function load_scripts( Doku_Event $event, $param )
39    {
40        $event->data['script'][] = array(
41            'defer' => true,
42            'src'   => $this->_get_resource_url( 'katex.min.js' ),
43        );
44
45        if ( $this->getConf( 'extension-mhchem' ) ) {
46            $event->data['script'][] = array(
47                'defer' => true,
48                'src'   => $this->_get_resource_url( 'contrib/mhchem.min.js' ),
49            );
50        }
51
52        if ( $this->getConf( 'extension-copy-tex' ) ) {
53            $event->data['script'][] = array(
54                'defer' => true,
55                'src'   => $this->_get_resource_url( 'contrib/copy-tex.min.js' ),
56            );
57        }
58
59        $event->data['script'][] = array(
60            'defer' => true,
61            'src'   => $this->_get_resource_url( 'contrib/auto-render.min.js' ),
62        );
63    }
64
65    private function _get_resource_url( $file_uri )
66    {
67        $url_templates = array(
68            "self-hosted" => DOKU_BASE . 'lib/plugins/katex/_assets/%FILE_URI%',
69            // e.g. https://cdn.bootcdn.net/ajax/libs/KaTeX/0.16.4/katex.min.js
70            "bootcdn"     => 'https://cdn.bootcdn.net/ajax/libs/KaTeX/%VERSION%/%FILE_URI%',
71            // e.g. https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/katex.min.js
72            "cdnjs"       => 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/%VERSION%/%FILE_URI%',
73            // e.g. https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js
74            "jsdelivr"    => 'https://cdn.jsdelivr.net/npm/katex@%VERSION%/dist/%FILE_URL%',
75            // e.g. https://libs.jshub.com/KaTeX/0.16.4/katex.min.js
76            "jshub"       => 'https://libs.jshub.com/KaTeX/%VERSION%/%FILE_URL%',
77            // e.g. https://cdn.staticfile.org/KaTeX/0.16.4/katex.min.js
78            "staticfile"  => 'https://cdn.staticfile.org/KaTeX/%VERSION%/%FILE_URL%',
79            // e.g. https://unpkg.com/katex@0.16.4/dist/katex.min.js
80            "unpkg"       => 'https://unpkg.com/katex@%VERSION%/dist/%FILE_URL%',
81        );
82
83        $katex_version = '0.16.4';
84        $cdn_provider  = $this->getConf( 'cdn-provider' );
85
86        return strtr( $url_templates[$cdn_provider], array( '%VERSION%' => $katex_version, '%FILE_URI%' => $file_uri ) );
87    }
88}
89