<?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 commandfunction parseCommand($line, $vars, $handle){global $ignore, $ignorestack, $ignorelevel;// Check for test conditionsif (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 passedfunction 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 listif ($inListing){if (strcmp(trim($line), "[websvn-endlisting]") == 0){$inListing = false;// For each item in the listforeach ($listing as $listvars){// Copy the value for this list item into the $vars arrayforeach ($listvars as $id => $value){$vars[$id] = $value;}// Output the list itemforeach ($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 listif (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 variablefunction parseTags($line, $vars){global $lang;// Replace the websvn variableswhile (ereg("\[websvn:([a-zA-Z0-9_]+)\]", $line, $matches)){// Make sure that the variable existsif (!isset($vars[$matches[1]])){$vars[$matches[1]] = "?${matches[1]}?";}$line = str_replace($matches[0], $vars[$matches[1]], $line);}// Replace the language stringswhile (ereg("\[lang:([a-zA-Z0-9_]+)\]", $line, $matches)){// Make sure that the variable existsif (!isset($lang[$matches[1]])){$lang[$matches[1]] = "?${matches[1]}?";}$line = str_replace($matches[0], $lang[$matches[1]], $line);}// Return the resultsreturn $line;}?>