xref: /plugin/combo/action/js.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
1*007225e5Sgerardnico<?php
2*007225e5Sgerardnico/**
3*007225e5Sgerardnico * DokuWiki Plugin Js Action
4*007225e5Sgerardnico *
5*007225e5Sgerardnico */
6*007225e5Sgerardnico
7*007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
8*007225e5Sgerardnico
9*007225e5Sgerardnico/**
10*007225e5Sgerardnico * Suppress the Javascript of Dokuwiki not needed on a page show
11*007225e5Sgerardnico */
12*007225e5Sgerardnicoclass action_plugin_combo_js extends DokuWiki_Action_Plugin
13*007225e5Sgerardnico{
14*007225e5Sgerardnico
15*007225e5Sgerardnico    // Because the javascript is a second request call
16*007225e5Sgerardnico    // we don't known if we are in the admin or public interface
17*007225e5Sgerardnico    // we add them to the js href the below query key
18*007225e5Sgerardnico    const ACCESS_PROPERTY_KEY = 'wcacc';
19*007225e5Sgerardnico    // For the public (no user, no admin)
20*007225e5Sgerardnico    const ACCESS_PROPERTY_VALUE_PUBLIC = 'public';
21*007225e5Sgerardnico
22*007225e5Sgerardnico    /**
23*007225e5Sgerardnico     * Registers our handler for the MANIFEST_SEND event
24*007225e5Sgerardnico     * https://www.dokuwiki.org/devel:event:js_script_list
25*007225e5Sgerardnico     * manipulate the list of JavaScripts that will be concatenated
26*007225e5Sgerardnico     * @param Doku_Event_Handler $controller
27*007225e5Sgerardnico     */
28*007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
29*007225e5Sgerardnico    {
30*007225e5Sgerardnico
31*007225e5Sgerardnico        // To add the act query string to tweak the cache at the end. ie http://localhost:81/lib/exe/js.php?t=strap&tseed=3cf44e7&act=show
32*007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_header');
33*007225e5Sgerardnico
34*007225e5Sgerardnico        // To get only the script that we need
35*007225e5Sgerardnico        $controller->register_hook('JS_SCRIPT_LIST', 'AFTER', $this, 'handle_js');
36*007225e5Sgerardnico
37*007225e5Sgerardnico    }
38*007225e5Sgerardnico
39*007225e5Sgerardnico    /**
40*007225e5Sgerardnico     * Add a query string to the js.php link when it's a SHOW action
41*007225e5Sgerardnico     * @param Doku_Event $event
42*007225e5Sgerardnico     */
43*007225e5Sgerardnico    public function handle_header(Doku_Event &$event, $param)
44*007225e5Sgerardnico    {
45*007225e5Sgerardnico
46*007225e5Sgerardnico        // If there is no user
47*007225e5Sgerardnico        if (empty($_SERVER['REMOTE_USER'])) {
48*007225e5Sgerardnico            $scripts = &$event->data['script'];
49*007225e5Sgerardnico            foreach ($scripts as &$script) {
50*007225e5Sgerardnico                $pos = strpos($script['src'], 'js.php');
51*007225e5Sgerardnico                if ($pos !== false) {
52*007225e5Sgerardnico                    $script['src'] = $script['src'] . '&'.self::ACCESS_PROPERTY_KEY.'='.self::ACCESS_PROPERTY_VALUE_PUBLIC.'';
53*007225e5Sgerardnico                }
54*007225e5Sgerardnico            }
55*007225e5Sgerardnico        }
56*007225e5Sgerardnico
57*007225e5Sgerardnico
58*007225e5Sgerardnico    }
59*007225e5Sgerardnico
60*007225e5Sgerardnico    /**
61*007225e5Sgerardnico     * This is to handle the HTTP call
62*007225e5Sgerardnico     * /lib/exe/js.php?t=strap&tseed=2eb19bd2d8991a9bb11366d787d4225e&wcacc=public
63*007225e5Sgerardnico     * @param Doku_Event $event
64*007225e5Sgerardnico     * @param            $param
65*007225e5Sgerardnico     */
66*007225e5Sgerardnico    public function handle_js(Doku_Event &$event, $param)
67*007225e5Sgerardnico    {
68*007225e5Sgerardnico
69*007225e5Sgerardnico        // It was added by the TPL_METAHEADER_OUTPUT handler (ie function handle_header)
70*007225e5Sgerardnico        $access = $_GET[self::ACCESS_PROPERTY_KEY];
71*007225e5Sgerardnico        if ($access == self::ACCESS_PROPERTY_VALUE_PUBLIC) {
72*007225e5Sgerardnico
73*007225e5Sgerardnico            // The directory path for the internal dokuwiki script
74*007225e5Sgerardnico            $dokuScriptPath = DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'scripts' . DIRECTORY_SEPARATOR;
75*007225e5Sgerardnico            // The directory path for the plugin script (we need to keep them)
76*007225e5Sgerardnico            $dokuPluginPath = DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR;
77*007225e5Sgerardnico
78*007225e5Sgerardnico            // Script that we want on the show page
79*007225e5Sgerardnico            $showPageScripts =
80*007225e5Sgerardnico                [
81*007225e5Sgerardnico                    0 => $dokuScriptPath . "qsearch.js", // for the search bar
82*007225e5Sgerardnico                    1 => $dokuScriptPath . "script.js",
83*007225e5Sgerardnico                    2 => $dokuScriptPath . "hotkeys.js",
84*007225e5Sgerardnico                    3 => $dokuScriptPath . "locktimer.js", // Use in js.php - dw_locktimer
85*007225e5Sgerardnico                    4 => $dokuScriptPath . "helpers.js", // substr_replace use in qsearch.php
86*007225e5Sgerardnico                    5 => 'conf' . DIRECTORY_SEPARATOR . 'userscript.js'
87*007225e5Sgerardnico                ];
88*007225e5Sgerardnico
89*007225e5Sgerardnico            $scriptsToKeep = array();
90*007225e5Sgerardnico
91*007225e5Sgerardnico            foreach ($event->data as $scriptPath) {
92*007225e5Sgerardnico                $posPluginPath = strpos($scriptPath, $dokuPluginPath);
93*007225e5Sgerardnico                if ($posPluginPath !== false) {
94*007225e5Sgerardnico                    // This is a plugin script, we keep it
95*007225e5Sgerardnico                    $scriptsToKeep[] = $scriptPath;
96*007225e5Sgerardnico                } else {
97*007225e5Sgerardnico
98*007225e5Sgerardnico                    foreach ($showPageScripts as $showPageScript) {
99*007225e5Sgerardnico
100*007225e5Sgerardnico                        $posShowPage = strpos($scriptPath, $showPageScript);
101*007225e5Sgerardnico                        if ($posShowPage !== false) {
102*007225e5Sgerardnico                            // This is a script needed on the show page
103*007225e5Sgerardnico                            $scriptsToKeep[] = $scriptPath;
104*007225e5Sgerardnico                        }
105*007225e5Sgerardnico                    }
106*007225e5Sgerardnico                }
107*007225e5Sgerardnico            }
108*007225e5Sgerardnico
109*007225e5Sgerardnico            $event->data = $scriptsToKeep;
110*007225e5Sgerardnico
111*007225e5Sgerardnico        }
112*007225e5Sgerardnico    }
113*007225e5Sgerardnico
114*007225e5Sgerardnico}
115*007225e5Sgerardnico
116