xref: /dokuwiki/inc/pageutils.php (revision b625487d2258a6f1f875813206adc9a5857dab24)
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