0,0 → 1,306 |
<?php |
# vim:et:ts=3:sts=3:sw=3:fdm=marker: |
|
// WebSVN - Subversion repository viewing via the web using PHP |
// Copyright © 2004-2006 Tim Armes, Matt Sicker |
// |
// This program is free software; you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by |
// the Free Software Foundation; either version 2 of the License, or |
// (at your option) any later version. |
// |
// This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. |
// |
// You should have received a copy of the GNU General Public License |
// along with this program; if not, write to the Free Software |
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// |
// -- |
// |
// templates.inc |
// |
// Templating system to allow advanced page customisation |
|
$ignore = false; |
|
// Stack of previous test results |
$ignorestack = array(); |
|
// Number of test levels currently ignored |
$ignorelevel = 0; |
|
// parseCommand |
// |
// Parse a special command |
|
function parseCommand($line, $vars, $handle) |
{ |
global $ignore, $ignorestack, $ignorelevel; |
|
// Check for test conditions |
if (strncmp(trim($line), "[websvn-test:", 13) == 0) |
{ |
if (!$ignore) |
{ |
$line = trim($line); |
$var = substr($line, 13, -1); |
if (empty($vars[$var])) |
{ |
array_push($ignorestack, $ignore); |
$ignore = true; |
} |
} |
else |
{ |
$ignorelevel++; |
} |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-else]", 13) == 0) |
{ |
if ($ignorelevel == 0) |
{ |
$ignore = !$ignore; |
} |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-endtest]", 16) == 0) |
{ |
if ($ignorelevel > 0) |
{ |
$ignorelevel--; |
} |
else |
{ |
$ignore = array_pop($ignorestack); |
} |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-getlisting]", 19) == 0) |
{ |
global $path, $rev, $svnrep; |
|
if (!$ignore) |
$svnrep->listFileContents($path, $rev); |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-defineicons]", 19) == 0) |
{ |
global $icons; |
|
if (!isset($icons)) |
$icons = array(); |
|
// Read all the lines until we reach the end of the definition, storing |
// each one... |
|
if (!$ignore) |
{ |
while (!feof($handle)) |
{ |
$line = trim(fgets($handle)); |
|
if (strncmp($line, "[websvn-enddefineicons]", 22) == 0) |
{ |
return true; |
} |
|
$eqsign = strpos($line, "="); |
|
$match = substr($line, 0, $eqsign); |
$def = substr($line, $eqsign + 1); |
|
$icons[$match] = $def; |
} |
} |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-icon]", 13) == 0) |
{ |
global $icons, $vars; |
|
if (!$ignore) |
{ |
// The current filetype should be defined my $vars["filetype"] |
|
if (!empty($icons[$vars["filetype"]])) |
{ |
echo parseTags($icons[$vars["filetype"]], $vars); |
} |
else if (!empty($icons["*"])) |
{ |
echo parseTags($icons["*"], $vars); |
} |
} |
|
return true; |
} |
|
if (strncmp(trim($line), "[websvn-treenode]", 17) == 0) |
{ |
global $icons, $vars; |
|
if (!$ignore) |
{ |
if ((!empty($icons["i-node"])) && (!empty($icons["t-node"])) && (!empty($icons["l-node"]))) |
{ |
for ($n = 1; $n < $vars["level"]; $n++) |
{ |
if ($vars["last_i_node"][$n]) |
{ |
echo parseTags($icons["e-node"], $vars); |
} |
else |
{ |
echo parseTags($icons["i-node"], $vars); |
} |
} |
|
if ($vars["level"] != 0) |
{ |
if ($vars["node"] == 0) |
{ |
echo parseTags($icons["t-node"], $vars); |
} |
else |
{ |
echo parseTags($icons["l-node"], $vars); |
$vars["last_i_node"][$vars["level"]] = TRUE; |
} |
} |
} |
} |
|
return true; |
} |
|
return false; |
} |
|
// parseTemplate |
// |
// Parse the given template, replacing the variables with the values passed |
|
function parseTemplate($template, $vars, $listing) |
{ |
global $ignore, $vars; |
|
if (!is_file($template)) |
{ |
print "No template file found ($template)"; |
exit; |
} |
|
$handle = fopen($template, "r"); |
$inListing = false; |
$ignore = false; |
$listLines = array(); |
|
while (!feof($handle)) |
{ |
$line = fgets($handle); |
|
// Check for the end of the file list |
if ($inListing) |
{ |
if (strcmp(trim($line), "[websvn-endlisting]") == 0) |
{ |
$inListing = false; |
|
// For each item in the list |
foreach ($listing as $listvars) |
{ |
// Copy the value for this list item into the $vars array |
foreach ($listvars as $id => $value) |
{ |
$vars[$id] = $value; |
} |
|
// Output the list item |
foreach ($listLines as $line) |
{ |
if (!parseCommand($line, $vars, $handle)) |
{ |
if (!$ignore) |
print parseTags($line, $vars); |
} |
} |
} |
} |
else |
{ |
if ($ignore == false) |
$listLines[] = $line; |
} |
} |
else if (parseCommand($line, $vars, $handle)) |
{ |
continue; |
} |
else |
{ |
// Check for the start of the file list |
if (strncmp(trim($line), "[websvn-startlisting]", 21) == 0) |
{ |
$inListing = true; |
} |
else |
{ |
if ($ignore == false) |
print parseTags($line, $vars); |
} |
} |
} |
|
fclose($handle); |
} |
|
// parseTags |
// |
// Replace all occurences of [websvn:varname] with the give variable |
|
function parseTags($line, $vars) |
{ |
global $lang; |
|
// Replace the websvn variables |
while (ereg("\[websvn:([a-zA-Z0-9_]+)\]", $line, $matches)) |
{ |
// Make sure that the variable exists |
if (!isset($vars[$matches[1]])) |
{ |
$vars[$matches[1]] = "?${matches[1]}?"; |
} |
|
$line = str_replace($matches[0], $vars[$matches[1]], $line); |
} |
|
// Replace the language strings |
while (ereg("\[lang:([a-zA-Z0-9_]+)\]", $line, $matches)) |
{ |
// Make sure that the variable exists |
if (!isset($lang[$matches[1]])) |
{ |
$lang[$matches[1]] = "?${matches[1]}?"; |
} |
|
$line = str_replace($matches[0], $lang[$matches[1]], $line); |
} |
|
// Return the results |
return $line; |
} |
?> |