1*e66c86a2SRobert Weinmeister<?php 2*e66c86a2SRobert Weinmeister/** 3*e66c86a2SRobert Weinmeister * DokuWiki Plugin VegaLite (Action Component) 4*e66c86a2SRobert Weinmeister * 5*e66c86a2SRobert Weinmeister * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6*e66c86a2SRobert Weinmeister * @author Robert Weinmeister <develop@weinmeister.org> 7*e66c86a2SRobert Weinmeister */ 8*e66c86a2SRobert Weinmeister 9*e66c86a2SRobert Weinmeisterdeclare(strict_types=1); 10*e66c86a2SRobert Weinmeister 11*e66c86a2SRobert Weinmeisterif (!defined('DOKU_INC')) { 12*e66c86a2SRobert Weinmeister die(); 13*e66c86a2SRobert Weinmeister} 14*e66c86a2SRobert Weinmeister 15*e66c86a2SRobert Weinmeisterclass action_plugin_vegalite extends \dokuwiki\Extension\ActionPlugin 16*e66c86a2SRobert Weinmeister{ 17*e66c86a2SRobert Weinmeister /** @inheritDoc */ 18*e66c86a2SRobert Weinmeister public function register(Doku_Event_Handler $controller): void { 19*e66c86a2SRobert Weinmeister $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'load'); 20*e66c86a2SRobert Weinmeister $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxRequest'); 21*e66c86a2SRobert Weinmeister } 22*e66c86a2SRobert Weinmeister 23*e66c86a2SRobert Weinmeister private function addLocalScript(Doku_Event $event): void { 24*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 25*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 26*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 27*e66c86a2SRobert Weinmeister 'src' => DOKU_BASE . 'lib/plugins/vegalite/vega.min.js', 28*e66c86a2SRobert Weinmeister ]; 29*e66c86a2SRobert Weinmeister 30*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 31*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 32*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 33*e66c86a2SRobert Weinmeister 'src' => DOKU_BASE . 'lib/plugins/vegalite/vega-lite.min.js', 34*e66c86a2SRobert Weinmeister ]; 35*e66c86a2SRobert Weinmeister 36*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 37*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 38*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 39*e66c86a2SRobert Weinmeister 'src' => DOKU_BASE . 'lib/plugins/vegalite/vega-embed.min.js', 40*e66c86a2SRobert Weinmeister ]; 41*e66c86a2SRobert Weinmeister } 42*e66c86a2SRobert Weinmeister 43*e66c86a2SRobert Weinmeister private function addScript(Doku_Event $event): void { 44*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 45*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 46*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 47*e66c86a2SRobert Weinmeister 'src' => "https://cdn.jsdelivr.net/npm/vega/build/vega.min.js", 48*e66c86a2SRobert Weinmeister ]; 49*e66c86a2SRobert Weinmeister 50*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 51*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 52*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 53*e66c86a2SRobert Weinmeister 'src' => "https://cdn.jsdelivr.net/npm/vega-lite/build/vega-lite.min.js", 54*e66c86a2SRobert Weinmeister ]; 55*e66c86a2SRobert Weinmeister 56*e66c86a2SRobert Weinmeister $event->data['script'][] = [ 57*e66c86a2SRobert Weinmeister 'type' => 'text/javascript', 58*e66c86a2SRobert Weinmeister 'charset' => 'utf-8', 59*e66c86a2SRobert Weinmeister 'src' => "https://cdn.jsdelivr.net/npm/vega-embed/build/vega-embed.min.js", 60*e66c86a2SRobert Weinmeister ]; 61*e66c86a2SRobert Weinmeister } 62*e66c86a2SRobert Weinmeister 63*e66c86a2SRobert Weinmeister private function pageIncludesVegaLite(): bool { 64*e66c86a2SRobert Weinmeister // true if the vegalite tag is used 65*e66c86a2SRobert Weinmeister // the include plugin can hide this fact, so we need a separate check for it 66*e66c86a2SRobert Weinmeister global $ACT; 67*e66c86a2SRobert Weinmeister global $TEXT; 68*e66c86a2SRobert Weinmeister if ('preview'==$ACT) { 69*e66c86a2SRobert Weinmeister $wikiText = $TEXT; 70*e66c86a2SRobert Weinmeister } else { 71*e66c86a2SRobert Weinmeister $wikiText = rawWiki(getID()); 72*e66c86a2SRobert Weinmeister } 73*e66c86a2SRobert Weinmeister 74*e66c86a2SRobert Weinmeister if ('edit'==$ACT) { 75*e66c86a2SRobert Weinmeister return false; 76*e66c86a2SRobert Weinmeister } 77*e66c86a2SRobert Weinmeister if (str_contains($wikiText, '<vegalite') || str_contains($wikiText, '{{page>') || str_contains($wikiText, '{{section>') || str_contains($wikiText, '{{namespace>') || str_contains($wikiText, '{{tagtopic>')) { 78*e66c86a2SRobert Weinmeister return true; 79*e66c86a2SRobert Weinmeister } 80*e66c86a2SRobert Weinmeister 81*e66c86a2SRobert Weinmeister return false; 82*e66c86a2SRobert Weinmeister } 83*e66c86a2SRobert Weinmeister 84*e66c86a2SRobert Weinmeister /** 85*e66c86a2SRobert Weinmeister * Load the Vega-Lite library and configuration into the page. 86*e66c86a2SRobert Weinmeister * 87*e66c86a2SRobert Weinmeister * @param Doku_Event $event DokuWiki event object 88*e66c86a2SRobert Weinmeister * @param mixed $param Unused parameter. 89*e66c86a2SRobert Weinmeister */ 90*e66c86a2SRobert Weinmeister public function load(Doku_Event $event, $param): void { 91*e66c86a2SRobert Weinmeister // only load Vega-Lite if it is needed 92*e66c86a2SRobert Weinmeister if (!$this->pageIncludesVegaLite()) { 93*e66c86a2SRobert Weinmeister return; 94*e66c86a2SRobert Weinmeister } 95*e66c86a2SRobert Weinmeister 96*e66c86a2SRobert Weinmeister $location = $this->getConf('location'); 97*e66c86a2SRobert Weinmeister // add the appropriate Vega-Lite script based on the location configuration 98*e66c86a2SRobert Weinmeister match ($location) { 99*e66c86a2SRobert Weinmeister 'local' => $this->addLocalScript($event), 100*e66c86a2SRobert Weinmeister default => $this->addScript($event) 101*e66c86a2SRobert Weinmeister }; 102*e66c86a2SRobert Weinmeister 103*e66c86a2SRobert Weinmeister $event->data['link'][] = [ 104*e66c86a2SRobert Weinmeister 'rel' => 'stylesheet', 105*e66c86a2SRobert Weinmeister 'type' => 'text/css', 106*e66c86a2SRobert Weinmeister 'href' => DOKU_BASE . "lib/plugins/vegalite/vegalite.css", 107*e66c86a2SRobert Weinmeister ]; 108*e66c86a2SRobert Weinmeister } 109*e66c86a2SRobert Weinmeister} 110