3 namespace dokuwiki\File
;
6 * Resolving relative IDs to absolute ones
8 abstract class Resolver
11 /** @var string context page ID */
13 /** @var string namespace of context page ID */
17 * @param string $contextID the current pageID that's the context to resolve relative IDs to
19 public function __construct($contextID)
21 $this->contextID
= $contextID;
22 $this->contextNS
= (string)getNS($contextID);
26 * Resolves a given ID to be absolute
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?
33 public function resolveId($id, $rev = '', $isDateAt = false)
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);
42 $id = $this->resolvePrefix($id);
43 return $this->resolveRelatives($id);
47 * Handle IDs starting with . or ~ and prepend the proper prefix
52 protected function resolvePrefix($id)
54 if($id === '') return $id;
56 // relative to current page (makes the current page a start page)
58 $id = $this->contextID
. ':' . substr($id, 1);
61 // relative to current namespace
63 // normalize initial dots without a colon
64 $id = preg_replace('/^((\.+:)*)(\.+)(?=[^:\.])/', '\1\3:', $id);
65 $id = $this->contextNS
. ':' . $id;
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;
77 * Handle . and .. within IDs
82 protected function resolveRelatives($id)
84 if ($id === '') return '';
85 $trail = ($id[-1] === ':') ?
':' : ''; // keep trailing colon
88 $parts = explode(':', $id);
90 foreach ($parts as $dir) {
91 if ($dir === '.') continue;
92 if ($dir === '') continue;
97 array_push($result, $dir);
100 $id = implode(':', $result);