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}