xref: /plugin/vegalite/action.php (revision e66c86a29c7c323e0ed804145202ccc8d1c27d79)
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