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