2 /*=====================================================================*\
3 || ###################################################################
4 || # ViewSVN [#]version[#]
5 || # Copyright ©2002-[#]year[#] Iris Studios, Inc.
7 || # This program is free software; you can redistribute it and/or modify
8 || # it under the terms of the GNU General Public License as published by
9 || # the Free Software Foundation; version [#]gpl[#] of the License.
11 || # This program is distributed in the hope that it will be useful, but
12 || # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 || # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 || # You should have received a copy of the GNU General Public License along
17 || # with this program; if not, write to the Free Software Foundation, Inc.,
18 || # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 || ###################################################################
20 \*=====================================================================*/
23 * Handles the various methods that are used to navigate
31 the majority of this stuff should go into the controller.
32 the string creators may need to go into a static class or something. or not. we'll see.
37 * Path managing class that constructs and parses input
38 * and output for paths. This is essentially a controller
39 * of all current information.
53 * The universal path that is currently being browsed
59 * Current repository that we're in
65 * Current internal path inside the repository
71 * The current revision number
77 * The current revision as a string argument
83 * Constructor: determine the type of linking to use
85 * @param integer Path management type
91 if ($type < 1 OR $type > 2)
93 $viewsvn->trigger
->error($viewsvn->lang
->string('Invalid path management type specified in [includes/config.php]'));
96 $this->type
= (int)$type;
98 $this->path
= $this->parse();
99 $this->revnum
= $this->revnum
;
100 $this->revstr
= $this->revstr
;
104 * Constructs a repository browser link
108 * @param string Base path
109 * @param string Browser path, separated using '/'
111 * @return string Link path
113 function out($base, $addpath)
117 $url = $this->fetch_arguments($base);
118 $addpath = $this->sanitize($addpath);
121 if ($this->type
== 1)
123 return $url[0] . '?path=' . $addpath . ($url[1] ?
'&' . $url[1] : '');
125 // advanced path system
126 else if ($this->type
== 2)
128 return $url[0] . ($addpath{0} != '/' ?
'/' : '') . $addpath . ($url[1] ?
'?' . $url[1] : '');
133 * Parses an incoming path with the various methods
134 * and returns a universal form
138 * @return string Universal path, separated using '/'
144 if (defined('PATH_OVERRIDE') AND PATH_OVERRIDE
== 1)
150 if ($this->type
== 1)
152 $path = $viewsvn->in
['path'];
154 // advanced path system
155 else if ($this->type
== 2)
157 if (@$_SERVER['PATH_INFO'])
159 $path = $viewsvn->sanitize($_SERVER['PATH_INFO']);
163 $viewsvn->trigger
->error($viewsvn->lang
->string('Your server does not support type-2 path management'));
169 $viewsvn->trigger
->error($viewsvn->lang
->string('Invalid path sent'));
172 if (!$viewsvn->repos
->verify($this->repos
= $this->fetch_repos($path), $this->relpath
= $this->fetch_path($path)))
174 $viewsvn->trigger
->error($viewsvn->lang
->string('The path specified could not be verified'));
181 * Create path breadcrumb
185 * @param string Universal path
186 * @param bool Add trailing slash
188 * @return string Breadcrumb HTML
190 function construct_breadcrumb($path, $doslash = true
)
192 global $viewsvn, $cachev;
197 $temp = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY
);
198 $count = count($temp) - 1;
200 foreach ($temp AS $val => $item)
203 $itembit .= (($count != $val OR $cachev->isdir($itembit)) ?
'/' : '');
204 $html .= '<a href="' . $viewsvn->path
. '/' . $this->out('browse.php' . $this->revstr
, $itembit) . '">' . $item . '</a>'. ($count != $val ?
' / ' : '');
211 * Returns the name of the repository from a upath
215 * @param string Universal path
217 * @return string Repository name
219 function fetch_repos($path)
221 $temp = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY
);
226 * Returns the path without the repository from a upath
230 * @param string Universal path
231 * @param bool Preceding slash
233 * @return string Relative path
235 function fetch_path($path, $doslash = false
)
237 $temp = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY
);
239 return ($doslash ?
'/' : '') . implode('/', $temp);
243 * Fetches any URL parameters a link has
247 * @param string Original URL
249 * @return array Two-element array: base path (no trailing '?'), arguments
251 function fetch_arguments($url)
255 $bits = parse_url($url);
257 if (isset($bits['query']))
259 $return[0] = $bits['path'];
260 $return[1] = $bits['query'];
264 $return[0] = $bits['path'];
272 * Determines if the root path has been reached
276 * @param string Universal path
278 * @return bool Root of path?
280 function is_root_path($path)
282 $path = $this->fetch_path($path);
283 $temp = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY
);
284 if (count($temp) > 0)
295 * Returns the current sanitized revision
299 * @param bool High-low or not
300 * @param mixed High revision (or regular)
301 * @param mixed Low revision
303 * @return mixed Revision number or HEAD
305 function fetch_rev_num($highlow = false
, $high = null
, $low = null
)
311 if (isset($viewsvn->in
['high']) AND is_null($high))
313 $high = $viewsvn->svn
->rev($viewsvn->in
['high']);
315 else if (is_null($high))
320 if (isset($viewsvn->in
['low']) AND is_null($low))
322 $low = $viewsvn->svn
->rev($viewsvn->in
['low']);
324 else if (is_null($low))
334 if (is_int($high) AND is_int($low) AND $low > $high)
341 return array('high' => $high, 'low' => $low);
345 if (isset($viewsvn->in
['rev']) AND is_null($high))
347 $rev = $viewsvn->svn
->rev($viewsvn->in
['rev']);
349 else if (is_null($high))
363 * Returns a GET string with sanitized revision data
367 * @param bool High-low or not
368 * @param mixed High revision (or regular)
369 * @param mixed Low revision
371 * @return string Revision GET data
373 function fetch_rev_str($highlow = false
, $high = null
, $low = null
)
375 $rev = $this->fetch_rev_num($highlow, $high, $low);
379 return '?low=' . $rev['low'] . '&high=' . $rev['high'];
383 return '?rev=' . $rev;
388 * Sanitizes a path for passing
394 * @return string Cleaned string
396 function sanitize($path)
398 return preg_replace('#[^a-z0-9\./\-_]*#i', '', $path);
402 /*=====================================================================*\
403 || ###################################################################
406 || ###################################################################
407 \*=====================================================================*/