[www] r966 - in trunk/svn.matroska.org: . WebSVN WebSVN/cache WebSVN/include WebSVN/languages WebSVN/templates WebSVN/templates/BlueGrey WebSVN/templates/Standard WebSVN/templates/Zinn

[email protected] Wed, 3 Aug 2005 02:50:48 +0400 (MSD)
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2005-08-03 02:50:12 +0400 (Wed, 03 Aug 2005)
New Revision: 966

Added:
   trunk/svn.matroska.org/WebSVN/
   trunk/svn.matroska.org/WebSVN/blame.php
   trunk/svn.matroska.org/WebSVN/cache/
   trunk/svn.matroska.org/WebSVN/cache/tmp
   trunk/svn.matroska.org/WebSVN/changes.txt
   trunk/svn.matroska.org/WebSVN/comp.php
   trunk/svn.matroska.org/WebSVN/diff.php
   trunk/svn.matroska.org/WebSVN/dl.php
   trunk/svn.matroska.org/WebSVN/filedetails.php
   trunk/svn.matroska.org/WebSVN/form.php
   trunk/svn.matroska.org/WebSVN/include/
   trunk/svn.matroska.org/WebSVN/include/bugtraq.inc
   trunk/svn.matroska.org/WebSVN/include/command.inc
   trunk/svn.matroska.org/WebSVN/include/config.inc
   trunk/svn.matroska.org/WebSVN/include/configclass.inc
   trunk/svn.matroska.org/WebSVN/include/feedcreator.class.php
   trunk/svn.matroska.org/WebSVN/include/setup.inc
   trunk/svn.matroska.org/WebSVN/include/svnlook.inc
   trunk/svn.matroska.org/WebSVN/include/template.inc
   trunk/svn.matroska.org/WebSVN/include/utils.inc
   trunk/svn.matroska.org/WebSVN/include/version.inc
   trunk/svn.matroska.org/WebSVN/index.php
   trunk/svn.matroska.org/WebSVN/install.txt
   trunk/svn.matroska.org/WebSVN/languages/
   trunk/svn.matroska.org/WebSVN/languages/english.inc
   trunk/svn.matroska.org/WebSVN/languages/french.inc
   trunk/svn.matroska.org/WebSVN/languages/german.inc
   trunk/svn.matroska.org/WebSVN/languages/japanese-euc.inc
   trunk/svn.matroska.org/WebSVN/languages/japanese-jis.inc
   trunk/svn.matroska.org/WebSVN/languages/japanese-sjis.inc
   trunk/svn.matroska.org/WebSVN/languages/japanese-utf8.inc
   trunk/svn.matroska.org/WebSVN/languages/korean-euc.inc
   trunk/svn.matroska.org/WebSVN/languages/korean-utf8.inc
   trunk/svn.matroska.org/WebSVN/languages/portuguese.inc
   trunk/svn.matroska.org/WebSVN/languages/russian.inc
   trunk/svn.matroska.org/WebSVN/languages/spanish.inc
   trunk/svn.matroska.org/WebSVN/languages/swedish.inc
   trunk/svn.matroska.org/WebSVN/languages/tchinese-utf8.inc
   trunk/svn.matroska.org/WebSVN/languages/tchinese.inc
   trunk/svn.matroska.org/WebSVN/licence.txt
   trunk/svn.matroska.org/WebSVN/listing.php
   trunk/svn.matroska.org/WebSVN/log.php
   trunk/svn.matroska.org/WebSVN/rss.php
   trunk/svn.matroska.org/WebSVN/temp/
   trunk/svn.matroska.org/WebSVN/templates.txt
   trunk/svn.matroska.org/WebSVN/templates/
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/blame.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/compare.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/diff.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/directory.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/e-node.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/filec.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/fileh.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/files.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/folder.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/footer.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/header.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/i-node.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/index.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/l-node.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/log.tmpl
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/png.js
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/repo.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/styles.css
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/subversion.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/t-node.png
   trunk/svn.matroska.org/WebSVN/templates/BlueGrey/xml.gif
   trunk/svn.matroska.org/WebSVN/templates/Standard/
   trunk/svn.matroska.org/WebSVN/templates/Standard/blame.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/compare.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/diff.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/directory.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/file.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/footer.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/header.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/index.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/log.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Standard/styles.css
   trunk/svn.matroska.org/WebSVN/templates/Standard/xml.gif
   trunk/svn.matroska.org/WebSVN/templates/Zinn/
   trunk/svn.matroska.org/WebSVN/templates/Zinn/blame.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/compare.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/diff.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/directory.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/file.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/footer.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/header.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/index.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/log.tmpl
   trunk/svn.matroska.org/WebSVN/templates/Zinn/styles.css
   trunk/svn.matroska.org/WebSVN/wsvn.php
Log:
add WebSVN feature to our repositories

Added: trunk/svn.matroska.org/WebSVN/blame.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/blame.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/blame.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,125 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// blame.php
+//
+// Show the blame information of a file.
+//
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+
+$vars["action"] = $lang["BLAME"];
+
+$svnrep = new SVNRepository($rep->path);
+
+// If there's no revision info, go to the lastest revision for this path
+$history = $svnrep->getHistory($path);
+$youngest = $history[0]["rev"];
+
+if (empty($rev))
+   $rev = $youngest;
+
+if ($path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+// Find the parent path (or the whole path if it's already a directory)
+$pos = strrpos($ppath, "/");
+$parent = substr($ppath, 0, $pos + 1);
+
+$vars["repname"] = $rep->name;
+$vars["rev"] = $rev;
+$vars["path"] = $ppath;
+
+createDirLinks($rep, $ppath, $rev, $showchanged);
+
+$listing = array();
+
+// Get the contents of the file
+$tfname = tempnam("temp", "");
+$svnrep->getFileContents($path, $tfname, $rev);
+
+$filecache = array();
+
+if ($file = fopen($tfname, "r"))      
+{
+   // Get the blame info
+   $tbname = tempnam("temp", "");
+   $svnrep->getBlameDetails($path, $tbname, $rev); 
+   
+   $ent = true;
+   if ((strrchr($path, ".") == '.php') || ($config->useEnscript))
+      $ent = false;
+
+   if ($blame = fopen($tbname, "r"))      
+   {
+      // Create an array of version/author/line
+      
+      $index = 0;
+      
+      while (!feof($blame) && !feof($file))
+      {
+         $blameline = fgets($blame);
+         
+         if ($blameline != "")
+         {
+            list($revision, $author) = sscanf($blameline, "%d %s");
+            
+            $listing[$index]["lineno"] = $index + 1;
+            
+            $url = $config->getURL($rep, $parent, "dir");
+            $listing[$index]["revision"] = "<a href=\"${url}rev=$revision&amp;sc=1\">$revision</a>";
+
+            $listing[$index]["author"] = $author;
+            
+            if ($ent)
+               $line = replaceEntities(rtrim(fgets($file)));
+            else
+               $line = rtrim(fgets($file));
+
+            $listing[$index]["line"] = hardspace($line);
+            
+            if (trim($listing[$index]["line"]) == "")
+               $listing[$index]["line"] = "&nbsp;";
+               
+            $index++;
+         }
+      }
+      
+      fclose($blame);
+   }
+   
+   fclose($file);
+}
+
+unlink($tfname);  
+unlink($tbname);  
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."blame.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+   
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/cache/tmp
===================================================================
--- trunk/svn.matroska.org/WebSVN/cache/tmp	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/cache/tmp	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1 @@
+This file is here so that the directory gets included in the ZIP files
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/changes.txt
===================================================================
--- trunk/svn.matroska.org/WebSVN/changes.txt	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/changes.txt	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,312 @@
+CHANGES
+
+FIX: Accented characters weren't shown correctly in the directory comparison
+     view.
+
+1.61
+
+NEW: Multibyte encodings are considered when urlencoding path names
+
+CHANGE: The listing view will now always show the revision asked for
+        (HEAD by default), but the log message will show the log 
+        string for the latest modification to the current directory).
+        This means the the parent directory structure won't change as you
+        browse through old directories.
+
+FIX: A bug prevented downloading of tarballs from working
+
+1.60 
+
+NEW: Directory displays are now shown in tree view (so that it's harder
+     to get lost).  Many thanks to Brent Lu for this excellent patch.
+     The prettiest result are available in the BlueGrey scheme.
+NEW: Comparison of entire directories
+NEW: Tarballs of directories may now be downloaded.
+     Set $config->allowdownload(); in config.inc to allow this.
+NEW: New style 'Zinn' based on the templates created for
+     http://www.projectzinn.org/.  Thanks to Justin Doran.
+NEW: File delivery now looks at the defined Mime-Type.  Thanks to
+     Peter Valdemar Mørch for this patch.
+NEW: Various configuration options may now be applied on a per project
+     basis.  Look in distconfig for instructions.
+NEW: Support for using 'bugtraq' properties when display log entries.
+     See http://svn.collab.net/repos/tortoisesvn/trunk/doc/issuetrackers.txt
+NEW: Traditional Chinese translation
+NEW: Spanish translation
+     
+CHANGE: Style information removed from RSS feed
+CHANGE: Changed files are now hidden by defaut (since the directory
+        comparison link is far more useful)
+
+FIX: File listing were't being shown with the correct accented characters
+     under windows.
+FIX: File listing sometimes failed when there were spaces in the filename
+FIX: Some setups wouldn't allow diff generations with enscript
+     enabled.
+FIX: Filenames are URL encoded correctly before calling svn file:///
+FIX: Keywords weren't expanded in file view when enscript was disabled
+
+1.51
+
+NEW: Korean translation
+NEW: Russian translation
+
+FIX: Repositories may now have spaces in their path (eg: c:\my reps)
+FIX: Diff now works when the file name has changed between versions
+FIX: RSS feed now generates Content-Type header for XML so that IE can display
+     the contents
+FIX: Diff and Blame didn't work properly for php files when enscript wasn't used
+FIX: Use svn --non-interactive to ensure that svn doesn't prompt WebSVN for input
+FIX: Corrections to the French translation
+FIX: Display an explanatory message when the user hasn't configured any
+     repository paths
+FIX: When using Multiviews, change to the WebSVN directory before executing
+     commands so that tempnam works.  This used to cause problems on some
+     systems when running diff and blame.
+
+1.50
+
+Notes: Before installing this version you should delete all the existing
+       cache files.
+       
+       wsvn.php has changed.  You should redo any appropriate configuration
+       changes inside this file.
+
+NEW: Blame information for a file can now be viewed
+NEW: The cached files are now compressed
+NEW: The project selection box shows the current project by default
+NEW: Swedish translation
+NEW: Japanese translation
+NEW: The install file explains how to set up permission based repository
+     access such that access via the web interface is the same as access
+     via a client (assuming Apache2).
+NEW: SVN keywords are now expanded in file listings
+
+CHANGE: The extraction of the directory listings is now accomplished using
+        the svn command via file:/// access rather than svnlook.  This has
+        the advantage of being non-recursive, and thereby eliminates the need
+        for caching the entire directory listing, and is much quicker on
+        complex direcory structures. No more 50Mb directory caches!
+        
+FIX: Deleted directories are now viewable.
+FIX: SHOWALL was being redefined in the language files
+FIX: The directory listing view sometimes showed [lang:DELETEDFILES
+FIX: Under Windows, links in the RSS output would start with "\" if WebSVN
+     was installed in the server's root directory.
+FIX: Sed wouldn't work under all versions of Windows due to the use of single
+     quotes around the paramters
+FIX: Improved character encoding support for log messages etc.
+FIX: Paths passed by URL are encoded
+FIX: Generated HTML code is strictly 4.01
+
+1.40
+
+NEW: RSS feed support (thanks to Lübbe Onken for his work on this)
+NEW: Translatations for French and Portuguese
+NEW: .exe is recognised by default as having content-type
+     application/x-msdownload
+NEW: Recognised links are now 'linkified' in the log messages
+NEW: Tabs in file/diff listings are now expanded by a user
+     configurable number of spaces. 
+NEW: WebSVN URLs now access the repository by name rather than number.
+     This means that bookmarks will stay the same when new projects
+     are added.  The old behaviour can be configured in config.inc.
+
+FIX: Removed the revision 0 that has appeared since the previous version
+FIX: Repositories were not sorted alphabetically when using ParentPath
+FIX: The PNG support script needed for IE (and the BlueGrey scheme) is
+     now only loaded with IE
+
+1.39
+
+CHANGE: In the human-readable date strings, display up to 119 minutes,
+        47 hours, 13 days or 23 months before moving up to the next
+        quantity, like ViewCVS.
+
+FIX: Links followed after viewing the contents of a file go to the 
+     revision of the repository previously being viewed
+FIX: Paths with spaces are now correctly showed in the log view
+FIX: Blank lines in the diff output are set to &nbsp; so the browser
+     won't compress them
+FIX: A blank author field is set to an &nbsp; cell.
+FIX: A year is 365 days, not 356.
+FIX: Base ages correctly upon GMT
+FIX: The diff output did not escape html entities when enscript was
+     enabled and the file extension was not recognised for enscript. 
+FIX: distconfig.inc has a few minor errors in the examples.
+FIX: It wasn't possible to call ParentPath multiple times
+
+1.38
+
+NEW: Templates can now define icons for particular file types
+     (see BlueGrey scheme for an example)
+NEW: Display of  PHP files with syntax highlighting
+NEW: Improve site navigation with links to each directory level on all
+     pages.
+
+1.37
+
+NEW: Display a message when there are no results found
+
+CHANGE: Aesthetic changes to the BlueGrey scheme
+CHANGE: Sort entries more naturally
+
+FIX: Really make sure that we redirect to the right place when using the
+     drop-down box to select projects.
+FIX: Nested [webtest]'s didn't always work
+FIX: Fixed use of "standard" and "Standard", which caused problems on
+     non-windows machines
+
+1.36
+
+NEW: Log message search feature
+NEW: Diff display tries to display changed lines as changed, rather than
+     showing the line deleted then added.
+
+FIX: Problem surrounding the quoting of commands and command line arguments
+     on Windows machines.
+
+1.35
+
+NEW: You can now specify a list of file types (extensions) for files which
+     should be delivered to the user in a GZIP'd archive rather than 
+     displayed as ASCII in the browser window.
+
+CHANGE: Files delived with a MIME Content type are now sent as "inline".
+        The browser will try to display them in the browser window, offering
+        a save box only if they can't be displayed in this mannor.
+
+FIX: Detect use of the HTTPS protocol when using the drop-down box to
+     select projects. (-- FIX INCORRECT. USE v1.36 -- )
+FIX: The PNGs in the BlueGrey style are now transparent under Internet
+     Explorer 5.5 and higher.
+
+1.34
+
+NEW: Support for switching between projects using a drop-down box control
+     (MultiViews users - note that wsvn.php has been changed)
+NEW: Sort the repositories alphabetically when using parentPath
+NEW: Better support for internationalisation
+     (Template writers:  Please note the use of the new variable 'charset')
+NEW: More useful info in browser titles with the standard templates
+
+FIX: Accented characters should now be displayed correctly (I hope).
+FIX: HTML files now display correcly on all machines
+FIX: Removed spurious BRs from the file listings
+
+1.33
+
+There are a few changes to the config file in this release.  Copy
+distconfig.inc to config.inc and redo any configuration changes that you
+had made.
+
+NEW: Recognised non-text files are now delivered to the user as attachments.
+     The list of files types to be sent back to the user (rather than displayed
+     using WebSVN) is user configurable.
+NEW: File comparisons are now colourised based on the file extension
+
+CHANGE: Only the Enscript file extensions that the user wishes to override are
+        now listed in the config file.
+
+1.32
+
+FIX: Links no longer functionned correctly when used in basic
+     (non-multiviews) mode.
+FIX: Stop diff from comparing space changes
+
+1.31
+
+FIX: Directory view had disappeared!
+FIX: Included missing file setup.inc
+FIX: Handle spaces in filenames
+
+1.30
+
+There are a few changes to the config file in this release.  Copy
+distconfig.inc to config.inc and redo any configuration changes that you
+had made.
+
+NEW: MultiViews support.  You can now set up WebSVN to access the
+     repositories using a URL such as:
+     
+      http://server/wsvn/repname/path/to/rep
+
+NEW: Colourisation support using Enscript
+NEW: [websvn-test] function can now be nested
+NEW: locwebsvnhttp variable added in template system
+NEW: Bluegrey scheme now has show/hide changed link
+
+FIX: Possible security hole with abuse of popen
+FIX: WebSVN should now function correctly (again) on non windows servers.
+FIX: First character of diff listing was missing
+
+1.20
+
+NEW: Comprehensive templating solution
+NEW: Show the age of a revision in the log view
+
+CHANGE: The youngest revision of the current directory is now shown by
+        default (as opposed to the head revision of the entire repository.
+        This means that clicking on a directory will show the lastest 
+        changes associated with it. A specific revision can still be
+        selected from a log view
+CHANGE: Only show the leaf name when viewing directory contents
+
+FIX: Fixed error concerning use of pclose
+
+1.10/1.10a
+
+There are a few changes to the config file in this release.  Copy
+distconfig.inc to config.inc and redo any configuration changes that you
+had made.
+
+NEW: WebSVN now caches information on the repositories.  Once a revision
+     has been viewed subsequent revisions use the cached infomation to 
+     display the directory structure.  This significantly improves the
+     browsing speed.
+NEW: German language file (thanks to Stephan Stapel)
+
+1.04/1.04a
+
+Please note that the config file is now stored in include/
+
+FIX: Directories in the log view lacked their trailing slashes.
+FIX: Diff is now far more efficient with Apache's memory,
+     and shows the corrrect line numbers.
+FIX: setDiffPath now works.
+FIX: Bug introduced in 1.03 whereby the revision number always showed '1'
+     corrected.
+
+Note that you can't view logs with 1.04!  Use 1.04a.
+
+1.03
+
+Note that the config.inc file has completely changed in this release, in
+order to make it more "future proof" and resiliant.  You'll need to copy
+distconfig.inc to config.inc redo the appropriate changes are described.
+
+NEW: A 'ParentPath' can now be specified, rather than having to specify the
+     directories by hand.
+
+FIX: Rewrite of the file list code.  Should now be quite a bit faster
+FIX: Use a more memory efficient algorithm to list file contents
+FIX: Spaces in Windows path to svnlook and diff are now handled properly
+FIX: Calls to external commands such as svnlook no longer require Windows
+     style line endings.
+
+1.02
+
+NEW: Improved command handling to report returned errors.  Considerably helps
+     initial installation problems.
+NEW: Show the author of each revision in the log view
+
+FIX: Removed the spurious &nbsp that some people were seeing
+
+1.01 (5 Feb 2004)
+
+FIX: Files with HTML content are now shown correcty
+FIX: The diff output had the revision lables the wrong way round
+
+1.00 (4 Feb 2004)
+
+First Public Release
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/comp.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/comp.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/comp.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,347 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// comp.php
+//
+// Compare two paths using "svn diff"
+//
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+
+$svnrep = new SVNRepository($rep->path);
+
+function checkRevision($rev)
+{
+   if (is_numeric($rev) && ((int)$rev > 0))
+      return $rev;
+      
+   $rev = strtoupper($rev);
+   
+   switch($rev)
+   {
+      case "HEAD":
+      case "PREV":
+      case "COMMITTED":
+         return $rev;
+   }
+   
+   return "HEAD";   
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+// Retrieve the request information
+$path1 = @$_REQUEST["compare"][0];
+$path2 = @$_REQUEST["compare"][1];
+$rev1 = @$_REQUEST["compare_rev"][0];
+$rev2 = @$_REQUEST["compare_rev"][1];
+
+// Some page links put the revision with the path...
+if (strpos($path1, "@")) list($path1, $rev1) = explode("@", $path1);
+if (strpos($path2, "@")) list($path2, $rev2) = explode("@", $path2);
+
+$rev1 = checkRevision($rev1);
+$rev2 = checkRevision($rev2);
+
+// Choose a sensible comparison order unless told not to
+if (!@$_REQUEST["manualorder"] && is_numeric($rev1) && is_numeric($rev2))
+{
+   if ($rev1 > $rev2)
+   {
+      $temppath = $path1;
+      $temprev = $rev1;
+      
+      $path1 = $path2;
+      $rev1 = $rev2;
+      
+      $path2 = $temppath;
+      $rev2 = $temprev;
+   }
+}
+
+$url = $config->getURL($rep, "", "comp");
+$vars["revlink"] = "<a href=\"${url}compare%5B%5D=".urlencode($path2)."@$rev2&amp;compare%5B%5D=".urlencode($path1)."@$rev1&manualorder=1\">${lang["REVCOMP"]}</a>";
+
+if ($rev1 == 0) $rev1 = "HEAD";
+if ($rev2 == 0) $rev2 = "HEAD";
+
+$vars["repname"] = $rep->name;
+$vars["action"] = $lang["PATHCOMPARISON"];
+$vars["compare_form"] = "<form action=\"$url\" method=\"post\" name=\"compareform\">";
+$vars["compare_path1input"] = "<input type=\"text\" size=\"40\" name=\"compare[0]\" value=\"$path1\">";
+$vars["compare_rev1input"] = "<input type=\"text\" size=\"5\" name=\"compare_rev[0]\" value=\"$rev1\">";
+$vars["compare_path2input"] = "<input type=\"text\" size=\"40\" name=\"compare[1]\" value=\"$path2\">";
+$vars["compare_rev2input"] = "<input type=\"text\" size=\"5\" name=\"compare_rev[1]\" value=\"$rev2\">";
+$vars["compare_submit"] = "<input name=\"comparesubmit\" type=\"submit\" value=\"${lang["COMPAREPATHS"]}\">";
+$vars["compare_endform"] = "<input type=\"hidden\" name=\"op\" value=\"comp\"><input type=\"hidden\" name=\"manualorder\" value=\"1\"><input type=\"hidden\" name=\"sc\" value=\"$showchanged\"></form>";   
+
+$vars["path1"] = $path1;
+$vars["path2"] = $path2;
+
+$vars["rev1"] = $rev1;
+$vars["rev2"] = $rev2;
+
+$noinput = empty($path1) || empty($path2);
+$listing = array();
+
+// Generate the diff listing
+$path1 = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $svnrep->repPath.$path1));
+$path2 = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $svnrep->repPath.$path2));
+
+$debug = false;
+
+if (!$noinput)
+{
+   $rawcmd = $config->svn." diff -r$rev1:$rev2 ".quote("file:///".$path1)." ".quote("file:///".$path2);
+   $cmd = quoteCommand($rawcmd, true);
+   if ($debug) echo "$cmd\n";
+}
+
+function clearVars()
+{
+   global $listing, $index;
+   
+   $listing[$index]["newpath"] = null;
+   $listing[$index]["endpath"] = null;
+   $listing[$index]["info"] = null;
+   $listing[$index]["diffclass"] = null;
+   $listing[$index]["difflines"] = null;
+   $listing[$index]["enddifflines"] = null;
+   $listing[$index]["properties"] = null;
+}	   
+
+$vars["success"] = false;
+
+if (!$noinput)
+{
+   if ($diff = popen($cmd, "r"))
+   {
+      $index = 0;
+      $indiff = false;
+      $indiffproper = false;
+      $getLine = true;
+      $node = null;
+   
+      $vars["success"] = true;
+   
+   	while (!feof($diff))
+   	{
+   	   if ($getLine)
+   	      $line = fgets($diff);
+         
+         clearVars();	   
+   	   $getLine = true;
+         if ($debug) print "Line = '$line'<br>" ;	         
+   	   if ($indiff)
+   	   {
+      	   // If we're in a diff proper, just set up the line
+      	   if ($indiffproper)
+      	   {
+         	   if ($line[0] == " " || $line[0] == "+" || $line[0] == "-")
+         	   {
+         	      switch ($line[0])
+         	      {
+         	         case " ":
+         	            $listing[$index]["diffclass"] = "diff";
+         	            $subline = replaceEntities(rtrim(substr($line, 1))); 
+         	            if (empty($subline)) $subline = "&nbsp;";
+         	            $listing[$index++]["line"] = $subline;
+                        if ($debug) print "Including as diff: $subline<br>";
+         	            break;
+         	   
+         	         case "+":
+         	            $listing[$index]["diffclass"] = "diffadded";
+         	            $subline = replaceEntities(rtrim(substr($line, 1))); 
+         	            if (empty($subline)) $subline = "&nbsp;";
+         	            $listing[$index++]["line"] = $subline;
+                        if ($debug) print "Including as added: $subline<br>";
+         	            break;
+         
+         	         case "-":
+         	            $listing[$index]["diffclass"] = "diffdeleted";
+         	            $subline = replaceEntities(rtrim(substr($line, 1))); 
+         	            if (empty($subline)) $subline = "&nbsp;";
+         	            $listing[$index++]["line"] = $subline;
+                        if ($debug) print "Including as removed: $subline<br>";
+         	            break;
+         	      }
+         	      
+         	      continue;
+         	   }
+         	   else
+         	   {
+         	      $indiffproper = false;
+         	      $listing[$index++]["enddifflines"] = true;
+         	      $getLine = false;
+                  if ($debug) print "Ending lines<br>";
+         	      continue;
+         	   }
+      	   }
+      	   
+      	   // Check for the start of a new diff area
+      	   if (!strncmp($line, "@@", 2))
+            {
+               $pos = strpos($line, "+");
+               $posline = substr($line, $pos); 
+         	   sscanf($posline, "+%d,%d", $sline, $eline);
+                        if ($debug) print "sline = '$sline', eline = '$eline'<br>";      	   
+         	   // Check that this isn't a file deletion
+         	   if ($sline == 0 && $eline == 0)
+         	   {
+         	      $line = fgets($diff);
+                  if ($debug) print "Ignoring: $line<br>" ;	         
+         	      while ($line[0] == " " || $line[0] == "+" || $line[0] == "-")
+                  {
+         	         $line = fgets($diff);
+                     if ($debug) print "Ignoring: $line<br>" ;	         
+                  }      	
+                           
+         	      $getLine = false;
+                  if ($debug) print "Unignoring previous - marking as deleted<b>";
+                  $listing[$index++]["info"] = $lang["FILEDELETED"];
+         	   }
+         	   else
+         	   {
+         	      $listing[$index++]["difflines"] = $line;
+         	      $indiffproper = true;
+         	   }
+         	   
+         	   continue;
+         	}
+         	else
+         	{
+         	   $indiff = false;
+               if ($debug) print "Ending diff";
+         	}
+         }
+         
+   	   // Check for a new node entry
+         if (strncmp(trim($line), "Index: ", 7) == 0)
+         {
+            // End the current node
+            if ($node)
+            {
+               $listing[$index++]["endpath"] = true;
+               clearVars();
+            }
+               
+            $node = trim($line);
+            $node = substr($node, 7);
+      
+            $listing[$index]["newpath"] = $node;
+            if ($debug) echo "Creating node $node<br>";
+            
+            // Skip past the line of ='s
+            $line = fgets($diff);
+            if ($debug) print "Skipping: $line<br>" ;	         
+           
+            // Check for a file addition
+            $line = fgets($diff);
+            if ($debug) print "Examining: $line<br>" ;	         
+            if (strpos($line, "(revision 0)"))
+               $listing[$index]["info"] = $lang["FILEADDED"];
+            
+            if (strncmp(trim($line), "Cannot display:", 15) == 0)
+            {
+               $index++;
+               clearVars();
+               $listing[$index++]["info"] = $line;
+               continue;
+            }
+            
+            // Skip second file info
+            $line = fgets($diff);
+            if ($debug) print "Skipping: $line<br>" ;	         
+            
+            $indiff = true;
+            $index++;
+            
+            continue;
+         }
+      
+         if (strncmp(trim($line), "Property changes on: ", 21) == 0)
+         {
+            $propnode = trim($line);
+            $propnode = substr($propnode, 21);
+            
+            if ($debug) print "Properties on $propnode (cur node $ $node)";
+            if ($propnode != $node)
+            {
+               if ($node)
+               {
+                  $listing[$index++]["endpath"] = true;
+                  clearVars();
+               }
+                  
+               $node = $propnode;
+   
+               $listing[$index++]["newpath"] = $node;
+               clearVars();
+            }
+            
+            $listing[$index++]["properties"] = true;
+            clearVars();
+            if ($debug) echo "Creating node $node<br>";
+   
+            // Skip the row of underscores
+            $line = fgets($diff);
+            if ($debug) print "Skipping: $line<br>" ;	     
+            
+            while ($line = trim(fgets($diff)))
+            {
+               $listing[$index++]["info"] = $line;
+               clearVars();
+            }
+            
+            continue;
+         }
+         
+         // Check for error messages
+         if (strncmp(trim($line), "svn: ", 5) == 0)
+         {
+            $listing[$index++]["info"] = urldecode($line);
+            $vars["success"] = false;
+            continue;
+         }
+         
+         $listing[$index++]["info"] = $line;
+         
+      }
+         
+      if ($node)
+      { 
+         clearVars();
+         $listing[$index++]["endpath"] = true;
+      }
+         
+      if ($debug) print_r($listing);
+   }		   
+}
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."compare.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+   
+?>

Added: trunk/svn.matroska.org/WebSVN/diff.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/diff.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/diff.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,352 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// diff.php
+//
+// Show the differences between 2 revisions of a file.
+//
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+
+$context = 5;
+
+$vars["action"] = $lang["DIFF"];
+$all = (@$_REQUEST["all"] == 1)?1:0;
+
+// Make sure that we have a repository
+if (!isset($rep))
+{
+   echo $lang["NOREP"];
+   exit;
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+// If there's no revision info, go to the lastest revision for this path
+$history = $svnrep->getHistory($path);
+$youngest = $history[0]["rev"];
+
+if (empty($rev))
+   $rev = $youngest;
+
+$history = $svnrep->getHistory($path, $rev);
+
+if ($path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+$prevrev = @$history[1]["rev"];
+
+$vars["repname"] = $rep->name;
+$vars["rev"] = $rev;
+$vars["path"] = $ppath;
+$vars["prevrev"] = $prevrev;
+
+$vars["rev1"] = $history[0]["rev"];
+$vars["rev2"] = $prevrev;
+
+createDirLinks($rep, $ppath, $rev, $showchanged);
+
+$listing = array();
+
+if ($prevrev)
+{
+   $url = $config->getURL($rep, $path, "diff");
+   
+   if (!$all)
+   {
+      $vars["showalllink"] = "<a href=\"${url}rev=$rev&amp;sc=$showchanged&amp;all=1\">${lang["SHOWENTIREFILE"]}</a>";
+      $vars["showcompactlink"] = "";
+   }
+   else
+   {
+      $vars["showcompactlink"] = "<a href=\"${url}rev=$rev&amp;sc=$showchanged&amp;all=0\">${lang["SHOWCOMPACT"]}</a>";
+      $vars["showalllink"] = "";
+   }
+
+   // Get the contents of the two files
+   $newtname = tempnam("temp", "");
+   $new = $svnrep->getFileContents($history[0]["path"], $newtname, $history[0]["rev"]);
+
+   $oldtname = tempnam("temp", "");
+   $old = $svnrep->getFileContents($history[1]["path"], $oldtname, $history[1]["rev"]);
+   
+   $ent = true;
+   if ((strrchr($path, ".") == '.php') || ($config->useEnscript))
+      $ent = false;
+
+   $file1cache = array();
+
+   if ($all)
+      $context = 1;  // Setting the context to 0 makes diff generate the wrong line numbers!
+
+   // Open a pipe to the diff command with $context lines of context   
+   
+   $cmd = quoteCommand($config->diff." --ignore-all-space -U $context $oldtname $newtname", false);
+   
+   if ($all)
+   {
+      $ofile = fopen($oldtname, "r");
+      $nfile = fopen($newtname, "r");      
+   }
+
+   if ($diff = popen($cmd, "r"))
+   {
+      // Ignore the 3 header lines
+	   $line = fgets($diff);
+	   $line = fgets($diff);
+
+      // Get the first real line
+	   $line = fgets($diff);
+      
+      $index = 0;
+      $listing = array();
+      
+      $curoline = 1;
+      $curnline = 1;
+      
+		while (!feof($diff))
+		{  
+		   // Get the first line of this range
+		   sscanf($line, "@@ -%d", $oline);
+		   
+		   $line = substr($line, strpos($line, "+"));
+		   sscanf($line, "+%d", $nline);
+		   
+		   if ($all)
+		   {
+		      while ($curoline < $oline || $curnline < $nline)
+		      {
+		         $listing[$index]["rev1diffclass"] = "diff";
+               $listing[$index]["rev2diffclass"] = "diff";
+                     
+               if ($curoline < $oline)
+               {
+                  $nl = fgets($ofile);
+                  
+                  if ($ent)
+                     $line = replaceEntities(rtrim($nl));
+                  else
+                     $line = rtrim($nl);
+                     
+                  $listing[$index]["rev1line"] = hardspace($line);
+
+                  $curoline++;
+               }
+               else
+                  $listing[$index]["rev1line"] = "&nbsp;";
+                  
+               if ($curnline < $nline)
+               {
+                  $nl = fgets($nfile);
+
+                  if ($ent)
+                     $line = replaceEntities(rtrim($nl));
+                  else
+                     $line = rtrim($nl);
+                     
+                  $listing[$index]["rev1line"] = hardspace($line);
+                  $curnline++;
+               }
+               else
+                  $listing[$index]["rev2line"] = "&nbsp;";
+                  
+      		   $listing[$index]["rev1lineno"] = 0;
+      		   $listing[$index]["rev2lineno"] = 0;
+
+		         $index++;
+		      }
+		   }
+		   else
+		   {
+   		   // Output the line numbers
+   		   $listing[$index]["rev1lineno"] = "$oline";
+   		   $listing[$index]["rev2lineno"] = "$nline";
+   		   $index++;
+		   }
+		   
+         $fin = false;
+         while (!feof($diff) && !$fin)
+         {          
+   		   $listing[$index]["rev1lineno"] = 0;
+   		   $listing[$index]["rev2lineno"] = 0;
+
+		      $line = fgets($diff);
+            if (!strncmp($line, "@@", 2))
+		      {
+		         $fin = true;
+		      }
+		      else
+		      {
+               $mod = $line{0};
+
+               if ($ent)
+                  $line = replaceEntities(rtrim(substr($line, 1)));
+               else
+                  $line = rtrim(substr($line, 1));
+                  
+               $listing[$index]["rev1line"] = hardspace($line);
+
+               $text = hardspace($line);
+               if ($text == "") $text = "&nbsp;";
+               
+               switch ($mod)
+               {
+                  case "-":
+                     $listing[$index]["rev1diffclass"] = "diffdeleted";
+                     $listing[$index]["rev2diffclass"] = "diff";
+                     
+                     $listing[$index]["rev1line"] = $text;
+                     $listing[$index]["rev2line"] = "&nbsp;";
+                     
+                     if ($all)
+                     {
+                        fgets($ofile);
+                        $curoline++;
+                     }
+                     
+                     break;  
+
+                  case "+":
+                     
+                     // Try to mark "changed" line sensibly
+                     if (!empty($listing[$index-1]) && empty($listing[$index-1]["rev1lineno"]) && $listing[$index-1]["rev1diffclass"] == "diffdeleted" && $listing[$index-1]["rev2diffclass"] == "diff")
+                     {
+                        $i = $index - 1;
+                        while (!empty($listing[$i-1]) && empty($listing[$i-1]["rev1lineno"]) && $listing[$i-1]["rev1diffclass"] == "diffdeleted" && $listing[$i-1]["rev2diffclass"] == "diff")
+                           $i--;
+                           
+                        $listing[$i]["rev1diffclass"] = "diffchanged";
+                        $listing[$i]["rev2diffclass"] = "diffchanged";
+                        $listing[$i]["rev2line"] = $text;
+                        
+                        if ($all)
+                        {
+                           fgets($nfile);
+                           $curnline++;
+                        }
+
+                        // Don't increment the current index count
+                        $index--;
+                     }
+                     else
+                     {
+                        $listing[$index]["rev1diffclass"] = "diff";
+                        $listing[$index]["rev2diffclass"] = "diffadded";
+                        
+                        $listing[$index]["rev1line"] = "&nbsp;";
+                        $listing[$index]["rev2line"] = $text;
+
+                        if ($all)
+                        {
+                           fgets($nfile);
+                           $curnline++;
+                        }
+                     }
+                     break;
+                     
+                  default:
+                     $listing[$index]["rev1diffclass"] = "diff";
+                     $listing[$index]["rev2diffclass"] = "diff";
+                     
+                     $listing[$index]["rev1line"] = $text;
+                     $listing[$index]["rev2line"] = $text;
+                     
+                     if ($all)
+                     {
+                        fgets($ofile);
+                        fgets($nfile);
+                        $curoline++;
+                        $curnline++;
+                     }
+
+                     break;                         		
+               }
+		      }
+		      
+		      if (!$fin)
+		         $index++;
+		   }
+		}   
+		
+		// Output the rest of the files
+	   if ($all)
+	   {
+	      while (!feof($ofile) || !feof($nfile))
+	      {
+	         $listing[$index]["rev1diffclass"] = "diff";
+            $listing[$index]["rev2diffclass"] = "diff";
+                  
+            if ($ent)
+               $line = replaceEntities(rtrim(fgets($ofile)));
+            else
+               $line = rtrim(fgets($ofile));
+
+            if (!feof($ofile))
+               $listing[$index]["rev1line"] = hardspace($line);
+            else
+               $listing[$index]["rev1line"] = "&nbsp;";
+               
+            if ($ent)
+               $line = replaceEntities(rtrim(fgets($nfile)));
+            else
+               $line = rtrim(fgets($nfile));
+
+            if (!feof($nfile))
+               $listing[$index]["rev2line"] = hardspace($line);
+            else
+               $listing[$index]["rev2line"] = "&nbsp;";
+               
+   		   $listing[$index]["rev1lineno"] = 0;
+   		   $listing[$index]["rev2lineno"] = 0;
+
+	         $index++;
+	      }
+	   }
+		
+		pclose($diff);   
+   }		   
+   
+   if ($all)
+   {
+      fclose($ofile);
+      fclose($nfile);      
+   }
+
+   // Remove our temporary files   
+   unlink($oldtname);
+   unlink($newtname);
+}
+else
+{
+   $vars["noprev"] = 1;
+}
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."diff.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+   
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/dl.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/dl.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/dl.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,104 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// dl.php
+//
+// Create gz/tar files of the requested item
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+
+// Make sure that this operation is allowed
+
+if (!$rep->getAllowDownload())
+   exit;
+
+$svnrep = new SVNRepository($rep->path);
+
+if ($path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+// If there's no revision info, go to the lastest revision for this path
+$history = $svnrep->getHistory($path);
+$youngest = $history[0]["rev"];
+
+if (empty($rev))
+   $rev = $youngest;
+
+// Create a temporary directory.  Here we have an unavoidable but highly
+// unlikely to occure race condition
+
+$tmpname = tempnam("temp", "wsvn");
+unlink($tmpname);
+if (mkdir($tmpname))
+{
+   // Get the name of the directory being archived
+   $arcname = substr($path, 0, -1);
+   $arcname = basename($arcname);
+   if (empty($arcname))
+      $arcname = $rep->name;
+
+   $svnrep->exportDirectory($path, $tmpname.DIRECTORY_SEPARATOR.$arcname, $rev);
+   
+   // Create the tar file
+   chdir($tmpname);
+   exec($config->tar." -cf $arcname.tar $arcname");
+   
+   // ZIP it up
+   exec($config->gzip." $arcname.tar");
+   $size = filesize("$arcname.tar.gz");
+
+   // Give the file to the browser
+
+   if ($fp = @fopen("$arcname.tar.gz","rb"))
+   {
+      header("Content-Type: application/x-gzip");
+      header("Content-Length: $size");
+      header("Content-Disposition: attachment; filename=$arcname.tar.gz");
+      @fpassthru($fp);
+   }
+   else
+   {
+      print "Unable to open file $arcname.tar.gz";
+   }
+   
+   fclose($fp);
+   
+   chdir("..");
+
+   // Delete the directory.  Why doesn't PHP have a generic recursive directory
+   // deletion command?  It's stupid.
+
+   if ($config->serverIsWindows)
+   {
+      $cmd = quoteCommand("rmdir /S /Q ".quote($tmpname), false);
+   }
+   else
+   {
+      $cmd = quoteCommand("rm -rf ".quote($tmpname), false);
+   }
+   
+   @exec($cmd);
+}
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/filedetails.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/filedetails.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/filedetails.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,148 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// filedetails.php
+//
+// Simply lists the contents of a file
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+
+// Make sure that we have a repository
+if (!isset($rep))
+{
+   echo $lang["NOREP"];
+   exit;
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+if ($path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+$passrev = $rev;
+
+// If there's no revision info, go to the lastest revision for this path
+$history = $svnrep->getHistory($path);
+$youngest = $history[0]["rev"];
+
+if (empty($rev))
+   $rev = $youngest;
+
+$extn = strrchr($path, ".");
+
+// Check to see if the user has requested that this type be zipped and sent
+// to the browser as an attachment
+
+if (in_array($extn, $zipped))
+{
+   $base = basename($path);
+   header("Content-Type: application/x-gzip");
+   header("Content-Disposition: attachment; filename=".urlencode($base).".gz");
+
+   // Get the file contents and pipe into gzip.  All this without creating
+   // a temporary file.  Damn clever.
+   $svnrep->getFileContents($path, "", $rev, "| ".$config->gzip." -n -f");
+   
+   exit;
+}
+
+// Check to see if we should serve it with a particular content-type.
+// The content-type could come from an svn:mime-type property on the
+// file, or from the $contentType array in setup.inc.
+
+if (!$rep->getIgnoreSvnMimeTypes()) 
+{
+  $svnMimeType = $svnrep->getProperty($path, 'svn:mime-type', $rev);
+}
+
+if (!$rep->getIgnoreWebSVNContentTypes()) 
+{
+  $setupContentType = @$contentType[$extn];
+}
+
+// Use this set of priorities when establishing what content-type to
+// actually use.
+
+if (!empty($svnMimeType) && $svnMimeType != 'application/octet-stream') 
+{
+  $cont = $svnMimeType;
+}
+else if (!empty($setupContentType))
+{
+  $cont = $setupContentType;
+} 
+else if (!empty($svnMimeType))
+{
+  // It now is equal to application/octet-stream due to logic
+  // above....
+  $cont = $svnMimeType;
+}
+
+// If there's a MIME type associated with this format, then we deliver it
+// with this information 
+
+if (!empty($cont))
+{
+   $base = basename($path);
+   
+   header("Content-Type: $cont");
+   //header("Content-Length: $size");
+   header("Content-Disposition: inline; filename=".urlencode($base));
+   
+   $svnrep->getFileContents($path, "", $rev);
+   
+   exit;
+}
+
+// There's no associated MIME type.  Show the file using WebSVN.
+
+$url = $config->getURL($rep, $path, "file");
+
+if ($rev != $youngest)
+   $vars["goyoungestlink"] = "<a href=\"${url}sc=1\">${lang["GOYOUNGEST"]}</a>";
+else
+   $vars["goyoungestlink"] = "";
+
+$vars["action"] = "";
+$vars["repname"] = $rep->name;
+$vars["rev"] = $rev;
+$vars["path"] = $ppath;
+
+createDirLinks($rep, $ppath, $passrev, $showchanged);
+
+$url = $config->getURL($rep, $path, "diff");
+$vars["prevdifflink"] = "<a href=\"${url}rev=$passrev&amp;sc=$showchanged\">${lang["DIFFPREV"]}</a>";
+
+$url = $config->getURL($rep, $path, "blame");
+$vars["blamelink"] = "<a href=\"${url}rev=$passrev&amp;sc=$showchanged\">${lang["BLAME"]}</a>";
+
+$listing = array ();
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."file.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/form.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/form.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/form.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,59 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// form.php
+//
+// Handling of WebSVN forms
+
+require_once("include/setup.inc");
+require_once("include/utils.inc");
+
+// Generic redirect handling
+
+function redirect($loc)
+{
+   $url= getFullURL($loc);
+   
+   header("Location: $url");
+   echo "<html><script language=\"JavaScript\" type=\"text/JavaScript\">window.location = \"$url\"</script></html>";
+}
+
+// Handle project selection
+
+if (@$_REQUEST["selectproj"])
+{   
+   $basedir = dirname($_SERVER["PHP_SELF"]);
+   if ($basedir != "" && $basedir != DIRECTORY_SEPARATOR && $basedir != "\\" && $basedir != "/" )
+      $basedir .= "/";
+   else
+      $basedir = "/";
+      
+   $url = $config->getURL($rep, "/", "dir");
+   $url = html_entity_decode($url);
+   
+   if ($config->multiViews)
+      redirect($url."sc=$showchanged");
+   else
+      redirect($basedir.$url."sc=$showchanged");   
+}
+
+
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/include/bugtraq.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/bugtraq.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/bugtraq.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,124 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// bugtraq.inc
+//
+// Functions for accessing the bugtraq properties and replacing issue IDs
+// with URLs.
+//
+// For more information about bugtraq, see 
+// http://svn.collab.net/repos/tortoisesvn/trunk/doc/issuetrackers.txt
+
+class Bugtraq
+{
+   var $msgstring;
+   var $urlstring;
+   
+   var $firstPart;
+   var $firstPartLen;
+   var $lastPart;
+   var $lastPartLen;
+   
+   var $propsfound = false;
+   
+   function Bugtraq($rep, $svnrep, $path)
+   {
+      global $config;
+            
+      if ($rep->getBugtraq())
+      {
+         $pos = strrpos($path, "/");
+         $parent = substr($path, 0, $pos + 1);
+      
+         while ((empty($this->msgstring) || empty($this->urlstring)) && (strpos($parent, "/") !== false))
+         {
+            if (empty($this->msgstring)) $this->msgstring = $svnrep->getProperty($parent, 'bugtraq:message');
+            if (empty($this->urlstring)) $this->urlstring = $svnrep->getProperty($parent, 'bugtraq:url');
+                  
+            $parent = substr($parent, 0, -1);        // Remove the trailing slash
+            $pos = strrpos($parent, "/");            // Find the last trailing slash
+            $parent = substr($parent, 0, $pos + 1);  // Find the previous parent directory      
+         }
+         
+         if (!empty($this->msgstring) && !empty($this->urlstring))
+         {
+            $this->msgstring = trim($this->msgstring);
+            $this->urlstring = trim($this->urlstring);
+            
+            if (($bugidpos = strpos($this->msgstring, "%BUGID%")) !== false && strpos($this->urlstring, "%BUGID%") !== false)
+            {
+               // Get the textual parts of the message string for comparison purposes
+               $this->firstPart = substr($this->msgstring, 0, $bugidpos);
+               $this->firstPartLen = strlen($this->firstPart);
+               $this->lastPart = substr($this->msgstring, $bugidpos + 7);
+               $this->lastPartLen = strlen($this->lastPart);
+            }
+            
+            $this->propsfound = true;
+         }
+      }
+   }
+
+   function replaceIDs($message)
+   {
+      if ($this->propsfound)
+      {
+         $logmsg  = "";
+         $message = rtrim($message);
+         
+         // Just compare the last line            
+         if ($offset = strrpos($message, "\n"))
+         {
+            $logmsg = substr($message, 0, $offset + 1);
+            $lastLine = substr($message, $offset + 1);
+         }
+         else
+            $lastLine = $message;
+            
+         // Make sure that our line really is an issue tracker message
+         if (((strncmp($lastLine, $this->firstPart, $this->firstPartLen) == 0) || (($offset !== false) && ($logmsg == ""))) &&
+             strcmp(substr($lastLine, -$this->lastPartLen, $this->lastPartLen), $this->lastPart) == 0)
+         {
+            // Get the issues list
+            if ($this->lastPartLen > 0)
+               $issues = substr($lastLine, $this->firstPartLen, -$this->lastPartLen);
+            else
+               $issues = substr($lastLine, $this->firstPartLen);
+            
+            // Add each reference to the first part of the line
+            $line = $this->firstPart;
+            while ($pos = strpos($issues, ","))
+            {
+               $issue  = trim(substr($issues, 0, $pos));
+               $issues = substr($issues, $pos + 1);
+               
+               $line .= "<a href=\"".str_replace("%BUGID%", $issue, $this->urlstring)."\">$issue</a>, ";
+            }
+            $line .= "<a href=\"".str_replace("%BUGID%", trim($issues), $this->urlstring)."\">".trim($issues)."</a>".$this->lastPart;
+            
+            return $logmsg.$line;
+         }
+      }
+      
+      return $message;
+   }
+}
+?>

Added: trunk/svn.matroska.org/WebSVN/include/command.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/command.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/command.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,153 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// command.inc
+//
+// External command handling
+
+function replaceEntities($str)
+{
+   global $config;
+   
+   if (version_compare(phpversion(), "4.1.0", "<"))
+      $str = htmlentities($str);
+   else
+      $str = htmlentities($str, ENT_COMPAT, $config->outputEnc);
+
+   return $str;
+}
+
+function transChars($str, $doEnt = true)
+{
+   global $config;
+   
+   // Try to convert the messages based on the locale information
+   if ($config->inputEnc && $config->outputEnc)
+   {
+      if (function_exists("iconv"))
+      {
+         $output = @iconv($config->inputEnc, $config->outputEnc, $str);
+         if (!empty($output))
+            $str = $output;
+      }
+   }
+   
+   if ($doEnt) $str = replaceEntities($str);
+
+   return $str;
+}
+
+function transArray($arr)
+{
+   global $config;
+   
+   $narr = array();
+   
+   foreach ($arr as $key => $value)
+   {
+      // Try to convert the messages based on the locale information
+      if ($config->inputEnc && $config->outputEnc)
+      {
+         if (function_exists("iconv"))
+         {
+            $output = @iconv($config->inputEnc, $config->outputEnc, $value);
+            if (!empty($output))
+               $value = $output;
+         }
+      }
+
+      $narr[$key] = replaceEntities(rtrim($value));
+   }
+      
+   return $narr;
+}
+
+function quoteCommand($cmd, $redirecterr)
+{
+   global $config;
+   
+   if ($redirecterr)
+      $cmd .= " 2>&1";
+      
+   // On Windows machines, the whole line needs quotes round it so that it's
+   // passed to cmd.exe correctly
+
+   if ($config->serverIsWindows)
+      $cmd = "\"$cmd\"";
+   
+   return $cmd;
+}
+
+function runCommand($cmd, $mayReturnNothing = false)
+{
+   global $lang;
+   
+   $output = array ();
+   $err = false;
+
+   $c = quoteCommand($cmd, false);
+      
+   // Try to run the command normally
+   if ($handle = popen($c, "r"))
+   {
+      $firstline = true;
+		while (!feof($handle))
+		{
+		   $line = fgets($handle);
+		   if ($firstline && $line == "" && !$mayReturnNothing)
+		   {
+		      $err = true;
+		   }
+		   $firstline = false;
+		   $output[] = transChars(rtrim($line));
+		}
+		
+		pclose($handle);
+		if (!$err)
+		   return $output;
+   }
+
+   echo "${lang["BADCMD"]}: <i><b>$cmd</b></i><br>";
+   
+   // Rerun the command, this time grabbing the error information
+
+   $c = quoteCommand($cmd, true);
+
+   $output = transChars(shell_exec($c));
+   if (!empty($output)) print "<p>".nl2br($output);
+   exit;
+}
+
+// quote
+//
+// Quote a string to send to the command line
+
+function quote($str)
+{
+   global $config;
+
+   if ($config->serverIsWindows)
+      return "\"$str\"";
+   else
+      return escapeshellarg($str);      
+}
+
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/include/config.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/config.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/config.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,238 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// config.inc
+//
+// Configuration parameters
+
+// --- FOLLOW THE INSTRUCTIONS BELOW TO CONFIGURE YOUR SETUP ---
+
+// --- PLATFORM CONFIGURATION ---
+
+// Uncomment the next line if your running a windows server
+//
+// $config->setServerIsWindows();
+
+// Configure these lines if your commands aren't on your path. 
+//
+$config->setSVNCommandPath("/usr/local/bin/");
+$config->setDiffPath("/usr/bin/");
+
+// For syntax colouring, if option enabled...
+// $config->setEnscriptPath("Path/to/enscript/command/");
+// $config->setSedPath("Path/to/sed/command/");
+
+// For delivered tarballs, if option enabled...
+// $config->setTarPath("Path/to/tar/command/");
+
+// For delivered GZIP'd files and tarballs, if option enabled...
+// $config->setGZipPath("Path/to/gzip/command/");
+
+// --- REPOSITORY SETUP ---
+
+// There are 2 methods for defining the repositiories available on the system.  Either you list
+// them by hand, in which case you can give each one the name of your choice, or you use the
+// parent path function, in which case the name of the directory is used as the repository name.
+//
+// To configure the repositories by hand, copy the line below, uncomment it and replace the name and path
+//
+$config->addRepository("Matroska Website", "/svn/www");
+$config->addRepository("Matroska Sources", "/svn/matroska");
+//
+// To use the parent path method, uncomment the newt line and and replace the path with your one.  You
+// can call the function several times if you have several parent paths.
+//
+// $config->parentPath("Path/to/parent (e.g. c:\\svn)");
+
+// --- LOOK AND FEEL ---
+//
+// Uncomment ONLY the display file that you want.  
+
+$config->setTemplatePath("$locwebsvnreal/templates/Standard/");
+// $config->setTemplatePath("$locwebsvnreal/templates/BlueGrey/");
+// $config->setTemplatePath("$locwebsvnreal/templates/Zinn/");
+
+// --- LANGUAGE SETUP ---
+
+// Uncomment ONLY the language file which you want.  If you want English then don't do anything here.
+//
+// include("languages/german.inc");
+// include("languages/french.inc");
+// include("languages/spanish.inc");
+// include("languages/portuguese.inc");
+// include("languages/swedish.inc");
+
+// include("languages/japanese-euc.inc");  // (Almost Unix/Linux/BSD)
+// include("languages/japanese-jis.inc");  // (ISO-2022-JP)
+// include("languages/japanese-sjis.inc"); // (Windows)
+// include("languages/japanese-utf8.inc"); // (FedoraCore/Max OS X/BeOS)
+
+// include("languages/korean-euc.inc"); 
+// include("languages/korean-utf8.inc");
+
+// include("languages/tchinese.inc"); 
+// include("languages/tchinese-utf8.inc");
+
+// By default, WebSVN tries to use the iconv module (if enabled) to convert log messages from your
+// system's character set to you default output encoding. If you find that your log messages aren't
+// displayed correctly then you'll need to change the values here.
+
+// $config->setInputEncoding("iso-8859-1");  // Encoding of log messages returned by svnlook on your system
+// $config->setOutputEncoding("iso-8859-1"); // Encoding of resulting web page
+$config->setOutputEncoding("utf8"); // Encoding of resulting web page
+
+// Note for Windows users:  To enable iconv you'll need to enable the extension in your php.ini file 
+// AND copy iconv.dll (not php_iconv.dll) to your Windows system folder.  In most cases the correct
+// encoding is set when you call $config->setServerIsWindows();.  
+
+// Note for *nix users.  You'll need to have iconv compiled into your binary.  The default input and
+// output encodings are taken from your locale informations.  Override these if they aren't correct.
+
+// --- MULTIVIEWS ---
+
+// Uncomment this line if you want to use MultiView to access the repository by, for example:
+//
+// http://servername/wsvn/repname/path/in/repository
+//
+// Note: The websvn directory will need to have Multiviews turned on in Apache, and you'll need to configure
+//       wsvn.php
+
+$config->useMultiViews();
+
+// --- FILE CONTENT ---
+//
+// You may wish certain file types to be GZIP'd and delieved to the user when clicked apon.
+// This is useful for binary files and the like that don't display well in a browser window!
+// Copy, uncomment and modify this line for each extension to which this rule should apply.
+// (Don't forget the . before the extension.  You don't need an index between the []'s).
+// If you'd rather that the files were delivered uncompressed with the associated MIME type,
+// then read below.
+//
+// $zipped[] = ".dll";
+
+// Subversion controlled files have an svn:mime-type property that can
+// be set on a file indicating its mime type. By default binary files
+// are set to the generic appcliation/octet-stream, and other files
+// don't have it set at all. WebSVN also has a built-in list of
+// associations from file extension to MIME content type. (You can
+// view this list in setup.inc).
+//
+// Determining the content-type: By default, if the svn:mime-type
+// property exists and is different from application/octet-stream, it
+// is used. Otherwise, if the built-in list has a contentType entry
+// for the extension of the file, that is used. Otherwise, if the
+// svn:mime-type property exists has the generic binary value of
+// application/octet-stream, the file will be served as a binary
+// file. Otherwise, the file will be brought up as ASCII text in the
+// browser window (although this text may optionally be colourised.
+// See below).
+//
+// Uncomment this if you want to ignore any svn:mime-type property on your
+// files.
+//
+// $config->ignoreSvnMimeTypes();
+// 
+// Uncomment this if you want skip WebSVN's custom mime-type handling
+//
+// $config->ignoreWebSVNContentTypes();
+// 
+// Following the examples below, you can add new associations, modify
+// the default ones or even delete them entirely (to show them in
+// ASCII via WebSVN).
+
+// $contentType[".c"] = "plain/text"; // Create a new association
+// $contentType[".doc"] = "plain/text"; // Modify an existing one
+// unset($contentType[".m"] // Remove a default association
+
+// --- TARBALLS ---
+
+// You need tar and gzip installed on your system.  Set the paths above if necessary
+//
+// Uncomment the line below to offer a tarball download option across all your
+// repositories.
+//
+$config->allowDownload();
+//
+// To change the global option for individual repositories, uncomment and replicate
+// the required line below (replacing 'myrep' for the name of the repository to be changed).
+
+// $config->findRepository("myrep")->allowDownload(); // Specifically allow downloading for 'myrep'
+// $config->findRepository("myrep")->disallowDownload(); // Specifically disallow downloading for 'myrep'
+
+// --- COLOURISATION ---
+
+// Uncomment this line if you want to use Enscript to colourise your file listings
+//
+// You'll need Enscript version 1.6 or higher AND Sed installed to use this feature. 
+// Set the path above.
+//
+$config->useEnscript();
+
+// Enscript need to be told what the contents of a file are so that it can be colourised
+// correctly.  WebSVN includes a predefined list of mappings from file extension to Enscript
+// file type (viewable in setup.inc).
+//
+// Here you should add and other extensions not already listed or redefine the default ones. eg:
+//
+// $extEnscript[".pas"] = "pascal";
+
+// --- RSSFEED ---
+
+// Uncomment this line if you wish to hide the RSS feed links across all repositories
+//
+// $config->hideRSS();
+//
+// To change the global option for individual repositories, uncomment and replicate
+// the required line below (replacing 'myrep' for the name of the repository to be changed).
+
+// $config->findRepository("myrep")->hideRSS(); // Specifically hide RSS links for 'myrep'
+// $config->findRepository("myrep")->showRSS(); // Specifically show RSS links for 'myrep'
+
+// --- BUGTRAQ ---
+
+// Uncomment this line if you wish to use bugtraq: properties to show links to your BugTracker
+// from the log messages.
+//
+// $config->useBugtraqProperties();
+//
+// To change the global option for individual repositories, uncomment and replicate
+// the required line below (replacing 'myrep' for the name of the repository to be changed).
+
+// $config->findRepository("myrep")->useBugtraqProperties(); // Specifically use bugtraq properties for 'myrep'
+// $config->findRepository("myrep")->ignoreBugtraqProperties(); // Specifically ignore bugtraq properties for 'myrep'
+
+// --- MISCELLANOUS ---
+
+// Uncomment this if you don't have the right to use it.  Be warned that you may need it however!
+set_time_limit(0);
+
+// Comment this line to turn off caching of repo information.  This will slow down your browsing.
+$config->setCachingOn();
+
+// Number of spaces to expand tabs to in diff/listing view across all repositories
+
+$config->expandTabsBy(2);
+
+// To change the global option for individual repositories, uncomment and replicate
+// the required line below (replacing 'myrep' for the name of the repository to be changed).
+
+// $config->findRepository("myrep")->expandTabsBy(3); // Expand Tabs by 3 for repository 'myrep'
+?>

Added: trunk/svn.matroska.org/WebSVN/include/configclass.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/configclass.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/configclass.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,580 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// configclass.inc
+//
+// General class for handling configuration options
+
+require("include/command.inc");
+require("include/version.inc");
+
+// Auxillary function used to sort repositories by name
+
+function cmpReps($a, $b)
+{
+   return strcasecmp($a->name, $b->name);
+}
+
+// A Repository configuration class
+
+Class Repository
+{
+   var $name;
+   var $path;
+   
+   // Local configuration options must start off unset
+   
+   var $allowDownload;
+   var $rss;
+   var $spaces;
+   var $ignoreSvnMimeTypes;
+   var $ignoreWebSVNContentTypes;
+   var $bugtraq;
+   
+   function Repository($name, $path)
+   {
+      $this->name = $name;
+      $this->path = $path;
+   }
+   
+   // Local configuration accessors
+      
+   // RSS Feed
+   
+   function hideRSS()
+   {
+      $this->rss = false;
+   }
+
+   function showRSS()
+   {
+      $this->rss = true;
+   }
+
+   function getHideRSS()
+   {
+      global $config;
+
+      if (isset($this->rss))
+         return $this->rss;
+         
+      return $config->rss;
+   }
+   
+   // Download
+   
+   function allowDownload()
+   {
+      $this->allowDownload = true;
+   }
+
+   function disallowDownload()
+   {
+      $this->allowDownload = false;
+   }
+
+   function getAllowDownload()
+   {
+      global $config;
+
+      if (isset($this->allowDownload))
+         return $this->allowDownload;
+         
+      return $config->allowDownload;
+   }
+
+   // Tab expansion
+   
+   function expandTabsBy($sp)
+   {
+      $this->spaces = $sp;
+   }
+   
+   function getExpandTabsBy()
+   {
+      global $config;
+
+      if (isset($this->spaces))
+         return $this->spaces;
+         
+      return $config->spaces;
+   }
+
+   // Mime Type Handing
+   
+   function ignoreSvnMimeTypes()
+   {
+      $this->ignoreSvnMimeTypes = true;
+   }
+
+   function useSvnMimeTypes()
+   {
+      $this->ignoreSvnMimeTypes = false;
+   }
+
+   function getIgnoreSvnMimeTypes()
+   {
+      global $config;
+
+      if (isset($this->ignoreSvnMimeTypes))
+         return $this->ignoreSvnMimeTypes;
+         
+      return $config->ignoreSvnMimeTypes;
+   }
+
+   function ignoreWebSVNContentTypes()
+   {
+      $this->ignoreWebSVNContentTypes = true;
+   }
+
+   function useWebSVNContentTypes()
+   {
+      $this->ignoreWebSVNContentTypes = false;
+   }
+
+   function getIgnoreWebSVNContentTypes()
+   {
+      global $config;
+
+      if (isset($this->ignoreWebSVNContentTypes))
+         return $this->ignoreWebSVNContentTypes;
+         
+      return $config->ignoreWebSVNContentTypes;
+   }
+   
+   // Issue Tracking
+   
+   function useBugtraqProperties()
+   {
+      $this->bugtraq = true;
+   }
+
+   function ignoreBugtraqProperties()
+   {
+      $this->bugtraq = false;
+   }
+
+   function getBugtraq()
+   {
+      global $config;
+
+      if (isset($this->bugtraq))
+         return $this->bugtraq;
+         
+      return $config->bugtraq;
+   }
+}
+
+// The general configuration class
+
+Class Config
+{
+   // Tool path locations
+
+   var $svnlook = "svnlook";
+   var $svn = "svn --non-interactive";
+   var $diff = "diff";
+   var $enscript ="enscript";
+   var $sed = "sed";
+   var $gzip = "gzip";
+   var $tar = "tar";
+   
+   // Other configuration items
+   
+   var $serverIsWindows = false;
+   var $cacheResults = false;
+   var $multiViews = false;
+   var $useEnscript = false;
+   var $allowDownload = false;
+   var $rss = true;
+   var $spaces = 8;
+   var $bugtraq = false;
+  
+   var $templatePath = "./templates/Standard/";
+
+   var $ignoreSvnMimeTypes = false;
+   var $ignoreWebSVNContentTypes = false;
+
+   // Default character encodings
+   var $inputEnc = "";
+   var $outputEnc;
+
+   var $quote = "'";
+
+   var $_repositories;
+   
+   function Config()
+   {
+      $this->setOutputEncoding("ISO-8859-1");
+   }
+   
+   function addRepository($name, $path)
+   {
+      if (($path{strlen($path) - 1} == DIRECTORY_SEPARATOR) ||
+          ($path{strlen($path) - 1} == "/"))
+         $path = substr($path, 0, -1);
+         
+      $this->_repositories[] = new Repository($name, $path);
+   }
+
+   function getRepository($rep)
+   {
+      return $this->_repositories[$rep];
+   }
+
+   function getRepositories()
+   {
+      return $this->_repositories;
+   }
+
+   function findRepository($name)
+   {
+      foreach ($this->_repositories as $index => $rep)
+      {
+         if (strcasecmp($rep->name, $name) == 0)
+            return $rep;
+      }
+      return null;
+   }
+
+   // setServerIsWindows
+   //
+   // The server is running on Windows
+   
+   function setServerIsWindows()
+   {
+      $this->serverIsWindows = true;
+      
+      // Try to set the input encoding intelligently
+      
+      $cp = 0;
+      if ($cp = @shell_exec("CHCP"))
+      {
+         $cp = trim(substr($cp, strpos($cp, ":") + 1));
+         settype($sp, "integer");
+      }
+      
+      // Use the most sensible default value if that failed
+      if ($cp == 0) $cp = 850;
+         
+      $this->setInputEncoding("CP$cp");
+      
+      // On Windows machines, use double quotes around command line parameters
+      
+      $this->quote = '"';
+   }
+
+   // setCachingOn
+   //
+   // Set result caching on
+   
+   function setCachingOn()
+   {
+      $this->cacheResults = true;
+   }
+
+   // useMultiViews
+   //
+   // Use MultiViews to access the repository
+   
+   function useMultiViews()
+   {
+      $this->multiViews = true;
+   }
+
+   // useEnscript
+   //
+   // Use Enscript to colourise listings
+   
+   function useEnscript()
+   {
+      $this->useEnscript = true;
+   }
+
+   // offerRSS
+   //
+   // Use Enscript to colourise listings
+   
+   function hideRSS()
+   {
+      $this->rss = false;
+   }
+
+   // allowDownload
+   //
+   // Allow download of tarballs
+   
+   function allowDownload()
+   {
+      global $vars;
+      
+      $this->allowDownload = true;
+   }
+
+   // getURL
+   //
+   // Get the URL to a path name based on the current config
+   
+   function getURL($rep, $path, $op)
+   {  
+      $base = $_SERVER["SCRIPT_NAME"];
+      
+      if ($this->multiViews)
+      {
+         // Remove the .php
+         $base = substr($base, 0, -4);
+         
+         if ($path && $path{0} != "/") $path = "/".$path;
+               
+         $url =  $base;
+         
+         if ($rep != -1)
+         {
+            $url .= "/".$rep->name.$path;
+            
+            if ($op != "dir")
+               $url .= "?op=$op&amp;";
+            else
+               $url .= "?";
+         }
+            
+         return $url;
+      }
+      else
+      {
+         switch ($op)
+         {
+            case "dir":
+               $fname = "listing.php";
+               break;
+               
+            case "file":
+               $fname = "filedetails.php";
+               break;
+
+            case "log":
+               $fname = "log.php";
+               break;
+
+            case "diff":
+               $fname = "diff.php";
+               break;
+
+            case "blame":
+               $fname = "blame.php";
+               break;
+
+            case "form":
+               $fname = "form.php";
+               break;
+
+            case "rss":
+               $fname = "rss.php";
+               break;
+
+            case "dl":
+               $fname = "dl.php";
+               break;
+
+            case "comp":
+               $fname = "comp.php";
+               break;
+         }
+
+         if ($rep == -1)
+            return $fname."?path=".urlencode($path)."&amp;";
+         else
+            return $fname."?repname=".$rep->name."&amp;path=".urlencode($path)."&amp;";
+      }
+   }
+
+   // setPath
+   //
+   // Set the location of the given path
+   
+   function setPath(&$var, $path, $name)
+   {
+      $lastchar = $path{strlen($path) - 1};
+      $isDir = ($lastchar == DIRECTORY_SEPARATOR ||
+                $lastchar == "/" ||
+                $lastchar == "\\");
+     
+      if (!$isDir)
+      {
+         $path .= DIRECTORY_SEPARATOR;
+      }
+
+      // On a windows machine we need to put spaces around the entire command
+      // to allow for spaces in the path
+      if ($this->serverIsWindows)
+         $var = "\"$path$name\"";
+      else         
+         $var = "$path$name";
+   }
+
+   // setSVNCommandPath
+   //
+   // Define the location of the svn and svnlook commands
+   
+   function setSVNCommandPath($path)
+   {
+      $this->setPath($this->svn, $path, "svn");
+      $this->setPath($this->svnlook, $path, "svnlook");
+   }
+   
+   // setDiffPath
+   //
+   // Define the location of the diff command
+   
+   function setDiffPath($path)
+   {
+      $this->setPath($this->diff, $path, "diff");
+   }
+
+   // setEnscriptPath
+   //
+   // Define the location of the enscript command
+   
+   function setEnscriptPath($path)
+   {
+      $this->setPath($this->enscript, $path, "enscript");
+   }
+
+   // setSedPath
+   //
+   // Define the location of the sed command
+   
+   function setSedPath($path)
+   {
+      $this->setPath($this->sed, $path, "sed");
+   }
+   
+   // setTarPath
+   //
+   // Define the location of the tar command
+   
+   function setTarPath($path)
+   {
+      $this->setPath($this->tar, $path, "tar");
+   }
+   
+   // setGzipPath
+   //
+   // Define the location of the GZip command
+   
+   function setGzipPath($path)
+   {
+      $this->setPath($this->gzip, $path, "gzip");
+   }
+   
+   function setTemplatePath($path)
+   {
+      $lastchar = $path{strlen($path) - 1};
+      $isDir = ($lastchar == DIRECTORY_SEPARATOR ||
+                $lastchar == "/" ||
+                $lastchar == "\\");
+     
+      if (!$isDir)
+      {
+         $path .= DIRECTORY_SEPARATOR;
+      }
+
+      // On a windows machine we need to put spaces around the entire command
+      // to allow for spaces in the path
+      $this->templatePath = $path;
+   }
+
+   // parentPath
+   //
+   // Automatically set up the repositories based on a parent path
+   
+   function parentPath($path)
+   {
+      if ($handle = opendir($path))
+      {
+         // For each file...
+         while (false !== ($file = readdir($handle)))
+         { 
+            // That's also a non hidden directory
+            if (is_dir($path.DIRECTORY_SEPARATOR.$file) && $file{0} != ".")
+            {
+               // And that contains a db directory (in an attempt to not include
+               // non svn repositories.
+               
+               if (is_dir($path.DIRECTORY_SEPARATOR.$file.DIRECTORY_SEPARATOR."db"))
+               {
+                  // We add the repository to the list
+                  $this->addRepository($file, $path.DIRECTORY_SEPARATOR.$file);
+               }
+            }
+         }
+         closedir($handle); 
+      }
+
+      // Sort the repositories into alphabetical order
+      
+      if (!empty($this->_repositories))
+         usort($this->_repositories, "cmpReps");
+   }
+   
+   // Encoding functions
+   
+   function setInputEncoding($enc)
+   {
+      $this->inputEnc = $enc;
+   }
+
+   function setOutputEncoding($enc)
+   {
+      global $vars;
+      
+      if ($enc != "")
+      {
+         $this->outputEnc = $enc;
+         $vars["charset"] = $enc;
+      }
+   }
+   
+   // Tab expansion functions
+   
+   function expandTabsBy($sp)
+   {
+      $this->spaces = $sp;
+   }
+   
+   // Misc settings
+   
+   function ignoreSvnMimeTypes()
+   {
+      $this->ignoreSvnMimeTypes = true;
+   }
+
+   function ignoreWebSVNContentTypes()
+   {
+      $this->ignoreWebSVNContentTypes = true;
+   }
+
+   function useBugtraqProperties()
+   {
+      $this->bugtraq = true;
+   }
+}
+?>

Added: trunk/svn.matroska.org/WebSVN/include/feedcreator.class.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/feedcreator.class.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/feedcreator.class.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,1100 @@
+<?php
+/***************************************************************************
+
+FeedCreator class v1.6
+originally (c) Kai Blankenhorn
+www.bitfolge.de
[email protected]
+v1.3 work by Scott Reynen ([email protected]) and Kai Blankenhorn
+v1.5 OPML support by Dirk Clemens
+
+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: <http://www.gnu.org/licenses/gpl.txt>
+
+****************************************************************************
+
+
+Changelog:
+
+Modifications for WebSVN:
+   The main description link wasn't put through htmlspecialcharacters
+   Output encoding now defined by $config
+
+v1.6    05-10-04
+    added stylesheet to RSS 1.0 feeds
+    fixed generator comment (thanks Kevin L. Papendick and Tanguy Pruvot)
+    fixed RFC822 date bug (thanks Tanguy Pruvot)
+    added TimeZone customization for RFC8601 (thanks Tanguy Pruvot)
+    fixed Content-type could be empty (thanks Tanguy Pruvot)
+    fixed author/creator in RSS1.0 (thanks Tanguy Pruvot)
+
+
+v1.6 beta    02-28-04
+    added Atom 0.3 support (not all features, though)
+    improved OPML 1.0 support (hopefully - added more elements)
+    added support for arbitrary additional elements (use with caution)
+    code beautification :-)
+    considered beta due to some internal changes
+
+v1.5.1    01-27-04
+    fixed some RSS 1.0 glitches (thanks to Stéphane Vanpoperynghe)
+    fixed some inconsistencies between documentation and code (thanks to Timothy Martin)
+
+v1.5    01-06-04
+    added support for OPML 1.0
+    added more documentation
+
+v1.4    11-11-03
+    optional feed saving and caching
+    improved documentation
+    minor improvements
+
+v1.3    10-02-03
+    renamed to FeedCreator, as it not only creates RSS anymore
+    added support for mbox
+    tentative support for echo/necho/atom/pie/???
+        
+v1.2    07-20-03
+    intelligent auto-truncating of RSS 0.91 attributes
+    don't create some attributes when they're not set
+    documentation improved
+    fixed a real and a possible bug with date conversions
+    code cleanup
+
+v1.1    06-29-03
+    added images to feeds
+    now includes most RSS 0.91 attributes
+    added RSS 2.0 feeds
+
+v1.0    06-24-03
+    initial release
+
+
+
+***************************************************************************/
+
+/*** GENERAL USAGE *********************************************************
+
+include("feedcreator.class.php");
+
+$rss = new UniversalFeedCreator();
+$rss->useCached(); // use cached version if age<1 hour
+$rss->title = "PHP news";
+$rss->description = "daily news from the PHP scripting world";
+$rss->link = "http://www.dailyphp.net/news";
+$rss->syndicationURL = "http://www.dailyphp.net/".$_SERVER["PHP_SELF"];
+
+$image = new FeedImage();
+$image->title = "dailyphp.net logo";
+$image->url = "http://www.dailyphp.net/images/logo.gif";
+$image->link = "http://www.dailyphp.net";
+$image->description = "Feed provided by dailyphp.net. Click to visit.";
+$rss->image = $image;
+
+// get your news items from somewhere, e.g. your database:
+mysql_select_db($dbHost, $dbUser, $dbPass);
+$res = mysql_query("SELECT * FROM news ORDER BY newsdate DESC");
+while ($data = mysql_fetch_object($res)) {
+    $item = new FeedItem();
+    $item->title = $data->title;
+    $item->link = $data->url;
+    $item->description = $data->short;
+    $item->date = $data->newsdate;
+    $item->source = "http://www.dailyphp.net";
+    $item->author = "John Doe";
+     
+    $rss->addItem($item);
+}
+
+// valid format strings are: RSS0.91, RSS1.0, RSS2.0, PIE0.1 (deprecated),
+// MBOX, OPML, ATOM0.3
+echo $rss->saveFeed("RSS1.0", "news/feed.xml");
+
+
+***************************************************************************
+*          A little setup                                                 *
+**************************************************************************/
+
+// your local timezone, set to "" to disable or for GMT
+define("TIME_ZONE","+01:00");
+
+
+
+
+/**
+* Version string.
+**/
+define("FEEDCREATOR_VERSION", "FeedCreator 1.6");
+
+
+
+/**
+* A FeedItem is a part of a FeedCreator feed.
+*
+* @author Kai Blankenhorn <[email protected]>
+* @since 1.3
+*/
+class FeedItem {
+    /**
+     * Mandatory attributes of an item.
+     */
+    var $title, $description, $link;
+    
+    /**
+     * Optional attributes of an item.
+     */
+    var $author, $authorEmail, $image, $category, $comments, $guid, $source, $creator;
+    
+    /**
+     * Publishing date of an item. May be in one of the following formats:
+     *
+     *    RFC 822:
+     *    "Mon, 20 Jan 03 18:05:41 +0400"
+     *    "20 Jan 03 18:05:41 +0000"
+     *
+     *    ISO 8601:
+     *    "2003-01-20T18:05:41+04:00"
+     *
+     *    Unix:
+     *    1043082341
+     */
+    var $date;
+    
+    /**
+     * Any additional elements to include as an assiciated array. All $key => $value pairs
+     * will be included unencoded in the feed item in the form
+     *     <$key>$value</$key>
+     * Again: No encoding will be used! This means you can invalidate or enhance the feed
+     * if $value contains markup. This may be abused to embed tags not implemented by
+     * the FeedCreator class used.
+     */
+    var $additionalElements = Array();
+
+    // on hold
+    // var $source;
+}
+
+
+
+/**
+* An FeedImage may be added to a FeedCreator feed.
+* @author Kai Blankenhorn <[email protected]>
+* @since 1.3
+*/
+class FeedImage {
+    /**
+     * Mandatory attributes of an image.
+     */
+    var $title, $url, $link;
+    
+    /**
+     * Optional attributes of an image.
+     */
+    var $width, $height, $description;
+}
+
+
+/**
+* UniversalFeedCreator lets you choose during runtime which
+* format to build.
+* For general usage of a feed class, see the FeedCreator class
+* below or the example above.
+*
+* @since 1.3
+* @author Kai Blankenhorn <[email protected]>
+*/
+class UniversalFeedCreator extends FeedCreator {
+    var $_feed;
+    
+    function _setFormat($format) {
+        switch (strtoupper($format)) {
+            
+            case "2.0":
+                // fall through
+            case "RSS2.0":
+                $this->_feed = new RSSCreator20();
+                break;
+            
+            case "1.0":
+                // fall through
+            case "RSS1.0":
+                $this->_feed = new RSSCreator10();
+                break;
+            
+            case "0.91":
+                // fall through
+            case "RSS0.91":
+                $this->_feed = new RSSCreator091();
+                break;
+            
+            case "PIE0.1":
+                $this->_feed = new PIECreator01();
+                break;
+            
+            case "MBOX":
+                $this->_feed = new MBOXCreator();
+                break;
+            
+            case "OPML":
+                $this->_feed = new OPMLCreator();
+                break;
+                
+            case "ATOM0.3":
+                $this->_feed = new AtomCreator03();
+                break;
+            
+            default:
+                $this->_feed = new RSSCreator091();
+                break;
+        }
+        
+        $vars = get_object_vars($this);
+        foreach ($vars as $key => $value) {
+            if ($key!="feed") {
+                $this->_feed->{$key} = $this->{$key};
+            }
+        }
+    }
+    
+    /**
+     * Creates a syndication feed based on the items previously added.
+     *
+     * @see        FeedCreator::addItem()
+     * @param    string    format    format the feed should comply to. Valid values are:
+     *            "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML".
+     * @return    string    the contents of the feed.
+     */
+    function createFeed($format = "RSS0.91") {
+        $this->_setFormat($format);
+        return $this->_feed->createFeed();
+    }
+    
+    
+    
+    /**
+     * Saves this feed as a file on the local disk. After the file is saved, an HTTP redirect
+     * header may be sent to redirect the use to the newly created file.
+     * @since 1.4
+     *
+     * @param    string    format    format the feed should comply to. Valid values are:
+     *            "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
+     * @param    string    filename    optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param    boolean    displayContents    optional    send the content of the file or not. If true, the file will be sent in the body of the response.
+     */
+    function saveFeed($format="RSS0.91", $filename="", $displayContents=true) {
+        $this->_setFormat($format);
+        $this->_feed->saveFeed($filename, $displayContents);
+    }
+
+}
+
+
+/**
+* FeedCreator is the abstract base implementation for concrete
+* implementations that implement a specific format of syndication.
+*
+* @abstract
+* @author Kai Blankenhorn <[email protected]>
+* @since 1.4
+*/
+class FeedCreator {
+
+    /**
+     * Mandatory attributes of a feed.
+     */
+    var $title, $description, $link;
+    
+    
+    /**
+     * Optional attributes of a feed.
+     */
+    var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+    
+    
+    /**
+     * @access private
+     */
+    var $items = Array();
+    
+    
+    /**
+     * This feed's MIME content type.
+     * @since 1.4
+     * @access private
+     */
+    var $contentType = "text/xml";
+    
+    
+    /**
+     * Any additional elements to include as an assiciated array. All $key => $value pairs
+     * will be included unencoded in the feed in the form
+     *     <$key>$value</$key>
+     * Again: No encoding will be used! This means you can invalidate or enhance the feed
+     * if $value contains markup. This may be abused to embed tags not implemented by
+     * the FeedCreator class used.
+     */
+    var $additionalElements = Array();
+   
+    
+    /**
+     * Adds an FeedItem to the feed.
+     *
+     * @param object FeedItem $item The FeedItem to add to the feed.
+     * @access public
+     */
+    function addItem($item) {
+        $this->items[] = $item;
+    }
+    
+    
+    /**
+     * Truncates a string to a certain length at the most sensible point.
+     * First, if there's a '.' character near the end of the string, the string is truncated after this character.
+     * If there is no '.', the string is truncated after the last ' ' character.
+     * If the string is truncated, " ..." is appended.
+     * If the string is already shorter than $length, it is returned unchanged.
+     *
+     * @static
+     * @param string    string A string to be truncated.
+     * @param int        length the maximum length the string should be truncated to
+     * @return string    the truncated string
+     */
+    function iTrunc($string, $length) {
+        if (strlen($string)<=$length) {
+            return $string;
+        }
+        
+        $pos = strrpos($string,".");
+        if ($pos>=$length-4) {
+            $string = substr($string,0,$length-4);
+            $pos = strrpos($string,".");
+        }
+        if ($pos>=$length*0.4) {
+            return substr($string,0,$pos+1)." ...";
+        }
+        
+        $pos = strrpos($string," ");
+        if ($pos>=$length-4) {
+            $string = substr($string,0,$length-4);
+            $pos = strrpos($string," ");
+        }
+        if ($pos>=$length*0.4) {
+            return substr($string,0,$pos)." ...";
+        }
+        
+        return substr($string,0,$length-4)." ...";
+            
+    }
+    
+    
+    /**
+     * Creates a comment indicating the generator of this feed.
+     * The format of this comment seems to be recognized by
+     * Syndic8.com.
+     */
+    function _createGeneratorComment() {
+        return "<!-- generator=\"".FEEDCREATOR_VERSION."\" -->\n";
+    }
+    
+    
+    /**
+     * Creates a string containing all additional elements specified in
+     * $additionalElements.
+     * @param    elements    array    an associative array containing key => value pairs
+     * @param indentString    string    a string that will be inserted before every generated line
+     * @return    string    the XML tags corresponding to $additionalElements
+     */
+    function _createAdditionalElements($elements, $indentString="") {
+        $ae = "";
+        if (is_array($elements)) {
+            foreach($elements AS $key => $value) {
+                $ae.= $indentString."<$key>$value</$key>\n";
+            }
+        }
+        return $ae;
+    }
+    
+    
+    /**
+     * Builds the feed's text.
+     * @abstract
+     * @return    string    the feed's complete text
+     */
+    function createFeed() {
+    }
+    
+    /**
+     * Generate a filename for the feed cache file. The result will be $_SERVER["PHP_SELF"] with the extension changed to .xml.
+     * For example:
+     *
+     * echo $_SERVER["PHP_SELF"]."\n";
+     * echo FeedCreator::_generateFilename();
+     *
+     * would produce:
+     *
+     * /rss/latestnews.php
+     * latestnews.xml
+     *
+     * @return string the feed cache filename
+     * @since 1.4
+     * @access private
+     */
+    function _generateFilename() {
+        $fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+        return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".xml";
+    }
+    
+    
+    /**
+     * @since 1.4
+     * @access private
+     */
+    function _redirect($filename) {
+        // attention, heavily-commented-out-area
+        
+        // maybe use this in addition to file time checking
+        //Header("Expires: ".date("r",time()+$this->_timeout));
+        
+        /* no caching at all, doesn't seem to work as good:
+        Header("Cache-Control: no-cache");
+        Header("Pragma: no-cache");
+        */
+        
+        // HTTP redirect, some feed readers' simple HTTP implementations don't follow it
+        //Header("Location: ".$filename);
+
+        Header("Content-Type: ".$this->contentType."; filename=".basename($filename));
+        Header("Content-Disposition: inline; filename=".basename($filename));
+        readfile($filename, "r");
+        die();
+    }
+    
+    /**
+     * Turns on caching and checks if there is a recent version of this feed in the cache.
+     * If there is, an HTTP redirect header is sent.
+     * To effectively use caching, you should create the FeedCreator object and call this method
+     * before anything else, especially before you do the time consuming task to build the feed
+     * (web fetching, for example).
+     * @since 1.4
+     * @param filename    string    optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param timeout    int        optional    the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+     */
+    function useCached($filename="", $timeout=3600) {
+        $this->_timeout = $timeout;
+        if ($filename=="") {
+            $filename = $this->_generateFilename();
+        }
+        if (file_exists($filename) AND (time()-filemtime($filename) < $timeout)) {
+            $this->_redirect($filename);
+        }
+    }
+    
+    
+    /**
+     * Saves this feed as a file on the local disk. After the file is saved, a redirect
+     * header may be sent to redirect the user to the newly created file.
+     * @since 1.4
+     *
+     * @param filename    string    optional    the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+     * @param redirect    boolean    optional    send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
+     */
+    function saveFeed($filename="", $displayContents=true) {
+        if ($filename=="") {
+            $filename = $this->_generateFilename();
+        }
+        $feedFile = fopen($filename, "w+");
+        if ($feedFile) {
+            fputs($feedFile,$this->createFeed());
+            fclose($feedFile);
+            if ($displayContents) {
+                $this->_redirect($filename);
+            }
+        } else {
+            echo "<br /><b>Error creating feed file, please check write permissions.</b><br />";
+        }
+    }
+}
+
+
+/**
+* FeedDate is an internal class that stores a date for a feed or feed item.
+* Usually, you won't need to use this.
+*/
+class FeedDate {
+    var $unix;
+    
+    /**
+     * Creates a new instance of FeedDate representing a given date.
+     * Accepts RFC 822, ISO 8601 date formats as well as unix time stamps.
+     * @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used.
+     */
+    function FeedDate($dateString="") {
+        if ($dateString=="") $dateString = date("r");
+        
+        if (is_integer($dateString)) {
+            $this->unix = $dateString;
+            return;
+        }
+        if (preg_match("~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) {
+            $months = Array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
+            $this->unix = mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);
+            if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
+                $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
+            } else {
+                if (strlen($matches[7])==1) {
+                    $oneHour = 3600;
+                    $ord = ord($matches[7]);
+                    if ($ord < ord("M")) {
+                        $tzOffset = (ord("A") - $ord - 1) * $oneHour;
+                    } elseif ($ord >= ord("M") AND $matches[7]!="Z") {
+                        $tzOffset = ($ord - ord("M")) * $oneHour;
+                    } elseif ($matches[7]=="Z") {
+                        $tzOffset = 0;
+                    }
+                }
+                switch ($matches[7]) {
+                    case "UT":
+                    case "GMT":    $tzOffset = 0;
+                }
+            }
+            $this->unix += $tzOffset;
+            return;
+        }
+        if (preg_match("~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~",$dateString,$matches)) {
+            $this->unix = mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);
+            if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
+                $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
+            } else {
+                if ($matches[7]=="Z") {
+                    $tzOffset = 0;
+                }
+            }
+            $this->unix += $tzOffset;
+            return;
+        }
+        $this->unix = 0;
+    }
+
+    /**
+     * Gets the date stored in this FeedDate as an RFC 822 date.
+     *
+     * @return a date in RFC 822 format
+     */
+    function rfc822() {
+        //return gmdate("r",$this->unix);
+        $date = gmdate("D, d M Y H:i:s", $this->unix);
+        if (TIME_ZONE!="") $date .= " ".str_replace(":","",TIME_ZONE);
+        return $date;
+    }
+    
+    /**
+     * Gets the date stored in this FeedDate as an ISO 8601 date.
+     *
+     * @return a date in ISO 8601 format
+     */
+    function iso8601() {
+        $date = gmdate("Y-m-d\TH:i:sO",$this->unix);
+        $date = substr($date,0,22) . ':' . substr($date,-2);
+        if (TIME_ZONE!="") $date = str_replace("+00:00",TIME_ZONE,$date);
+        return $date;
+    }
+    
+    /**
+     * Gets the date stored in this FeedDate as unix time stamp.
+     *
+     * @return a date as a unix time stamp
+     */
+    function unix() {
+        return $this->unix;
+    }
+}
+
+
+/**
+* RSSCreator10 is a FeedCreator that implements RDF Site Summary (RSS) 1.0.
+*
+* @see http://www.purl.org/rss/1.0/
+* @since 1.3
+* @author Kai Blankenhorn <[email protected]>
+*/
+class RSSCreator10 extends FeedCreator {
+
+    /**
+     * Builds the RSS feed's text. The feed will be compliant to RDF Site Summary (RSS) 1.0.
+     * The feed will contain all items previously added in the same order.
+     * @return    string    the feed's complete text
+     */
+    function createFeed() {
+        global $config;     
+        $feed = "<?xml version=\"1.0\" encoding=\"".$config->outputEnc."\"?>\n";
+        $feed.= "<?xml-stylesheet href=\"http://www.w3.org/2000/08/w3c-synd/style.css\" type=\"text/css\"?>\n";
+        $feed.= $this->_createGeneratorComment();
+        $feed.= "<rdf:RDF\n";
+        $feed.= "    xmlns=\"http://purl.org/rss/1.0/\"\n";
+        $feed.= "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n";
+        $feed.= "    xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
+        $feed.= "    <channel rdf:about=\"".htmlspecialchars($this->syndicationURL)."\">\n";
+        $feed.= "        <title>".htmlspecialchars($this->title)."</title>\n";
+        $feed.= "        <description>".htmlspecialchars($this->description)."</description>\n";
+        $feed.= "        <link>".htmlspecialchars($this->link)."</link>\n";
+        if ($this->image!=null) {
+            $feed.= "        <image rdf:resource=\"".$this->image->url."\" />\n";
+        }
+        $now = new FeedDate();
+        $feed.= "       <dc:date>".htmlspecialchars($now->iso8601())."</dc:date>\n";
+        $feed.= "        <items>\n";
+        $feed.= "            <rdf:Seq>\n";
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "                <rdf:li rdf:resource=\"".htmlspecialchars($this->items[$i]->link)."\"/>\n";
+        }
+        $feed.= "            </rdf:Seq>\n";
+        $feed.= "        </items>\n";
+        $feed.= "    </channel>\n";
+        if ($this->image!=null) {
+            $feed.= "    <image rdf:about=\"".$this->image->url."\">\n";
+            $feed.= "        <title>".$this->image->title."</title>\n";
+            $feed.= "        <link>".$this->image->link."</link>\n";
+            $feed.= "        <url>".$this->image->url."</url>\n";
+            $feed.= "    </image>\n";
+        }
+        //$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "    ");
+        
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "    <item rdf:about=\"".htmlspecialchars($this->items[$i]->link)."\">\n";
+            //$feed.= "        <dc:type>Posting</dc:type>\n";
+            $feed.= "        <dc:format>text/html</dc:format>\n";
+            if ($this->items[$i]->date!=null) {
+                $itemDate = new FeedDate($this->items[$i]->date);
+                $feed.= "        <dc:date>".htmlspecialchars($itemDate->iso8601())."</dc:date>\n";
+            }
+            if ($this->items[$i]->source!="") {
+                $feed.= "        <dc:source>".htmlspecialchars($this->items[$i]->source)."</dc:source>\n";
+            }
+            if ($this->items[$i]->author!="") {
+                $feed.= "        <dc:creator>".htmlspecialchars($this->items[$i]->author)."</dc:creator>\n";
+            }
+            $feed.= "        <title>".htmlspecialchars(strip_tags(strtr($this->items[$i]->title,"\n\r","  ")))."</title>\n";
+            $feed.= "        <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+            $feed.= "        <description>".htmlspecialchars($this->items[$i]->description)."</description>\n";
+            $feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+            $feed.= "    </item>\n";
+        }
+        $feed.= "</rdf:RDF>\n";
+        return $feed;
+    }
+}
+
+
+
+/**
+* RSSCreator091 is a FeedCreator that implements RSS 0.91 Spec, revision 3.
+*
+* @see http://my.netscape.com/publish/formats/rss-spec-0.91.html
+* @since 1.3
+* @author Kai Blankenhorn <[email protected]>
+*/
+class RSSCreator091 extends FeedCreator {
+
+    /**
+     * Stores this RSS feed's version number.
+     * @access private
+     */
+    var $RSSVersion;
+
+    function RSSCreator091() {
+        $this->_setRSSVersion("0.91");
+        $this->contentType = "application/rss+xml";
+    }
+    
+    /**
+     * Sets this RSS feed's version number.
+     * @access private
+     */
+    function _setRSSVersion($version) {
+        $this->RSSVersion = $version;
+    }
+
+    /**
+     * Builds the RSS feed's text. The feed will be compliant to RDF Site Summary (RSS) 1.0.
+     * The feed will contain all items previously added in the same order.
+     * @return    string    the feed's complete text
+     */
+    function createFeed() {
+        global $config;     
+        $feed = "<?xml version=\"1.0\" encoding=\"".$config->outputEnc."\"?>\n";
+        $feed.= $this->_createGeneratorComment();
+        $feed.= "<rss version=\"".$this->RSSVersion."\">\n";
+        $feed.= "    <channel>\n";
+        $feed.= "        <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
+        $feed.= "        <description>".FeedCreator::iTrunc(htmlspecialchars($this->description),500)."</description>\n";
+        $feed.= "        <link>".htmlspecialchars($this->link)."</link>\n";
+        $now = new FeedDate();
+        $feed.= "        <lastBuildDate>".htmlspecialchars($now->rfc822())."</lastBuildDate>\n";
+        $feed.= "        <generator>".FEEDCREATOR_VERSION."</generator>\n";
+
+        if ($this->image!=null) {
+            $feed.= "        <image>\n";
+            $feed.= "            <url>".$this->image->url."</url>\n";
+            $feed.= "            <title>".FeedCreator::iTrunc(htmlspecialchars($this->image->title),100)."</title>\n";
+            $feed.= "            <link>".$this->image->link."</link>\n";
+            if ($this->image->width!="") {
+                $feed.= "            <width>".$this->image->width."</width>\n";
+            }
+            if ($this->image->height!="") {
+                $feed.= "            <height>".$this->image->height."</height>\n";
+            }
+            if ($this->image->description!="") {
+                $feed.= "            <description>".htmlspecialchars($this->image->description)."</description>\n";
+            }
+            $feed.= "        </image>\n";
+        }
+        if ($this->language!="") {
+            $feed.= "        <language>".$this->language."</language>\n";
+        }
+        if ($this->copyright!="") {
+            $feed.= "        <copyright>".FeedCreator::iTrunc(htmlspecialchars($this->copyright),100)."</copyright>\n";
+        }
+        if ($this->editor!="") {
+            $feed.= "        <managingEditor>".FeedCreator::iTrunc(htmlspecialchars($this->editor),100)."</managingEditor>\n";
+        }
+        if ($this->webmaster!="") {
+            $feed.= "        <webMaster>".FeedCreator::iTrunc(htmlspecialchars($this->webmaster),100)."</webMaster>\n";
+        }
+        if ($this->pubDate!="") {
+            $pubDate = new FeedDate($this->pubDate);
+            $feed.= "        <pubDate>".htmlspecialchars($pubDate->rfc822())."</pubDate>\n";
+        }
+        if ($this->category!="") {
+            $feed.= "        <category>".htmlspecialchars($this->category)."</category>\n";
+        }
+        if ($this->docs!="") {
+            $feed.= "        <docs>".FeedCreator::iTrunc(htmlspecialchars($this->docs),500)."</docs>\n";
+        }
+        if ($this->ttl!="") {
+            $feed.= "        <ttl>".htmlspecialchars($this->ttl)."</ttl>\n";
+        }
+        if ($this->rating!="") {
+            $feed.= "        <rating>".FeedCreator::iTrunc(htmlspecialchars($this->rating),500)."</rating>\n";
+        }
+        if ($this->skipHours!="") {
+            $feed.= "        <skipHours>".htmlspecialchars($this->skipHours)."</skipHours>\n";
+        }
+        if ($this->skipDays!="") {
+            $feed.= "        <skipDays>".htmlspecialchars($this->skipDays)."</skipDays>\n";
+        }
+        $feed.= $this->_createAdditionalElements($this->additionalElements, "    ");
+
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "        <item>\n";
+            $feed.= "            <title>".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100)."</title>\n";
+            $feed.= "            <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+            $feed.= "            <description>".htmlspecialchars($this->items[$i]->description)."</description>\n";
+            if ($this->items[$i]->author!="") {
+                $feed.= "            <author>".htmlspecialchars($this->items[$i]->author)."</author>\n";
+            }
+            /*
+            // on hold
+            if ($this->items[$i]->source!="") {
+                    $feed.= "            <source>".htmlspecialchars($this->items[$i]->source)."</source>\n";
+            }
+            */
+            if ($this->items[$i]->category!="") {
+                $feed.= "            <category>".htmlspecialchars($this->items[$i]->category)."</category>\n";
+            }
+            if ($this->items[$i]->comments!="") {
+                $feed.= "            <comments>".$this->items[$i]->comments."</comments>\n";
+            }
+            if ($this->items[$i]->date!="") {
+            $itemDate = new FeedDate($this->items[$i]->date);
+                $feed.= "            <pubDate>".htmlspecialchars($itemDate->rfc822())."</pubDate>\n";
+            }
+            if ($this->items[$i]->guid!="") {
+                $feed.= "            <guid>".$this->items[$i]->guid."</guid>\n";
+            }
+            $feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+            $feed.= "        </item>\n";
+        }
+        $feed.= "    </channel>\n";
+        $feed.= "</rss>\n";
+        return $feed;
+    }
+}
+
+
+
+/**
+* RSSCreator20 is a FeedCreator that implements RDF Site Summary (RSS) 2.0.
+*
+* @see http://backend.userland.com/rss
+* @since 1.3
+* @author Kai Blankenhorn <[email protected]>
+*/
+class RSSCreator20 extends RSSCreator091 {
+
+    function RSSCreator20() {
+        parent::_setRSSVersion("2.0");
+    }
+    
+}
+
+
+/**
+* PIECreator01 is a FeedCreator that implements the emerging PIE specification,
+* as in http://intertwingly.net/wiki/pie/Syntax.
+*
+* @deprecated
+* @since 1.3
+* @author Scott Reynen <[email protected]> and Kai Blankenhorn <[email protected]>
+*/
+class PIECreator01 extends FeedCreator {
+    
+    function createFeed() {
+        $feed = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+        $feed.= "<feed version=\"0.1\" xmlns=\"http://example.com/newformat#\">\n";
+        $feed.= "    <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
+        $feed.= "    <subtitle>".FeedCreator::iTrunc(htmlspecialchars($this->description),500)."</subtitle>\n";
+        $feed.= "    <link>".$this->link."</link>\n";
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "    <entry>\n";
+            $feed.= "        <title>".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100)."</title>\n";
+            $feed.= "        <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+            $itemDate = new FeedDate($this->items[$i]->date);
+            $feed.= "        <created>".htmlspecialchars($itemDate->iso8601())."</created>\n";
+            $feed.= "        <issued>".htmlspecialchars($itemDate->iso8601())."</issued>\n";
+            $feed.= "        <modified>".htmlspecialchars($itemDate->iso8601())."</modified>\n";
+            $feed.= "        <id>".$this->items[$i]->guid."</id>\n";
+            if ($this->items[$i]->author!="") {
+                $feed.= "        <author>\n";
+                $feed.= "            <name>".htmlspecialchars($this->items[$i]->author)."</name>\n";
+                if ($this->items[$i]->authorEmail!="") {
+                    $feed.= "            <email>".$this->items[$i]->authorEmail."</email>\n";
+                }
+                $feed.="        </author>\n";
+            }
+            $feed.= "        <content type=\"text/html\" xml:lang=\"en-us\">\n";
+            $feed.= "            <div xmlns=\"http://www.w3.org/1999/xhtml\">".$this->items[$i]->description."</div>\n";
+            $feed.= "        </content>\n";
+            $feed.= "    </entry>\n";
+        }
+        $feed.= "</feed>\n";
+        return $feed;
+    }
+}
+
+
+/**
+* AtomCreator03 is a FeedCreator that implements the atom specification,
+* as in http://www.intertwingly.net/wiki/pie/FrontPage.
+* Please note that just by using AtomCreator03 you won't automatically
+* produce valid atom files. For example, you have to specify either an editor
+* for the feed or an author for every single feed item.
+*
+* Some elements have not been implemented yet. These are (incomplete list):
+* author URL, item author's email and URL, item contents, alternate links,
+* other link content types than text/html. Some of them may be created with
+* AtomCreator03::additionalElements.
+*
+* @see FeedCreator#additionalElements
+* @since 1.6
+* @author Kai Blankenhorn <[email protected]>, Scott Reynen <[email protected]>
+*/
+class AtomCreator03 extends FeedCreator {
+
+    function AtomCreator03() {
+        $this->contentType = "application/atom+xml";
+    }
+    
+    function createFeed() {
+        $feed = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+        $feed.= $this->_createGeneratorComment();
+        $feed.= "<feed version=\"0.3\" xmlns=\"http://purl.org/atom/ns#\"";
+        if ($this->language!="") {
+            $feed.= " xml:lang:\"".$this->language."\"";
+        }
+        $feed.= ">\n";
+        $feed.= "    <title>".htmlspecialchars($this->title)."</title>\n";
+        $feed.= "    <tagline>".htmlspecialchars($this->description)."</tagline>\n";
+        $feed.= "    <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->link)."\"/>\n";
+        $feed.= "    <id>".$this->link."</id>\n";
+        $now = new FeedDate();
+        $feed.= "    <modified>".htmlspecialchars($now->iso8601())."</modified>\n";
+        if ($this->editor!="") {
+            $feed.= "    <author>\n";
+            $feed.= "        <name>".$this->editor."</name>\n";
+            if ($this->editorEmail!="") {
+                $feed.= "        <email>".$this->editorEmail."</email>\n";
+            }
+            $feed.= "    </author>\n";
+        }
+        $feed.= "    <generator>".FEEDCREATOR_VERSION."</generator>\n";
+        $feed.= $this->_createAdditionalElements($this->additionalElements, "    ");
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "    <entry>\n";
+            $feed.= "        <title>".htmlspecialchars(strip_tags($this->items[$i]->title))."</title>\n";
+            $feed.= "        <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->items[$i]->link)."\"/>\n";
+            if ($this->items[$i]->date=="") {
+                $this->items[$i]->date = time();
+            }
+            $itemDate = new FeedDate($this->items[$i]->date);
+            $feed.= "        <created>".htmlspecialchars($itemDate->iso8601())."</created>\n";
+            $feed.= "        <issued>".htmlspecialchars($itemDate->iso8601())."</issued>\n";
+            $feed.= "        <modified>".htmlspecialchars($itemDate->iso8601())."</modified>\n";
+            $feed.= "        <id>".$this->items[$i]->link."</id>\n";
+            $feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+            if ($this->items[$i]->author!="") {
+                $feed.= "        <author>\n";
+                $feed.= "            <name>".htmlspecialchars($this->items[$i]->author)."</name>\n";
+                $feed.= "        </author>\n";
+            }
+            if ($this->items[$i]->description!="") {
+                $feed.= "        <summary>".htmlspecialchars($this->items[$i]->description)."</summary>\n";
+            }
+            $feed.= "    </entry>\n";
+        }
+        $feed.= "</feed>\n";
+        return $feed;
+    }
+}
+
+
+/**
+* MBOXCreator is a FeedCreator that implements the mbox format
+* as described in http://www.qmail.org/man/man5/mbox.html
+*
+* @since 1.3
+* @author Kai Blankenhorn <[email protected]>
+*/
+class MBOXCreator extends FeedCreator {
+
+    function MBOXCreator() {
+        $this->contentType = "text/plain";
+    }
+    
+    function qp_enc($input = "", $line_max = 76) {
+        $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
+        $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
+        $eol = "\r\n";
+        $escape = "=";
+        $output = "";
+        while( list(, $line) = each($lines) ) {
+            //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
+            $linlen = strlen($line);
+            $newline = "";
+            for($i = 0; $i < $linlen; $i++) {
+                $c = substr($line, $i, 1);
+                $dec = ord($c);
+                if ( ($dec == 32) && ($i == ($linlen - 1)) ) { // convert space at eol only
+                    $c = "=20";
+                } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
+                    $h2 = floor($dec/16); $h1 = floor($dec%16);
+                    $c = $escape.$hex["$h2"].$hex["$h1"];
+                }
+                if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
+                    $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
+                    $newline = "";
+                }
+                $newline .= $c;
+            } // end of for
+            $output .= $newline.$eol;
+        }
+        return trim($output);
+    }
+    
+
+    /**
+     * Builds the MBOX contents.
+     * @return    string    the feed's complete text
+     */
+    function createFeed() {
+        global $config;
+        for ($i=0;$i<count($this->items);$i++) {
+            if ($this->items[$i]->author!="") {
+                $from = $this->items[$i]->author;
+            } else {
+                $from = $this->title;
+            }
+            $itemDate = new FeedDate($this->items[$i]->date);
+            $feed.= "From ".strtr(MBOXCreator::qp_enc($from)," ","_")." ".date("D M d H:i:s Y",$itemDate->unix())."\n";
+            $feed.= "Content-Type: text/plain;\n";
+            $feed.= "    charset=\"".$config->outputEnc."\"\n";
+            $feed.= "Content-Transfer-Encoding: quoted-printable\n";
+            $feed.= "Content-Type: text/plain\n";
+            $feed.= "From: \"".MBOXCreator::qp_enc($from)."\"\n";
+            $feed.= "Date: ".$itemDate->rfc822()."\n";
+            $feed.= "Subject: ".MBOXCreator::qp_enc(FeedCreator::iTrunc($this->items[$i]->title,100))."\n";
+            $feed.= "\n";
+            $body = chunk_split(MBOXCreator::qp_enc($this->items[$i]->description));
+            $feed.= preg_replace("~\nFrom ([^\n]*)(\n?)~","\n>From $1$2\n",$body);
+            $feed.= "\n";
+            $feed.= "\n";
+        }
+        return $feed;
+    }
+    
+    /**
+     * Generate a filename for the feed cache file. Overridden from FeedCreator to prevent XML data types.
+     * @return string the feed cache filename
+     * @since 1.4
+     * @access private
+     */
+    function _generateFilename() {
+        $fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+        return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".mbox";
+    }
+}
+
+
+/**
+* OPMLCreator is a FeedCreator that implements OPML 1.0.
+*
+* @see http://opml.scripting.com/spec
+* @author Dirk Clemens, Kai Blankenhorn
+* @since 1.5
+*/
+class OPMLCreator extends FeedCreator {
+    
+    function createFeed() {     
+        $feed = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+        $feed.= $this->_createGeneratorComment();
+        $feed.= "<opml xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
+        $feed.= "    <head>\n";
+        $feed.= "        <title>".htmlspecialchars($this->title)."</title>\n";
+        if ($this->pubDate!="") {
+            $date = new FeedDate($this->pubDate);
+            $feed.= "         <dateCreated>".$date->rfc822()."</dateCreated>\n";
+        }
+        if ($this->lastBuildDate!="") {
+            $date = new FeedDate($this->lastBuildDate);
+            $feed.= "         <dateModified>".$date->rfc822()."</dateModified>\n";
+        }
+        if ($this->editor!="") {
+            $feed.= "         <ownerName>".$this->editor."</ownerName>\n";
+        }
+        if ($this->editorEmail!="") {
+            $feed.= "         <ownerEmail>".$this->editorEmail."</ownerEmail>\n";
+        }
+        $feed.= "    </head>\n";
+        $feed.= "    <body>\n";
+        for ($i=0;$i<count($this->items);$i++) {
+            $feed.= "    <outline type=\"rss\" ";
+            $title = htmlspecialchars(strip_tags(strtr($this->items[$i]->title,"\n\r","  ")));
+            $feed.= " title=\"".$title."\"";
+            $feed.= " text=\"".$title."\"";
+            //$feed.= " description=\"".htmlspecialchars($this->items[$i]->description)."\"";
+            $feed.= " url=\"".htmlspecialchars($this->items[$i]->link)."\"";
+            $feed.= "/>\n";
+        }
+        $feed.= "    </body>\n";
+        $feed.= "</opml>\n";
+        return $feed;
+    }
+}
+
+?>

Added: trunk/svn.matroska.org/WebSVN/include/setup.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/setup.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/setup.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,339 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// setup.inc
+//
+// Global setup
+
+// --- DON'T CHANGE THIS FILE ---
+//
+// User changes should be done in config.ini
+
+// Include the configuration class
+require("include/configclass.inc");
+
+// Define the language array
+$lang = array();
+
+// Include a default language file.
+require("languages/english.inc");
+
+// Set up svnlocwebsvn
+if (empty($locwebsvnhttp))
+   $locwebsvnhttp = ".";
+
+if (empty($locwebsvnreal))
+   $locwebsvnreal = ".";
+
+$vars["locwebsvnhttp"] = $locwebsvnhttp;
+
+// Make sure that the input locale is set up correctly
+setlocale(LC_ALL, "");
+
+// Create the config
+$config = new Config;
+
+// Set up the default character encodings
+if (function_exists("iconv_get_encoding"))
+{
+  $config->setInputEncoding(iconv_get_encoding("input_encoding"));
+  $config->setOutputEncoding(iconv_get_encoding("input_encoding"));   
+}
+
+// Set up the default content-type extension handling
+
+$contentType = array (
+
+".dwg" => "application/acad", // AutoCAD Drawing files
+".DWG" => "application/acad", // AutoCAD Drawing files
+".arj" => "application/arj", //  
+".ccAD" => "application/clariscad", // ClarisCAD files
+".DRW" => "application/drafting", // MATRA Prelude drafting
+".dxf" => "application/dxf", // DXF (AutoCAD)
+".DXF" => "application/dxf", // DXF (AutoCAD)
+".xl" => "application/excel", // Microsoft Excel
+".unv" => "application/i-deas", //SDRC I-DEAS files
+".UNV" => "application/i-deas", //SDRC I-DEAS files
+".igs" => "application/iges", // IGES graphics format
+".iges" => "application/iges", // IGES graphics format
+".IGS" => "application/iges", // IGES graphics format
+".IGES" => "application/iges", // IGES graphics format
+".hqx" => "application/mac-binhex40", // Macintosh BinHex format
+".word" => "application/msword", // Microsoft Word
+".w6w" => "application/msword", // Microsoft Word
+".doc" => "application/msword", // Microsoft Word
+".wri" => "application/mswrite", // Microsoft Write
+".bin" => "application/octet-stream", // Uninterpreted binary
+".exe" => "application/x-msdownload", // Windows EXE
+".EXE" => "application/x-msdownload", // Windows EXE
+".oda" => "application/oda", //  
+".pdf" => "application/pdf", // PDF (Adobe Acrobat)
+".ai" => "application/postscript", // PostScript
+".PS" => "application/postscript", // PostScript
+".ps" => "application/postscript", // PostScript
+".eps" => "application/postscript", // PostScript
+".prt" => "application/pro_eng", // PTC Pro/ENGINEER
+".PRT" => "application/pro_eng", // PTC Pro/ENGINEER
+".part" => "application/pro_eng", // PTC Pro/ENGINEER
+".rtf" => "application/rtf", // Rich Text Format
+".set" => "application/set", // SET (French CAD standard)
+".SET" => "application/set", // SET (French CAD standard)
+".stl" => "application/sla", // Stereolithography
+".STL" => "application/sla", // Stereolithography
+".SOL" => "application/solids", // MATRA Prelude Solids
+".stp" => "application/STEP", // ISO-10303 STEP data files
+".STP" => "application/STEP", // ISO-10303 STEP data files
+".step" => "application/STEP", // ISO-10303 STEP data files
+".STEP" => "application/STEP", // ISO-10303 STEP data files
+".vda" => "application/vda", // VDA-FS Surface data
+".VDA" => "application/vda", // VDA-FS Surface data
+".dir" => "application/x-director", // Macromedia Director
+".dcr" => "application/x-director", // Macromedia Director
+".dxr" => "application/x-director", // Macromedia Director
+".mif" => "application/x-mif", // FrameMaker MIF Format
+".csh" => "application/x-csh", // C-shell script
+".dvi" => "application/x-dvi", // TeX DVI
+".gz" => "application/x-gzip", // GNU Zip
+".gzip" => "application/x-gzip", // GNU Zip
+".hdf" => "application/x-hdf", // ncSA HDF Data File
+".latex" => "application/x-latex", // LaTeX source
+".nc" => "application/x-netcdf", // Unidata netCDF
+".cdf" => "application/x-netcdf", // Unidata netCDF
+".sh" => "application/x-sh", // Bourne shell script
+".sit" => "application/x-stuffit", // Stiffut Archive
+".tcl" => "application/x-tcl", // TCL script
+".tex" => "application/x-tex", // TeX source
+".texinfo" => "application/x-texinfo", // Texinfo (Emacs)
+".texi" => "application/x-texinfo", // Texinfo (Emacs)
+".t" => "application/x-troff", // Troff
+".tr" => "application/x-troff", // Troff
+".roff" => "application/x-troff", // Troff
+".man" => "application/x-troff-man", // Troff with MAN macros
+".me" => "application/x-troff-me", // Troff with ME macros
+".ms" => "application/x-troff-ms", // Troff with MS macros
+".src" => "application/x-wais-source", // WAIS source
+".bcpio" => "application/x-bcpio", // Old binary CPIO
+".cpio" => "application/x-cpio", // POSIX CPIO
+".gtar" => "application/x-gtar", // GNU tar
+".shar" => "application/x-shar", // Shell archive
+".sv4cpio" => "application/x-sv4cpio", // SVR4 CPIO
+".sv4crc" => "application/x-sv4crc", // SVR4 CPIO with CRC
+".tar" => "application/x-tar", // 4.3BSD tar format
+".ustar" => "application/x-ustar", // POSIX tar format
+".hlp" => "application/x-winhelp", // Windows Help
+".zip" => "application/zip", // ZIP archive
+".au" => "audio/basic", // Basic audio (usually m-law)
+".snd" => "audio/basic", // Basic audio (usually m-law)
+".aif" => "audio/x-aiff", // AIFF audio
+".aiff" => "audio/x-aiff", // AIFF audio
+".aifc" => "audio/x-aiff", // AIFF audio
+".ra" => "audio/x-pn-realaudio", // RealAudio
+".ram" => "audio/x-pn-realaudio", // RealAudio
+".rpm" => "audio/x-pn-realaudio-plugin", // RealAudio (plug-in)
+".wav" => "audio/x-wav", // Windows WAVE audio
+".mp3" => "audio/x-mp3", // MP3 files
+".gif" => "image/gif", // gif image
+".ief" => "image/ief", // Image Exchange Format
+".jpg" => "image/jpeg", // JPEG image
+".JPG" => "image/jpeg", // JPEG image
+".JPE" => "image/jpeg", // JPEG image
+".jpe" => "image/jpeg", // JPEG image
+".JPEG" => "image/jpeg", // JPEG image
+".jpeg" => "image/jpeg", // JPEG image
+".pict" => "image/pict", // Macintosh PICT
+".tiff" => "image/tiff", // TIFF image
+".tif" => "image/tiff", // TIFF image
+".ras" => "image/x-cmu-raster", // CMU raster
+".pnm" => "image/x-portable-anymap", // PBM Anymap format
+".pbm" => "image/x-portable-bitmap", // PBM Bitmap format
+".pgm" => "image/x-portable-graymap", // PBM Graymap format
+".ppm" => "image/x-portable-pixmap", // PBM Pixmap format
+".rgb" => "image/x-rgb", // RGB Image
+".xbm" => "image/x-xbitmap", // X Bitmap
+".xpm" => "image/x-xpixmap", // X Pixmap
+".xwd" => "image/x-xwindowdump", // X Windows dump (xwd) format
+".zip" => "multipart/x-zip", // PKZIP Archive
+".gzip" => "multipart/x-gzip", // GNU ZIP Archive
+".mpeg" => "video/mpeg", // MPEG video
+".mpg" => "video/mpeg", // MPEG video
+".MPG" => "video/mpeg", // MPEG video
+".MPE" => "video/mpeg", // MPEG video
+".mpe" => "video/mpeg", // MPEG video
+".MPEG" => "video/mpeg", // MPEG video
+".mpeg" => "video/mpeg", // MPEG video
+".qt" => "video/quicktime", // QuickTime Video
+".mov" => "video/quicktime", // QuickTime Video
+".avi" => "video/msvideo", // Microsoft Windows Video
+".movie" => "video/x-sgi-movie", // SGI Movieplayer format
+".wrl" => "x-world/x-vrml" // VRML Worlds
+
+);
+
+// List of extensions recognised by enscript.
+
+$extEnscript = array
+(
+  ".ada"     => "ada",
+  ".adb"     => "ada",
+  ".ads"     => "ada",
+  ".awk"     => "awk",
+  ".c"       => "c",
+  ".c++"     => "cpp",
+  ".cc"      => "cpp",
+  ".cpp"     => "cpp",
+  ".csh"     => "csh",
+  ".cxx"     => "cpp",
+  ".diff"    => "diffu",
+  ".dpr"     => "delphi",
+  ".el"      => "elisp",
+  ".eps"     => "postscript",
+  ".f"       => "fortran",
+  ".for"     => "fortran",
+  ".gs"      => "haskell",
+  ".h"       => "c",
+  ".hpp"     => "cpp",
+  ".hs"      => "haskell",
+  ".htm"     => "html",
+  ".html"    => "html",
+  ".idl"     => "idl",
+  ".java"    => "java",
+  ".js"      => "javascript",
+  ".lgs"     => "haskell",
+  ".lhs"     => "haskell",
+  ".m"       => "objc",
+  ".m4"      => "m4",
+  ".man"     => "nroff",
+  ".nr"      => "nroff",
+  ".p"       => "pascal",
+  ".pas"     => "delphi",
+  ".patch"   => "diffu",
+  ".pkg"     => "sql", 
+  ".pl"      => "perl",
+  ".pm"      => "perl",
+  ".pp"      => "pascal",
+  ".ps"      => "postscript",
+  ".s"       => "asm",
+  ".scheme"  => "scheme",
+  ".scm"     => "scheme",
+  ".scr"     => "synopsys",
+  ".sh"      => "sh",
+  ".shtml"   => "html",
+  ".sql"     => "sql",
+  ".st"      => "states",
+  ".syn"     => "synopsys",
+  ".synth"   => "synopsys",
+  ".tcl"     => "tcl",
+  ".tex"     => "tex",
+  ".texi"    => "tex",
+  ".texinfo" => "tex",
+  ".v"       => "verilog",
+  ".vba"     => "vba",
+  ".vh"      => "verilog",
+  ".vhd"     => "vhdl",
+  ".vhdl"    => "vhdl",
+  ".py"      => "python",
+  
+  // The following are handled internally by WebSVN, since there's no
+  // support for them in Enscript
+  
+  ".php"     => "php",
+  ".inc"     => "php"  
+);
+
+// Default 'zipped' array
+
+$zipped = array ();
+
+// Get the user's personalised config
+
+require("config.inc");
+
+// Make sure that the user has set up a repository
+
+$reps = $config->getRepositories();
+if (empty($reps[0]))
+{
+   echo $lang["SUPPLYREP"];
+   exit;
+}
+
+// Override the rep parameter with the repository name if it's available
+$repname = @$_REQUEST["repname"];
+if (isset($repname))
+{
+    $rep = $config->findRepository($repname);
+}
+else
+   $rep = $reps[0];
+   
+// Retrieve other standard parameters
+
+if (version_compare(phpversion(), "4.1.0", "<"))
+   $path = html_entity_decode(@$_REQUEST["path"]);
+else
+   $path = html_entity_decode(@$_REQUEST["path"], ENT_COMPAT, $config->outputEnc);
+
+$path = escapeshellcmd($path);
+$rev = (int)@$_REQUEST["rev"];
+$showchanged = (@$_REQUEST["sc"] == 1)?1:0;
+
+// Function to create the project selection HTML form
+function createProjectSelectionForm()
+{ 
+   global $config, $vars, $rep, $lang, $showchanged;
+   
+   $url = $config->getURL(-1, "", "form");
+   $vars["projects_form"] = "<form action=\"$url\" method=\"post\" name=\"projectform\">";
+   
+   $reps = $config->getRepositories();
+   $vars["projects_select"] = "<select name=\"repname\" onchange=\"javascript:this.form.submit();\">";
+   
+   foreach ($reps as $trep)
+   {
+      if ($rep->name == $trep->name)
+         $sel = "selected";
+      else
+         $sel = "";
+         
+      $vars["projects_select"] .= "<option value=\"".$trep->name."\" $sel>".$trep->name."</option>";
+   }
+   
+   $vars["projects_select"] .= "</select>";
+   
+   $vars["projects_submit"] = "<input type=\"submit\" value=\"${lang["GO"]}\">";
+   $vars["projects_endform"] = "<input type=\"hidden\" name=\"selectproj\" value=\"1\"><input type=\"hidden\" name=\"op\" value=\"form\"><input type=\"hidden\" name=\"sc\" value=\"$showchanged\"></form>";   
+}
+
+// Create the form if we're not in MultiViews.  Otherwise wsvn must create the form once the current project has
+// been found
+
+if (!$config->multiViews)
+{
+   createProjectSelectionForm();
+}
+
+if ($rep)
+{
+   $vars["allowdownload"] = $rep->getAllowDownload();
+   $vars["repname"] = $rep->name;
+}
+
+?>

Added: trunk/svn.matroska.org/WebSVN/include/svnlook.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/svnlook.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/svnlook.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,594 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// svn-look.inc
+//
+// Svn bindings
+//
+// These binding currently use svnlook to achieve their goal.  Once a proper SWIG binding has been
+// produces, there'll be an option to use those instead
+
+require_once("include/utils.inc");
+
+// Function returns true if the give entry in a directory tree is at the top level
+
+function _topLevel($entry)
+{
+   // To be at top level, there must be one space before the entry
+   return (strlen($entry) > 1 && $entry{0} == " " && $entry{1} != " ");
+}
+
+// Function to sort two given directory entries.  Directories go at the top
+
+function _dirSort($e1, $e2)
+{
+   $isDir1 = $e1{strlen($e1) - 1} == "/";
+   $isDir2 = $e2{strlen($e2) - 1} == "/";
+   
+   if ($isDir1 && !$isDir2) return -1;
+   if ($isDir2 && !$isDir1) return 1;
+   
+   return strnatcasecmp($e1, $e2);
+}
+
+// Return the revision string to pass to a command
+
+function _revStr($rev)
+{
+   if ($rev > 0)
+      return "-r $rev";
+   else
+      return "";
+}
+
+// Function to encode a URL without encoding the /'s
+
+function encodepath($uri)
+{
+   $parts = explode('/', $uri);
+   for ($i = 0; $i < count($parts); $i++)
+   {
+      if ( function_exists("mb_detect_encoding") && function_exists("mb_convert_encoding"))
+      {
+         $parts[$i] = mb_convert_encoding($parts[$i], "UTF-8", mb_detect_encoding($parts[$i]));
+      }
+      
+      $parts[$i] = rawurlencode($parts[$i]);
+   }
+   
+   $uri = implode('/', $parts);
+   
+   // Quick hack.  Subversion seems to have a bug surrounding the use of %3A instead of :
+   
+   $uri = str_replace("%3A" ,":", $uri);
+   
+   return $uri;
+}
+
+// The SVNRepository Class
+
+Class SVNRepository
+{
+   var $repPath;
+   
+   function SVNRepository($repPath)
+   {
+      $this->repPath = $repPath;
+   }
+   
+   function dirContents($path, $rev = 0)
+   {
+      global $config, $locwebsvnreal;
+      
+      $revstr = _revStr($rev);
+      
+      $tree = array();
+      
+      // Try to find a cached version of this revision of the repository
+      
+      if ($rev == 0)
+      {
+         $head = runCommand($config->svnlook." youngest ".quote($this->repPath));
+         settype($head[0], "integer");
+         $rev = $head[0];
+      }
+      
+      $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+      $output = runCommand($config->svn." list $revstr ".quote("file:///".$path), true);
+      
+      foreach ($output as $entry)
+      {
+         if ($entry != "")
+            $tree[] = $entry;
+      }
+      
+      // Sort the entries into alphabetical order with the directories at the top of the list
+      usort($tree, "_dirSort");
+      
+      return $tree;
+   }
+   
+   function getLogDetails($path, $rev = 0)
+   {
+      global $config, $lang, $locwebsvnreal;
+      
+      if ($rev == 0)
+      {
+         $head = runCommand($config->svnlook." youngest ".quote($this->repPath));
+         settype($head[0], "integer");
+         $rev = $head[0];
+      }
+
+      $revstr = _revStr($rev);
+      $path = quote($path);
+      
+      // Try to find a cached version of this revision of the repository
+            
+      $cachedname = strtr($this->repPath, ":/\\", "___");
+      $cachedname = $locwebsvnreal.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR.$cachedname."_log_$rev";
+      
+      if ($config->cacheResults && !file_exists($cachedname))
+      {
+         // Cache the directory layout
+         
+         $cmd = quoteCommand($config->svnlook." info $revstr ".quote($this->repPath)." $path", false);
+
+         if (($handle = popen($cmd, "r")) !== FALSE)
+         {
+            if (($output = gzopen($cachedname, "w")) !== FALSE)
+            {
+                  while (!feof($handle))
+            		{
+            		   $line = fgets($handle);
+            		   gzwrite($output, $line);
+            		}
+            		
+            	gzclose($output);
+            }
+         	pclose($handle);
+         }
+      }
+      
+      // Get the log info
+      if ($config->cacheResults && file_exists($cachedname))
+      {
+         $output = transArray(gzfile($cachedname));
+      }
+      else
+      {   
+         $output = runCommand($config->svnlook." info $revstr ".quote($this->repPath)." $path");
+      }
+                     
+      // Create a nice array to return
+      $log["author"] = ($output[0] ? $output[0] : "&nbsp;");
+      
+      $date = $output[1];
+      $log["date"] = $date;
+
+      sscanf($date, "%d-%d-%d %d:%d:%d %d", $y, $mo, $d, $h, $m, $s, $offset);
+      
+      // Remove the offset to get the time in GMT
+      $h -= $offset / 100;
+      
+      // Get the commit time as seconds.  Note that the mktime function assumes that the time being
+      // passed to it is a local time - it will therefore subtract/add the required number of hours
+      // to make it GMT.  Since we already have the time in GMT we first add the localtime offset to
+      // get the commit time in local time.  The offset calculated above already handles the summer
+      // time case, so we tell mktime not to take this into account.
+      
+      $lt = gettimeofday();
+      $minwest = $lt["minuteswest"];
+      $committime = mktime($h ,$m - $minwest, $s, $mo, $d, $y, 0);
+      $log["committime"] = $committime;
+      
+      // Get the current time (as GMT)
+      $t = localtime(time(), 1);
+      $curtime = mktime($t["tm_hour"],  $t["tm_min"], $t["tm_sec"], $t["tm_mon"] + 1, $t["tm_mday"], $t["tm_year"] + 1900, $t["tm_isdst"]);
+      
+      // Get the number of seconds since the commit
+      $agesecs = $curtime - $committime;
+      if ($agesecs < 0) $agesecs = 0;
+      
+      // Now create a nice human readable age based on these figures
+      $years = floor($agesecs / (60*60*24*365));
+      if ($years > 1)
+      {
+         $log["age"] = "$years&nbsp;${lang["YEARS"]}";         
+      }
+      else
+      {
+         $months = floor($agesecs / (60*60*24*365/12));
+         if ($months > 1)
+         {
+            $log["age"] = "$months&nbsp;${lang["MONTHS"]}";
+         }
+         else
+         {
+            $weeks = floor($agesecs / (60*60*24*7));
+            if ($weeks > 1)
+            {
+               $log["age"] = "$weeks&nbsp;${lang["WEEKS"]}";
+            }
+            else
+            {              
+               $days = floor($agesecs / (60*60*24));
+               if ($days > 1)
+               {
+                  $log["age"] = "$days&nbsp;${lang["DAYS"]}";
+               }
+               else
+               { 
+                  $hours = floor($agesecs / (60*60));
+                  if ($hours > 1)
+                  {
+                     $log["age"] = "$hours&nbsp;${lang["HOURS"]}";
+                  }
+                  else
+                  { 
+                     $minutes = floor($agesecs / 60);
+                     $log["age"] = "$minutes&nbsp;${lang["MINUTES"]}";
+                  }
+               }
+            }
+         }
+      }
+      
+      $log["message"] = $output[3]; 
+      $pos = 4;
+      while (isset($output[$pos]))
+      {
+         $log["message"] .= "\n".$output[$pos];
+         $pos++;
+      }
+            
+      // If we're working on the head, get the head revision
+      if ($rev > 0)
+         $log["rev"] = $rev;
+      else
+      {
+         $head = runCommand($config->svnlook." youngest ".quote($this->repPath));
+         settype($head[0], "integer");
+         $log["rev"] = $head[0];
+      }
+       
+      return $log;
+   }
+   
+   function getChangedFiles($rev = 0)
+   {
+      global $config, $locwebsvnreal;
+      
+      if ($rev == 0)
+      {
+         $head = runCommand($config->svnlook." youngest ".quote($this->repPath));
+         settype($head[0], "integer");
+         $rev = $head[0];
+      }
+      
+      $revstr = _revStr($rev);
+         
+      // Try to find a cached version of this revision of the repository
+      
+      $cachedname = strtr($this->repPath, ":/\\", "___");
+      $cachedname = $locwebsvnreal.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR.$cachedname."_mods_$rev";
+      
+      if ($config->cacheResults && !file_exists($cachedname))
+      {
+         // Cache the directory layout
+         
+         $cmd = quoteCommand($config->svnlook." changed $revstr ".quote($this->repPath), false);
+
+         if (($handle = popen($cmd, "r")) !== FALSE)
+         {
+            if (($output = gzopen($cachedname, "w")) !== FALSE)
+            {
+                  while (!feof($handle))
+            		{
+            		   $line = fgets($handle);
+            		   gzwrite($output, $line);
+            		}
+            		
+            	gzclose($output);
+            }
+         	pclose($handle);
+         }
+      }
+      
+      if ($config->cacheResults && file_exists($cachedname))
+      {
+         $output = transArray(gzfile($cachedname));
+      }
+      else
+      {
+        $output = runCommand($config->svnlook." changed $revstr ".quote($this->repPath));
+      }
+           
+      // Now create a nicer array from that
+      $changes = array("added" => array(), "updated" => array(), "deleted" => array());
+      
+      foreach ($output as $changed)
+      {
+         if (trim($changed) != "")
+         {
+            $mod = $changed{0};
+            $name = substr($changed, 4);
+            
+            switch ($mod)
+            {
+               case "A":
+                  $changes["added"][] = $name;
+                  break;
+                  
+               case "U":
+                  $changes["updated"][] = $name;
+                  break;
+   
+               case "D":
+                  $changes["deleted"][] = $name;
+                  break;
+            }
+         }
+      }
+      
+      // Sort each array alphabetically
+      
+      natcasesort($changes["added"]);
+      natcasesort($changes["deleted"]);
+      natcasesort($changes["updated"]);
+    
+      return $changes;              
+   }
+   
+   // getFileContents
+   //
+   // Dump the content of a file to the given filename
+   
+   function getFileContents($path, $filename, $rev = 0, $pipe = "")
+   {
+      global $config, $extEnscript;
+      
+      $revstr = _revStr($rev);
+      
+      // If there's no filename, we'll just deliver the contents as it is to the user
+      if ($filename == "")
+      {
+         $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+         passthru($config->svn." cat $revstr ".quote("file:///".$path)." $pipe");
+         return;
+      }
+      
+      // Get the file contents info
+      
+      $ext = strrchr($path, ".");
+      $l = @$extEnscript[$ext];
+        
+      if ($l == "php")
+      {         
+         // Output the file to the filename
+         $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+         $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." > $filename", false);
+         @exec($cmd);
+         
+         // Get the file as a string (memory hogging, but we have no other options)
+         $content = highlight_file($filename, true);
+         
+         // Destroy the previous version, and replace it with the highlighted version
+         $f = fopen($filename, "w");
+         if ($f)
+         {
+            // The highlight file function doesn't deal with line endings very nicely at all.  We'll have to do it
+            // by hand.
+            
+            // Remove the first line generated by highlight()
+            $pos = strpos($content, "\n");
+            $content = substr($content, $pos+1);
+            
+            $content = explode("<br />", $content);
+            
+            foreach ($content as $line)
+            {
+               fputs($f, rtrim($line)."\n");
+            }
+            
+            fclose($f);
+         }         
+      }
+      else
+      {
+         if ($config->useEnscript)
+         {
+            // Get the files, feed it through enscript, then remove the enscript headers using sed
+            //
+            // Note that the sec command returns only the part of the file between <PRE> and </PRE>.
+            // It's complicated because it's designed not to return those lines themselves.
+         
+            $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+            $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." | ".
+                                $config->enscript." --language=html ".
+								        ($l ? "--color --pretty-print=$l" : "")." -o - | ".
+                                $config->sed." -n ".$config->quote."1,/^<PRE.$/!{/^<\\/PRE.$/,/^<PRE.$/!p;}".$config->quote." > $filename", false);
+            @exec($cmd);
+         }
+         else
+         {
+            $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+            $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." > $filename", false);
+            @exec($cmd);
+         }
+      }
+  }
+
+   // listFileContents
+   //
+   // Print the contents of a file without filling up Apache's memory
+   
+   function listFileContents($path, $rev = 0)
+   {
+      global $config, $extEnscript;
+      
+      $revstr = _revStr($rev);
+      $pre = false;
+      
+      // Get the file contents info
+      
+      $ext = strrchr($path, ".");
+      $l = @$extEnscript[$ext];
+      
+      // Deal with php highlighting internally
+      if ($l == "php")
+      {
+         $tmp = tempnam("temp", "wsvn");
+         
+         // Output the file to a temporary file
+         $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+         $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." > $tmp", false);
+         @exec($cmd);
+         highlight_file($tmp);
+         unlink($tmp);
+      }
+      else
+      {  
+         if ($config->useEnscript)
+         {
+            $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+            $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." | ".
+                                $config->enscript." --language=html ".
+ 								        ($l ? "--color --pretty-print=$l" : "")." -o - | ".
+                                $config->sed." -n ".$config->quote."/^<PRE.$/,/^<\\/PRE.$/p".$config->quote." 2>&1", false);
+                                  
+            if (!($result = popen($cmd, "r")))
+               return;
+         }
+         else
+         {
+            $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+            $cmd = quoteCommand($config->svn." cat $revstr ".quote("file:///".$path)." 2>&1", false);
+            
+            if (!($result = popen($cmd, "r")))
+               return;
+              
+            $pre = true;
+         }
+          
+         if ($pre)
+            echo "<PRE>";
+            
+   		while (!feof($result))
+   		{
+   		   $line = fgets($result, 1024);
+   		   if ($pre) $line = replaceEntities($line);
+   		   
+   		   print hardspace($line);
+   		}
+    
+         if ($pre)
+            echo "</PRE>";
+   		
+   		pclose($result);
+      }
+   }
+
+   // getBlameDetails
+   //
+   // Dump the blame content of a file to the given filename
+   
+   function getBlameDetails($path, $filename, $rev = 0)
+   {
+      global $config;
+      
+      $revstr = _revStr($rev);
+      
+      $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+      $cmd = quoteCommand($config->svn." blame $revstr ".quote("file:///".$path)." > $filename", false);
+      
+      @exec($cmd);
+  }
+
+   function getProperty($path, $property, $rev = 0)
+   {
+      global $config;
+      
+      $revstr = _revStr($rev);
+      
+      $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+      $ret = runCommand($config->svn." propget $property $revstr ".quote("file:///".$path), true);
+      
+      // Remove the surplus newline
+      if (count($ret))
+         unset($ret[count($ret) - 1]);
+      
+      return implode("\n", $ret);
+   }
+
+  function getHistory($path, $rev = 0)
+   {
+      global $config;
+      
+      $revstr = _revStr($rev);
+      $path = quote($path);
+      
+      // Get the history info
+      $output = runCommand($config->svnlook." history $revstr ".quote($this->repPath)." $path");
+            
+      // Now create a nicer array from that
+      $history = array();
+          
+      $line = 0;
+      foreach ($output as $record)
+      {  
+         $line++;
+         
+         // Skip header info
+         if ($line < 3)
+            continue;  
+            
+         $record = trim($record);
+         if ($record != "")
+         {
+            list($rev, $path) = split(" ", $record, 2);
+            if ($rev)
+            {
+               $path = trim($path);
+               $history[] = array("rev" => $rev, "path" => $path);
+            }
+         }
+      }
+         
+      return $history;
+   }
+
+   // exportDirectory
+   //
+   // Exports the directory to the given location
+   
+   function exportDirectory($path, $filename, $rev = 0)
+   {
+      global $config;
+      
+      $revstr = _revStr($rev);
+      
+      $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->repPath.$path));
+      $cmd = quoteCommand($config->svn." export $revstr ".quote("file:///".$path)." $filename", false);
+
+      @exec($cmd);
+  }
+}
+?>

Added: trunk/svn.matroska.org/WebSVN/include/template.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/template.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/template.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,305 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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] wit 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;
+}
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/include/utils.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/utils.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/utils.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,188 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// utils.inc
+//
+// General utility commands
+
+// createDirLinks
+//
+// Create a list of links to the current path that'll be available from the template
+
+function createDirLinks($rep, $path, $rev, $showchanged)
+{
+   global $vars, $config;
+   
+   $subs = explode("/", $path);
+   $sofar = "";
+   $count = count($subs);
+   $vars["curdirlinks"] = "";
+   
+   // The number of links depends on the last item.  It's empty if
+   // we're looing at a directory, and full if it's a file
+   if (empty($subs[$count - 1]))
+   {
+      $limit = $count - 2;
+      $dir = true;
+   }
+   else
+   {
+      $limit = $count - 1;
+      $dir = false;
+   }
+      
+   for ($n = 0; $n < $limit; $n++)
+   {
+      $sofar .= $subs[$n]."/";
+      $sofarurl = $config->getURL($rep, $sofar, "dir");
+      $vars["curdirlinks"] .= "[<a href=\"${sofarurl}rev=$rev&amp;sc=$showchanged\">".$subs[$n]."/]</a> ";
+   }
+   
+   if ($dir)
+   {
+      $vars["curdirlinks"] .=  "[<b>".$subs[$n]."</b>/]";
+   }
+   else
+   {
+      $vars["curdirlinks"] .=  "[<b>".$subs[$n]."</b>]";
+   }
+}
+
+// Create links out of http:// and mailto: tags
+
+function create_anchors($text)
+{
+   $ret = $text;
+
+   // Match correctly formed URLs that aren't already links
+	$ret = preg_replace("#\b(?<!href=\")([a-z]+?)://(\S*)([\w/]+)#i",
+	                    "<a href=\"\\1://\\2\\3\" target=\"_blank\">\\1://\\2\\3</a>",
+	                    $ret);
+	                    
+	// Now match anything beginning with www, as long as it's not //www since they were matched above                    
+	$ret = preg_replace("#\b(?<!//)www\.(\S*)([\w/]+)#i",
+	                    "<a href=\"http://www.\\1\\2\" target=\"_blank\">www.\\1\\2</a>",
+	                    $ret);
+
+	// Match email addresses
+	$ret = preg_replace("#\b([\w\-_.]+)@([\w\-.]+)\b#i",
+	                    "<a href=\"mailto:\\1@\\2\">\\1@\\2</a>",
+	                    $ret);
+   
+   // Replace any usernames
+	$ret = preg_replace("#\[:nom:([^\]]*)\]#e",
+	                    "username(0, trim(\"\\1\"))",
+	                    $ret);
+   
+	return ($ret);
+}
+
+function getFullURL($loc)
+{
+   $protocol = 'http';
+   
+   if (isset($_SERVER["HTTPS"]) && (strtolower($_SERVER["HTTPS"]) != "off"))
+   {
+   	$protocol = "https";
+   }
+   
+   $port = ":".$_SERVER["SERVER_PORT"];
+   if ((":80" == $port && "http" == $protocol) ||
+       (":443" == $port && "https" == $protocol)) 
+   {
+      $port = "";
+   }
+   
+   if (isset($_SERVER["HTTP_HOST"]))
+   {
+   	$host = $_SERVER["HTTP_HOST"];
+   }
+   else if (isset($_SERVER["SERVER_NAME"]))
+   {
+   	$host = $_SERVER["SERVER_NAME"].$port;
+   }
+   else if (isset($_SERVER["SERVER_ADDR"]))
+   {
+   	$host = $_SERVER["SERVER_ADDR"].$port;
+   }
+   else
+   {
+      print "Unable to redirect";
+      exit;
+   }
+   
+   $url	= $protocol . "://" . $host . $loc;
+
+   return $url;
+}
+
+// hardspace
+//
+// Replace the spaces at the front of a line with hard spaces
+
+$spacearray = array (
+0 => "",
+1 => "&nbsp;",
+2 => "&nbsp;&nbsp;",
+3 => "&nbsp;&nbsp;&nbsp;",
+4 => "&nbsp;&nbsp;&nbsp;&nbsp;",
+5 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
+6 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
+7 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
+8 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
+9 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
+10 => "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
+);
+
+function hardspace($s)
+{
+   global $spacearray, $config, $rep;
+
+   $len = strlen($s);
+
+   // Calculate the number of spaces to added (expanding tabs)
+   for ($i = 0, $numspaces = 0; $i < $len; $i++)
+   {
+      if ($s[$i] == " ")
+	      $numspaces += 1;
+	   else
+	      if ($s[$i] == "\t")
+	         $numspaces += $rep->getExpandTabsBy();
+	      else
+	         break;
+   }
+   
+   // Strip the leading blanks
+   $s = substr($s, $i);
+
+   // Create a string of &nbsp;'s
+   $spaces = "";
+   while ($numspaces >= 10)
+   {
+     $spaces .= $spacearray[10];
+     $numspaces -= 10;
+   }
+   $spaces .= $spacearray[$numspaces];
+   
+   // Stick them together
+   return $spaces.$s;
+}
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/include/version.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/include/version.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/include/version.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,27 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// version.inc
+//
+// Version information
+
+$version = "1.61";
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/index.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/index.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/index.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,51 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// index.php
+//
+// Main page.  Lists all the projects
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require("include/template.inc");
+
+$vars["action"] = $lang["PROJECTS"];
+$vars["repname"] = "";
+$vars["rev"] = 0;
+$vars["path"] = "";
+
+$projects = $config->getRepositories();
+$i = 0;
+$listing = array ();
+foreach ($projects as $project)
+{
+   $url = $config->getURL($project, "/", "dir");
+
+   $listing[$i]["rowparity"] = $i % 2;
+   $listing[$i++]["projlink"] = "<a href=\"${url}sc=0\">".$project->name."</a>";
+} 
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."index.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/install.txt
===================================================================
--- trunk/svn.matroska.org/WebSVN/install.txt	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/install.txt	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,232 @@
+
+WHY WebSVN?
+
+WebSVN offers a view onto your subversion repositories that's been designed
+to reflect the Subversion methodology. You can view the log of any file or
+directory and see a list of all the files changed, added or deleted in any
+given revision. You can also view the differences between 2 versions of a
+file so as to see exactly what was changed in a particular revision. 
+
+WebSVN offers the following features: 
+
+* Easy to use interface 
+* Highly customisable templating system 
+* Colourisation of file listings
+* Blame view
+* Log message searching
+* Fast browsing thanks to internal caching feature 
+* Apache MultiViews support 
+* RSS feed support
+
+Since it's written using PHP, WebSVN is also very portable and easy to install.
+
+INSTALLATION
+
+Grab the source and stick it somewhere that your server can get to.  You
+obviously need to have PHP installed and working.  Also note that WebSVN
+won't currently work in safe mode, due to the need to call svnlook.
+
+You'll also need diff (preferably the GNU version; for Windows users I'd
+recommend the Cygwin version) and svnlook available.
+
+Rename distconfig.inc as config.inc (found in the includes directory)and then
+edit it as directed in the file itself.
+
+If everything has gone well, you should be able to view your projects by
+pointing your browser at the index.php file.
+
+For those of you wishing to customise the look and feel a little, you should
+read templates.txt, which explains the highly configurable template system.
+
+Windows users - note that some of the features offered by WebSVN, when
+enabled, require the use of various external programs.  They can be downloaded
+from these locations:
+
+Diff/Sed/Gzip/Tar: http://www.cygwin.com/
+Enscript:      http://people.ssh.com/mtr/genscript/
+
+ACCENTED CHARACTERS
+
+WebSVN is designed to worked with accented characters.  To do this, it uses
+the iconv function.  This may not be installed on your system.  If you aren't
+getting the characters that you expect, make sure that the iconv module is
+being loaded in php.ini.  Windows users will need to copy the appropriate
+DLLs to the system directory (from the PHP installation directory).
+
+CACHING
+
+In order to return results with a reasonable speed, WebSVN caches the results
+of it's requests to svnlook.  Under normal usage this works correctly since
+it's not generally possible to change a revision with subversion.
+
+That said, one case that may cause confusion is if someone changes the log
+message of a given revision.  WebSVN will have cached the previous log message
+and won't know that there's a new one available.  There are various solutions
+to this problem:
+
+1) Turn off caching in the config file.  This will severely impede the
+   perfomance of WebSVN.
+
+2) Change the post-revprop-change hook so that is deletes the contents of the
+   cache after any change to a revision property
+
+3) Only allow the administrator to change revision properties.  He can then
+   delete the cache by hand should this occur.
+
+COLOURISATION
+
+You can few files with syntax colouring if you have Enscript 1.6 or higher 
+installed on your system.  You'll also need Sed.
+
+Simply set the paths in the config file and then uncomment the line:
+
+$config->useEnscript();
+
+MULTIVIEWS
+
+You may choose to configure access to your repository via Apache's MultiView
+system. This will enable you to access a respositoy using a url such as:
+
+http://servername/wsvn/repname/path/in/repository
+
+To do this you must:
+
+- Place wsvn.php where you want to.  Normally you place it such that it's
+  accessible straight after the servername, as shown above.
+
+- Configure the parent directory of wsvn.php to use MultiViews (see Apache
+  docs).
+
+- Change config.inc to include the line $config->useMultiViews();
+
+- Change the paths configured at the beginning of the wsvn.php script.
+
+Now go to http://servername/wsvn/ and make sure that you get the index page.
+
+The repname part of the URL is the name given to it in the config.inc file.
+For this reason you may wish to avoid putting spaces in the name.
+
+AUTHENTICATION AND MULTIVIEW WALK-THROUGH
+
+You may wish to provide an authentication mechanism for WebSVN.  One obvious
+solution is to protect the entire WebSVN directory with some form of Apache
+authentication mechanism, but that doesn't allow for per repository
+authentication.
+
+This walkthrough gives an example of setting up per repository authentication
+that's based on the same authentication requirements as you define for the 
+Subversion access itself.  You'll need to be using Apache.
+
+First, you must get the Multiviews option working.  In my set up, my Apache
+directory root is set to a location on my harddrive:
+
+DocumentRoot "D:/svnpage"
+
+In that directory, I have WebSVN installed in a directory called websvn.
+Normally WebSVN would be accessed by http://servername/websvn
+
+wsvn.php in then copied from the WebSVN installation to the document root
+directory and the variables at the beginning of the script configured as
+follows (based on your own directory locations, obviously):
+
+// Location of websvn directory via HTTP
+//
+// e.g.  For http://servername/websvn use /websvn
+//
+// Note that wsvn.php need not be in the /websvn directory (and normally isn't).
+$locwebsvnhttp = "/websvn";  
+
+// Physical location of websvn directory
+$locwebsvnreal = "d:/svnpage/websvn";
+
+Next, turn on Multiviews in the WebSVN config.inc file:
+
+$config->useMultiViews();
+
+Finally, Apache needs to know that you want to enable MultiViews for the root
+directory.  This can be done by including this line in the directory's
+.htaccess file (assuming that the appropriate AllowOverrides directive is set
+up):
+
+Options MultiViews
+
+If all has gone well, repositories should now by accessible by
+http://servername/wsvn/repname
+
+Note the index page can be accessed through http://servername/wsvn
+If you want to view the index page by http://servername/ you need to
+add another directive to the .htaccess file:
+
+DirectoryIndex wsvn.php
+
+We are now in a position where each repository has it's own URL location.
+To configure authentication we can use the same method as for controlling
+access to the svn repositories themselves.  Here's an example using SSPI:
+
+<Location /wsvn/myproj>
+SVNPath C:\svn\myproj
+AuthType SSPI
+SSPIAuth On
+SSPIAuthoritative On
+SSPIDomain MYDOMAIN
+SSPIOfferBasic On
+AuthzSVNAccessFile c:\svn\myaccessfile.txt
+Require valid-user
+</Location>
+
+Here, I protect just the 'myproj' project, now accessed using
+http://servername/wsvn/myproj
+
+To get the AuthzSVNAccessFile directive working, you have to have the SVNPath
+directive pointing to the real SVN repository.  Do NOT include the DAV
+directive.
+
+The authenticaion now works as for the repository access via SVN.  Very nice!
+
+Newer versions of subversion allow use of the SVNParentPath directive with
+AuthzSVNAccessFile , making for an even nicer set up.  Here's an example:
+
+<Location /svn>
+DAV svn
+SVNParentPath C:\svn
+AuthType SSPI
+SSPIAuth On
+SSPIAuthoritative On
+SSPIDomain MYDOMAIN
+SSPIOfferBasic On
+AuthzSVNAccessFile c:\svn\accessfile.txt
+Require valid-user
+</Location>		
+
+<Location /wsvn/>
+SVNParentPath C:\svn
+AuthType SSPI
+SSPIAuth On
+SSPIAuthoritative On
+SSPIDomain MYDOMAIN
+SSPIOfferBasic On
+AuthzSVNAccessFile c:\svn\accessfile.txt
+Satisfy Any
+Require valid-user
+</Location>	
+
+Note the use of the / after /wsvn/ in the location directive.  If you use
+<Location /wsvn> then you won't be able to access the index.
+
+COMMON PROBLEMS
+
+1) On a Windows machine, this error is reported:
+
+Warning: shell_exec(): Unable to execute
+
+If you experience this problem, you need to give IUSR_<machinename> execute
+permissions on %systemroot%\system32\cmd.exe. Under most systems, the file will
+be C:\WINDOWS\system32\cmd.exe.
+
+Right-click on the file, choose properties, and on the security tab click
+the "Add" button. Add the IUSR_<machinename> user, and then select the
+"read" and "read & execute" boxes.
+
+LICENCE
+
+GNU Public licence.

Added: trunk/svn.matroska.org/WebSVN/languages/english.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/english.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/english.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,112 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// english.inc
+//
+// English language strings
+
+$lang["LOG"] = "Log";
+$lang["DIFF"] = "Diff";
+
+$lang["NOREP"] = "No repository given";
+$lang["NOPATH"] = "Path not found";
+$lang["SUPPLYREP"] = "Please set up a repository path in include/config.inc using \$config->parentPath or \$config->addRepository<p>See the installation guide for more details";
+
+$lang["DIFFREVS"] = "Diff between revs";
+$lang["AND"] = "and";
+$lang["REV"] = "Rev";
+$lang["LINE"] = "Line";
+$lang["SHOWENTIREFILE"] = "Show entire file";
+$lang["SHOWCOMPACT"] = "Only display areas with differences";
+
+$lang["DIFFPREV"] = "Compare with Previous";
+$lang["BLAME"] = "Blame";
+
+$lang["REVINFO"] = "Revision Information";
+$lang["GOYOUNGEST"] = "Go to most recent revision";
+$lang["LASTMOD"] = "Last modification";
+$lang["LOGMSG"] = "Log message";
+$lang["CHANGES"] = "Changes";
+$lang["SHOWCHANGED"] = "Show changed files";
+$lang["HIDECHANGED"] = "Hide changed files";
+$lang["NEWFILES"] = "New Files";
+$lang["CHANGEDFILES"] = "Modified files";
+$lang["DELETEDFILES"] = "Deleted files";
+$lang["VIEWLOG"] = "View&nbsp;Log";
+$lang["PATH"] = "Path";
+$lang["AUTHOR"] = "Author";
+$lang["AGE"] = "Age";
+$lang["LOG"] = "Log";
+$lang["CURDIR"] = "Current Directory";
+$lang["TARBALL"] = "Tarball";
+
+$lang["PREV"] = "Prev";
+$lang["NEXT"] = "Next";
+$lang["SHOWALL"] = "Show All";
+
+$lang["BADCMD"] = "Error running this command";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;Projects";
+$lang["SERVER"] = "Subversion&nbsp;Server";
+
+$lang["SEARCHLOG"] = "Search log for";
+$lang["CLEARLOG"] = "Clear current search";
+$lang["MORERESULTS"] = "Find more matches...";
+$lang["NORESULTS"] = "There are no logs matching your query";
+$lang["NOMORERESULTS"] = "There are no more logs matching your query";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "file(s) modified"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "Line No.";
+$lang["BLAMEFOR"] = "Blame information for rev";
+
+$lang["YEARS"] = "years";
+$lang["MONTHS"] = "months";
+$lang["WEEKS"] = "weeks";
+$lang["DAYS"] = "days";
+$lang["HOURS"] = "hours";
+$lang["MINUTES"] = "minutes";
+
+$lang["GO"] = "Go";
+
+$lang["PATHCOMPARISON"] = "Path Comparison";
+$lang["COMPAREPATHS"] = "Compare Paths";
+$lang["COMPAREREVS"] = "Compare Revisions";
+$lang["PROPCHANGES"] = "Property changes :";
+$lang["CONVFROM"] = "This comparison shows the changes necessary to convert path ";
+$lang["TO"] = "TO";
+$lang["REVCOMP"] = "Reverse comparison";
+$lang["COMPPATH"] = "Compare Path:";
+$lang["WITHPATH"] = "With Path:";
+$lang["FILEDELETED"] = "File deleted";
+$lang["FILEADDED"] = "New file";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+
+// $lang["NOBR"] = "<nobr>";
+// $lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/french.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/french.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/french.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,90 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Erik Le Blanc 
+//
+// 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
+//
+// --
+//
+// french.inc
+//
+// French language strings
+
+$lang["LOG"] = "Log";
+$lang["DIFF"] = "Diff";
+
+$lang["NOREP"] = "Pas de repository";
+$lang["NOPATH"] = "Fichier ou r&eacute;pertoire non trouv&eacute;";
+
+$lang["DIFFREVS"] = "Diff&eacute;rences entre les r&eacute;visions";
+$lang["AND"] = "et";
+$lang["REV"] = "R&eacute;vision";
+$lang["LINE"] = "Ligne";
+$lang["SHOWENTIREFILE"] = "Afficher tout le fichier";
+$lang["SHOWCOMPACT"] = "Afficher seulement les passages avec des diff&eacute;rences";
+
+$lang["DIFFPREV"] = "Diff&eacute;rence avec le pr&eacute;c&eacute;dent";
+$lang["BLAME"] = "Responsabilit&eacute;";
+
+$lang["REVINFO"] = "Information sur la R&eacute;vision";
+$lang["GOYOUNGEST"] = "Aller &agrave; la R&eacute;vision la plus r&eacute;cente";
+$lang["LASTMOD"] = "Derni&egrave;re modification";
+$lang["LOGMSG"] = "Message de Log";
+$lang["CHANGES"] = "Changements";
+$lang["SHOWCHANGED"] = "Montrer les fichiers modifi&eacute;s";
+$lang["HIDECHANGED"] = "Cacher les fichiers modifi&eacute;s";
+$lang["NEWFILES"] = "Nouveaux fichiers";
+$lang["CHANGEDFILES"] = "Fichier(s) modifi&eacute;(s)";
+$lang["DELETEDFILES"] = "Fichier(s) effac&eacute;(s)";
+$lang["VIEWLOG"] = "Afficher&nbsp;le&nbsp;Log";
+$lang["PATH"] = "Chemin";
+$lang["AUTHOR"] = "Auteur";
+$lang["AGE"] = "Anciennet&eacute;";
+$lang["LOG"] = "Log";
+$lang["CURDIR"] = "R&eacute;pertoire courant";
+
+$lang["PREV"] = "Pr&eacute;c&eacute;dent";
+$lang["NEXT"] = "Suivant";
+$lang["SHOWALL"] = "Tout montrer";
+
+$lang["BADCMD"] = "Cette commande a provoqu&eacute; une erreur";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Projets&nbsp;Subversion";
+$lang["SERVER"] = "Serveur&nbsp;Subversion";
+
+$lang["SEARCHLOG"] = "Rechercher dans les Logs";
+$lang["CLEARLOG"] = "Effacer la recherche courante";
+$lang["MORERESULTS"] = "Trouver plus de r&eacute;ponses...";
+$lang["NORESULTS"] = "Il n'y a pas de r&eacute;ponse &agrave; votre recherche dans les Logs";
+$lang["NOMORERESULTS"] = "Il n'y a pas plus de r&eacute;ponses &agrave; votre recherche";
+
+$lang["RSSFEEDTITLE"] = "Fil RSS de WebSVN"; 
+$lang["FILESMODIFIED"] = "fichier(s) modifi&aecute;(s)"; 
+$lang["RSSFEED"] = "RSS"; 
+
+$lang["LINENO"] = "Ligne num&eacute;ro";
+$lang["BLAMEFOR"] = "Dernier responsable";
+
+$lang["YEARS"] = "ann&eacute;es";
+$lang["MONTHS"] = "mois";
+$lang["WEEKS"] = "semaines";
+$lang["DAYS"] = "jours";
+$lang["HOURS"] = "heures";
+$lang["MINUTES"] = "minutes";
+
+$lang["GO"] = "Go";
+

Added: trunk/svn.matroska.org/WebSVN/languages/german.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/german.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/german.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,68 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Stephan Stapel, <[email protected]>
+//
+// 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
+//
+// --
+//
+// germany.inc
+//
+// German language strings
+
+$lang["NOREP"] = "Kein Repository angegeben.";
+
+$lang["DIFFREVS"] = "Vergleich zwischen Revisionen";
+$lang["AND"] = "und";
+$lang["REV"] = "Revision";
+$lang["LINE"] = "Zeile";
+$lang["SHOWENTIREFILE"] = "Ganze Datei anzeigen";
+$lang["SHOWCOMPACT"] = "Nur ge&auml;nderte Bereiche";
+
+$lang["DIFFPREV"] = "Vergleich mit vorheriger";
+
+$lang["REVINFO"] = "Revisions-Information";
+$lang["GOYOUNGEST"] = "Zur aktuellen Revision";                  
+$lang["LASTMOD"] = "Letzte &Auml;nderung";
+$lang["LOGMSG"] = "Logeintrag";
+$lang["CHANGES"] = "Änderungen";                                         
+$lang["SHOWCHANGED"] = "Ge&auml;nderte Dateien anzeigen";
+$lang["HIDECHANGED"] = "Ge&auml;nderte Dateien verstecken";
+$lang["NEWFILES"] = "Neue Dateien";
+$lang["CHANGEDFILES"] = "Ge&auml;nderte Dateien";
+$lang["DELETEDFILES"] = "Gel&ouml;schte Dateien";
+$lang["VIEWLOG"] = "Log&nbsp;anzeigen";
+$lang["PATH"] = "Pfad";
+$lang["AUTHOR"] = "Autor";
+$lang["AGE"] = "Alter";                                                 
+$lang["LOG"] = "Log";
+$lang["CURDIR"] = "Aktuelles Verzeichnis";                                
+
+$lang["PREV"] = "Zur&uuml;ck";
+$lang["NEXT"] = "Weiter";
+$lang["SHOWALL"] = "Alles anzeigen";
+
+$lang["BADCMD"] = "Fehler beim Ausf&uuml;hren des Befehls";
+   
+$lang["PROJECTS"] = "Subversion-Projekte";                       
+$lang["SERVER"] = "Subversion Server";                           
+
+$lang["YEARS"] = "Jahre";                                             
+$lang["MONTHS"] = "Monate";                                           
+$lang["WEEKS"] = "Wochen";                                             
+$lang["DAYS"] = "Tage";                                               
+$lang["HOURS"] = "Stunden";                                             
+$lang["MINUTES"] = "Minuten";   

Added: trunk/svn.matroska.org/WebSVN/languages/japanese-euc.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/japanese-euc.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/japanese-euc.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,96 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// japanese-euc.inc
+// Transrator: BEPPU Masamichi
+//
+// Japanese(EUC) language strings
+
+$lang["LOG"] = "¥í¥°";
+$lang["DIFF"] = "º¹Ê¬";
+
+$lang["NOREP"] = "¥ê¥Ý¥¸¥È¥ê¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó";
+$lang["NOPATH"] = "¥Ñ¥¹¤¬¸«ÉÕ¤«¤ê¤Þ¤»¤ó";
+
+$lang["DIFFREVS"] = "¥ê¥Ó¥¸¥ç¥ó´Ö¤Îº¹Ê¬";
+$lang["AND"] = "¤È";
+$lang["REV"] = "¥ê¥Ó¥¸¥ç¥ó";
+$lang["LINE"] = "¹Ô";
+$lang["SHOWENTIREFILE"] = "Á´¤ÆÉ½¼¨";
+$lang["SHOWCOMPACT"] = "°Û¤Ê¤ë¹Ô¤Î¼þÊÕ¤À¤±É½¼¨";
+
+$lang["DIFFPREV"] = "Á°¤Î¥ê¥Ó¥¸¥ç¥ó¤È¤Îº¹Ê¬";
+$lang["BLAME"] = "¾ÜºÙɽ¼¨";
+
+$lang["REVINFO"] = "¥ê¥Ó¥¸¥ç¥ó¾ðÊó";
+$lang["GOYOUNGEST"] = "ºÇ¿·¤Î¥ê¥Ó¥¸¥ç¥ó¤Ø";
+$lang["LASTMOD"] = "ºÇ½ª¹¹¿·Æü»þ";
+$lang["LOGMSG"] = "¥í¥°¥á¥Ã¥»¡¼¥¸";
+$lang["CHANGES"] = "Êѹ¹";
+$lang["SHOWCHANGED"] = "Êѹ¹¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î°ìÍ÷¤òɽ¼¨¤¹¤ë";
+$lang["HIDECHANGED"] = "Êѹ¹¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î°ìÍ÷¤òɽ¼¨¤·¤Ê¤¤";
+$lang["NEWFILES"] = "Äɲåե¡¥¤¥ë";
+$lang["CHANGEDFILES"] = "½¤Àµ¥Õ¥¡¥¤¥ë";
+$lang["DELETEDFILES"] = "ºï½ü¥Õ¥¡¥¤¥ë";
+$lang["VIEWLOG"] = "¥í¥°¤ò¸«¤ë";
+$lang["PATH"] = "¥Ñ¥¹";
+$lang["AUTHOR"] = "½¤Àµ¼Ô";
+$lang["AGE"] = "̵½¤Àµ»þ´Ö";
+$lang["LOG"] = "¥í¥°";
+$lang["CURDIR"] = "¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê";
+
+$lang["PREV"] = "Á°";
+$lang["NEXT"] = "¼¡";
+$lang["SHOWALL"] = "Á´¤ÆÉ½¼¨";
+
+$lang["BADCMD"] = "¥³¥Þ¥ó¥É¼Â¹ÔÃæ¤Î¥¨¥é¡¼";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;¥×¥í¥¸¥§¥¯¥È°ìÍ÷";
+$lang["SERVER"] = "Subversion&nbsp;¥µ¡¼¥Ð";
+
+$lang["SEARCHLOG"] = "¥í¥°¤ò¸¡º÷";
+$lang["CLEARLOG"] = "¸¡º÷¾ò·ï¤ò¥¯¥ê¥¢¤¹¤ë";
+$lang["MORERESULTS"] = "¸¡º÷¾ò·ï¤ò¹Ê¤ê¹þ¤à";
+$lang["NORESULTS"] = "¸¡º÷¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿";
+$lang["NOMORERESULTS"] = "¤³¤ì°Ê¾å¸¡º÷¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "¥Õ¥¡¥¤¥ë¤¬½¤Àµ¤µ¤ì¤Þ¤·¤¿"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "¹ÔÈÖ¹æ";
+$lang["BLAMEFOR"] = "¾ÜºÙɽ¼¨ Âоݥê¥Ó¥¸¥ç¥ó";
+                                                                                
+$lang["YEARS"] = "ǯ´Ö";
+$lang["MONTHS"] = "¥õ·î´Ö";
+$lang["WEEKS"] = "½µ´Ö";
+$lang["DAYS"] = "Æü´Ö";
+$lang["HOURS"] = "»þ´Ö";
+$lang["MINUTES"] = "ʬ";
+
+$lang["GO"] = "GO";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "<nobr>";
+$lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/japanese-jis.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/japanese-jis.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/japanese-jis.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,96 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// japanese-jis.inc
+// Translator: BEPPU Masamichi
+//
+// Japanese(JIS) language strings
+
+$lang["LOG"] = "$B%m%0(B";
+$lang["DIFF"] = "$B:9J,(B";
+
+$lang["NOREP"] = "$B%j%]%8%H%j$,;XDj$5$l$F$$$^$;$s(B";
+$lang["NOPATH"] = "$B%Q%9$,8+IU$+$j$^$;$s(B";
+
+$lang["DIFFREVS"] = "$B%j%S%8%g%s4V$N:9J,(B";
+$lang["AND"] = "$B$H(B";
+$lang["REV"] = "$B%j%S%8%g%s(B";
+$lang["LINE"] = "$B9T(B";
+$lang["SHOWENTIREFILE"] = "$BA4$FI=<((B";
+$lang["SHOWCOMPACT"] = "$B0[$J$k9T$N<~JU$@$1I=<((B";
+
+$lang["DIFFPREV"] = "$BA0$N%j%S%8%g%s$H$N:9J,(B";
+$lang["BLAME"] = "$B>\:YI=<((B";
+
+$lang["REVINFO"] = "$B%j%S%8%g%s>pJs(B";
+$lang["GOYOUNGEST"] = "$B:G?7$N%j%S%8%g%s$X(B";
+$lang["LASTMOD"] = "$B:G=*99?7F|;~(B";
+$lang["LOGMSG"] = "$B%m%0%a%C%;!<%8(B";
+$lang["CHANGES"] = "$BJQ99(B";
+$lang["SHOWCHANGED"] = "$BJQ99$5$l$?%U%!%$%k$N0lMw$rI=<($9$k(B";
+$lang["HIDECHANGED"] = "$BJQ99$5$l$?%U%!%$%k$N0lMw$rI=<($7$J$$(B";
+$lang["NEWFILES"] = "$BDI2C%U%!%$%k(B";
+$lang["CHANGEDFILES"] = "$B=$@5%U%!%$%k(B";
+$lang["DELETEDFILES"] = "$B:o=|%U%!%$%k(B";
+$lang["VIEWLOG"] = "$B%m%0$r8+$k(B";
+$lang["PATH"] = "$B%Q%9(B";
+$lang["AUTHOR"] = "$B=$@5<T(B";
+$lang["AGE"] = "$BL5=$@5;~4V(B";
+$lang["LOG"] = "$B%m%0(B";
+$lang["CURDIR"] = "$B%+%l%s%H%G%#%l%/%H%j(B";
+
+$lang["PREV"] = "$BA0(B";
+$lang["NEXT"] = "$B<!(B";
+$lang["SHOWALL"] = "$BA4$FI=<((B";
+
+$lang["BADCMD"] = "$B%3%^%s%I<B9TCf$N%(%i!<(B";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;$B%W%m%8%'%/%H0lMw(B";
+$lang["SERVER"] = "Subversion&nbsp;$B%5!<%P(B";
+
+$lang["SEARCHLOG"] = "$B%m%0$r8!:w(B";
+$lang["CLEARLOG"] = "$B8!:w>r7o$r%/%j%"$9$k(B";
+$lang["MORERESULTS"] = "$B8!:w>r7o$r9J$j9~$`(B";
+$lang["NORESULTS"] = "$B8!:w>r7o$K%^%C%A$9$k$b$N$O$"$j$^$;$s$G$7$?(B";
+$lang["NOMORERESULTS"] = "$B$3$l0J>e8!:w>r7o$K%^%C%A$9$k$b$N$O$"$j$^$;$s(B";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "$B%U%!%$%k$,=$@5$5$l$^$7$?(B"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "$B9THV9f(B";
+$lang["BLAMEFOR"] = "$B>\:YI=<((B $BBP>]%j%S%8%g%s(B";
+                                                                                
+$lang["YEARS"] = "$BG/4V(B";
+$lang["MONTHS"] = "$B%u7n4V(B";
+$lang["WEEKS"] = "$B=54V(B";
+$lang["DAYS"] = "$BF|4V(B";
+$lang["HOURS"] = "$B;~4V(B";
+$lang["MINUTES"] = "$BJ,(B";
+
+$lang["GO"] = "GO";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "<nobr>";
+$lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/japanese-sjis.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/japanese-sjis.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/japanese-sjis.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,96 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// japanese-sjis.inc
+// Translator: BEPPU Masamichi
+//
+// Japanese(ShitJIS) language strings
+
+$lang["LOG"] = "ƒƒO";
+$lang["DIFF"] = "·•ª";
+
+$lang["NOREP"] = "ƒŠƒ|ƒWƒgƒŠ‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ";
+$lang["NOPATH"] = "ƒpƒX‚ªŒ©•t‚©‚è‚Ü‚¹‚ñ";
+
+$lang["DIFFREVS"] = "ƒŠƒrƒWƒ‡ƒ“ŠÔ‚̍·•ª";
+$lang["AND"] = "‚Æ";
+$lang["REV"] = "ƒŠƒrƒWƒ‡ƒ“";
+$lang["LINE"] = "s";
+$lang["SHOWENTIREFILE"] = "‘S‚Ä•\ަ";
+$lang["SHOWCOMPACT"] = "ˆÙ‚È‚és‚ÌŽü•Ó‚¾‚¯•\ަ";
+
+$lang["DIFFPREV"] = "‘O‚ÌƒŠƒrƒWƒ‡ƒ“‚Ƃ̍·•ª";
+$lang["BLAME"] = "Ú×•\ަ";
+
+$lang["REVINFO"] = "ƒŠƒrƒWƒ‡ƒ“î•ñ";
+$lang["GOYOUNGEST"] = "ÅV‚ÌƒŠƒrƒWƒ‡ƒ“‚Ö";
+$lang["LASTMOD"] = "ÅIXV“úŽž";
+$lang["LOGMSG"] = "ƒƒOƒƒbƒZ[ƒW";
+$lang["CHANGES"] = "•ύX";
+$lang["SHOWCHANGED"] = "•ύX‚³‚ꂽƒtƒ@ƒCƒ‹‚̈ꗗ‚ð•\ަ‚·‚é";
+$lang["HIDECHANGED"] = "•ύX‚³‚ꂽƒtƒ@ƒCƒ‹‚̈ꗗ‚ð•\ަ‚µ‚È‚¢";
+$lang["NEWFILES"] = "’ljÁƒtƒ@ƒCƒ‹";
+$lang["CHANGEDFILES"] = "C³ƒtƒ@ƒCƒ‹";
+$lang["DELETEDFILES"] = "íœƒtƒ@ƒCƒ‹";
+$lang["VIEWLOG"] = "ƒƒO‚ðŒ©‚é";
+$lang["PATH"] = "ƒpƒX";
+$lang["AUTHOR"] = "C³ŽÒ";
+$lang["AGE"] = "–³C³ŽžŠÔ";
+$lang["LOG"] = "ƒƒO";
+$lang["CURDIR"] = "ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ";
+
+$lang["PREV"] = "‘O";
+$lang["NEXT"] = "ŽŸ";
+$lang["SHOWALL"] = "‘S‚Ä•\ަ";
+
+$lang["BADCMD"] = "ƒRƒ}ƒ“ƒhŽÀs’†‚̃Gƒ‰[";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;ƒvƒƒWƒFƒNƒgˆê——";
+$lang["SERVER"] = "Subversion&nbsp;ƒT[ƒo";
+
+$lang["SEARCHLOG"] = "ƒƒO‚ðŒŸõ";
+$lang["CLEARLOG"] = "ŒŸõðŒ‚ðƒNƒŠƒA‚·‚é";
+$lang["MORERESULTS"] = "ŒŸõðŒ‚ði‚荞‚Þ";
+$lang["NORESULTS"] = "ŒŸõðŒ‚Ƀ}ƒbƒ`‚·‚é‚à‚̂͂ ‚è‚Ü‚¹‚ñ‚Å‚µ‚½";
+$lang["NOMORERESULTS"] = "‚±‚êˆÈãŒŸõðŒ‚Ƀ}ƒbƒ`‚·‚é‚à‚̂͂ ‚è‚Ü‚¹‚ñ";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "ƒtƒ@ƒCƒ‹‚ªC³‚³‚ê‚Ü‚µ‚½"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "s”ԍ†";
+$lang["BLAMEFOR"] = "Ú×•\ަ ‘ÎÛƒŠƒrƒWƒ‡ƒ“";
+                                                                                
+$lang["YEARS"] = "”NŠÔ";
+$lang["MONTHS"] = "ƒ•ŒŽŠÔ";
+$lang["WEEKS"] = "TŠÔ";
+$lang["DAYS"] = "“úŠÔ";
+$lang["HOURS"] = "ŽžŠÔ";
+$lang["MINUTES"] = "•ª";
+
+$lang["GO"] = "GO";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "<nobr>";
+$lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/japanese-utf8.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/japanese-utf8.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/japanese-utf8.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,96 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// japanese-utf8.inc
+// Translatior: BEPPU Masamichi
+//
+// Japanese(UTF-8) language strings
+
+$lang["LOG"] = "ログ";
+$lang["DIFF"] = "差分";
+
+$lang["NOREP"] = "リポジトリが指定されていません";
+$lang["NOPATH"] = "パスが見付かりません";
+
+$lang["DIFFREVS"] = "リビジョン間の差分";
+$lang["AND"] = "と";
+$lang["REV"] = "リビジョン";
+$lang["LINE"] = "行";
+$lang["SHOWENTIREFILE"] = "全て表示";
+$lang["SHOWCOMPACT"] = "異なる行の周辺だけ表示";
+
+$lang["DIFFPREV"] = "前のリビジョンとの差分";
+$lang["BLAME"] = "詳細表示";
+
+$lang["REVINFO"] = "リビジョン情報";
+$lang["GOYOUNGEST"] = "最新のリビジョンへ";
+$lang["LASTMOD"] = "最終更新日時";
+$lang["LOGMSG"] = "ログメッセージ";
+$lang["CHANGES"] = "変更";
+$lang["SHOWCHANGED"] = "変更されたファイルの一覧を表示する";
+$lang["HIDECHANGED"] = "変更されたファイルの一覧を表示しない";
+$lang["NEWFILES"] = "追加ファイル";
+$lang["CHANGEDFILES"] = "修正ファイル";
+$lang["DELETEDFILES"] = "削除ファイル";
+$lang["VIEWLOG"] = "ログを見る";
+$lang["PATH"] = "パス";
+$lang["AUTHOR"] = "修正者";
+$lang["AGE"] = "無修正時間";
+$lang["LOG"] = "ログ";
+$lang["CURDIR"] = "カレントディレクトリ";
+
+$lang["PREV"] = "前";
+$lang["NEXT"] = "次";
+$lang["SHOWALL"] = "全て表示";
+
+$lang["BADCMD"] = "コマンド実行中のエラー";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;プロジェクト一覧";
+$lang["SERVER"] = "Subversion&nbsp;サーバ";
+
+$lang["SEARCHLOG"] = "ログを検索";
+$lang["CLEARLOG"] = "検索条件をクリアする";
+$lang["MORERESULTS"] = "検索条件を絞り込む";
+$lang["NORESULTS"] = "検索条件にマッチするものはありませんでした";
+$lang["NOMORERESULTS"] = "これ以上検索条件にマッチするものはありません";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "ファイルが修正されました"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "行番号";
+$lang["BLAMEFOR"] = "詳細表示 対象リビジョン";
+                                                                                
+$lang["YEARS"] = "年間";
+$lang["MONTHS"] = "ヵ月間";
+$lang["WEEKS"] = "週間";
+$lang["DAYS"] = "日間";
+$lang["HOURS"] = "時間";
+$lang["MINUTES"] = "分";
+
+$lang["GO"] = "GO";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "<nobr>";
+$lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/korean-euc.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/korean-euc.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/korean-euc.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,110 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// korean-euc.inc
+// Translator: Lee Jae-Hong
+// Korean(EUC) language strings
+
+$lang["LOG"] = "·Î±×";
+$lang["DIFF"] = "ºñ±³";
+
+$lang["NOREP"] = "ÀúÀå¼Ò°¡ ÁöÁ¤µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.";
+$lang["NOPATH"] = "°æ·Î¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.";
+$lang["SUPPLYREP"] = "include/config.inc ÆÄÀÏÀÇ \$config->parentPath ¶Ç´Â \$config->addRepository¿¡ ÀúÀå¼ÒÀÇ °æ·Î¸¦ ÁöÁ¤ÇØ ÁֽʽÿÀ.<p>¼³Ä¡ ¼³¸í¼­¸¦ ÂüÁ¶ÇØ ÁֽʽÿÀ.";
+
+$lang["DIFFREVS"] = "¸®ºñÀü°£ ºñ±³";
+$lang["AND"] = "¿Í(°ú)";
+$lang["REV"] = "¸®ºñÀü";
+$lang["LINE"] = "Çà";
+$lang["SHOWENTIREFILE"] = "¸ðµÎ º¸±â";
+$lang["SHOWCOMPACT"] = "¹Ù²ï ºÎºÐ¸¸ º¸±â";
+
+$lang["DIFFPREV"] = "ÀÌÀü ¸®ºñÀü°ú ºñ±³";
+$lang["BLAME"] = "¼öÁ¤ÇÑ »ç¶÷ º¸±â";
+
+$lang["REVINFO"] = "¸®ºñÀü Á¤º¸";
+$lang["GOYOUNGEST"] = "ÃֽЏ®ºñÀüÀ¸·Î °¡±â";
+$lang["LASTMOD"] = "¸¶Áö¸· º¯°æ";
+$lang["LOGMSG"] = "·Î±× ¸Þ½ÃÁö";
+$lang["CHANGES"] = "º¯°æ";
+$lang["SHOWCHANGED"] = "º¯°æµÈ ÆÄÀÏ º¸±â";
+$lang["HIDECHANGED"] = "º¯°æµÈ ÆÄÀÏ ¼û±â±â";
+$lang["NEWFILES"] = "»õ ÆÄÀÏ";
+$lang["CHANGEDFILES"] = "¼öÁ¤µÈ ÆÄÀÏ";
+$lang["DELETEDFILES"] = "»èÁ¦µÈ ÆÄÀÏ";
+$lang["VIEWLOG"] = "·Î±×&nbsp;º¸±â";
+$lang["PATH"] = "°æ·Î";
+$lang["AUTHOR"] = "ÀÛ¼ºÀÚ";
+$lang["AGE"] = "±â°£";
+$lang["LOG"] = "·Î±×";
+$lang["CURDIR"] = "ÇöÀç µð·ºÅ丮";
+$lang["TARBALL"] = "Tarball";
+
+$lang["PREV"] = "ÀÌÀü";
+$lang["NEXT"] = "´ÙÀ½";
+$lang["SHOWALL"] = "¸ðµÎ º¸±â";
+
+$lang["BADCMD"] = "¸í·É ½ÇÇà ¿¡·¯";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;ÇÁ·ÎÁ§Æ®";
+$lang["SERVER"] = "Subversion&nbsp;¼­¹ö";
+
+$lang["SEARCHLOG"] = "·Î±× °Ë»ö";
+$lang["CLEARLOG"] = "°Ë»ö Á¶°Ç »èÁ¦";
+$lang["MORERESULTS"] = "³ª¸ÓÁö °Ë»ö °á°ú...";
+$lang["NORESULTS"] = "°Ë»ö Á¶°Ç¿¡ ¸Â´Â °á°ú°¡ ¾ø½À´Ï´Ù.";
+$lang["NOMORERESULTS"] = "´õ ÀÌ»ó °Ë»ö Á¶°Ç¿¡ ¸Â´Â °á°ú°¡ ¾ø½À´Ï´Ù.";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "ÆÄÀÏ ¼öÁ¤µÊ"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "Çà¹øÈ£";
+$lang["BLAMEFOR"] = "¼öÁ¤ÇÑ »ç¶÷ º¸±â, ¸®ºñÀü ";
+
+$lang["YEARS"] = "³â";
+$lang["MONTHS"] = "°³¿ù";
+$lang["WEEKS"] = "ÁÖÀÏ";
+$lang["DAYS"] = "ÀÏ";
+$lang["HOURS"] = "½Ã°£";
+$lang["MINUTES"] = "ºÐ";
+
+$lang["GO"] = "Go";
+
+$lang["PATHCOMPARISON"] = "°æ·Î ºñ±³";
+$lang["COMPAREPATHS"] = "°æ·Î ºñ±³Çϱâ";
+$lang["COMPAREREVS"] = "¸®ºñÀü ºñ±³Çϱâ";
+$lang["PROPCHANGES"] = "Ư¼º º¯°æ :";
+$lang["CONVFROM"] = "ÀÌ ºñ±³´Â ¹Ù²ï °æ·Î¸¦ º¸¿© ÁÝ´Ï´Ù.";
+$lang["TO"] = "¿¡¼­";
+$lang["REVCOMP"] = "¿ª ºñ±³";
+$lang["COMPPATH"] = "ºñ±³ °æ·Î:";
+$lang["WITHPATH"] = "°æ·Î:";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+
+// $lang["NOBR"] = "<nobr>";
+// $lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/korean-utf8.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/korean-utf8.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/korean-utf8.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,110 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// korean-utf8.inc
+// Translator: Lee Jae-Hong
+// Korean(utf8) language strings
+
+$lang["LOG"] = "로그";
+$lang["DIFF"] = "비교";
+
+$lang["NOREP"] = "저장소가 지정되어 있지 않습니다.";
+$lang["NOPATH"] = "경로를 찾을 수 없습니다.";
+$lang["SUPPLYREP"] = "include/config.inc 파일의 \$config->parentPath 또는 \$config->addRepository에 저장소의 경로를 지정해 주십시오.<p>설치 설명서를 참조해 주십시오.";
+
+$lang["DIFFREVS"] = "리비전간 비교";
+$lang["AND"] = "와(과)";
+$lang["REV"] = "리비전";
+$lang["LINE"] = "행";
+$lang["SHOWENTIREFILE"] = "모두 보기";
+$lang["SHOWCOMPACT"] = "바뀐 부분만 보기";
+
+$lang["DIFFPREV"] = "이전 리비전과 비교";
+$lang["BLAME"] = "수정한 사람 보기";
+
+$lang["REVINFO"] = "리비전 정보";
+$lang["GOYOUNGEST"] = "최신 리비전으로 가기";
+$lang["LASTMOD"] = "마지막 변경";
+$lang["LOGMSG"] = "로그 메시지";
+$lang["CHANGES"] = "변경";
+$lang["SHOWCHANGED"] = "변경된 파일 보기";
+$lang["HIDECHANGED"] = "변경된 파일 숨기기";
+$lang["NEWFILES"] = "새 파일";
+$lang["CHANGEDFILES"] = "수정된 파일";
+$lang["DELETEDFILES"] = "삭제된 파일";
+$lang["VIEWLOG"] = "로그&nbsp;보기";
+$lang["PATH"] = "경로";
+$lang["AUTHOR"] = "작성자";
+$lang["AGE"] = "기간";
+$lang["LOG"] = "로그";
+$lang["CURDIR"] = "현재 디렉토리";
+$lang["TARBALL"] = "Tarball";
+
+$lang["PREV"] = "이전";
+$lang["NEXT"] = "다음";
+$lang["SHOWALL"] = "모두 보기";
+
+$lang["BADCMD"] = "명령 실행 에러";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;프로젝트";
+$lang["SERVER"] = "Subversion&nbsp;서버";
+
+$lang["SEARCHLOG"] = "로그 검색";
+$lang["CLEARLOG"] = "검색 조건 삭제";
+$lang["MORERESULTS"] = "나머지 검색 결과...";
+$lang["NORESULTS"] = "검색 조건에 맞는 결과가 없습니다.";
+$lang["NOMORERESULTS"] = "더 이상 검색 조건에 맞는 결과가 없습니다.";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "파일 수정됨"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "행번호";
+$lang["BLAMEFOR"] = "수정한 사람 보기, 리비전 ";
+
+$lang["YEARS"] = "년";
+$lang["MONTHS"] = "개월";
+$lang["WEEKS"] = "주일";
+$lang["DAYS"] = "일";
+$lang["HOURS"] = "시간";
+$lang["MINUTES"] = "분";
+
+$lang["GO"] = "Go";
+
+$lang["PATHCOMPARISON"] = "경로 비교";
+$lang["COMPAREPATHS"] = "경로 비교하기";
+$lang["COMPAREREVS"] = "리비전 비교하기";
+$lang["PROPCHANGES"] = "특성 변경 :";
+$lang["CONVFROM"] = "이 비교는 바뀐 경로를 보여 줍니다.";
+$lang["TO"] = "에서";
+$lang["REVCOMP"] = "역 비교";
+$lang["COMPPATH"] = "비교 경로:";
+$lang["WITHPATH"] = "경로:";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+
+// $lang["NOBR"] = "<nobr>";
+// $lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/portuguese.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/portuguese.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/portuguese.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,81 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// english.inc
+//
+// English language strings
+
+$lang["LOG"] = "Log";
+$lang["DIFF"] = "Diff";
+
+$lang["NOREP"] = "N&atilde;o foi indicado um reposit&oacute;rio";
+$lang["NOPATH"] = "Path Inv&aacute;lida";
+
+$lang["DIFFREVS"] = "Diferen&ccedil;as entre revis&otilde;es";
+$lang["AND"] = "e";
+$lang["REV"] = "Rev";
+$lang["LINE"] = "Linha";
+$lang["SHOWENTIREFILE"] = "Mostrar todo o ficheiro";
+$lang["SHOWCOMPACT"] = "Mostrar apenas &aacute;reas com diferen&ccedil;as";
+
+$lang["DIFFPREV"] = "Diferen&ccedil;as com a anterior";
+
+$lang["REVINFO"] = "Notas desta revis&atilde;o";
+$lang["GOYOUNGEST"] = "Revis&atilde;o mais recente";
+$lang["LASTMOD"] = "&Uacute;ltima altera&ccedil;&atilde;o";
+$lang["LOGMSG"] = "Mensagem de Log";
+$lang["CHANGES"] = "Altera&ccedil;&otilde;es";
+$lang["SHOWCHANGED"] = "Mostrar ficheiros alterados";
+$lang["HIDECHANGED"] = "Esconder ficheiros alterados";
+$lang["NEWFILES"] = "Novos ficheiros";
+$lang["CHANGEDFILES"] = "Ficheiros alterados";
+$lang["DELETEDFILES"] = "Ficheiros apagados";
+$lang["VIEWLOG"] = "Ver&nbsp;Log";
+$lang["PATH"] = "Path";
+$lang["AUTHOR"] = "Autor";
+$lang["AGE"] = "Idade";
+$lang["LOG"] = "Log";
+$lang["CURDIR"] = "Directoria Currente";
+
+$lang["PREV"] = "Anterior";
+$lang["NEXT"] = "Seguinte";
+$lang["SHOWALL"] = "Mostrar todos";
+
+$lang["BADCMD"] = "Erro ao correr este comando";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;Projectos";
+$lang["SERVER"] = "Subversion&nbsp;Servidor";
+
+$lang["SEARCHLOG"] = "Pesquisar o Search log por";
+$lang["CLEARLOG"] = "Limpar pesquisa";
+$lang["MORERESULTS"] = "Encontrar mais...";
+$lang["NORESULTS"] = "A pesquisa n&atilde;o devolveu nenhum log";
+$lang["NOMORERESULTS"] = "N&atilde;o existem mais resultados (logs) para a pesquisa";
+
+$lang["YEARS"] = "anos";
+$lang["MONTHS"] = "meses";
+$lang["WEEKS"] = "semanas";
+$lang["DAYS"] = "dias";
+$lang["HOURS"] = "horas";
+$lang["MINUTES"] = "minutos";
+
+$lang["GO"] = "Go";

Added: trunk/svn.matroska.org/WebSVN/languages/russian.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/russian.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/russian.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,90 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// russian.inc
+//
+// Russian language strings (win1251)
+// 
+
+$lang["LOG"] = "Ïðîòîêîë";
+$lang["DIFF"] = "Ñðàâíåíèå";
+
+$lang["NOREP"] = "Ðåïîçèòîðèé íå çàäàí";
+$lang["NOPATH"] = "Ïóòü íå íàéäåí";
+
+$lang["DIFFREVS"] = "Ñðàâíåíèå ðåâèçèé";
+$lang["AND"] = "è";
+$lang["REV"] = "ðåâ.";
+$lang["LINE"] = "Ñòðîêà";
+$lang["SHOWENTIREFILE"] = "Ïîêàçàòü öåëûé ôàéë";
+$lang["SHOWCOMPACT"] = "Îòîáðàæàòü òîëüêî îáëàñòè ñ ðàçëè÷èÿìè";
+
+$lang["DIFFPREV"] = "Ñðàâíåíèå ñ ïðåäûäóùèì";
+$lang["BLAME"] = "Blame";
+
+$lang["REVINFO"] = "Èíôîðìàöèÿ î ðåâèçèè";
+$lang["GOYOUNGEST"] = "Èäòè ê ïîñëåäíåé ðåâèçèè";
+$lang["LASTMOD"] = "Ïîñëåäíåå èçìåíåíèå";
+$lang["LOGMSG"] = "Ðåãèñòðàöèîííîå ñîîáùåíèå";
+$lang["CHANGES"] = "Èçìåíåíèÿ";
+$lang["SHOWCHANGED"] = "Ïîêàç èçìåíèâøèåñÿ ôàéëû";
+$lang["HIDECHANGED"] = "Ñêðûòü èçìåíèâøèåñÿ ôàéëû";
+$lang["NEWFILES"] = "Íîâûå ôàéëû";
+$lang["CHANGEDFILES"] = "Èçìåíåííûå ôàéëû";
+$lang["DELETEDFILES"] = "Óäàëåííûå ôàéëû";
+$lang["VIEWLOG"] = "Ñìîòðåòü&nbsp;ïðîòîêîë";
+$lang["PATH"] = "Ïóòü";
+$lang["AUTHOR"] = "Àâòîð";
+$lang["AGE"] = "Âîçðàñò";
+$lang["LOG"] = "Ïðîòîêîë";
+$lang["CURDIR"] = "Òåêóùèé êàòàëîã";
+
+$lang["PREV"] = "Ïðåä.";
+$lang["NEXT"] = "Ñëåä.";
+$lang["SHOWALL"] = "Ïîêàçàòü âñ¸";
+
+$lang["BADCMD"] = "Îøèáêà âûïîëíåíèÿ ýòîé êîììàíäû";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;Projects";
+$lang["SERVER"] = "Subversion&nbsp;Server";
+
+$lang["SEARCHLOG"] = "Èñêàòü log for";
+$lang["CLEARLOG"] = "Î÷èñòèòü òåêóùèé ïîèñê";
+$lang["MORERESULTS"] = "Èñêàòü åùå ñîâïàäåíèÿ...";
+$lang["NORESULTS"] = "There are no logs matching your query";
+$lang["NOMORERESULTS"] = "There are no more logs matching your query";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "Ôàèéë(û) èçìåíåíû"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "Ñòðîêà #.";
+$lang["BLAMEFOR"] = "Blame information for rev";
+
+$lang["YEARS"] = "ãîä";
+$lang["MONTHS"] = "ìåñÿö";
+$lang["WEEKS"] = "íåäåëÿ";
+$lang["DAYS"] = "äåíü";
+$lang["HOURS"] = "÷àñ";
+$lang["MINUTES"] = "ìèíóòà";
+
+$lang["GO"] = "Go";

Added: trunk/svn.matroska.org/WebSVN/languages/spanish.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/spanish.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/spanish.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,112 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// english.inc
+//
+// English language strings
+
+$lang["LOG"] = "Log";
+$lang["DIFF"] = "Diff";
+
+$lang["NOREP"] = "No se especificó un repositorio";
+$lang["NOPATH"] = "Ruta no encontrada";
+$lang["SUPPLYREP"] = "Por Favor, configure una ruta a un repositorio en include/config.inc usando \$config->parentPath o \$config->addRepository<p>Verifique la guía de instalación para mas detalles";
+
+$lang["DIFFREVS"] = "Diff entre versiones";
+$lang["AND"] = "y";
+$lang["REV"] = "Rev";
+$lang["LINE"] = "Línea";
+$lang["SHOWENTIREFILE"] = "Mostrar el archivo completo";
+$lang["SHOWCOMPACT"] = "Solo mostrar áreas con diferencias";
+
+$lang["DIFFPREV"] = "Comparar con el anterior";
+$lang["BLAME"] = "Autoría";
+
+$lang["REVINFO"] = "Información sobre la revisión";
+$lang["GOYOUNGEST"] = "Ir a la última revisión";
+$lang["LASTMOD"] = "Ultima modificación";
+$lang["LOGMSG"] = "Mensaje de Log";
+$lang["CHANGES"] = "Cambios";
+$lang["SHOWCHANGED"] = "Mostrar archivos modificados";
+$lang["HIDECHANGED"] = "Ocultar archivos modificados";
+$lang["NEWFILES"] = "Archivos Nuevos";
+$lang["CHANGEDFILES"] = "Archivos modificados";
+$lang["DELETEDFILES"] = "Archivos borrados";
+$lang["VIEWLOG"] = "Ver&nbsp;Log";
+$lang["PATH"] = "Ruta";
+$lang["AUTHOR"] = "Autor";
+$lang["AGE"] = "Antigüedad";
+$lang["LOG"] = "Log";
+$lang["CURDIR"] = "Directorio Actual";
+$lang["TARBALL"] = "Tarball";
+
+$lang["PREV"] = "Ant";
+$lang["NEXT"] = "Sig";
+$lang["SHOWALL"] = "Mostrar todo";
+
+$lang["BADCMD"] = "Error ejecutando ese comando";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Proyectos de&nbsp;Subversion";
+$lang["SERVER"] = "Servidor de&nbsp;Subversion";
+
+$lang["SEARCHLOG"] = "Buscar en el log";
+$lang["CLEARLOG"] = "Limpiar la búsqueda actual";
+$lang["MORERESULTS"] = "Buscar mas coincidencias";
+$lang["NORESULTS"] = "Ningún log coincide con su búsqueda";
+$lang["NOMORERESULTS"] = "No hay mas logs que coincidan con su búsqueda";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "Archivo(s) modificados"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "Línea Nro.";
+$lang["BLAMEFOR"] = "Información de culpa para rev";
+
+$lang["YEARS"] = "Años";
+$lang["MONTHS"] = "meses";
+$lang["WEEKS"] = "semanas";
+$lang["DAYS"] = "días";
+$lang["HOURS"] = "horas";
+$lang["MINUTES"] = "minutos";
+
+$lang["GO"] = "Ir";
+
+$lang["PATHCOMPARISON"] = "Comparación de rutas";
+$lang["COMPAREPATHS"] = "Comparar Rutas";
+$lang["COMPAREREVS"] = "Comparar Revisiones";
+$lang["PROPCHANGES"] = "Cambios de propiedades :";
+$lang["CONVFROM"] = "Esta Comparación muestra los cambios necesarios para convertir la ruta";
+$lang["TO"] = "a";
+$lang["REVCOMP"] = "Revertir comparación";
+$lang["COMPPATH"] = "Comparar Ruta:";
+$lang["WITHPATH"] = "Con Ruta:";
+$lang["FILEDELETED"] = "Archivo Eliminado";
+$lang["FILEADDED"] = "Archivo Nuevo";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files.
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+
+// $lang["NOBR"] = "<nobr>";
+// $lang["ENDNOBR"] = "</nobr>";

Added: trunk/svn.matroska.org/WebSVN/languages/swedish.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/swedish.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/swedish.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,114 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// swedish.inc
+//
+// Swedish language strings
+
+$lang["LOG"] = "Logg";
+$lang["DIFF"] = "Skillnad";
+
+$lang["NOREP"] = "Inget arkiv angivet"; //repository
+$lang["NOPATH"] = "S&ouml;kv&auml;gen saknas";
+$lang["SUPPLYREP"] = "V&auml;nligen s&auml;tt upp en s&ouml;v&auml;g till arkivet i include/config.inc med \$config->parentPath eller \$config->addRepository<p>Se installationsanvisningen f&ouml;r mer detaljer";
+
+$lang["DIFFREVS"] = "Skillnad mellan rev.";
+$lang["AND"] = "och";
+$lang["REV"] = "Rev";
+$lang["LINE"] = "Rad";
+$lang["SHOWENTIREFILE"] = "Visa hela filen";
+$lang["SHOWCOMPACT"] = "Visa bara omr&aring;den med skillnader";
+
+$lang["DIFFPREV"] = "Skillnad mot f&ouml;reg&aring;ende";
+$lang["BLAME"] = "Ansvarig";
+
+$lang["REVINFO"] = "Revisionsinformation";
+$lang["GOYOUNGEST"] = "G&aring; till senaste revision";
+$lang["LASTMOD"] = "Senast &auml;ndrad";
+$lang["LOGMSG"] = "Loggmeddelande";
+$lang["CHANGES"] = "&auml;ndringar";
+$lang["SHOWCHANGED"] = "Visa &auml;ndrade filer";
+$lang["HIDECHANGED"] = "G&ouml;m &auml;ndrade filer";
+$lang["NEWFILES"] = "Nya filer";
+$lang["CHANGEDFILES"] = "&Auml;ndrade filer";
+$lang["DELETEDFILES"] = "Raderade filer";
+$lang["VIEWLOG"] = "Visa&nbsp;Logg";
+$lang["PATH"] = "S&ouml;kv&auml;g";
+$lang["AUTHOR"] = "F&ouml;rfattare";
+$lang["AGE"] = "&Aring;lder";
+$lang["LOG"] = "Logg";
+$lang["CURDIR"] = "Nuvarande folder";
+$lang["TARBALL"] = "Tarball";
+
+$lang["PREV"] = "F&ouml;reg.";
+$lang["NEXT"] = "N&auml;sta";
+$lang["SHOWALL"] = "Visa alla";
+
+$lang["BADCMD"] = "Fel vid k&ouml;rning av kommande";
+
+$lang["POWERED"] = "Powered by <a href=\"http://websvn.tigris.org/\">WebSVN</a>";
+$lang["PROJECTS"] = "Subversion&nbsp;Projekt";
+$lang["SERVER"] = "Subversion&nbsp;Server";
+
+$lang["SEARCHLOG"] = "S&ouml;k i logg efter";
+$lang["CLEARLOG"] = "Rensa nuvarande s&ouml;kning";
+$lang["MORERESULTS"] = "Hitta fler tr&auml;ffar...";
+$lang["NORESULTS"] = "Det finns ingen logg som motsvarar din s&ouml;kning";
+$lang["NOMORERESULTS"] = "Det finns inga fler loggar i din s&ouml;kning";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "fil(er) &auml;ndrade"; 
+$lang["RSSFEED"] = "RSS"; 
+
+$lang["LINENO"] = "Radnr.";
+$lang["BLAMEFOR"] = "Ansvariginformation f&ouml;r rev";
+
+$lang["YEARS"] = "&aring;r";
+$lang["MONTHS"] = "m&aring;nader";
+$lang["WEEKS"] = "veckor";
+$lang["DAYS"] = "dagar";
+$lang["HOURS"] = "timmar";
+$lang["MINUTES"] = "minuter";
+
+$lang["GO"] = "Utf&ouml;r";
+
+$lang["PATHCOMPARISON"] = "S&ouml;kv&auml;gsj&auml;mf&ouml;relse";
+$lang["COMPAREPATHS"] = "J&auml;mf&ouml;r s&ouml;kv&auml;gar";
+$lang["COMPAREREVS"] = "J&auml;mf&ouml;r revisioner";
+$lang["PROPCHANGES"] = "Egenskaps&auml;ndringar :";
+$lang["CONVFROM"] = "Denna j&auml;mförelse visar &auml;ndringarna som beh&ouml;vs för att konvertera s&ouml;kv&auml;g "; 
+$lang["TO"] = "till";
+$lang["REVCOMP"] = "V&auml;xla j&auml;mf&ouml;relse";
+$lang["COMPPATH"] = "J&auml;mf&ouml;r s&ouml;kv&auml;g:";
+$lang["WITHPATH"] = "Med s&ouml;kv&auml;g:";
+$lang["FILEDELETED"] = "Filen raderad";
+$lang["FILEADDED"] = "Ny fil";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+
+// $lang["NOBR"] = "<nobr>";
+// $lang["ENDNOBR"] = "</nobr>";
+
+

Added: trunk/svn.matroska.org/WebSVN/languages/tchinese-utf8.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/tchinese-utf8.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/tchinese-utf8.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,107 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// tchinese.inc
+//
+// Traditional Chinese language strings
+// 
+// Author: Yuan-Chung Hsiao <[email protected]>
+//
+
+$lang["LOG"] = "歷史記é??";
+$lang["DIFF"] = "比å??";
+
+$lang["NOREP"] = "沒æ?‰æ?”æ??åº?";
+$lang["NOPATH"] = "?‰¾ä¸å?°è·¯å¾?";
+$lang["SUPPLYREP"] = "請在include/config.inc中設定æ?”æ??庫ä?ç½®??? \$config->parentPath ??? \$config->addRepository<p>?›´è©³ç´°?????§å®¹è«‹è?‹å?‰è?æ?‹å??";
+
+$lang["DIFFREVS"] = "不å??????œ¬??“ç??差異";
+$lang["AND"] = "???";
+$lang["REV"] = "ä¿®è????????";
+$lang["LINE"] = "è¡?";
+$lang["SHOWALL"] = "顯示å®??•´???檔æ??";
+$lang["SHOWCOMPACT"] = "?ªé¡¯ç¤ºä¸å?????";
+
+$lang["DIFFPREV"] = "?????ä?????次æ?”è??";
+$lang["BLAME"] = "譴責";
+
+$lang["REVINFO"] = "ä¿®è?????次è??è¨?";
+$lang["GOYOUNGEST"] = "??°æ???–°???ä¿®è??";
+$lang["LASTMOD"] = "???å¾??›´???";
+$lang["LOGMSG"] = "訊æ?¯è?˜é??";
+$lang["CHANGES"] = "?”¹è®?";
+$lang["SHOWCHANGED"] = "顯示已è?Šå?•æ?”æ??";
+$lang["HIDECHANGED"] = "?š±??å·²è®Šå?•æ?”æ??";
+$lang["NEWFILES"] = "?–°æª”æ??";
+$lang["CHANGEDFILES"] = "å·²è?Šå?•æ?”æ??";
+$lang["DELETEDFILES"] = "已刪?™¤æª”æ??";
+$lang["VIEWLOG"] = "??‹æ­·?²è¨˜é??";
+$lang["PATH"] = "è·¯å??";
+$lang["AUTHOR"] = "作è??";
+$lang["AGE"] = "?›´??•æ?????";
+$lang["LOG"] = "歷史記é??";
+$lang["CURDIR"] = "?›®??ç›®???";
+$lang["TARBALL"] = "Tarball ? ¼å¼?";
+
+$lang["PREV"] = "上ä??ç­?";
+$lang["NEXT"] = "下ä??ç­?";
+$lang["SHOWALL"] = "顯示??¨é??";
+
+$lang["BADCMD"] = "?Ÿ·è¡???¯èª¤";
+
+$lang["POWERED"] = "?Ž¡?”¨ <a href=\"http://websvn.tigris.org/\">WebSVN</a>?ž¶è¨?";
+$lang["PROJECTS"] = "Subversion&nbsp;å°?æ¡?";
+$lang["SERVER"] = "Subversion&nbsp;Server";
+
+$lang["SEARCHLOG"] = "??œå?‹è?˜é????§å®¹";
+$lang["CLEARLOG"] = "æ¸??™¤?›®??æ?œå??";
+$lang["MORERESULTS"] = "?‰¾??°æ›´å¤šç??符å?????...";
+$lang["NORESULTS"] = "?Ÿ¥è©¢ç?æ?œä¸¦æ²’æ?‰ç¬¦??????ç´????";
+$lang["NOMORERESULTS"] = "沒æ?‰æ›´å¤šç?????符å??ä½ ç???Ÿ¥è©?";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "??‹æ?”æ??變å??"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "è¡?";
+$lang["BLAMEFOR"] = "????œ¬è­´è²¬è³?è¨?";
+
+$lang["YEARS"] = "å¹´å??";
+$lang["MONTHS"] = "??????";
+$lang["WEEKS"] = "??±å??";
+$lang["DAYS"] = "?—¥???";
+$lang["HOURS"] = "小æ?????";
+$lang["MINUTES"] = "?????˜å??";
+
+$lang["GO"] = "???";
+
+$lang["COMPAREPATHS"] = "比å?è·¯å¾?";
+$lang["COMPAREREVS"] = "比å?ä¿®è¨????";
+$lang["PROPCHANGES"] = "?”¹è®Šå±¬??? :";
+$lang["CONVFROM"] = "??™å?‹æ?”å?é¡¯ç¤ºå??????”¹è®Šè?‰æ?›è·¯å¾?";
+$lang["TO"] = "???";
+$lang["REVCOMP"] = "顛å?’æ?”å??";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";

Added: trunk/svn.matroska.org/WebSVN/languages/tchinese.inc
===================================================================
--- trunk/svn.matroska.org/WebSVN/languages/tchinese.inc	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/languages/tchinese.inc	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,108 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// tchinese.inc
+//
+// Traditional Chinese language strings
+// 
+// Author: Yuan-Chung Hsiao <[email protected]>
+//
+
+$lang["LOG"] = "¾ú¥v°O¿ý";
+$lang["DIFF"] = "¤ñ¹ï";
+
+$lang["NOREP"] = "¨S¦³ÀÉ®×®w";
+$lang["NOPATH"] = "§ä¤£¨ì¸ô®|";
+$lang["SUPPLYREP"] = "½Ð¦binclude/config.inc¤¤³]©wÀÉ®×®w¦ì¸m¬° \$config->parentPath ©Î \$config->addRepository<p>§ó¸Ô²Óªº¤º®e½Ð¨£¦w¸Ë¤â¥U";
+
+$lang["DIFFREVS"] = "¤£¦Pª©¥»¶¡ªº®t²§";
+$lang["AND"] = "»P";
+$lang["REV"] = "­×­qª©¸¹";
+$lang["LINE"] = "¦æ";
+$lang["SHOWALL"] = "Åã¥Ü§¹¾ãªºÀÉ®×";
+$lang["SHOWCOMPACT"] = "¥uÅã¥Ü¤£¦P³B";
+
+$lang["DIFFPREV"] = "»P«e¤@ª©¦¸¤ñ¸û";
+$lang["BLAME"] = "Äþ³d";
+
+$lang["REVINFO"] = "­×­qª©¦¸¸ê°T";
+$lang["GOYOUNGEST"] = "¨ì³Ì·sªº­×­q";
+$lang["LASTMOD"] = "³Ì«á§ó°Ê";
+$lang["LOGMSG"] = "°T®§°O¿ý";
+$lang["CHANGES"] = "§ïÅÜ";
+$lang["SHOWCHANGED"] = "Åã¥Ü¤wÅܰÊÀÉ®×";
+$lang["HIDECHANGED"] = "ÁôÂäwÅܰÊÀÉ®×";
+$lang["NEWFILES"] = "·sÀÉ®×";
+$lang["CHANGEDFILES"] = "¤wÅܰÊÀÉ®×";
+$lang["DELETEDFILES"] = "¤w§R°£ÀÉ®×";
+$lang["VIEWLOG"] = "¬Ý¾ú¥v°O¿ý";
+$lang["PATH"] = "¸ô®|";
+$lang["AUTHOR"] = "§@ªÌ";
+$lang["AGE"] = "§ó°Ê®É¶¡";
+$lang["LOG"] = "¾ú¥v°O¿ý";
+$lang["CURDIR"] = "¥Ø«e¥Ø¿ý";
+$lang["TARBALL"] = "Tarball ®æ¦¡";
+
+$lang["PREV"] = "¤W¤@µ§";
+$lang["NEXT"] = "¤U¤@µ§";
+$lang["SHOWALL"] = "Åã¥Ü¥þ³¡";
+
+$lang["BADCMD"] = "°õ¦æ¿ù»~";
+
+$lang["POWERED"] = "±Ä¥Î <a href=\"http://websvn.tigris.org/\">WebSVN</a>¬[³]";
+$lang["PROJECTS"] = "Subversion&nbsp;±M®×";
+$lang["SERVER"] = "Subversion&nbsp;Server";
+
+$lang["SEARCHLOG"] = "·j´M°O¿ý¤º®e";
+$lang["CLEARLOG"] = "²M°£¥Ø«e·j´M";
+$lang["MORERESULTS"] = "§ä¨ì§ó¦hªº²Å¦Xªº...";
+$lang["NORESULTS"] = "¬d¸ßµ²ªG¨Ã¨S¦³²Å¦Xªº¬ö¿ý";
+$lang["NOMORERESULTS"] = "¨S¦³§ó¦h¬ö¿ý²Å¦X§Aªº¬d¸ß";
+
+$lang["RSSFEEDTITLE"] = "WebSVN RSS feed"; 
+$lang["FILESMODIFIED"] = "­ÓÀÉ®×ÅܰÊ"; 
+$lang["RSSFEED"] = "RSS feed"; 
+
+$lang["LINENO"] = "¦æ";
+$lang["BLAMEFOR"] = "ª©¥»Äþ³d¸ê°T";
+
+$lang["YEARS"] = "¦~«e";
+$lang["MONTHS"] = "¤ë«e";
+$lang["WEEKS"] = "¶g«e";
+$lang["DAYS"] = "¤é«e";
+$lang["HOURS"] = "¤p®É«e";
+$lang["MINUTES"] = "¤ÀÄÁ«e";
+
+$lang["GO"] = "¨ì";
+
+$lang["COMPAREPATHS"] = "¤ñ¹ï¸ô®|";
+$lang["COMPAREREVS"] = "¤ñ¹ï­×­qª©";
+$lang["PROPCHANGES"] = "§ïÅÜÄÝ©Ê :";
+$lang["CONVFROM"] = "³o­Ó¤ñ¹ïÅã¥Ü¥²»Ý§ïÅÜÂà´«¸ô®|";
+$lang["TO"] = "¨ì";
+$lang["REVCOMP"] = "ÄA­Ë¤ñ¹ï";
+
+// The following are defined by some languages to stop unwanted line splitting
+// in the template files. 
+
+$lang["NOBR"] = "";
+$lang["ENDNOBR"] = "";
+

Added: trunk/svn.matroska.org/WebSVN/licence.txt
===================================================================
--- trunk/svn.matroska.org/WebSVN/licence.txt	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/licence.txt	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,280 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS

Added: trunk/svn.matroska.org/WebSVN/listing.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/listing.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/listing.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,324 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// listing.php
+//
+// Show the listing for the given repository/path/revision
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+require_once("include/bugtraq.inc");
+
+function fileLink($path, $file, $returnjoin = false)
+{
+   global $rep, $passrev, $showchanged, $config;
+   
+   if ($path == "" || $path{0} != "/")
+      $ppath = "/".$path;
+   else
+      $ppath = $path;
+
+   if ($returnjoin)
+      return $ppath.$file;
+
+   $isDir = $file{strlen($file) - 1} == "/";
+      
+   if ($isDir)
+   {
+      $url = $config->getURL($rep, $ppath.$file, "dir");
+      return "<a href=\"${url}rev=$passrev&amp;sc=$showchanged\">$file</a>";
+   }
+   else
+   {
+      $url = $config->getURL($rep, $ppath.$file, "file");
+      return "<a href=\"${url}rev=$passrev&amp;sc=$showchanged\">$file</a>";
+   }
+}
+
+function showDirFiles($svnrep, $subs, $level, $limit, $rev, $listing, $index)
+{
+   global $rep, $passrev, $showchanged, $config, $lang;
+
+   $path = "";
+
+   for ($n = 0; $n <= $level; $n++)
+   {
+      $path .= $subs[$n]."/";
+   }
+
+   $contents = $svnrep->dirContents($path, $rev);
+
+   // List each file in the current directory
+   $loop = 0;
+   $last_index = 0;
+   foreach($contents as $file)
+   {
+      $isDir = ($file{strlen($file) - 1} == "/"?1:0);
+
+      if ($isDir)
+      {
+         $listing[$index]["filetype"] = "dir";
+
+         if ($rep->getAllowDownload())
+         {
+            $dlurl = $config->getURL($rep, $path.$file, "dl"); 
+            $listing[$index]["fileviewdllink"] = "<a href=\"${dlurl}rev=$passrev&amp;isdir=1\">${lang["TARBALL"]}</a>";
+         }
+         else 
+            $listing[$index]["fileviewdllink"] = "&nbsp;";
+      }
+      else
+      {
+         if ($level != $limit)
+         {
+            // List directories only, skip all files
+            continue;
+         }
+         
+         $listing[$index]["fileviewdllink"] = "&nbsp;";
+         $listing[$index]["filetype"] = strrchr($file, ".");
+      }   
+
+      $listing[$index]["rowparity"] = ($index % 2)?"1":"0";
+      
+      $listing[$index]["compare_box"] = "<input type=\"checkbox\" name=\"compare[]\" value=\"".fileLink($path, $file, true)."@$passrev\" onClick=\"checkCB(this)\">";
+      
+      if (!strcmp($subs[$level+1]."/", $file) || !strcmp($subs[$level+1], $file))
+         $listing[$index]["filelink"] = "<b>".fileLink($path, $file)."</b>";
+      else
+         $listing[$index]["filelink"] = fileLink($path, $file);
+
+      // The history command doesn't return with a trailing slash.  We need to remember here if the
+      // file is a directory or not! 
+   
+      $listing[$index]["isDir"] = $isDir;
+   
+      $listing[$index]["level"] = $level;
+      $listing[$index]["node"] = 0; // t-node
+   
+      $fileurl = $config->getURL($rep, $path.$file, "log");
+      $listing[$index]["fileviewloglink"] = "<a href=\"${fileurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=$isDir\">${lang["VIEWLOG"]}</a>";
+   
+      $rssurl = $config->getURL($rep, $path.$file, "rss");
+      if ($rep->getHideRss())
+      {
+         $listing[$index]["rsslink"] = "<a href=\"${rssurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=$isDir\">${lang["RSSFEED"]}</a>";
+         $listing[$index]["rssanchor"] = "<a href=\"${rssurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=$isDir\">";
+      }
+   
+      $index++;
+      $loop++;
+      $last_index = $index;
+
+      if (($level != $limit) && ($isDir))
+      {
+         if (!strcmp($subs[$level + 1]."/", $file))
+         {
+            $listing = showDirFiles($svnrep, $subs, $level + 1, $limit, $rev, $listing, $index);
+            $index = count($listing);
+         }
+      }      
+    }
+
+    if ($last_index != 0)
+    {
+       $listing[$last_index - 1]["node"] = 1; // l-node
+    }
+
+   return $listing;
+}
+
+function showTreeDir($svnrep, $path, $rev, $listing)
+{
+   global $vars;
+
+   $subs = explode("/", $path);
+
+   // For directory, the last element in the subs is empty.
+   // For file, the last element in the subs is the file name.
+   // Therefore, it is always count($subs) - 2
+   $limit = count($subs) - 2;
+
+   for ($n = 0; $n < $limit; $n++)
+   {
+      $vars["last_i_node"][$n] = FALSE;
+   }
+
+   return showDirFiles($svnrep, $subs, 0, $limit, $rev, $listing, 0);
+
+}
+
+// Make sure that we have a repository
+if (!isset($rep))
+{
+   echo $lang["NOREP"];
+   exit;
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+// Revision info to pass along chain
+$passrev = $rev;
+
+// Get the directory contents of the given revision, or HEAD if not defined
+$contents = $svnrep->dirContents($path, @$rev);
+
+$history = $svnrep->getHistory($path);
+
+if (!empty($history[0]))
+   $youngest = $history[0]["rev"];
+else
+   $youngest = -1;
+
+// Unless otherwise specified, we get the log details of the latest change
+if (empty($rev))
+   $logrev = $youngest;
+else
+   $logrev = $rev;
+
+$log = $svnrep->getLogDetails($path, $logrev);
+
+$headlog = $svnrep->getLogDetails($path);
+$headrev = $headlog["rev"];
+
+// If we're not looking at a specific revision, get the HEAD revision number
+// (the revision of the rest of the tree display)
+
+if (empty($rev))
+{
+   $rev = $headrev;
+}
+
+if ($path == "" || $path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+$vars["repname"] = $rep->name;
+
+$dirurl = $config->getURL($rep, $path, "dir");
+$logurl = $config->getURL($rep, $path, "log");
+$rssurl = $config->getURL($rep, $path, "rss");
+$dlurl = $config->getURL($rep, $path, "dl");
+$compurl = $config->getURL($rep, "", "comp");
+
+if ($passrev != 0 && $passrev != $headrev && $youngest != -1)
+   $vars["goyoungestlink"] = "<a href=\"${dirurl}opt=dir&amp;sc=1\">${lang["GOYOUNGEST"]}</a>";
+else
+   $vars["goyoungestlink"] = "";
+
+$bugtraq = new Bugtraq($rep, $svnrep, $ppath);
+
+$vars["action"] = "";
+$vars["author"] = $log['author'];
+$vars["date"] = $log['date'];
+$vars["log"] = nl2br($bugtraq->replaceIDs(create_anchors($log['message'])));
+$vars["rev"] = $rev;
+$vars["lastchangedrev"] = $logrev;
+$vars["path"] = $ppath;
+
+if (!$showchanged)
+{
+   $vars["showchangeslink"] = "<a href=\"${dirurl}rev=$passrev&amp;sc=1\">${lang["SHOWCHANGED"]}</a>";
+   $vars["hidechangeslink"] = "";
+
+   $vars["hidechanges"] = true;
+   $vars["showchanges"] = false;
+}
+else
+{
+   $vars["showchangeslink"] = "";
+   
+   $changes = $svnrep->getChangedFiles($rev);
+
+   $first = true;
+   $vars["newfilesbr"] = "";
+   $vars["newfiles"] = "";
+   foreach ($changes["added"] as $file)
+   {
+      if (!$first) $vars["newfilesbr"] .= "<br>";
+      $first = false;
+      $vars["newfilesbr"] .= fileLink("", $file);
+      $vars["newfiles"] .= " ".fileLink("", $file);
+   }
+      
+   $first = true;
+   $vars["changedfilesbr"] = "";
+   $vars["changedfiles"] = "";
+   foreach ($changes["updated"] as $file)
+   {
+      if (!$first) $vars["changedfilesbr"] .= "<br>";
+      $first = false;
+      $vars["changedfilesbr"] .= fileLink("", $file);
+      $vars["changedfiles"] .= " ".fileLink("", $file);
+   }
+
+   $first = true;
+   $vars["deletedfilesbr"] = "";
+   $vars["deletedfiles"] = "";
+   foreach ($changes["deleted"] as $file)
+   {
+      if (!$first) $vars["deletedfilesbr"] .= "<br>";
+      $first = false;
+      $vars["deletedfilesbr"] .= $file;
+      $vars["deletedfiles"] .= " ".$file;
+   }
+
+   $vars["hidechangeslink"] = "<a href=\"${dirurl}rev=$passrev&amp;sc=0\">${lang["HIDECHANGED"]}</a>";
+   
+   $vars["hidechanges"] = false;
+   $vars["showchanges"] = true;
+}
+
+createDirLinks($rep, $ppath, $passrev, $showchanged);
+$vars["curdirloglink"] = "<a href=\"${logurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=1\">${lang["VIEWLOG"]}</a>";
+$vars["curdircomplink"] = "<a href=\"${compurl}compare%5B%5D=".urlencode($history[1]["path"])."@".$history[1]["rev"]."&amp;compare%5B%5D=".urlencode($history[0]["path"])."@".$history[0]["rev"]."\">${lang["DIFFPREV"]}</a>";
+if (isset($history[1]))
+	$vars["curdircomplink"] = "<a href=\"${compurl}compare%5B%5D=".urlencode($history[1]["path"])."@".$history[1]["rev"]."&amp;compare%5B%5D=".urlencode($history[0]["path"])."@".$history[0]["rev"]."\">${lang["DIFFPREV"]}</a>";
+else
+	$vars["curdircomplink"] = "";
+ 
+if ($rep->getHideRss())
+{
+   $vars["curdirrsslink"] = "<a href=\"${rssurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=1\">${lang["RSSFEED"]}</a>";
+   $vars["curdirrssanchor"] = "<a href=\"${rssurl}rev=$passrev&amp;sc=$showchanged&amp;isdir=1\">";
+}
+
+if ($rep->getAllowDownload())
+   $vars["curdirdllink"] = "<a href=\"${dlurl}rev=$passrev&amp;isdir=1\">${lang["TARBALL"]}</a>";
+
+$url = $config->getURL($rep, "", "comp");
+$vars["compare_form"] = "<form action=\"$url\" method=\"post\" name=\"compareform\">";
+$vars["compare_submit"] = "<input name=\"comparesubmit\" type=\"submit\" value=\"${lang["COMPAREPATHS"]}\">";
+$vars["compare_endform"] = "<input type=\"hidden\" name=\"op\" value=\"comp\"><input type=\"hidden\" name=\"sc\" value=\"$showchanged\"></form>";   
+
+$listing = array();
+$listing = showTreeDir($svnrep, $path, $rev, $listing);
+
+$vars["version"] = $version;
+
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."directory.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/log.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/log.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/log.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,309 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+// log.php
+//
+// Show the logs for the given path
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+require_once("include/bugtraq.inc");
+
+$page = (int)@$_REQUEST["page"];
+$all = (@$_REQUEST["all"] == 1)?1:0;
+$isDir = (@$_REQUEST["isdir"] == 1)?1:0;
+$dosearch = (@$_REQUEST["logsearch"] == 1)?1:0;
+$search = trim(@$_REQUEST["search"]);
+$words = explode(" ", $search);
+
+$fromRev = (int)@$_REQUEST["fr"];
+
+// Max number of results to find at a time
+$numSearchResults = 10;
+
+if ($search == "")
+   $dosearch = false;   
+
+// removeAccents
+//
+// Remove all the accents from a string.  This function doesn't seem
+// ideal, but expecting everyone to install 'unac' seems a little
+// excessive as well...
+
+function removeAccents($string)
+{ 
+   return strtr($string,
+                "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
+                "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"); 
+} 
+
+// Normalise the search words
+foreach ($words as $index => $word)
+{
+   $words[$index] = strtolower(removeAccents($word));
+   
+   // Remove empty string introduced by multiple spaces
+   if ($words[$index] == "")
+      unset($words[$index]);
+}
+
+if (empty($page)) $page = 1;
+
+// If searching, display all the results
+if ($dosearch) $all = true;
+
+$maxperpage = 20;
+
+// Make sure that we have a repository
+if (!isset($rep))
+{
+   echo $lang["NOREP"];
+   exit;
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+$passrev = $rev;
+
+// If there's no revision info, go to the lastest revision for this path
+$history = $svnrep->getHistory($path);
+$youngest = $history[0]["rev"];
+
+if (empty($rev))
+   $rev = $youngest;
+
+if ($path == "" || $path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+$vars["action"] = $lang["LOG"];
+$vars["repname"] = $rep->name;
+$vars["rev"] = $rev;
+$vars["path"] = $ppath;
+
+createDirLinks($rep, $ppath, $passrev, $showchanged);
+
+$logurl = $config->getURL($rep, $path, "log");
+
+if ($rev != $youngest)
+   $vars["goyoungestlink"] = "<a href=\"${logurl}sc=1\">${lang["GOYOUNGEST"]}</a>";
+else
+   $vars["goyoungestlink"] = "";
+
+// We get the bugtraq variable just once based on the HEAD
+$bugtraq = new Bugtraq($rep, $svnrep, $ppath);
+
+$history = $svnrep->getHistory($path, $rev);
+
+// Get the number of separate revisions
+$revisions = count($history);
+
+if ($all)
+{
+   $firstrevindex = 0;
+   $lastrevindex = $revisions - 1;
+   $pages = 1;
+}
+else
+{
+   // Calculate the number of pages
+   $pages = floor($revisions / $maxperpage);
+   if (($revisions % $maxperpage) > 0) $pages++;
+   
+   if ($page > $pages) $page = $pages;
+   
+   // Word out where to start and stop
+   $firstrevindex = ($page - 1) * $maxperpage;
+   $lastrevindex = $firstrevindex + $maxperpage - 1;
+   if ($lastrevindex > $revisions - 1) $lastrevindex = $revisions - 1;
+}
+
+$vars["logsearch_moreresultslink"] = "";
+
+$row = 0;
+$index = 0;
+$listing = array();
+$found = false;
+
+for ($n = $firstrevindex; $n <= $lastrevindex; $n++)
+{
+   $r = $history[$n];
+   
+   // Assume a good match
+   $match = true;
+   
+   $log = $svnrep->getLogDetails($path, $r["rev"]);
+   
+   // Check the log for the search words, if searching
+   if ($dosearch)
+   {
+      if ((empty($fromRev) || $fromRev > $r["rev"]))
+      {
+         // Turn all the HTML entities into real characters.  
+         
+         if (version_compare(phpversion(), "4.1.0", "<"))
+            $msg = html_entity_decode($log["message"]);
+         else
+            $msg = html_entity_decode($log["message"], ENT_COMPAT, $config->outputEnc);
+                  
+         // Make sure that each word in the search in also in the log
+         foreach($words as $word)
+         {
+            if (strpos(strtolower(removeAccents($msg)), $word) === false)
+            {
+               $match = false;
+               break;
+            }
+         }
+         
+         if ($match)
+         {
+            $numSearchResults--;
+            $found = true;
+         }
+      }
+      else
+         $match = false;
+   }
+   
+   if ($match)
+   {
+      // Add the trailing slash if we need to (svnlook history doesn't return trailing slashes!)
+      $rpath = $r["path"];
+      if ($isDir && $rpath{strlen($rpath) - 1} != "/")
+         $rpath .= "/";
+   
+      // Find the parent path (or the whole path if it's already a directory)
+      $pos = strrpos($rpath, "/");
+      $parent = substr($rpath, 0, $pos + 1);
+   
+      $url = $config->getURL($rep, $parent, "dir");
+      $listing[$index]["compare_box"] = "<input type=\"checkbox\" name=\"compare[]\" value=\"$parent@${r["rev"]}\" onClick=\"checkCB(this)\">";
+      $listing[$index]["revlink"] = "<a href=\"${url}rev=${r["rev"]}&amp;sc=1\">${r["rev"]}</a>";
+   
+      if ($isDir)
+      {
+         $url = $config->getURL($rep, $rpath, "dir"); 
+         $listing[$index]["revpathlink"] = "<a href=\"${url}rev=${r["rev"]}&amp;sc=$showchanged\">$rpath</a>";
+      }
+      else
+      {
+         $url = $config->getURL($rep, $rpath, "file"); 
+         $listing[$index]["revpathlink"] = "<a href=\"${url}rev=${r["rev"]}&amp;sc=$showchanged\">$rpath</a>";
+      }
+      
+      $listing[$index]["revauthor"] = $log["author"];
+      $listing[$index]["revage"] = $log["age"];
+      $listing[$index]["revlog"] = nl2br($bugtraq->replaceIDs(create_anchors($log["message"])));
+      $listing[$index]["rowparity"] = "$row";
+      
+      $row = 1 - $row;
+      $index++;
+   }
+   
+   // If we've reached the search limit, stop here...
+   if (!$numSearchResults)
+   {
+      $url = $config->getURL($rep, $path, "log");
+      $vars["logsearch_moreresultslink"] = "<a href=\"${url}rev=$revamp;&sc=$showchanged&amp;isdir=$isDir&logsearch=1&search=$search&fr=${r["rev"]}\">${lang["MORERESULTS"]}</a>";
+      break;
+   }
+}
+
+$vars["logsearch_resultsfound"] = true;
+
+if ($dosearch && !$found)
+{
+   if ($fromRev == 0)
+   {
+      $vars["logsearch_nomatches"] = true;
+      $vars["logsearch_resultsfound"] = false;
+   }
+   else
+      $vars["logsearch_nomorematches"] = true;
+}
+else if ($dosearch && $numSearchResults > 0)
+{
+   $vars["logsearch_nomorematches"] = true;
+}
+
+// Work out the paging options
+
+$vars["pagelinks"] = "";
+$vars["showalllink"] = "";
+
+if ($pages > 1)
+{
+   $prev = $page - 1;
+   $next = $page + 1;
+   echo "<p><center>";
+      
+   if ($page > 1) $vars["pagelinks"] .= "<a href=\"${logurl}rev=$rev&amp;sc=$showchanged&amp;page=$prev\"><&nbsp;${lang["PREV"]}</a> ";
+   for ($p = 1; $p <= $pages; $p++)
+   {
+      if ($p != $page)
+         $vars["pagelinks"].= "<a href=\"${logurl}rev=$rev&amp;sc=$showchanged&amp;page=$p\">$p</a> "; 
+      else
+         $vars["pagelinks"] .= "<b>$p </b>";
+   }
+   if ($page < $pages) $vars["pagelinks"] .=" <a href=\"${logurl}rev=$rev&amp;sc=$showchanged&amp;page=$next\">${lang["NEXT"]}&nbsp;></a>";   
+   
+   $vars["showalllink"] = "<a href=\"${logurl}rev=$rev&amp;sc=$showchanged&amp;all=1\">${lang["SHOWALL"]}</a>";
+   echo "</center>";
+}
+
+// Create the project change combo box
+ 
+$url = $config->getURL($rep, $path, "log");
+$vars["logsearch_form"] = "<form action=\"$url\" method=\"post\" name=\"logsearchform\">";
+
+$vars["logsearch_inputbox"] = "<input name=\"search\" value=\"$search\">";
+
+$vars["logsearch_submit"] = "<input type=\"submit\" value=\"${lang["GO"]}\">";
+$vars["logsearch_endform"] = "<input type=\"hidden\" name=\"logsearch\" value=\"1\">".
+                             "<input type=\"hidden\" name=\"op\" value=\"log\">".
+                             "<input type=\"hidden\" name=\"rev\" value=\"$rev\">".
+                             "<input type=\"hidden\" name=\"sc\" value=\"$showchanged\">".
+                             "<input type=\"hidden\" name=\"isdir\" value=\"$isDir\">".
+                             "</form>";   
+
+if ($search != "")
+{
+   $url = $config->getURL($rep, $path, "log");
+   $vars["logsearch_clearloglink"] = "<a href=\"${url}rev=$rev&amp;sc=$showchanged&amp;isdir=$isDir\">${lang["CLEARLOG"]}</a>";
+}
+else
+   $vars["logsearch_clearloglink"] = "";
+
+$url = $config->getURL($rep, "", "comp");
+$vars["compare_form"] = "<form action=\"$url\" method=\"post\" name=\"compareform\">";
+$vars["compare_submit"] = "<input name=\"comparesubmit\" type=\"submit\" value=\"${lang["COMPAREREVS"]}\">";
+$vars["compare_endform"] = "<input type=\"hidden\" name=\"op\" value=\"comp\"><input type=\"hidden\" name=\"sc\" value=\"$showchanged\"></form>";   
+
+$vars["version"] = $version;
+parseTemplate($config->templatePath."header.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."log.tmpl", $vars, $listing);
+parseTemplate($config->templatePath."footer.tmpl", $vars, $listing);
+
+?>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/rss.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/rss.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/rss.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,141 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// RSS feed initial version by Lübbe Onken
+// Modifications for the first official RSS feed release by Tim Armes
+//
+// 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
+//
+// --
+//
+// rss.php
+//
+// Creates an rss feed for the given repository number
+
+include("include/feedcreator.class.php");
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+require_once("include/utils.inc");
+require_once("include/template.inc");
+
+$isDir = (@$_REQUEST["isdir"] == 1)?1:0;
+
+$maxmessages = 20;
+
+// Find the base URL name
+if ($config->multiViews)
+{
+   $baseurl = "";
+}
+else
+{
+   $baseurl = dirname($_SERVER["PHP_SELF"]);
+   if ($baseurl != "" && $baseurl != DIRECTORY_SEPARATOR && $baseurl != "\\" && $baseurl != "/" )
+      $baseurl .= "/";
+   else
+      $baseurl = "/";
+}
+
+$svnrep = new SVNRepository($rep->path);
+
+if ($path == "" || $path{0} != "/")
+   $ppath = "/".$path;
+else
+   $ppath = $path;
+
+$url = $config->getURL($rep, $path, "log");
+$listurl = $config->getURL($rep, $path, "dir");
+
+$history = $svnrep->getHistory($path, $rev);
+
+$cachename = strtr($svnrep->repPath, ":/\\", "___");
+$cachename = $locwebsvnreal.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR.$cachename."_rssfeed";
+
+$rss = new UniversalFeedCreator();
+$rss->useCached($cachename);
+$rss->title = $rep->name;
+$rss->description = "${lang["RSSFEEDTITLE"]} - $repname";
+$rss->link = getFullURL($baseurl.$listurl);
+$rss->syndicationURL = $rss->link;
+
+//$divbox = "<div>";
+//$divfont = "<span>";
+
+if ($maxmessages > count($history))
+   $maxmessages = count($history);
+
+for ($n = 0; $n < $maxmessages; $n++)
+{
+   $r = $history[$n];
+   
+   $log = $svnrep->getLogDetails($path, $r["rev"]);
+   $changes = $svnrep->getChangedFiles($r["rev"]);
+   $files = count($changes["added"]) + count($changes["deleted"]) + count($changes["updated"]);
+
+   // Add the trailing slash if we need to (svnlook history doesn't return trailing slashes!)
+   $rpath = $r["path"];
+   if ($isDir && $rpath{strlen($rpath) - 1} != "/")
+      $rpath .= "/";
+   
+   // Find the parent path (or the whole path if it's already a directory)
+   $pos = strrpos($rpath, "/");
+   $parent = substr($rpath, 0, $pos + 1);
+ 
+   $url = $config->getURL($rep, $parent, "dir");
+   
+   $desc = $log["message"];
+   $item = new FeedItem();
+   
+   // For the title, we show the first 10 words of the description
+   $pos = 0;
+   $len = strlen($desc);
+   for ($i = 0; $i < 10; $i++)
+   {
+      if ($pos >= $len) break;
+      
+      $pos = strpos($desc, " ", $pos);
+      
+      if ($pos === FALSE) break;
+      $pos++;
+   }
+   
+   if ($pos !== FALSE)
+   {
+      $sdesc = substr($desc, 0, $pos) . "...";
+   }
+   else
+   {
+      $sdesc = $desc;
+   }
+   
+   if ($desc == "") $sdesc = "${lang["REV"]} ${r["rev"]}";
+   
+   $item->title = "$sdesc";
+   $item->link = getFullURL($baseurl."${url}rev=${r["rev"]}&amp;sc=$showchanged");
+   $item->description = "<div><strong>${lang["REV"]} ${r["rev"]} - ${log["author"]}</strong> ($files ${lang["FILESMODIFIED"]})</div><div>".nl2br(create_anchors($desc))."</div>";
+   $item->date = $log["committime"];
+   $item->author = $log["author"];
+     
+   $rss->addItem($item);
+}
+
+// valid format strings are: RSS0.91, RSS1.0, RSS2.0, PIE0.1, MBOX, OPML
+header("Content-Type: text/xml");
+echo $rss->createFeed("RSS2.0");
+
+?>

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/blame.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/blame.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/blame.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,23 @@
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+[websvn:curdirlinks] - <h2> [lang:BLAMEFOR] [websvn:rev]</h2>
+<p>
+
+<table cellpadding="2px" cellspacing="0" width="100%">
+   <tr>
+      <th class="HdrClmn"><b>[lang:LINENO]</b></th>
+      <th class="HdrClmn"><b>[lang:REV]</b></th>
+      <th class="HdrClmn"><b>[lang:AUTHOR]</b></th>
+      <th class="HdrClmnEnd"><b>[lang:LINE]</b></th>
+   </tr>
+
+   [websvn-startlisting]
+      <tr>
+         <td class="CatClmn0" style="border-right: 1px solid black" valign="top">[websvn:lineno]</td>
+         <td class="CatClmn0" style="border-right: 1px solid black" valign="top">[websvn:revision]</td>
+         <td class="CatClmn0" style="border-right: 1px solid black" valign="top">[websvn:author]</td>
+         <td style="border-right: 1px solid black" valign="top">[websvn:line]</td>
+      </tr>
+   [websvn-endlisting]
+
+</table>

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/compare.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/compare.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/compare.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,55 @@
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+<p>
+[websvn:compare_form]
+<table>
+   <tr><td>[lang:COMPPATH]&nbsp</td><td>[websvn:compare_path1input] [lang:REV] [websvn:compare_rev1input]</td></tr>
+   <tr><td>[lang:WITHPATH]</td><td>[websvn:compare_path2input] [lang:REV] [websvn:compare_rev2input]</td></tr>
+</table>
+[websvn:compare_submit]
+[websvn:compare_endform]
+<hr>
+   <p>[lang:CONVFROM] <b>[websvn:path1] ([lang:REV] [websvn:rev1])</b> [lang:TO] <b>[websvn:path2] ([lang:REV] [websvn:rev2])</b>
+   <p>
+   [websvn:revlink]
+<p>
+
+[websvn-startlisting]
+   [websvn-test:newpath]
+      <p>
+      <div class="newpath">
+         <b>[websvn:newpath]</b><br>
+   [websvn-endtest]
+
+   [websvn-test:info]
+      [websvn:info]<br>
+   [websvn-endtest]
+
+   [websvn-test:difflines]
+      <div class="difflines">
+         <p>
+         [websvn:difflines]<br>
+         <table class="diff" cellspacing="0">
+   [websvn-endtest]
+   
+   [websvn-test:diffclass]
+            <tr><td class="[websvn:diffclass]">[websvn:line]</td></tr>
+   [websvn-endtest]
+
+   [websvn-test:enddifflines]
+         </table>
+      </div>
+   [websvn-endtest]
+
+   [websvn-test:endpath]
+      </div>
+      <p><hr>
+   [websvn-endtest]
+
+   [websvn-test:properties]
+      <p><i>[lang:PROPCHANGES]</i><p>
+   [websvn-endtest]
+
+[websvn-endlisting]
+</table>
+

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/diff.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/diff.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/diff.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,36 @@
+[websvn-test:noprev]
+No Previous Revision
+[websvn-else]
+
+   <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+   <h2>[websvn:repname]</h2>
+   [websvn:curdirlinks] - [lang:DIFFREVS] <b>[websvn:rev2]</b> [lang:AND] <b>[websvn:rev1]</b>
+   <p>
+   
+   <p><center>
+   [websvn:showcompactlink]
+   [websvn:showalllink]
+   </center>
+   <p>
+   <table class="diff" width="100%" cellspacing="0">
+      <tr>
+         <th class="HdrClmnEnd" style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev2]</b></th>
+         <th rowspan=100000 width="5"></th>
+         <th class="HdrClmnEnd" style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev1]</b></th>
+      </tr>
+   
+      [websvn-startlisting]
+         [websvn-test:rev1lineno]
+            <tr>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center" class="row1"><b>[lang:LINE] [websvn:rev1lineno]...</b></td>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center" class="row1"><b>[lang:LINE] [websvn:rev2lineno]...</b></td>
+            <tr>
+         [websvn-else]
+            <tr><td class="[websvn:rev1diffclass]">[websvn:rev1line]</td>
+            <td class="[websvn:rev2diffclass]">[websvn:rev2line]</td></tr>
+         [websvn-endtest]
+      [websvn-endlisting]
+   
+   </table>
+[websvn-endtest]
+

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/directory.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/directory.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/directory.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,124 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h1>[websvn:repname]</h1>
+
+<table border=0 cellpadding=2 cellspacing=0>
+<tr><th colspan=2 class="HdrClmnEnd">[lang:REVINFO]</th></tr>
+<tr><td class="CatClmn0" valign="top">[lang:CURDIR]:</td><td class="row0">[websvn:path]</td></tr>
+<tr><td class="CatClmn1">[lang:REV]:</td><td class="row1">[websvn:rev]
+[websvn-test:goyoungestlink]
+ - [websvn:goyoungestlink]
+[websvn-endtest]
+</td></tr>
+<tr><td class="CatClmn0" valign="top">[lang:AUTHOR]:</td><td class="row0">[websvn:author]</td></tr>
+<tr><td class="CatClmn1" valign="top">[lang:LASTMOD]:</td><td class="row1">[lang:REV] [websvn:lastchangedrev] - [websvn:date]</td></tr>
+<tr><td class="CatClmn0" valign="top">[lang:LOGMSG]:</td><td class="row0">[websvn:log]</td></tr>
+[websvn-test:hidechanges]
+   <tr><td class="CatClmn1" valign="top">&nbsp;</td><td class="row1">([websvn:showchangeslink])</td></tr>
+[websvn-else]
+[websvn:showchangeslink]
+   <tr><td class="CatClmn1" valign="top">&nbsp;</td><td class="row1">([websvn:hidechangeslink])</td></tr>
+   [websvn-test:changedfilesbr]
+   <tr><td class="CatClmn0" valign="top">[lang:CHANGEDFILES]:</td><td class="row0">[websvn:changedfilesbr]</td></tr>
+   [websvn-endtest]
+   [websvn-test:newfilesbr]
+      [websvn-test:changedfilesbr]
+         <tr><td class="CatClmn1" valign="top">[lang:NEWFILES]:</td><td class="row1">[websvn:newfilesbr]</td></tr>
+      [websvn-else]
+         <tr><td class="CatClmn0" valign="top">[lang:NEWFILES]:</td><td class="row0">[websvn:newfilesbr]</td></tr>
+      [websvn-endtest]
+   [websvn-endtest]
+   [websvn-test:deletedfilesbr]
+      [websvn-test:changedfilesbr]
+         [websvn-test:newfilesbr]
+            <tr><td class="CatClmn0" valign="top">[lang:DELETEDFILES]:</td><td class="row0">[websvn:deletedfilesbr]</td></tr>
+            [websvn-else]
+            <tr><td class="CatClmn1" valign="top">[lang:DELETEDFILES]:</td><td class="row1">[websvn:deletedfilesbr]</td></tr>
+         [websvn-endtest]
+      [websvn-else]
+         [websvn-test:newfilesbr]
+            <tr><td class="CatClmn1" valign="top">[lang:DELETEDFILES]:</td><td class="row1">[websvn:deletedfilesbr]</td></tr>
+            [websvn-else]
+            <tr><td class="CatClmn0" valign="top">[lang:DELETEDFILES]:</td><td class="row0">[websvn:deletedfilesbr]</td></tr>
+         [websvn-endtest]
+      [websvn-endtest]
+   [websvn-endtest]      
+[websvn-endtest]
+</table>
+
+[websvn-defineicons]
+dir=<img align="middle" valign="center" src="[websvn:locwebsvnhttp]/templates/BlueGrey/folder.png" alt="[FOLDER]">
+*=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/file.png" alt="[FILE]">
+.c=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/filec.png" alt="[C-FILE]">
+.h=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/fileh.png" alt="[H-FILE]">
+.s=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/files.png" alt="[S-FILE]">
+
+i-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/i-node.png" alt="[NODE]">
+t-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/t-node.png" alt="[NODE]">
+l-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/l-node.png" alt="[NODE]">
+e-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/e-node.png" alt="[NODE]">
+[websvn-enddefineicons]
+
+<p><hr>
+[websvn:curdirlinks] - [websvn:curdirloglink] - [websvn:curdircomplink]
+[websvn-test:allowdownload]
+ - [websvn:curdirdllink]
+[websvn-endtest]
+[websvn-test:curdirrsslink]
+ - [websvn:curdirrssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/BlueGrey/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a>
+[websvn-endtest]
+<p>
+[websvn:compare_form]
+   <table cellpadding="0px" cellspacing="0px" width="100%">
+      <tr>
+         <th class="HdrClmn" width="100%"><b>[lang:PATH]</b></th>
+         [websvn-test:allowdownload]
+            [websvn-test:curdirrsslink]
+               <th class="HdrClmn"><b>[lang:NOBR][lang:LOG][lang:ENDNOBR]</b></th>
+               <th class="HdrClmn"><b>[lang:TARBALL]</b></th>
+               <th class="HdrClmnEnd"><b>[lang:RSSFEED]</b></th>
+            [websvn-else]
+               <th class="HdrClmn"><b>[lang:NOBR][lang:LOG][lang:ENDNOBR]</b></th>
+               <th class="HdrClmnEnd"><b>[lang:TARBALL]</b></th>
+            [websvn-endtest]
+         [websvn-else]
+            [websvn-test:curdirrsslink]
+               <th class="HdrClmn"><b>[lang:LOG]</b></th>
+               <th class="HdrClmnEnd"><b>[lang:RSSFEED]</b></th>
+            [websvn-else]
+               <th class="HdrClmnEnd"><b>[lang:NOBR][lang:LOG][lang:ENDNOBR]</b></th>
+            [websvn-endtest]
+         [websvn-endtest]
+      </tr>
+      [websvn-startlisting]
+      <tr>
+         <td valign="middle" style="border-right: 1px solid black; padding: 0 2px 0 2px;" class="row[websvn:rowparity]">
+            [websvn:compare_box]
+            [websvn-treenode]
+            [websvn-icon]
+            [websvn:filelink]
+         </td>
+         [websvn-test:allowdownload]
+            [websvn-test:curdirrsslink]
+               <td style="border-right: 1px solid black; padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+               <td style="border-right: 1px solid black; padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[websvn:fileviewdllink]</td>
+               <td style="padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[websvn:rssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/BlueGrey/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a></td>
+            [websvn-else]
+               <td style="border-right: 1px solid black; padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+               <td style="padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[websvn:fileviewdllink]</td>
+            [websvn-endtest]
+         [websvn-else]
+            [websvn-test:curdirrsslink]
+               <td style="border-right: 1px solid black; padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+               <td style="padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[websvn:rssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/BlueGrey/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a></td>
+            [websvn-else]
+               <td style="padding: 0 2px 0 2px;" class="row[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+            [websvn-endtest]
+         [websvn-endtest]   
+      </tr>
+      [websvn-endlisting]
+   </table>
+<p>
+[websvn:compare_submit]  
+[websvn:compare_endform]
+<hr>

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/e-node.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/e-node.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/file.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,16 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+[websvn:curdirlinks] - [lang:REV] [websvn:rev]
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+<p>
+[websvn:prevdifflink] - [websvn:blamelink]
+<p>
+<hr>
+<table width="100%" border=0><tr><td class="row0">
+[websvn-getlisting]
+</td></tr></table>
+<hr>
+

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/filec.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/filec.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/fileh.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/fileh.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/files.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/files.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/folder.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/folder.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/footer.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/footer.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/footer.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,3 @@
+      <p><center><font size="-1"><i><b>[lang:POWERED] v[websvn:version]</b></i></font></center>
+   </body>
+</html>

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/header.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/header.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/header.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+   <head>
+		<meta http-equiv="content-type" content="text/html;charset=[websvn:charset]">
+	   <link href="[websvn:locwebsvnhttp]/templates/BlueGrey/styles.css" rel="stylesheet" media="screen">
+      <!--[if gte IE 5.5000]>
+      <script type="text/javascript" src="[websvn:locwebsvnhttp]/templates/BlueGrey/png.js"></script>
+      <![endif]-->
+      <title>
+         WebSVN
+         [websvn-test:repname]
+            - [websvn:repname]
+         [websvn-endtest]
+         [websvn-test:action]
+            - [websvn:action]
+         [websvn-endtest]
+         [websvn-test:rev2]
+            [websvn-test:path2]
+               - [websvn:path1] [lang:REV] [websvn:rev1] [lang:AND] [websvn:path2] [lang:REV] [websvn:rev2]
+            [websvn-else]
+               - [lang:REV] [websvn:rev1] [lang:AND] [websvn:rev2]
+            [websvn-endtest]
+         [websvn-else]
+            [websvn-test:rev]
+               - [lang:REV] [websvn:rev]
+            [websvn-endtest]
+         [websvn-endtest]
+         [websvn-test:path]
+            - [websvn:path]
+         [websvn-endtest]
+      </title>
+
+      <script>
+         function checkCB(chBox)
+         {
+            count = 0
+            first = null
+            f = chBox.form
+            for (i = 0 ; i < f.elements.length ; i++)
+            if (f.elements[i].type == 'checkbox' && f.elements[i].checked)
+            {
+               if (first == null && f.elements[i] != chBox)
+                  first = f.elements[i]
+               count += 1
+            }
+            
+            if (count > 2) 
+            {
+               first.checked = false
+               count -= 1
+            }
+         }
+      </script>
+
+   </head>
+   <body>
+
+      <div style="text-align: center">
+        <a href="http://subversion.tigris.org/"><img style="border: 0; width: 468px; height: 64px" src="[websvn:locwebsvnhttp]/templates/BlueGrey/subversion.png" alt="Subversion" /></a>
+      </div>
+      
+      <hr>

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/i-node.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/i-node.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/index.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/index.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/index.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,8 @@
+<p>
+<table align="center" border=0 cellspacing=0 cellpadding=0 width="50%">
+   <tr><th align="left" colspan=2 class="HdrClmnEnd">[lang:PROJECTS]</th></tr>
+   [websvn-startlisting]
+      <tr><td class="row[websvn:rowparity]"><img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/repo.png" alt="[FOLDER]"> [websvn:projlink]</td></tr>
+   [websvn-endlisting]
+</table>
+<hr>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/l-node.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/l-node.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/log.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/log.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/log.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,56 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<p>
+<h2>[websvn:repname] - [lang:REV] [websvn:rev]</h2>
+[websvn:curdirlinks]<p>
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+<hr>
+<center>
+[websvn:logsearch_form][lang:SEARCHLOG]: [websvn:logsearch_inputbox][websvn:logsearch_submit]
+[websvn-test:logsearch_clearloglink]
+<p><font size="-1">[websvn:logsearch_clearloglink]</font><p>
+[websvn-endtest]
+[websvn:logsearch_endform]
+</center>
+
+[websvn-test:logsearch_nomatches]
+   <center>[lang:NORESULTS]</center>
+[websvn-endtest]
+
+[websvn-test:logsearch_resultsfound]
+   [websvn:compare_form]
+      <table cellpadding="2px" cellspacing="0" width="100%">
+         <tr>
+            <th class="HdrClmn">[lang:REV]</th>
+            <th class="HdrClmn">[lang:PATH]</th>
+            <th class="HdrClmn">[lang:AUTHOR]</th>
+            <th class="HdrClmn">[lang:AGE]</th>
+            <th class="HdrClmnEnd">[lang:LOGMSG]</th>
+         </tr>
+      
+         [websvn-startlisting]
+         <tr>
+            <td style="border-right: 1px solid black" valign="top" class="row[websvn:rowparity]"><nobr>[websvn:compare_box][websvn:revlink]</nobr></td>
+            <td style="border-right: 1px solid black" valign="top" class="row[websvn:rowparity]">[websvn:revpathlink]</td>
+            <td style="border-right: 1px solid black" valign="top" class="row[websvn:rowparity]">[websvn:revauthor]</td>
+            <td style="border-right: 1px solid black" valign="top" class="row[websvn:rowparity]">[websvn:revage]</td>
+            <td valign="top" class="row[websvn:rowparity]">[websvn:revlog]</td>
+         </tr>
+         [websvn-endlisting]
+      </table>
+      <p>
+      [websvn:compare_submit]  
+   [websvn:compare_endform]
+[websvn-endtest]
+
+[websvn-test:logsearch_nomorematches]
+   <p><center>[lang:NOMORERESULTS]</center>
+[websvn-endtest]
+      
+<p><center>[websvn:logsearch_moreresultslink]</center>
+
+<hr>
+<p><center>[websvn:pagelinks]<p>[websvn:showalllink]</center>
+   
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/png.js
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/png.js	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/png.js	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,39 @@
+// correctly handle PNG transparency in Win IE 5.5 or higher.
+ 
+function correctPNG()
+{
+   for(var i = 0; i < document.images.length; i++)
+   {
+      var img = document.images[i]
+      var imgName = img.src.toUpperCase()
+      if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
+      {
+         var imgID = (img.id) ? "id='" + img.id + "' " : ""
+         var imgClass = (img.className) ? "class='" + img.className + "' " : ""
+         var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
+         var imgStyle = "display:inline-block;" + img.style.cssText 
+         var imgAttribs = img.attributes;
+         for (var j=0; j<imgAttribs.length; j++)
+         {
+            var imgAttrib = imgAttribs[j];
+            if (imgAttrib.nodeName == "align")
+            {		  
+               if (imgAttrib.nodeValue == "left") imgStyle = "float:left;" + imgStyle
+               if (imgAttrib.nodeValue == "right") imgStyle = "float:right;" + imgStyle
+               break
+            }
+         }
+         var strNewHTML = "<span " + imgID + imgClass + imgTitle
+         strNewHTML += " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
+         strNewHTML += "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+         strNewHTML += "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
+         img.outerHTML = strNewHTML
+         i = i-1
+      }
+   }
+}
+
+var supported = /MSIE (5\.5)|[6789]/.test(navigator.userAgent) && navigator.platform == "Win32";
+
+if (supported)
+   window.attachEvent("onload", correctPNG);

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/repo.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/repo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/styles.css
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/BlueGrey/styles.css	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/BlueGrey/styles.css	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,98 @@
+BODY
+{
+    COLOR: black;
+    FONT-FAMILY: verdana, sans-serif;
+    BACKGROUND-COLOR: white
+}
+HR
+{
+    BORDER-RIGHT: 0px;
+    PADDING-RIGHT: 0px;
+    BORDER-TOP: 0px;
+    PADDING-LEFT: 0px;
+    PADDING-BOTTOM: 0px;
+    BORDER-LEFT: 0px;
+    PADDING-TOP: 0px;
+    BORDER-BOTTOM: 0px;
+    HEIGHT: 1px;
+    BACKGROUND-COLOR: #808080
+}
+A
+{
+    TEXT-DECORATION: none
+}
+A:hover
+{
+    TEXT-DECORATION: underline
+}
+.HdrClmn
+{
+    BORDER-RIGHT: black 1px solid;
+    FONT-WEIGHT: bold;
+    COLOR: white;
+    BORDER-BOTTOM: black 1px solid;
+    BACKGROUND-COLOR: #809cc8
+}
+.HdrClmnEnd
+{
+    FONT-WEIGHT: bold;
+    COLOR: white;
+    BORDER-BOTTOM: black 1px solid;
+    BACKGROUND-COLOR: #809cc8
+}
+
+.row0
+{
+   background-color: #F0F0F0;
+}
+
+.row1
+{
+   background-color: #E0E0E0;
+}
+
+.CatClmn1
+{
+    BORDER-RIGHT: black 1px solid;
+    BACKGROUND-COLOR: #d0d0ee
+}
+
+.CatClmn0
+{
+    BORDER-RIGHT: black 1px solid;
+    BACKGROUND-COLOR: #e0e0ff
+}
+
+TD.diffdeleted
+{
+   font-size: 11px;
+   background-color: red;
+}
+
+TD.diffchanged
+{
+   font-size: 11px;
+   background-color: yellow;
+}
+
+TD.diffadded
+{
+   font-size: 11px;
+   background-color: green;
+}
+
+TD.diff
+{
+   font-size: 11px;
+   background-color: #F0F0F0;
+}
+
+DIV.newpath
+{
+   PADDING: 10px 10px 10px 10px;
+   BACKGROUND-COLOR: #d0d0ee
+}
+
+DIV.difflines
+{
+}
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/subversion.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/subversion.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/t-node.png
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/t-node.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/xml.gif
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/BlueGrey/xml.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/blame.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/blame.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/blame.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,24 @@
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+[websvn:curdirlinks] - <h2> [lang:BLAMEFOR] [websvn:rev]</h2>
+<p>
+
+<table border="1" class="blame" width="100%">
+   <tr>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:LINENO]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:REV]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:AUTHOR]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:LINE]</b></th>
+   </tr>
+
+   [websvn-startlisting]
+      <tr>
+         <td>[websvn:lineno]</td>
+         <td>[websvn:revision]</td>
+         <td>[websvn:author]</td>
+         <td>[websvn:line]</td>
+      </tr>
+   [websvn-endlisting]
+
+</table>
+

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/compare.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/compare.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/compare.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,63 @@
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+<p>
+<center>
+   [websvn:compare_form]
+   <table>
+      <tr><td>
+         <table class="outlined">
+            <tr><td>[lang:COMPPATH]&nbsp;</td><td>[websvn:compare_path1input] [lang:REV] [websvn:compare_rev1input]</td></tr>
+            <tr><td>[lang:WITHPATH]&nbsp;</td><td>[websvn:compare_path2input] [lang:REV] [websvn:compare_rev2input]</td></tr>
+         </table>
+      </td><tr>
+      <tr><td align="center">[websvn:compare_submit]</td></tr>       
+   </table>
+   [websvn:compare_endform]
+</center>
+<hr>
+[websvn-test:success]
+   [lang:CONVFROM] <b>[websvn:path1] ([lang:REV] [websvn:rev1])</b> [lang:TO] <b>[websvn:path2] ([lang:REV] [websvn:rev2])</b>
+   <p>
+   [websvn:revlink]
+[websvn-endtest]
+<p>
+
+[websvn-startlisting]
+   [websvn-test:newpath]
+      <p>
+      <div class="newpath">
+         <b>[websvn:newpath]</b><br>
+   [websvn-endtest]
+
+   [websvn-test:info]
+      [websvn:info]<br>
+   [websvn-endtest]
+
+   [websvn-test:difflines]
+      <div class="difflines">
+         <p>
+         [websvn:difflines]<br>
+         <table class="diff" cellspacing="0">
+   [websvn-endtest]
+   
+   [websvn-test:diffclass]
+            <tr><td class="[websvn:diffclass]">[websvn:line]</td></tr>
+   [websvn-endtest]
+
+   [websvn-test:enddifflines]
+         </table>
+      </div>
+   [websvn-endtest]
+
+   [websvn-test:endpath]
+      </div>
+      <p><hr>
+   [websvn-endtest]
+
+   [websvn-test:properties]
+      <p><i>[lang:PROPCHANGES]</i><p>
+   [websvn-endtest]
+
+[websvn-endlisting]
+</table>
+

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/diff.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/diff.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/diff.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,35 @@
+[websvn-test:noprev]
+   No Previous Revision
+[websvn-else]
+   <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+   <h2>[websvn:repname]</h2>
+   [websvn:curdirlinks] - <h2>[lang:DIFFREVS] <b>[websvn:rev2]</b> [lang:AND] <b>[websvn:rev1]</b></h2>
+   <p>
+   
+   <p><center>
+   [websvn:showcompactlink]
+   [websvn:showalllink]
+   </center>
+   <p>
+   <table class="diff" width="100%">
+      <tr>
+         <th style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev2]</b></th>
+         <th rowspan=100000 width=5></th>
+         <th style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev1]</b></th>
+      </tr>
+   
+      [websvn-startlisting]
+         [websvn-test:rev1lineno]
+            <tr>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center"><b>[lang:LINE] [websvn:rev1lineno]...</b></td>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center"><b>[lang:LINE] [websvn:rev2lineno]...</b></td>
+            <tr>
+         [websvn-else]
+            <tr><td class="[websvn:rev1diffclass]">[websvn:rev1line]</td>
+            <td class="[websvn:rev2diffclass]">[websvn:rev2line]</td></tr>
+         [websvn-endtest]
+      [websvn-endlisting]
+   
+   </table>
+[websvn-endtest]
+

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/directory.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/directory.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/directory.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,105 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h1>[websvn:repname]</h1>
+<p><b>[lang:PATH]:</b> [websvn:path]
+<br><b>[lang:REV]:</b> [websvn:rev]
+[websvn-test:goyoungestlink]
+ - [websvn:goyoungestlink]
+[websvn-endtest]
+<br><b>[lang:LASTMOD]:</b> [lang:REV] [websvn:lastchangedrev] - [websvn:author] - [websvn:date]
+<br><b>[lang:LOGMSG]:</b><br>
+[websvn:log]
+<p>
+[websvn-test:hidechanges]
+   <p>[websvn:showchangeslink]
+[websvn-endtest]
+
+[websvn-test:showchanges]
+   <p><b>[lang:CHANGES]:</b><br>
+   <p>[websvn:hidechangeslink]
+   <p>
+      <center>
+      <table border=1 class="bordered" cellpadding=4>
+         <tr>
+            <th><center><b>[lang:NEWFILES]</b></center></th>
+            <th><center><b>[lang:CHANGEDFILES]</b></center></th>
+            <th><center><b>[lang:DELETEDFILES]</b></center></th>
+         </tr>
+         <tr>  
+            <td valign="top">
+            [websvn-test:newfilesbr]
+               [websvn:newfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+            <td valign="top">
+            [websvn-test:changedfilesbr]
+               [websvn:changedfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+            <td valign="top">
+            [websvn-test:deletedfilesbr]
+               [websvn:deletedfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+         </tr>
+      </table>
+   </center>
+[websvn-endtest]
+
+[websvn-defineicons]
+dir=&nbsp;&nbsp;&nbsp;&nbsp;
+i-node=&nbsp;&nbsp;&nbsp;&nbsp;
+t-node=&nbsp;&nbsp;&nbsp;&nbsp;
+l-node=&nbsp;&nbsp;&nbsp;&nbsp;
+e-node=&nbsp;&nbsp;&nbsp;&nbsp;
+*=&nbsp;&nbsp;&nbsp;&nbsp;
+[websvn-enddefineicons]
+
+<p><hr>
+<b>[lang:CURDIR]:</b> [websvn:curdirlinks] - [websvn:curdirloglink] - [websvn:curdircomplink]
+[websvn-test:allowdownload]
+ - [websvn:curdirdllink]
+[websvn-endtest]
+[websvn-test:curdirrsslink]
+ - [websvn:curdirrssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/Standard/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a>
+[websvn-endtest]
+<p>
+
+[websvn:compare_form]
+   <table class="outlined" width="100%" cellpadding=2>
+      <tr>
+         <th width="100%"><b>[lang:PATH]</b></th>
+         <th><b>[lang:NOBR][lang:LOG][lang:ENDNOBR]</b></th>
+         [websvn-test:allowdownload]
+            <th><b>[lang:TARBALL]</b></th>
+         [websvn-endtest]
+         [websvn-test:curdirrsslink]
+            <th><b>[lang:RSSFEED]</b></th>
+         [websvn-endtest]
+      </tr>
+      [websvn-startlisting]
+      <tr>
+         <td class="[websvn:rowparity]">
+            [websvn:compare_box]
+            [websvn-treenode]
+            [websvn:filelink]
+         </td>
+         <td class="[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+         [websvn-test:allowdownload]
+            <td class="[websvn:rowparity]">[websvn:fileviewdllink]</td>
+         [websvn-endtest]
+         [websvn-test:curdirrsslink]
+            <td class="row[websvn:rowparity]">[websvn:rssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/Standard/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a></td>
+         [websvn-endtest]
+      </tr>
+      [websvn-endlisting]
+   </table>
+<p>
+[websvn:compare_submit]  
+[websvn:compare_endform]

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/file.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/file.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/file.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,13 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname]</h2>
+[websvn:curdirlinks] - [lang:REV] [websvn:rev]<p>
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+
+[websvn:prevdifflink] - [websvn:blamelink]
+<p>
+<table width="100%" border=0><tr><td>
+[websvn-getlisting]
+</td></tr></table>

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/footer.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/footer.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/footer.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,3 @@
+      <p><center><font size="-1"><i><b>[lang:POWERED] v[websvn:version]</b></i></font></center>
+   </body>
+</html>

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/header.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/header.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/header.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+   <head>
+		<meta http-equiv="content-type" content="text/html;charset=[websvn:charset]">
+	   <link href="[websvn:locwebsvnhttp]/templates/Standard/styles.css" rel="stylesheet" media="screen">
+      <script>
+         function checkCB(chBox)
+         {
+            count = 0
+            first = null
+            f = chBox.form
+            for (i = 0 ; i < f.elements.length ; i++)
+            if (f.elements[i].type == 'checkbox' && f.elements[i].checked)
+            {
+               if (first == null && f.elements[i] != chBox)
+                  first = f.elements[i]
+               count += 1
+            }
+            
+            if (count > 2) 
+            {
+               first.checked = false
+               count -= 1
+            }
+         }
+      </script>
+      <title>
+         WebSVN
+         [websvn-test:repname]
+            - [websvn:repname]
+         [websvn-endtest]
+         [websvn-test:action]
+            - [websvn:action]
+         [websvn-endtest]
+         [websvn-test:rev2]
+            [websvn-test:path2]
+               - [websvn:path1] [lang:REV] [websvn:rev1] [lang:AND] [websvn:path2] [lang:REV] [websvn:rev2]
+            [websvn-else]
+               - [lang:REV] [websvn:rev1] [lang:AND] [websvn:rev2]
+            [websvn-endtest]
+         [websvn-else]
+            [websvn-test:rev]
+               - [lang:REV] [websvn:rev]
+            [websvn-endtest]
+         [websvn-endtest]
+         [websvn-test:path]
+            - [websvn:path]
+         [websvn-endtest]
+      </title>
+
+   </head>
+   <body>
+      <center>
+         <h1>[lang:SERVER]</h1>
+      </center>
+      <hr>
+      <p>
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/index.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/index.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/index.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,16 @@
+
+<table border=0 cellspacing=0 cellpadding=0 align="center">
+   <tr>
+      <td align="center">
+         <br><h2>[lang:PROJECTS]:</h2>
+         <table border=0>
+            <tr><td><ul>
+               [websvn-startlisting]
+                  <li><strong>[websvn:projlink]</strong></li>
+               [websvn-endlisting]
+            </ul></td></tr>
+         </table>
+      </td>
+   </tr>
+</table>
+  

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/log.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/log.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/log.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,52 @@
+
+<div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+<h2>[websvn:repname] - [lang:REV] [websvn:rev]</h2>
+[websvn:curdirlinks]<p>
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+
+<center>
+[websvn:logsearch_form][lang:SEARCHLOG]: [websvn:logsearch_inputbox][websvn:logsearch_submit]
+[websvn-test:logsearch_clearloglink]
+<p><font size="-1">[websvn:logsearch_clearloglink]</font><p>
+[websvn-endtest]
+[websvn:logsearch_endform]
+</center>
+
+[websvn-test:logsearch_nomatches]
+   <center>[lang:NORESULTS]</center>
+[websvn-endtest]
+
+[websvn-test:logsearch_resultsfound]
+   [websvn:compare_form]
+      <table border=1 class="outlined" width="100%" cellpadding=2>
+         <tr>
+            <th>[lang:REV]</th>
+            <th>[lang:PATH]</th>
+            <th>[lang:AUTHOR]</th>
+            <th>[lang:AGE]</th>
+            <th>[lang:LOGMSG]</th>
+         </tr>
+      
+         [websvn-startlisting]
+         <tr>
+            <td valign="top" class="[websvn:rowparity]"><nobr>[websvn:compare_box][websvn:revlink]</nobr></td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revpathlink]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revauthor]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revage]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revlog]</td>
+         </tr>
+         [websvn-endlisting]
+      </table>
+      <p>
+      [websvn:compare_submit]  
+   [websvn:compare_endform]
+[websvn-endtest]
+   
+[websvn-test:logsearch_nomorematches]
+   <p><center>[lang:NOMORERESULTS]</center>
+[websvn-endtest]
+
+<p><center>[websvn:logsearch_moreresultslink]</center>
+<p><center>[websvn:pagelinks]<p>[websvn:showalllink]</center>

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/styles.css
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Standard/styles.css	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Standard/styles.css	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,86 @@
+
+body
+{
+   font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular;
+   background-color: white;
+   margin: 20px;
+   padding: 0px
+}
+
+H1
+{ 
+   color: #99007E;
+   font-size: 30px;
+   font-weight: normal;
+   font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular;
+   text-decoration: none;
+}
+
+HR { color: #99007E; background-color: #99007E  }
+
+.highlight { color: #99007E; font-style: italic;  }
+
+TABLE.bordered, TABLE.outlined, TABLE.blame
+{
+   border-collapse: collapse;
+   border: solid 2px #99007E;
+}
+
+.bordered TD, .bordered TH
+{
+   border: solid 2px #99007E;
+}
+
+.outlined TD
+{
+   padding: 0px 5px 0px 5px;
+}
+
+.outlined TH, .blame TH
+{
+   padding: 5px 5px 5px 5px;
+   font-weight: bold;
+   border: solid 2px #99007E;
+}
+
+.outlined TD, .blame TD
+{
+   padding: 1px 5px 1px 5px;
+   border-right: solid 2px #99007E;
+   border-bottom: solid 1px #F0F0F0;
+}
+
+TD.diffdeleted
+{
+   font-size: 11px;
+   background-color: red;
+}
+
+TD.diffchanged
+{
+   font-size: 11px;
+   background-color: yellow;
+}
+
+TD.diffadded
+{
+   font-size: 11px;
+   background-color: green;
+}
+
+TD.diff
+{
+   font-size: 11px;
+   background-color: #D0D0D0;
+}
+
+TABLE.diff
+{
+   border-collapse: collapse;
+}
+
+DIV.newpath
+{
+   padding: 5px 5px 5px 5px;
+   border: solid 2px #99007E;
+}

Added: trunk/svn.matroska.org/WebSVN/templates/Standard/xml.gif
===================================================================
(Binary files differ)


Property changes on: trunk/svn.matroska.org/WebSVN/templates/Standard/xml.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/blame.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/blame.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/blame.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,32 @@
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+[websvn:curdirlinks] - [lang:BLAMEFOR] [websvn:rev]
+<p>
+
+<table border="1" class="blame" width="100%" cellpadding="2">
+   <tr>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:LINENO]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:REV]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:AUTHOR]</b></th>
+      <th style="padding-bottom: 5px" align="left"><b>[lang:LINE]</b></th>
+   </tr>
+
+   [websvn-startlisting]
+      <tr>
+         <td>[websvn:lineno]</td>
+         <td>[websvn:revision]</td>
+         <td>[websvn:author]</td>
+         <td>[websvn:line]</td>
+      </tr>
+   [websvn-endlisting]
+
+</table>
+

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/compare.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/compare.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/compare.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,72 @@
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+
+<center>
+   [websvn:compare_form]
+   <table>
+      <tr><td>
+         <table class="outlined">
+            <tr><td>[lang:COMPPATH]&nbsp;</td><td>[websvn:compare_path1input] [lang:REV] [websvn:compare_rev1input]</td></tr>
+            <tr><td>[lang:WITHPATH]&nbsp;</td><td>[websvn:compare_path2input] [lang:REV] [websvn:compare_rev2input]</td></tr>
+         </table>
+      </td><tr>
+      <tr><td align="center">[websvn:compare_submit]</td></tr>       
+   </table>
+   [websvn:compare_endform]
+   <hr>
+</center>
+<p>
+[websvn-test:success]
+   [lang:CONVFROM] <b>[websvn:path1] ([lang:REV] [websvn:rev1])</b> [lang:TO] <b>[websvn:path2] ([lang:REV] [websvn:rev2])</b>
+   <p>
+   [websvn:revlink]
+[websvn-endtest]
+<p>
+
+[websvn-startlisting]
+   [websvn-test:newpath]
+      <p>
+      <div class="newpath">
+         <b>[websvn:newpath]</b><br>
+   [websvn-endtest]
+
+   [websvn-test:info]
+      [websvn:info]<br>
+   [websvn-endtest]
+
+   [websvn-test:difflines]
+      <div class="difflines">
+         <p>
+         [websvn:difflines]<br>
+         <table class="diff" cellspacing="0">
+   [websvn-endtest]
+   
+   [websvn-test:diffclass]
+            <tr><td class="[websvn:diffclass]">[websvn:line]</td></tr>
+   [websvn-endtest]
+
+   [websvn-test:enddifflines]
+         </table>
+      </div>
+   [websvn-endtest]
+
+   [websvn-test:endpath]
+      </div>
+      <p><hr>
+   [websvn-endtest]
+
+   [websvn-test:properties]
+      <p><i>[lang:PROPCHANGES]</i><p>
+   [websvn-endtest]
+
+[websvn-endlisting]
+</table>
+

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/diff.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/diff.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/diff.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,46 @@
+[websvn-test:noprev]
+   No Previous Revision
+[websvn-else]
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+<b>[lang:PATH]:</b> [websvn:path]
+<br><b>[lang:REV]:</b> [websvn:rev]
+<p><hr>
+<b>[lang:CURDIR]:</b> [websvn:curdirlinks]
+   <p>
+   
+   <p><center>
+   [websvn:showcompactlink]
+   [websvn:showalllink]
+   </center>
+   <p>
+   <table class="diff" width="100%">
+      <tr>
+         <th style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev2]</b></th>
+         <th rowspan=100000 width=5></th>
+         <th style="padding-bottom: 5px" width="50%" align="left"><b>[lang:REV] [websvn:rev1]</b></th>
+      </tr>
+   
+      [websvn-startlisting]
+         [websvn-test:rev1lineno]
+            <tr>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center"><b>[lang:LINE] [websvn:rev1lineno]...</b></td>
+               <td width="50%" style="padding: 3px 0 3px 0" align="center"><b>[lang:LINE] [websvn:rev2lineno]...</b></td>
+            <tr>
+         [websvn-else]
+            <tr><td class="[websvn:rev1diffclass]">[websvn:rev1line]</td>
+            <td class="[websvn:rev2diffclass]">[websvn:rev2line]</td></tr>
+         [websvn-endtest]
+      [websvn-endlisting]
+   
+   </table>
+[websvn-endtest]
+

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/directory.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/directory.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/directory.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,114 @@
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+<b>[lang:PATH]:</b> [websvn:path]
+<br><b>[lang:REV]:</b> [websvn:rev]
+<p><hr>
+<b>[lang:CURDIR]:</b> [websvn:curdirlinks] - [websvn:curdirloglink] - [websvn:curdircomplink]
+[websvn-test:allowdownload]
+ - [websvn:curdirdllink]
+[websvn-endtest]
+[websvn-test:curdirrsslink]
+ - [websvn:curdirrssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/Standard/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a>
+[websvn-endtest]
+
+[websvn-defineicons]
+dir=&nbsp;&nbsp;&nbsp;&nbsp;
+i-node=&nbsp;&nbsp;&nbsp;&nbsp;
+t-node=&nbsp;&nbsp;&nbsp;&nbsp;
+l-node=&nbsp;&nbsp;&nbsp;&nbsp;
+e-node=&nbsp;&nbsp;&nbsp;&nbsp;
+*=&nbsp;&nbsp;&nbsp;&nbsp;
+[websvn-enddefineicons]
+
+<p>
+[websvn:compare_form]
+   <table class="outlined" width="100%" cellpadding="2">
+      <tr>
+         <th width="100%"><b>Path</b></th>
+         <th><b>[lang:NOBR][lang:LOG][lang:ENDNOBR]</b></th>
+         [websvn-test:allowdownload]
+            <th><b>[lang:TARBALL]</b></th>
+         [websvn-endtest]
+         [websvn-test:curdirrsslink]
+            <th><b>[lang:RSSFEED]</b></th>
+         [websvn-endtest]
+      </tr>
+      [websvn-startlisting]
+      <tr>
+         <td class="[websvn:rowparity]">
+            [websvn:compare_box]
+            [websvn-treenode]
+            [websvn:filelink]
+         </td>
+         <td class="[websvn:rowparity]">[lang:NOBR][websvn:fileviewloglink][lang:ENDNOBR]</td>
+         [websvn-test:allowdownload]
+            <td class="[websvn:rowparity]">[websvn:fileviewdllink]</td>
+         [websvn-endtest]
+         [websvn-test:curdirrsslink]
+            <td class="row[websvn:rowparity]">[websvn:rssanchor]<img style="border: 0;" src="[websvn:locwebsvnhttp]/templates/Standard/xml.gif" width="36" height="14" alt="[lang:RSSFEED]"></a></td>
+         [websvn-endtest]
+      </tr>
+      [websvn-endlisting]
+   </table>
+<p>
+[websvn:compare_submit]  
+[websvn:compare_endform]
+<hr>
+[websvn-test:goyoungestlink]
+ - [websvn:goyoungestlink]
+[websvn-endtest]
+<br><b>[lang:LASTMOD]:</b> [lang:REV] [websvn:lastchangedrev] - [websvn:author] - [websvn:date]
+<br><b>[lang:LOGMSG]:</b><br>
+[websvn:log]
+<p>
+[websvn-test:hidechanges]
+   <p>[websvn:showchangeslink]
+[websvn-endtest]
+
+[websvn-test:showchanges]
+   <p><b>[lang:CHANGES]:</b><br>
+   <p>[websvn:hidechangeslink]
+   <p>
+      <center>
+      <table border=1 class="bordered" cellpadding=4>
+         <tr>
+            <th><center><b>[lang:NEWFILES]</b></center></th>
+            <th><center><b>[lang:CHANGEDFILES]</b></center></th>
+            <th><center><b>[lang:DELETEDFILES]</b></center></th>
+         </tr>
+         <tr>  
+            <td valign="top">
+            [websvn-test:newfilesbr]
+               [websvn:newfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+            <td valign="top">
+            [websvn-test:changedfilesbr]
+               [websvn:changedfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+            <td valign="top">
+            [websvn-test:deletedfilesbr]
+               [websvn:deletedfilesbr]
+            [websvn-else]
+               &nbsp;
+            [websvn-endtest]
+            </td>
+         </tr>
+      </table>
+   </center>
+[websvn-endtest]
+
+

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/file.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/file.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/file.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,25 @@
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+<b>[lang:PATH]:</b> [websvn:path]
+<br><b>[lang:REV]:</b> [websvn:rev]
+<p><hr>
+<b>[lang:CURDIR]:</b> [websvn:curdirlinks]
+<p>
+
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+
+[websvn:prevdifflink] - [websvn:blamelink]
+<p>
+<table width="100%" border=1><tr><td>
+[websvn-getlisting]
+</td></tr></table>

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/footer.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/footer.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/footer.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,2 @@
+   </body>
+</html>

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/header.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/header.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/header.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,51 @@
+<html>
+   <head>
+		<meta http-equiv="content-type" content="text/html;charset=[websvn:charset]">
+	   <link href="[websvn:locwebsvnhttp]/templates/zinn/styles.css" rel="stylesheet" media="screen">
+      <script>
+         function checkCB(chBox)
+         {
+            count = 0
+            first = null
+            f = chBox.form
+            for (i = 0 ; i < f.elements.length ; i++)
+            if (f.elements[i].type == 'checkbox' && f.elements[i].checked)
+            {
+               if (first == null && f.elements[i] != chBox)
+                  first = f.elements[i]
+               count += 1
+            }
+            
+            if (count > 2) 
+            {
+               first.checked = false
+               count -= 1
+            }
+         }
+      </script>
+      <title>
+         WebSVN
+         [websvn-test:repname]
+            - [websvn:repname]
+         [websvn-endtest]
+         [websvn-test:action]
+            - [websvn:action]
+         [websvn-endtest]
+         [websvn-test:rev2]
+            [websvn-test:path2]
+               - [websvn:path1] [lang:REV] [websvn:rev1] [lang:AND] [websvn:path2] [lang:REV] [websvn:rev2]
+            [websvn-else]
+               - [lang:REV] [websvn:rev1] [lang:AND] [websvn:rev2]
+            [websvn-endtest]
+         [websvn-else]
+            [websvn-test:rev]
+               - [lang:REV] [websvn:rev]
+            [websvn-endtest]
+         [websvn-endtest]
+         [websvn-test:path]
+            - [websvn:path]
+         [websvn-endtest]
+      </title>
+
+   </head>
+   <body>

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/index.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/index.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/index.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,15 @@
+
+<table border=0 cellspacing=0 cellpadding=0 align="center">
+   <tr>
+      <td align="center">
+         <br><h1>[lang:PROJECTS]:</h1>
+         <p><hr><p>
+         <table width="100%" class="outlined" cellpadding="2">
+            [websvn-startlisting]
+               <tr><td>[websvn:projlink]</td></tr>
+            [websvn-endlisting]
+         </table>
+      </td>
+   </tr>
+</table>
+  

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/log.tmpl
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/log.tmpl	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/log.tmpl	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,62 @@
+<table width="100%" border="0">
+   <tr>
+      <td>
+         <h1>[websvn:repname]</h1>
+      </td>
+      <td>
+         <div align="right">[websvn:projects_form][websvn:projects_select][websvn:projects_submit][websvn:projects_endform]</div>
+      </td>
+   </tr>
+</table>
+<b>[lang:PATH]:</b> [websvn:path]
+<br><b>[lang:REV]:</b> [websvn:rev]
+<p><hr>
+<b>[lang:CURDIR]:</b> [websvn:curdirlinks]<br><br>
+[websvn-test:goyoungestlink]
+[websvn:goyoungestlink]<p>
+[websvn-endtest]
+
+<center>
+[websvn:logsearch_form][lang:SEARCHLOG]: [websvn:logsearch_inputbox][websvn:logsearch_submit]
+[websvn-test:logsearch_clearloglink]
+<p><font size="-1">[websvn:logsearch_clearloglink]</font><p>
+[websvn-endtest]
+[websvn:logsearch_endform]
+</center>
+
+[websvn-test:logsearch_nomatches]
+   <center>[lang:NORESULTS]</center>
+[websvn-endtest]
+
+[websvn-test:logsearch_resultsfound]
+   [websvn:compare_form]
+      <table border=1 class="outlined" width="100%" cellpadding=2>
+         <tr>
+            <th>[lang:REV]</th>
+            <th>[lang:PATH]</th>
+            <th>[lang:AUTHOR]</th>
+            <th>[lang:AGE]</th>
+            <th>[lang:LOGMSG]</th>
+         </tr>
+      
+         [websvn-startlisting]
+         <tr>
+            <td valign="top" class="[websvn:rowparity]"><nobr>[websvn:compare_box][websvn:revlink]</nobr></td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revpathlink]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revauthor]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revage]</td>
+            <td valign="top" class="[websvn:rowparity]">[websvn:revlog]</td>
+         </tr>
+         [websvn-endlisting]
+      </table>
+      <p>
+      [websvn:compare_submit]  
+   [websvn:compare_endform]
+[websvn-endtest]
+   
+[websvn-test:logsearch_nomorematches]
+   <p><center>[lang:NOMORERESULTS]</center>
+[websvn-endtest]
+
+<p><center>[websvn:logsearch_moreresultslink]</center>
+<p><center>[websvn:pagelinks]<p>[websvn:showalllink]</center>

Added: trunk/svn.matroska.org/WebSVN/templates/Zinn/styles.css
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates/Zinn/styles.css	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates/Zinn/styles.css	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,99 @@
+
+body
+{
+   font-family: Verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular;
+   background-color: white;
+   margin: 20px;
+   padding: 0px;
+   font-size: 76%;
+}
+
+H1
+{ 
+   color: #8c0000;
+   font-size: 30px;
+   font-weight: normal;
+   font-family: Verdana, Arial, Helvetica, Geneva, Swiss, SunSans-Regular;
+   text-decoration: none;
+}
+
+a:link { color: black;
+   font-size: 76%;
+}
+a:visited { color: black;
+   font-size: 76%;
+}
+
+HR { color: #8c0000; background-color: #8c0000  }
+
+.highlight { color: #8c0000; font-style: italic;  }
+
+TABLE.bordered, TABLE.outlined, TABLE.blame
+{
+   border-collapse: collapse;
+   border: solid 2px #8c0000;
+}
+
+.bordered TD, .bordered TH
+{
+   border: solid 2px #8c0000;
+}
+
+.outlined TH, .blame TH
+{
+   padding: 5px 5px 5px 5px;
+   font-weight: bold;
+   border: solid 2px #8c0000;
+}
+
+.outlined TD, .blame TD
+{
+   padding: 1px 5px 1px 5px;
+   border-right: solid 2px #8c0000;
+   border-bottom: solid 1px #F0F0F0;
+}
+
+.blame TD
+{
+   font-size: 11px;
+}
+
+.blame TD A 
+{
+   font-size: 100%;
+}
+
+TD.diffdeleted
+{
+   font-size: 11px;
+   background-color: red;
+}
+
+TD.diffchanged
+{
+   font-size: 11px;
+   background-color: yellow;
+}
+
+TD.diffadded
+{
+   font-size: 11px;
+   background-color: green;
+}
+
+TD.diff
+{
+   font-size: 11px;
+   background-color: #D0D0D0;
+}
+
+TABLE.diff
+{
+   border-collapse: collapse;
+}
+
+DIV.newpath
+{
+   padding: 5px 5px 5px 5px;
+   border: solid 2px #8c0000;
+}
\ No newline at end of file

Added: trunk/svn.matroska.org/WebSVN/templates.txt
===================================================================
--- trunk/svn.matroska.org/WebSVN/templates.txt	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/templates.txt	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,340 @@
+
+THE TEMPLATING SYSTEM
+~~~~~~~~~~~~~~~~~~~~~
+
+Everyone wants their view onto their SVN repository to fit in with their look
+and feel.  With WebSVN's templating system this is very possible.
+
+To create your own templates, you first need to change your config.inc file to
+tell WebSVN where the templates are stored.  For example:
+
+$config->setTemplatePath("./templates/Standard/");
+
+This directory should contain at least the following files:
+
+header.tmpl - Header templated included before any other
+footer.tmpl - Footer templated included after any other
+
+index.tmpl - The main project page template
+
+directory.tmpl - Listing of a directory
+log.tmple - Log of a directory or file
+file.tmpl - Contents of a text file
+diff.tmpl - Differences between text files
+blame.tmpl - Blame information for a file
+
+Each template file should be written in HTML, but is allowed to contain certain
+WebSVN controls.  There are two control types, commands and variables.
+
+
+COMMANDS
+~~~~~~~~
+
+NOTE:  Commands MUST appear on their own line.
+
+---
+
+[websvn-test:varname]
+...
+[websvn-else]
+...
+[websvn-endtest]
+
+If the variable is non-0 write out the first part else write out the second
+
+---
+
+[websvn-startlisting]
+...
+[websvn-endlisting]
+
+
+Used in pages that contain listings of files, logs, etc.  Everything between
+the controls is repeated for each item in the list
+
+---
+
+[websvn-defineicons] (used in directory.tmpl only)
+...
+[websvn-enddefineicons]
+...
+
+[websvn-treenode]
+[websvn-icon]
+
+These commands are used to display certain icons next to certain file types in
+the directory view.
+
+The [websvn-defineicons] block should contain a line for each file type,
+defining the HTML to be used for that file type.  To define the HTML for a
+particular extension use the syntax:
+
+.<extension>=<HTML code>
+
+There are also some special filetypes:
+
+dir=<HTML code> is used for directory icons
+*=<HTML code> is used for all filetypes which have no other definition
+
+i-node - | shaped node of the tree view
+t-node - T shaped node of the tree view
+l-node - L shaped node of the tree view
+e-node - Empty node of the tree view
+
+Example from the BlueGrey scheme:
+
+[websvn-defineicons]
+dir=<img align="middle" valign="center" src="[websvn:locwebsvnhttp]/templates/BlueGrey/folder.png" alt="[FOLDER]">
+*=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/file.png" alt="[FILE]">
+.c=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/filec.png" alt="[C-FILE]">
+.h=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/fileh.png" alt="[H-FILE]">
+.s=<img align="middle" src="[websvn:locwebsvnhttp]/templates/BlueGrey/files.png" alt="[S-FILE]">
+
+i-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/i-node.png" alt="[NODE]">
+t-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/t-node.png" alt="[NODE]">
+l-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/l-node.png" alt="[NODE]">
+e-node=<img align="middle" border="0" width="24" height="26" src="[websvn:locwebsvnhttp]/templates/BlueGrey/e-node.png" alt="[NODE]">
+[websvn-enddefineicons]
+
+Inside the [websvn-startlisting] block, the command [websvn-treeview] will
+output the HTML code defined for the appropriate tree view icon.
+[websvn-icon] will output the HTML code defined for the type of the current
+file.
+
+---
+
+[websvn-getlisting] (used in file.tmpl only)
+ 
+Get the contents of the file being viewed and output it exactly (surrounded
+with <PRE> .. </PRE>).
+
+VARIABLES
+~~~~~~~~~
+
+Variables are written in the form [websvn:varname] where varname is the name of
+a variable passed to the template.  The control is replaced with the variable
+required.
+
+The variables available are described below for each template.
+You may also access the language file using [lang:varname] is order to keep your
+templates international!
+
+Take special notice of the use of the locwebsvnhttp variable.  It should be used
+to locate other files and graphics that your templates need.  For example:
+
+<link href="[websvn:locwebsvnhttp]/templates/tmptname/styles.css" ...
+
+You may imagine that simply using . in place should work, however this isn't
+the case when MultiViews are turned on.  Using this variable gives you a way to
+access your template files in all cases.
+
+Variables defined for in all scripts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+locwebsvnhttp - Root of websvn directory
+charset - The charset requested by the user
+
+projects_form - HTML <form> specification for the projects selection box
+projects_select - HTML <select>...</select> specification for the project
+                  options
+projects_submit - HTML <input> specification for the projects selection GO
+                  button
+projects_endform - HTML </form> specification for the projects selection
+                   box (includes hidden field declarations)
+
+
+
+Variables defined for index.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+projlink - Link to the project
+rowparity - Parity of the row (0 or 1).  Used to generate striped tables
+
+Variables defined for directory.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+repname - Name of the repository
+rev - Revision being viewed
+path - Path of item being logged
+author - Author of current revision
+date - Date that revision was committed
+log - Log message of revision
+lastchangedrev - Revision of the last modification to current directory
+goyoungestlink - Link to head revision of repository
+
+showchanges - 1 if showing changes (for websvn-test)
+hidechanges - 1 if hiding changes (for websvn-test)
+showchangeslink - Link to page with changes hidden
+hidechangeslink - Link to page with changes shown
+
+newfilesbr - list of the new files separated by <BR>'s
+changedfilesbr - list of the changed files separated by <BR>'s
+deletedfilesbr - list of the deleted files separated by <BR>'s
+
+newfiles - list of the new files separated by spaces
+changedfiles - list of the changed files separated by spaces
+deletedfiles - list of the deleted files separated by spaces
+
+curdirlinks - List of the path of this directory with links to each one
+curdirloglink - Link to the log view of current directory
+curdirrsslink - Link to the RSS feed for the current directory
+curdirrssanchor - The <a href=...> tag to the RSS feed for the current directory
+curdirdllink - Link to the tarball of current directory
+curdircomplink - Link to comparison with previously changed revision
+
+allowdownload - True if downloading has been configured
+
+compare_form - HTML <form> specification for the comparison form
+compare_submit - HTML <input> specification for the comparison button
+compare_endform - HTML </form> specification for the comparison form
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+compare_box - HTML checkbox specification for the comparison option
+filelink - Link to the file
+rowparity - Parity of the row (0 or 1).  Used to generate striped tables
+fileviewloglink - Link to the log page for the file
+fileviewdllink - Link to the tarball of current directory
+isDir - true if the current file is a directory (use with [websvn-test:isDir]
+        to display icons) 
+rsslink - Link to the RSS feed for this file/directory
+rssanchor - The <a href=...> tag to the RSS feed for this file/directory
+
+Variables defined for log.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+action - Action being performed ("Log")
+
+repname - Name of the repository
+rev - Revision being viewed
+path - Path of item being logged
+curdirlinks - List of the path of this directory with links to each one
+
+pagelinks - List of list to all the pages of the log
+showalllink - Link to show the entire log in one go
+
+logsearch_form - HTML <form> specification for the log search box
+logsearch_inputbox - HTML <input> specification for the log search box
+logsearch_submit - HTML <input> specification for the log search GO button
+logsearch_endform -  HTML </form> specification for the log search box box
+                     (includes hidden field declarations)
+logsearch_clearloglink - Link to unfiltered display (remove current search
+                         criteria)
+                         
+logsearch_resultsfound - true when there are logs to display
+logsearch_nomatches - true when there are no matches for the current request
+logsearch_nomorematches - true when there are no further matches to the current
+                          request (but there have been previous pages,
+                          for example)
+
+compare_form - HTML <form> specification for the comparison form
+compare_submit - HTML <input> specification for the comparison button
+compare_endform - HTML </form> specification for the comparison form
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+compare_box - HTML checkbox specification for the comparison option
+revpathlink - Link to revision
+revauthor - Author of this revision
+revage - Age of revision
+revlog - Log message of revision
+
+
+Variables defined for file.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+repname - Name of the repository
+rev - Revision being viewed
+path - Path of item being logged
+curdirlinks - List of the path of this directory with links to each one
+
+prevdifflink - Link to comparison with previous revision
+blamelink - Link to the blame information for this file
+
+Note: Use command [websvn-getlisting] to display the listing.
+
+
+Variables defined for diff.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+action - Action being performed ("Diff")
+locwebsvnhttp - Root of websvn directory
+charset - The charset requested by the user
+
+repname - Name of the repository
+rev - Revision being viewed
+path - Path of item being logged
+curdirlinks - List of the path of this directory with links to each one
+
+rev1 - Revision of the older file
+rev2 - Revision of the newer file
+
+showcompactlink - Link to compact view
+showalllink - Link to full view
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+rev1lineno / rev2lineno - Line number of the next difference block.  Only
+                          defined at the start of the block.
+rev2diffclass / rev2diffclass - Class name of the diff block used for colouring
+                                differences.  The result is one of:
+                                    * diff (no changes)
+                                    * diffadded
+                                    * diffchanged
+                                    * diffdeleted
+rev1line / rev2line - The line under comparison
+
+Variables defined for blame.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+locwebsvnhttp - Root of websvn directory
+charset - The charset requested by the user
+
+repname - Name of the repository
+rev - Revision being viewed
+path - Path of item being logged
+curdirlinks - List of the path of this directory with links to each one
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+lineno - Line number of the line
+revision - Revision in which the line changed
+author - Last author to modify the line
+line - The line itself
+
+Variables defined for compare.tmpl
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+action - Action being performed ("Path Comparison")
+repname - Name of the repository
+path1 - First path being compared 
+rev1 - Revision of first path
+path2 - Second path being compared 
+rev2 - Revision of second path
+
+success = true if the comparison succeeded
+
+revlink - Link to reverse comparison
+
+compare_form - HTML <form> specification for the comparison form
+compare_path1input/compare_path2input - HTML specifications for the path input areas
+compare_rev1input/compare_rev2input - HTML specifications for the revision input areas                                        
+compare_submit - HTML <input> specification for the comparison button
+compare_endform - HTML </form> specification for the comparison form
+
+Used in [websvn-startlisting] ... [websvn-endlisting] block:
+
+newpath - Name of new file under comparison (only defined at start of block)
+difflines - Lines changed information for this file.  Start of diff lines.
+            (only defined after newpath)
+diffclass - Class name of the diff block used for colouring
+            differences.  The result is one of:
+               * diff (no changes)
+               * diffadded
+               * diffdeleted
+line - The line under comparison
+enddifflines - End of diff lines
+properties - Property changes
+endpath - End of current path

Added: trunk/svn.matroska.org/WebSVN/wsvn.php
===================================================================
--- trunk/svn.matroska.org/WebSVN/wsvn.php	2005-07-11 21:06:24 UTC (rev 965)
+++ trunk/svn.matroska.org/WebSVN/wsvn.php	2005-08-02 22:50:12 UTC (rev 966)
@@ -0,0 +1,131 @@
+<?php
+
+// WebSVN - Subversion repository viewing via the web using PHP
+// Copyright (C) 2004 Tim Armes
+//
+// 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
+//
+// --
+//
+
+// --- CONFIGURE THESE VARIABLES ---
+
+// Location of websvn directory via HTTP
+//
+// e.g.  For http://servername/websvn use /websvn
+//
+// Note that wsvn.php need not be in the /websvn directory (and normally isn't).
+$locwebsvnhttp = "/websvn";  
+
+// Physical location of websvn directory
+$locwebsvnreal = "d:/websvn";
+
+chdir($locwebsvnreal);
+
+// --- DON'T CHANGE BELOW HERE ---
+
+ini_set("include_path", $locwebsvnreal);
+
+require_once("include/setup.inc");
+require_once("include/svnlook.inc");
+
+if (!isset($_REQUEST["sc"]))
+   $_REQUEST["sc"] = 1;
+
+if ($config->multiViews)
+{
+   // If this is a form handling request, deal with it
+   if (@$_REQUEST["op"] == "form")
+   {
+      include("$locwebsvnreal/form.php");
+      exit;
+   }
+
+   $path = @$_SERVER["PATH_INFO"];
+
+   // Remove initial slash
+   $path = substr($path, 1);
+   if (empty($path))
+   {
+      include("$locwebsvnreal/index.php");
+      exit;
+   }
+   
+   // Get the repository name
+   $pos = strpos($path, "/");
+
+   if ($pos === false)
+   {
+      $name = substr($path, 0);
+      $path = "/";
+   }
+   else
+   {
+      $name = substr($path, 0, $pos);
+      $path = substr($path, $pos);
+   }
+      
+   $rep = $config->findRepository($name);
+   createProjectSelectionForm();
+   $vars["allowdownload"] = $rep->getAllowDownload();
+
+   // find the operation type
+   $op = @$_REQUEST["op"];
+   switch ($op)
+   {
+      case "dir":
+         $file = "listing.php";
+         break;
+         
+      case "file":
+         $file = "filedetails.php";
+         break;
+
+      case "log":
+         $file = "log.php";
+         break;
+
+      case "diff":
+         $file = "diff.php";
+         break;
+
+      case "blame":
+         $file = "blame.php";
+         break;
+
+      case "rss":
+         $file = "rss.php";
+         break;
+      
+      case "dl":
+         $file = "dl.php";
+         break;
+
+      case "comp":
+         $file = "comp.php";
+         break;
+
+      default:
+         $file = "listing.php";
+   }
+   
+   // Now include the file that handles it
+   include("$locwebsvnreal/$file");
+}
+else
+{
+   print "<p>MultiViews must be configured in config.inc in order to use this file";
+   exit;
+}