69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * DokuWiki Plugin safefnrecode (Action Component)
 | |
|  *
 | |
|  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
 | |
|  * @author  Andreas Gohr <andi@splitbrain.org>
 | |
|  */
 | |
| 
 | |
| class action_plugin_safefnrecode extends DokuWiki_Action_Plugin
 | |
| {
 | |
| 
 | |
|     /** @inheritdoc */
 | |
|     public function register(Doku_Event_Handler $controller)
 | |
|     {
 | |
|         $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'handleIndexerTasksRun');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Handle indexer event
 | |
|      *
 | |
|      * @param Doku_Event $event
 | |
|      * @param $param
 | |
|      */
 | |
|     public function handleIndexerTasksRun(Doku_Event $event, $param)
 | |
|     {
 | |
|         global $conf;
 | |
|         if ($conf['fnencode'] != 'safe') return;
 | |
| 
 | |
|         if (!file_exists($conf['datadir'].'_safefn.recoded')) {
 | |
|             $this->recode($conf['datadir']);
 | |
|             touch($conf['datadir'].'_safefn.recoded');
 | |
|         }
 | |
| 
 | |
|         if (!file_exists($conf['olddir'].'_safefn.recoded')) {
 | |
|             $this->recode($conf['olddir']);
 | |
|             touch($conf['olddir'].'_safefn.recoded');
 | |
|         }
 | |
| 
 | |
|         if (!file_exists($conf['metadir'].'_safefn.recoded')) {
 | |
|             $this->recode($conf['metadir']);
 | |
|             touch($conf['metadir'].'_safefn.recoded');
 | |
|         }
 | |
| 
 | |
|         if (!file_exists($conf['mediadir'].'_safefn.recoded')) {
 | |
|             $this->recode($conf['mediadir']);
 | |
|             touch($conf['mediadir'].'_safefn.recoded');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Recursive function to rename all safe encoded files to use the new
 | |
|      * square bracket post indicator
 | |
|      */
 | |
|     private function recode($dir)
 | |
|     {
 | |
|         $dh = opendir($dir);
 | |
|         if (!$dh) return;
 | |
|         while (($file = readdir($dh)) !== false) {
 | |
|             if ($file == '.' || $file == '..') continue;           # cur and upper dir
 | |
|             if (is_dir("$dir/$file")) $this->recode("$dir/$file"); #recurse
 | |
|             if (strpos($file, '%') === false) continue;             # no encoding used
 | |
|             $new = preg_replace('/(%[^\]]*?)\./', '\1]', $file);    # new post indicator
 | |
|             if (preg_match('/%[^\]]+$/', $new)) $new .= ']';        # fix end FS#2122
 | |
|             rename("$dir/$file", "$dir/$new");                     # rename it
 | |
|         }
 | |
|         closedir($dh);
 | |
|     }
 | |
| }
 |