xref: /plugin/mermaid/action.php (revision 6fcac0250967f7ce0b7cf65d269724c2d4140b75)
146a60b4fSRobertWeinmeister<?php
246a60b4fSRobertWeinmeister/**
346a60b4fSRobertWeinmeister * DokuWiki Plugin mermaid (Action Component)
446a60b4fSRobertWeinmeister *
546a60b4fSRobertWeinmeister * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
646a60b4fSRobertWeinmeister * @author  Robert Weinmeister <develop@weinmeister.org>
746a60b4fSRobertWeinmeister */
846a60b4fSRobertWeinmeister
946a60b4fSRobertWeinmeisterclass action_plugin_mermaid extends \dokuwiki\Extension\ActionPlugin
1046a60b4fSRobertWeinmeister{
1146a60b4fSRobertWeinmeister    /** @inheritDoc */
1246a60b4fSRobertWeinmeister    public function register(Doku_Event_Handler $controller)
1346a60b4fSRobertWeinmeister    {
1446a60b4fSRobertWeinmeister        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'load');
1546a60b4fSRobertWeinmeister    }
1646a60b4fSRobertWeinmeister
1746a60b4fSRobertWeinmeister    public function load(Doku_Event $event, $param)
1846a60b4fSRobertWeinmeister    {
196e5341c6SRobert Weinmeister        // Can be changed for debugging Mermaid
206e5341c6SRobert Weinmeister        // https://mermaid.js.org/config/directives.html#changing-loglevel-via-directive
216e5341c6SRobert Weinmeister        define("MERMAIDLOGLEVEL", "error");
226e5341c6SRobert Weinmeister
234c8bd9ffSRobert Weinmeister        $theme = $this->getConf('theme');
244c8bd9ffSRobert Weinmeister        $init = "mermaid.initialize({startOnLoad: true, logLevel: '".MERMAIDLOGLEVEL."', theme: '".$theme."'});";
25*6fcac025SRobert Weinmeister        $location = $this->getConf('location');
264c8bd9ffSRobert Weinmeister
27*6fcac025SRobert Weinmeister        switch ($location) {
282d4b7fc2SRobert Weinmeister            case 'local':
2946a60b4fSRobertWeinmeister                $event->data['script'][] = array
3046a60b4fSRobertWeinmeister                (
3146a60b4fSRobertWeinmeister                    'type'    => 'text/javascript',
3246a60b4fSRobertWeinmeister                    'charset' => 'utf-8',
332d4b7fc2SRobert Weinmeister                    'src' => DOKU_BASE.'lib/plugins/mermaid/mermaid.min.js'
3446a60b4fSRobertWeinmeister                );
352d4b7fc2SRobert Weinmeister                break;
362d4b7fc2SRobert Weinmeister            case 'latest':
37*6fcac025SRobert Weinmeister            case 'remote108':
38a612c7d6SRobert Weinmeister            case 'remote106':
398eaa3f3bSRobert Weinmeister            case 'remote104':
407d8a2661SRobert Weinmeister            case 'remote103':
414df3d176SRobert Weinmeister            case 'remote102':
425f50b169SRobert Weinmeister            case 'remote101':
436e5341c6SRobert Weinmeister            case 'remote100':
44*6fcac025SRobert Weinmeister                $versions = array(
45*6fcac025SRobert Weinmeister                    'latest' => '',
46*6fcac025SRobert Weinmeister                    'remote108' => '@10.8.0',
47*6fcac025SRobert Weinmeister                    'remote106' => '@10.6.1',
48*6fcac025SRobert Weinmeister                    'remote104' => '@10.4.0',
49*6fcac025SRobert Weinmeister                    'remote103' => '@10.3.1',
50*6fcac025SRobert Weinmeister                    'remote102' => '@10.2.4',
51*6fcac025SRobert Weinmeister                    'remote101' => '@10.1.0',
52*6fcac025SRobert Weinmeister                    'remote100' => '@10.0.2'
53*6fcac025SRobert Weinmeister                );
54*6fcac025SRobert Weinmeister                $data = "import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid".$versions[$location]."/dist/mermaid.esm.min.mjs';".$init;
556e5341c6SRobert Weinmeister                $event->data['script'][] = array
566e5341c6SRobert Weinmeister                (
576e5341c6SRobert Weinmeister                    'type'    => 'module',
586e5341c6SRobert Weinmeister                    'charset' => 'utf-8',
59*6fcac025SRobert Weinmeister                    '_data' => $data
606e5341c6SRobert Weinmeister                );
616e5341c6SRobert Weinmeister                break;
626e5341c6SRobert Weinmeister            case 'remote94':
636e5341c6SRobert Weinmeister                $event->data['script'][] = array
646e5341c6SRobert Weinmeister                (
656e5341c6SRobert Weinmeister                    'type'    => 'text/javascript',
666e5341c6SRobert Weinmeister                    'charset' => 'utf-8',
674df3d176SRobert Weinmeister                    'src' => 'https://cdn.jsdelivr.net/npm/mermaid@9.4.3/dist/mermaid.min.js'
686e5341c6SRobert Weinmeister                );
696e5341c6SRobert Weinmeister                break;
702d4b7fc2SRobert Weinmeister            case 'remote93':
712d4b7fc2SRobert Weinmeister                $event->data['script'][] = array
722d4b7fc2SRobert Weinmeister                (
732d4b7fc2SRobert Weinmeister                    'type'    => 'text/javascript',
742d4b7fc2SRobert Weinmeister                    'charset' => 'utf-8',
754df3d176SRobert Weinmeister                    'src' => 'https://cdn.jsdelivr.net/npm/mermaid@9.3.0/dist/mermaid.min.js'
762d4b7fc2SRobert Weinmeister                );
772d4b7fc2SRobert Weinmeister                break;
782d4b7fc2SRobert Weinmeister            default:
792d4b7fc2SRobert Weinmeister        }
8046a60b4fSRobertWeinmeister
8146a60b4fSRobertWeinmeister        $event->data['link'][] = array
8246a60b4fSRobertWeinmeister        (
8346a60b4fSRobertWeinmeister            'rel'     => 'stylesheet',
8446a60b4fSRobertWeinmeister            'type'    => 'text/css',
8546a60b4fSRobertWeinmeister            'href'    => DOKU_BASE."lib/plugins/mermaid/mermaid.css",
8646a60b4fSRobertWeinmeister        );
8746a60b4fSRobertWeinmeister
88*6fcac025SRobert Weinmeister        switch ($location) {
894df3d176SRobert Weinmeister            case 'local':
906e5341c6SRobert Weinmeister            case 'remote94':
916e5341c6SRobert Weinmeister            case 'remote93':
9246a60b4fSRobertWeinmeister                $event->data['script'][] = array
9346a60b4fSRobertWeinmeister                (
9446a60b4fSRobertWeinmeister                    'type'    => 'text/javascript',
9546a60b4fSRobertWeinmeister                    'charset' => 'utf-8',
964c8bd9ffSRobert Weinmeister                    '_data'   => $init
9746a60b4fSRobertWeinmeister                );
986e5341c6SRobert Weinmeister                break;
996e5341c6SRobert Weinmeister            default:
1006e5341c6SRobert Weinmeister        }
101*6fcac025SRobert Weinmeister
102*6fcac025SRobert Weinmeister        // remove the search highlight from DokuWiki as it interferes with the Mermaid parsing/rendering
103*6fcac025SRobert Weinmeister        $event->data['script'][] = array
104*6fcac025SRobert Weinmeister        (
105*6fcac025SRobert Weinmeister            'type'    => 'text/javascript',
106*6fcac025SRobert Weinmeister            'charset' => 'utf-8',
107*6fcac025SRobert Weinmeister            '_data' => "document.addEventListener('DOMContentLoaded', function() {
108*6fcac025SRobert Weinmeister                            jQuery('.mermaid').each(function() {
109*6fcac025SRobert Weinmeister                                var modifiedContent = jQuery(this).html().replace(/<span class=\"search_hit\">(.+?)<\/span>/g, '$1');
110*6fcac025SRobert Weinmeister                                jQuery(this).html(modifiedContent);
111*6fcac025SRobert Weinmeister                             })
112*6fcac025SRobert Weinmeister                        });"
113*6fcac025SRobert Weinmeister        );
11446a60b4fSRobertWeinmeister    }
11546a60b4fSRobertWeinmeister}