1b625487dSandi<?php 2b625487dSandi/** 3b625487dSandi * Utilities for handling pagenames 4b625487dSandi * 5b625487dSandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 7b625487dSandi */ 8b625487dSandi 9b625487dSandi 10b625487dSandi/** 11b625487dSandi * Remove unwanted chars from ID 12b625487dSandi * 13b625487dSandi * Cleans a given ID to only use allowed characters. Accented characters are 14b625487dSandi * converted to unaccented ones 15b625487dSandi * 16b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 17b625487dSandi */ 18b625487dSandifunction cleanID($id){ 19b625487dSandi global $conf; 20b625487dSandi global $lang; 21b625487dSandi $id = trim($id); 22b625487dSandi $id = utf8_strtolower($id); 23b625487dSandi 24b625487dSandi //alternative namespace seperator 25b625487dSandi $id = strtr($id,';',':'); 26b625487dSandi if($conf['useslash']){ 27b625487dSandi $id = strtr($id,'/',':'); 28b625487dSandi }else{ 29b625487dSandi $id = strtr($id,'/','_'); 30b625487dSandi } 31b625487dSandi 32b625487dSandi if($conf['deaccent']) $id = utf8_deaccent($id,-1); 33b625487dSandi 34b625487dSandi //remove specials 35b625487dSandi $id = utf8_stripspecials($id,'_','_:.-'); 36b625487dSandi 37b625487dSandi //clean up 38*06bd9a88Sandi $id = preg_replace('#_+#','_',$id); 39b625487dSandi $id = preg_replace('#:+#',':',$id); 40b625487dSandi $id = trim($id,':._-'); 41b625487dSandi $id = preg_replace('#:[:\._\-]+#',':',$id); 42b625487dSandi 43b625487dSandi return($id); 44b625487dSandi} 45b625487dSandi 46b625487dSandi/** 47b625487dSandi * Return namespacepart of a wiki ID 48b625487dSandi * 49b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 50b625487dSandi */ 51b625487dSandifunction getNS($id){ 52b625487dSandi if(strpos($id,':')!==false){ 53b625487dSandi return substr($id,0,strrpos($id,':')); 54b625487dSandi } 55b625487dSandi return false; 56b625487dSandi} 57b625487dSandi 58b625487dSandi/** 59b625487dSandi * Returns the ID without the namespace 60b625487dSandi * 61b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 62b625487dSandi */ 63b625487dSandifunction noNS($id){ 64b625487dSandi return preg_replace('/.*:/','',$id); 65b625487dSandi} 66b625487dSandi 67b625487dSandi/** 68b625487dSandi * returns the full path to the datafile specified by ID and 69b625487dSandi * optional revision 70b625487dSandi * 71b625487dSandi * The filename is URL encoded to protect Unicode chars 72b625487dSandi * 73b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 74b625487dSandi */ 75b625487dSandifunction wikiFN($id,$rev=''){ 76b625487dSandi global $conf; 77b625487dSandi $id = cleanID($id); 78b625487dSandi $id = str_replace(':','/',$id); 79b625487dSandi if(empty($rev)){ 80b625487dSandi $fn = $conf['datadir'].'/'.utf8_encodeFN($id).'.txt'; 81b625487dSandi }else{ 82b625487dSandi $fn = $conf['olddir'].'/'.utf8_encodeFN($id).'.'.$rev.'.txt'; 83b625487dSandi if($conf['usegzip'] && !@file_exists($fn)){ 84b625487dSandi //return gzip if enabled and plaintext doesn't exist 85b625487dSandi $fn .= '.gz'; 86b625487dSandi } 87b625487dSandi } 88b625487dSandi return $fn; 89b625487dSandi} 90b625487dSandi 91b625487dSandi/** 92b625487dSandi * returns the full path to the mediafile specified by ID 93b625487dSandi * 94b625487dSandi * The filename is URL encoded to protect Unicode chars 95b625487dSandi * 96b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 97b625487dSandi */ 98b625487dSandifunction mediaFN($id){ 99b625487dSandi global $conf; 100b625487dSandi $id = cleanID($id); 101b625487dSandi $id = str_replace(':','/',$id); 102b625487dSandi $fn = $conf['mediadir'].'/'.utf8_encodeFN($id); 103b625487dSandi return $fn; 104b625487dSandi} 105b625487dSandi 106b625487dSandi/** 107b625487dSandi * Returns the full filepath to a localized textfile if local 108b625487dSandi * version isn't found the english one is returned 109b625487dSandi * 110b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 111b625487dSandi */ 112b625487dSandifunction localeFN($id){ 113b625487dSandi global $conf; 114b625487dSandi $file = './lang/'.$conf['lang'].'/'.$id.'.txt'; 115b625487dSandi if(!@file_exists($file)){ 116b625487dSandi //fall back to english 117b625487dSandi $file = './lang/en/'.$id.'.txt'; 118b625487dSandi } 119b625487dSandi return $file; 120b625487dSandi} 121b625487dSandi 122b625487dSandi/** 123b625487dSandi * Returns a full media id 124b625487dSandi * 125b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 126b625487dSandi */ 12737e34a5eSandifunction resolve_mediaid($ns,&$page,&$exists){ 128b625487dSandi global $conf; 12937e34a5eSandi 130b625487dSandi //if links starts with . add current namespace 131b625487dSandi if($page{0} == '.'){ 132b625487dSandi $page = $ns.':'.substr($page,1); 133b625487dSandi } 134b625487dSandi 135b625487dSandi //if link contains no namespace. add current namespace (if any) 136b625487dSandi if($ns !== false && strpos($page,':') === false){ 137b625487dSandi $page = $ns.':'.$page; 138b625487dSandi } 139b625487dSandi 140b625487dSandi $page = cleanID($page); 141b625487dSandi $file = mediaFN($page); 142b625487dSandi $exists = @file_exists($file); 143b625487dSandi} 144b625487dSandi 145b625487dSandi/** 146b625487dSandi * Returns a full page id 147b625487dSandi * 148b625487dSandi * @author Andreas Gohr <andi@splitbrain.org> 149b625487dSandi */ 15037e34a5eSandifunction resolve_pageid($ns,&$page,&$exists){ 151b625487dSandi global $conf; 152b625487dSandi 153b625487dSandi //if links starts with . add current namespace 154b625487dSandi if($page{0} == '.'){ 155b625487dSandi $page = $ns.':'.substr($page,1); 156b625487dSandi } 157b625487dSandi 158b625487dSandi //if link contains no namespace. add current namespace (if any) 159b625487dSandi if($ns !== false && strpos($page,':') === false){ 160b625487dSandi $page = $ns.':'.$page; 161b625487dSandi } 162b625487dSandi 163b625487dSandi //keep hashlink if exists then clean both parts 164b625487dSandi list($page,$hash) = split('#',$page,2); 165b625487dSandi $page = cleanID($page); 166b625487dSandi $hash = cleanID($hash); 167b625487dSandi 168b625487dSandi $file = wikiFN($page); 169b625487dSandi 170b625487dSandi $exists = false; 171b625487dSandi 172b625487dSandi //check alternative plural/nonplural form 173b625487dSandi if(!@file_exists($file)){ 174b625487dSandi if( $conf['autoplural'] ){ 175b625487dSandi if(substr($page,-1) == 's'){ 176b625487dSandi $try = substr($page,0,-1); 177b625487dSandi }else{ 178b625487dSandi $try = $page.'s'; 179b625487dSandi } 180b625487dSandi if(@file_exists(wikiFN($try))){ 181b625487dSandi $page = $try; 182b625487dSandi $exists = true; 183b625487dSandi } 184b625487dSandi } 185b625487dSandi }else{ 186b625487dSandi $exists = true; 187b625487dSandi } 188b625487dSandi 189b625487dSandi //add hash if any 190b625487dSandi if(!empty($hash)) $page.'#'.$hash; 191b625487dSandi} 192b625487dSandi 193b625487dSandi//Setup VIM: ex: et ts=2 enc=utf-8 : 194