[ Index ] |
PHP Cross Reference of DokuWiki |
[Summary view] [Print] [Text view]
1 <?php 2 3 namespace dokuwiki\File; 4 5 /** 6 * Resolving relative IDs to absolute ones 7 */ 8 abstract class Resolver 9 { 10 11 /** @var string context page ID */ 12 protected $contextID; 13 /** @var string namespace of context page ID */ 14 protected $contextNS; 15 16 /** 17 * @param string $contextID the current pageID that's the context to resolve relative IDs to 18 */ 19 public function __construct($contextID) 20 { 21 $this->contextID = $contextID; 22 $this->contextNS = (string)getNS($contextID); 23 } 24 25 /** 26 * Resolves a given ID to be absolute 27 * 28 * @param string $id The ID to resolve 29 * @param string|int|false $rev The revision time to use when resolving 30 * @param bool $isDateAt Is the given revision only a datetime hint not an exact revision? 31 * @return string 32 */ 33 public function resolveId($id, $rev = '', $isDateAt = false) 34 { 35 global $conf; 36 37 // some pre cleaning for useslash: 38 if ($conf['useslash']) $id = str_replace('/', ':', $id); 39 // on some systems, semicolons might be used instead of colons: 40 $id = str_replace(';', ':', $id); 41 42 $id = $this->resolvePrefix($id); 43 return $this->resolveRelatives($id); 44 } 45 46 /** 47 * Handle IDs starting with . or ~ and prepend the proper prefix 48 * 49 * @param string $id 50 * @return string 51 */ 52 protected function resolvePrefix($id) 53 { 54 if($id === '') return $id; 55 56 // relative to current page (makes the current page a start page) 57 if ($id[0] === '~') { 58 $id = $this->contextID . ':' . substr($id, 1); 59 } 60 61 // relative to current namespace 62 if ($id[0] === '.') { 63 // normalize initial dots without a colon 64 $id = preg_replace('/^((\.+:)*)(\.+)(?=[^:\.])/', '\1\3:', $id); 65 $id = $this->contextNS . ':' . $id; 66 } 67 68 // auto-relative, because there is a context namespace but no namespace in the ID 69 if ($this->contextID !== '' && strpos($id, ':') === false) { 70 $id = $this->contextNS . ':' . $id; 71 } 72 73 return $id; 74 } 75 76 /** 77 * Handle . and .. within IDs 78 * 79 * @param string $id 80 * @return string 81 */ 82 protected function resolveRelatives($id) 83 { 84 if ($id === '') return ''; 85 $trail = ($id[-1] === ':') ? ':' : ''; // keep trailing colon 86 87 $result = []; 88 $parts = explode(':', $id); 89 90 foreach ($parts as $dir) { 91 if ($dir === '.') continue; 92 if ($dir === '') continue; 93 if ($dir === '..') { 94 array_pop($result); 95 continue; 96 } 97 array_push($result, $dir); 98 } 99 100 $id = implode(':', $result); 101 $id .= $trail; 102 103 return $id; 104 } 105 106 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body