xref: /plugin/combo/action/js.php (revision 107913560bb13e13e4f36f952bdaf245f89fbe67)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3ad54dffdSgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php');
4ad54dffdSgerardnico
504fd306cSNickeauuse ComboStrap\Identity;
6c3437056SNickeau
7007225e5Sgerardnico
8007225e5Sgerardnico/**
9007225e5Sgerardnico * Suppress the Javascript of Dokuwiki not needed on a page show
10007225e5Sgerardnico */
11007225e5Sgerardnicoclass action_plugin_combo_js extends DokuWiki_Action_Plugin
12007225e5Sgerardnico{
13007225e5Sgerardnico
14007225e5Sgerardnico    // Because the javascript is a second request call
15007225e5Sgerardnico    // we don't known if we are in the admin or public interface
16007225e5Sgerardnico    // we add them to the js href the below query key
17007225e5Sgerardnico    const ACCESS_PROPERTY_KEY = 'wcacc';
18007225e5Sgerardnico    // For the public (no user, no admin)
19007225e5Sgerardnico    const ACCESS_PROPERTY_VALUE_PUBLIC = 'public';
20007225e5Sgerardnico
21007225e5Sgerardnico    /**
22007225e5Sgerardnico     * Registers our handler for the MANIFEST_SEND event
23007225e5Sgerardnico     * https://www.dokuwiki.org/devel:event:js_script_list
24007225e5Sgerardnico     * manipulate the list of JavaScripts that will be concatenated
25007225e5Sgerardnico     * @param Doku_Event_Handler $controller
26007225e5Sgerardnico     */
27007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
28007225e5Sgerardnico    {
29007225e5Sgerardnico
30007225e5Sgerardnico        // 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
31007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_header');
32007225e5Sgerardnico
33007225e5Sgerardnico        // To get only the script that we need
34007225e5Sgerardnico        $controller->register_hook('JS_SCRIPT_LIST', 'AFTER', $this, 'handle_js');
35007225e5Sgerardnico
36007225e5Sgerardnico    }
37007225e5Sgerardnico
38007225e5Sgerardnico    /**
39007225e5Sgerardnico     * Add a query string to the js.php link when it's a SHOW action
40007225e5Sgerardnico     * @param Doku_Event $event
41007225e5Sgerardnico     */
42007225e5Sgerardnico    public function handle_header(Doku_Event &$event, $param)
43007225e5Sgerardnico    {
44007225e5Sgerardnico
45007225e5Sgerardnico        // If there is no user
4604fd306cSNickeau        if (Identity::isAnonymous()) {
47007225e5Sgerardnico            $scripts = &$event->data['script'];
48007225e5Sgerardnico            foreach ($scripts as &$script) {
4970bbd7f1Sgerardnico                $src = $script['src'] ?? null;
5070bbd7f1Sgerardnico                if ($src === null) {
5170bbd7f1Sgerardnico                    continue;
5270bbd7f1Sgerardnico                }
5370bbd7f1Sgerardnico                $pos = strpos($src, 'js.php');
54007225e5Sgerardnico                if ($pos !== false) {
5570bbd7f1Sgerardnico                    $script['src'] = $src . '&' . self::ACCESS_PROPERTY_KEY . '=' . self::ACCESS_PROPERTY_VALUE_PUBLIC;
56007225e5Sgerardnico                }
57007225e5Sgerardnico            }
58007225e5Sgerardnico        }
59007225e5Sgerardnico
60007225e5Sgerardnico
61007225e5Sgerardnico    }
62007225e5Sgerardnico
63007225e5Sgerardnico    /**
64007225e5Sgerardnico     * This is to handle the HTTP call
65007225e5Sgerardnico     * /lib/exe/js.php?t=strap&tseed=2eb19bd2d8991a9bb11366d787d4225e&wcacc=public
66007225e5Sgerardnico     * @param Doku_Event $event
67007225e5Sgerardnico     * @param            $param
68007225e5Sgerardnico     */
69007225e5Sgerardnico    public function handle_js(Doku_Event &$event, $param)
70007225e5Sgerardnico    {
71007225e5Sgerardnico
72531e725cSNickeau        /**
73531e725cSNickeau         * The directory separator is hard written
74531e725cSNickeau         * in the list {@link js_out()}
75531e725cSNickeau         * We then use it here also as hardcoded
76531e725cSNickeau         */
77531e725cSNickeau        $directorySeparatorInDokuwikiList = "/";
78531e725cSNickeau
79007225e5Sgerardnico        // It was added by the TPL_METAHEADER_OUTPUT handler (ie function handle_header)
8070bbd7f1Sgerardnico        $access = $_GET[self::ACCESS_PROPERTY_KEY] ?? null;
81007225e5Sgerardnico        if ($access == self::ACCESS_PROPERTY_VALUE_PUBLIC) {
82007225e5Sgerardnico
83007225e5Sgerardnico            // The directory path for the internal dokuwiki script
84531e725cSNickeau            $dokuScriptPath = $directorySeparatorInDokuwikiList . 'lib' . $directorySeparatorInDokuwikiList . 'scripts' . $directorySeparatorInDokuwikiList;
85007225e5Sgerardnico            // The directory path for the plugin script (we need to keep them)
86531e725cSNickeau            $dokuPluginPath = $directorySeparatorInDokuwikiList . 'lib' . $directorySeparatorInDokuwikiList . 'plugins' . $directorySeparatorInDokuwikiList;
87007225e5Sgerardnico
88007225e5Sgerardnico            // Script that we want on the show page
89007225e5Sgerardnico            $showPageScripts =
90007225e5Sgerardnico                [
91007225e5Sgerardnico                    0 => $dokuScriptPath . "qsearch.js", // for the search bar
92007225e5Sgerardnico                    1 => $dokuScriptPath . "script.js",
93007225e5Sgerardnico                    2 => $dokuScriptPath . "hotkeys.js",
94007225e5Sgerardnico                    3 => $dokuScriptPath . "locktimer.js", // Use in js.php - dw_locktimer
95007225e5Sgerardnico                    4 => $dokuScriptPath . "helpers.js", // substr_replace use in qsearch.php
96531e725cSNickeau                    5 => 'conf' . $directorySeparatorInDokuwikiList . 'userscript.js',
97531e725cSNickeau                    6 => $dokuScriptPath . "cookie.js", // plugin may depend on this library such as styling (lib/plugins/styling/script.js)
98*10791356Sgerardnico                    7 => $dokuScriptPath . "jquery/jquery.cookie.js", // cookie.js depends on it
99*10791356Sgerardnico                    8 => $dokuScriptPath . "behaviour.js", // contains dw_show that is used by the tree.js tree
100*10791356Sgerardnico                    9 => $dokuScriptPath . "tree.js", // used by the index.js tree
101*10791356Sgerardnico                    10 => $dokuScriptPath . "index.js" // index page
102007225e5Sgerardnico                ];
103007225e5Sgerardnico
104007225e5Sgerardnico            $scriptsToKeep = array();
105007225e5Sgerardnico
106007225e5Sgerardnico            foreach ($event->data as $scriptPath) {
107007225e5Sgerardnico                $posPluginPath = strpos($scriptPath, $dokuPluginPath);
108007225e5Sgerardnico                if ($posPluginPath !== false) {
109007225e5Sgerardnico                    // This is a plugin script, we keep it
110007225e5Sgerardnico                    $scriptsToKeep[] = $scriptPath;
111007225e5Sgerardnico                } else {
112007225e5Sgerardnico
113007225e5Sgerardnico                    foreach ($showPageScripts as $showPageScript) {
114007225e5Sgerardnico
115007225e5Sgerardnico                        $posShowPage = strpos($scriptPath, $showPageScript);
116007225e5Sgerardnico                        if ($posShowPage !== false) {
117007225e5Sgerardnico                            // This is a script needed on the show page
118007225e5Sgerardnico                            $scriptsToKeep[] = $scriptPath;
119007225e5Sgerardnico                        }
120007225e5Sgerardnico                    }
121007225e5Sgerardnico                }
122007225e5Sgerardnico            }
123007225e5Sgerardnico
124007225e5Sgerardnico            $event->data = $scriptsToKeep;
125007225e5Sgerardnico
126007225e5Sgerardnico        }
127007225e5Sgerardnico    }
128007225e5Sgerardnico
129007225e5Sgerardnico}
130