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