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