mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-30 03:41:36 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			944 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			944 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| /*
 | |
|   +----------------------------------------------------------------------+
 | |
|   | PHP Version 5                                                        |
 | |
|   +----------------------------------------------------------------------+
 | |
|   | Copyright (c) 1997-2004 The PHP Group                                |
 | |
|   +----------------------------------------------------------------------+
 | |
|   | This source file is subject to version 3.0 of the PHP license,       |
 | |
|   | that is bundled with this package in the file LICENSE, and is        |
 | |
|   | available through the world-wide-web at the following url:           |
 | |
|   | http://www.php.net/license/3_0.txt.                                  |
 | |
|   | If you did not receive a copy of the PHP license and are unable to   |
 | |
|   | obtain it through the world-wide-web, please send a note to          |
 | |
|   | license@php.net so we can mail you a copy immediately.               |
 | |
|   +----------------------------------------------------------------------+
 | |
|   | Authors:    Thomas Schöfbeck <tom@php.net>                           |
 | |
|   |             Gabor Hojtsy <goba@php.net>                              |
 | |
|   |             Mark Kronsbein <mk@php.net>                              |
 | |
|   |             Jan Fabry <cheezy@php.net>
 | |
|   +----------------------------------------------------------------------+
 | |
| */
 | |
| if ($argc < 2 || $argc > 3) {
 | |
| ?>
 | |
| 
 | |
| Check the revision of translated files against
 | |
| the actual english xml files, and print statistics
 | |
| 
 | |
|   Usage:
 | |
|   <?=$argv[0]?> <language-code> [<maintainer>] [><revcheck.html>]
 | |
| 
 | |
|   <language-code> must be a valid language code used
 | |
|   in the repository
 | |
| 
 | |
|   If you specify <maintainer>, the script only checks
 | |
|   the files maintained by the person you add here
 | |
| 
 | |
|   If you specify ><revcheck.html>, the output is an html file.
 | |
|   
 | |
|   Read more about Revision comments and related
 | |
|   funcionality in the PHP Documentation Howto.
 | |
|    
 | |
|   Authors: Thomas Schöfbeck <tom@php.net>
 | |
|            Gabor Hojtsy <goba@php.net>
 | |
|            Mark Kronsbein <mk@php.net> 
 | |
|            Jan Fabry <cheezy@php.net>
 | |
| 
 | |
| <?php
 | |
|   exit;
 | |
| }
 | |
| 
 | |
| // Long runtime
 | |
| set_time_limit(0);
 | |
| 
 | |
| // disable E_NOTICE
 | |
| error_reporting(E_ALL ^ E_NOTICE);
 | |
| 
 | |
| // A file is criticaly "outdated' if
 | |
| define("ALERT_REV",   10); // translation is 10 or more revisions behind the en one
 | |
| define("ALERT_SIZE",   3); // translation is  3 or more kB smaller than the en one
 | |
| define("ALERT_DATE", -30); // translation is 30 or more days older than the en one
 | |
| 
 | |
| // Revision marks used to flag files
 | |
| define("REV_UPTODATE", 1); // actual file
 | |
| define("REV_NOREV",    2); // file with revision comment without revision
 | |
| define("REV_CRITICAL", 3); // criticaly old / small / outdated
 | |
| define("REV_OLD",      4); // outdated file
 | |
| define("REV_NOTAG",    5); // file without revision comment
 | |
| define("REV_NOTRANS",  6); // file without translation
 | |
| 
 | |
| define("REV_CREDIT",   7); // only used in translators list
 | |
| define("REV_WIP",      8); // only used in translators list
 | |
| 
 | |
| // Colors used to mark files by status (colors for the above types)
 | |
| $CSS = array(
 | |
|   REV_UPTODATE => "act",
 | |
|   REV_NOREV    => "norev",
 | |
|   REV_CRITICAL => "crit",
 | |
|   REV_OLD      => "old",
 | |
|   REV_NOTAG    => "wip",
 | |
|   REV_NOTRANS  => "wip",
 | |
|   REV_CREDIT   => "wip",
 | |
|   REV_WIP      => "wip",
 | |
| );
 | |
| 
 | |
| // Option for the link to cvs.php.net: normal: "&f=h"
 | |
| // long diff: "&f=h&num=10", unified (text): "&f=u"
 | |
| define("CVS_OPT", "&f=h&num=10");
 | |
| 
 | |
| // Initializing variables from parameters
 | |
| $LANG = $argv[1];
 | |
| if ($argc == 3) {
 | |
|     $MAINT = $argv[2];
 | |
| } else {
 | |
|     $MAINT = "";
 | |
| }
 | |
| 
 | |
| // Main directory of the PHP documentation (depends on the
 | |
| // sapi used). We do need the trailing slash!
 | |
| if ("cli" === php_sapi_name()) {
 | |
| 	if (isset($PHPDOCDIR) && is_dir($PHPDOCDIR))
 | |
| 		$DOCDIR = $PHPDOCDIR."/";
 | |
| 	else
 | |
| 		$DOCDIR = "./";
 | |
| } else
 | |
| 	$DOCDIR = "../";
 | |
| 
 | |
| // =========================================================================
 | |
| // Functions to get revision info and credits from a file
 | |
| // =========================================================================
 | |
| 
 | |
| // Grabs the revision tag and stores credits from the file given
 | |
| function get_tags($file, $val = "en-rev")
 | |
| {
 | |
|     // Read the first 500 chars. The comment should be at
 | |
|     // the begining of the file
 | |
|     $fp = @fopen($file, "r") or die ("Unable to read $file.");
 | |
|     $line = fread($fp, 500);
 | |
|     fclose($fp);
 | |
| 
 | |
|     // Check for English CVS revision tag (. is for $ in the preg!),
 | |
|     // Return if this was needed (it should be there)
 | |
|     if ($val == "en-rev") {
 | |
|         preg_match("/<!-- .Revision: \d+\.(\d+) . -->/", $line, $match);
 | |
|         return $match[1];
 | |
|     }
 | |
| 
 | |
|     // Handle credits (only if no maintainer is specified)
 | |
|     if ($val == "\\S*") {
 | |
|     
 | |
|         global $files_by_maint;
 | |
| 
 | |
|         // Find credits info, let more credits then one,
 | |
|         // using commas as list separator
 | |
|         if (preg_match("'<!--\s*CREDITS:\s*(.+)\s*-->'U", $line, $match_credit)) {
 | |
|           
 | |
|             // Explode with commas a separators
 | |
|             $credits = explode(",", $match_credit[1]);
 | |
|           
 | |
|             // Store all elements
 | |
|             foreach ($credits as $num => $credit) {
 | |
|                 $files_by_maint[trim($credit)][REV_CREDIT]++;
 | |
|             }
 | |
|           
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // No match before the preg
 | |
|     $match = array();
 | |
|     
 | |
|     // Check for the translations "revision tag"
 | |
|     preg_match ("/<!--\s*EN-Revision:\s*\d+\.(\d+)\s*Maintainer:\s*("
 | |
|                 . $val . ")\s*Status:\s*(.+)\s*-->/U", 
 | |
|                 $line,
 | |
|                 $match
 | |
|     );
 | |
| 
 | |
|     // The tag with revision number is not found so search
 | |
|     // for n/a revision comment (comment where revision is not known)
 | |
|     if (count($match) == 0) {
 | |
|         preg_match ("'<!--\s*EN-Revision:\s*(n/a)\s*Maintainer:\s*("
 | |
|                     . $val . ")\s*Status:\s*(.+)\s*-->'U",
 | |
|                     $line,
 | |
|                     $match
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     // Return with found revision info (number, maint, status)
 | |
|     return $match;
 | |
|     
 | |
| } // get_tags() function end
 | |
| 
 | |
| 
 | |
| // =========================================================================
 | |
| // Functions to check file status in translated directory, and store info
 | |
| // =========================================================================
 | |
| 
 | |
| // Checks a file, and gather status info
 | |
| function get_file_status($file)
 | |
| {
 | |
|     // The information is contained in these global arrays and vars
 | |
|     global $DOCDIR, $LANG, $MAINT, $files_by_mark, $files_by_maint;
 | |
|     global $file_sizes_by_mark;
 | |
|     global $missing_files, $missing_tags, $using_rev;
 | |
| 
 | |
|     // Transform english file name to translated file name
 | |
|     $trans_file = preg_replace("'^".$DOCDIR."en/'", $DOCDIR.$LANG."/", $file);
 | |
| 
 | |
|     // If we cannot find the file, we push it into the missing files list
 | |
|     if (!@file_exists($trans_file)) {
 | |
|         $files_by_mark[REV_NOTRANS]++;
 | |
|         $trans_name = substr($trans_file, strlen($DOCDIR) + strlen($LANG) + 1);
 | |
|         $size = round(filesize($file)/1024, 1);
 | |
|         $missing_files[$trans_name] = array( $size );
 | |
|         $file_sizes_by_mark[REV_NOTRANS] += $size;
 | |
|         // compute en-tags just if they're needed in the WIP-Table
 | |
|         if($using_rev) {
 | |
|         	$missing_files[$trans_name][] = "1.".get_tags($file);
 | |
|         }
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     // No specific maintainer, check for a revision tag
 | |
|     if (empty($MAINT)) {
 | |
|         $trans_tag = get_tags($trans_file, "\\S*");
 | |
|     }
 | |
|     // If we need to check for a specific translator
 | |
|     else {
 | |
|         // Get translated files tag, with maintainer
 | |
|         $trans_tag = get_tags($trans_file, $MAINT);
 | |
| 
 | |
|         // If this is a file belonging to another
 | |
|         // maintainer, than we would not like to
 | |
|         // deal with it anymore
 | |
|         if (count($trans_tag) == 0) {
 | |
|             $trans_tag = get_tags($trans_file, "\\S*");
 | |
|             // We found a tag for another maintainer
 | |
|             if (count($trans_tag) > 0) {
 | |
|                 return FALSE;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Compute sizes and diffs
 | |
|     $en_size    = intval(filesize($file) / 1024);
 | |
|     $trans_size = intval(filesize($trans_file) / 1024);
 | |
|     $size_diff  = intval($en_size) - intval($trans_size);
 | |
|     
 | |
|     // If we found no revision tag, then collect this
 | |
|     // file in the missing tags list
 | |
|     if (count($trans_tag) == 0) {
 | |
|         $files_by_mark[REV_NOTAG]++;
 | |
|         $file_sizes_by_mark[REV_NOTAG] += $en_size;
 | |
|         $missing_tags[] = array(substr($trans_file, strlen($DOCDIR)), $en_size, $trans_size, $size_diff);
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     // Distribute values in separate vars for further processing
 | |
|     list(, $this_rev, $this_maint, $this_status) = $trans_tag;
 | |
| 
 | |
|     // Get English file revision
 | |
|     $en_rev = get_tags($file);
 | |
|     
 | |
|     // If we have a numeric revision number (not n/a), compute rev. diff
 | |
|     if (is_numeric($this_rev)) {
 | |
|         $rev_diff   = intval($en_rev) - intval($this_rev);
 | |
|         $trans_rev  = "1." . $this_rev;
 | |
|         $en_rev     = "1." . $en_rev;
 | |
|     } else {
 | |
|         // If we have no numeric revision, make all revision
 | |
|         // columns hold the rev from the translated file
 | |
|         $rev_diff = $trans_rev = $this_rev;
 | |
|         $en_rev   = "1." . $en_rev;
 | |
|     }
 | |
| 
 | |
|     // If the file is up-to-date
 | |
|     if ($rev_diff === 0) {
 | |
|         // Store file by status and maintainer
 | |
|         $files_by_mark[REV_UPTODATE]++;
 | |
|         $files_by_maint[$this_maint][REV_UPTODATE]++;
 | |
|         $file_sizes_by_mark[REV_UPTODATE] += $en_size;
 | |
|         
 | |
|         return FALSE;
 | |
|     } 
 | |
| 
 | |
|     // Compute times and diffs
 | |
|     $en_date    = intval((time() - filemtime($file)) / 86400);
 | |
|     $trans_date = intval((time() - filemtime($trans_file)) / 86400);
 | |
|     $date_diff  = $en_date - $trans_date;
 | |
| 
 | |
|     // Make decision on file category by revision, date and size
 | |
|     if ($rev_diff >= ALERT_REV || $size_diff >= ALERT_SIZE || $date_diff <= ALERT_DATE) {
 | |
|         $status_mark = REV_CRITICAL;
 | |
|     } elseif ($rev_diff === "n/a") {
 | |
|         $status_mark = REV_NOREV;
 | |
|     } else {
 | |
|         $status_mark = REV_OLD;
 | |
|     }
 | |
| 
 | |
|     // Store files by status, and by maintainer too
 | |
|     $files_by_mark[$status_mark]++;
 | |
|     $files_by_maint[$this_maint][$status_mark]++;
 | |
|     $file_sizes_by_mark[$status_mark] += $en_size;
 | |
| 
 | |
|     return array(
 | |
|         "full_name"  => $file,
 | |
|         "short_name" => basename($trans_file),
 | |
|         "revision"   => array($en_rev,  $trans_rev,  $rev_diff),
 | |
|         "size"       => array($en_size, $trans_size, $size_diff),
 | |
|         "date"       => array($en_date, $trans_date, $date_diff),
 | |
|         "maintainer" => $this_maint,
 | |
|         "status"     => $this_status,
 | |
|         "mark"       => $status_mark
 | |
|     );
 | |
|     
 | |
| } // get_file_status() function end
 | |
| 
 | |
| // =========================================================================
 | |
| // A function to check directory status in translated directory
 | |
| // =========================================================================
 | |
| 
 | |
| // Check the status of files in a diretory of smarty/doc XML files
 | |
| // The English directory is passed to this function to check
 | |
| function get_dir_status($dir)
 | |
| {
 | |
|     
 | |
|     // Collect files and diretcories in these arrays
 | |
|     $directories = array();
 | |
|     $files       = array();
 | |
|     
 | |
|     // Open the directory 
 | |
|     $handle = @opendir($dir);
 | |
|     
 | |
|     // Walk through all names in the directory
 | |
|     while ($file = @readdir($handle)) {
 | |
| 
 | |
|       // If we found a file with one or two point as a name,
 | |
|       // or a CVS directory, skip the file
 | |
|       if (preg_match("/^\.{1,2}/",$file) || $file == 'CVS')
 | |
|         continue;
 | |
| 
 | |
|       // Collect files and directories
 | |
|       if (is_dir($dir.$file)) { $directories[] = $file; }
 | |
|       else { $files[] = $file; }
 | |
| 
 | |
|     }
 | |
|     
 | |
|     // Close the directory
 | |
|     @closedir($handle);
 | |
|       
 | |
|     // Sort files and directories
 | |
|     sort($directories);
 | |
|     sort($files);
 | |
|       
 | |
|     // Go through files first
 | |
|     $dir_status = array();
 | |
|     foreach ($files as $file) {
 | |
|         // If the file status is OK, append the status info
 | |
|         if ($file_status = get_file_status($dir.$file)) {
 | |
|             $dir_status[] = $file_status;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Then go through subdirectories, merging all the info
 | |
|     // coming from subdirs to one array
 | |
|     foreach ($directories as $file) {
 | |
|         $dir_status = array_merge(
 | |
|             $dir_status, 
 | |
|             get_dir_status($dir.$file.'/')
 | |
|         );
 | |
|     }
 | |
|     
 | |
|     // Return with collected file info in
 | |
|     // this dir and subdirectories [if any]
 | |
|     return $dir_status;
 | |
| 
 | |
| } // get_dir_status() function end
 | |
| 
 | |
| // =========================================================================
 | |
| // Functions to read in the translation.xml file and process contents
 | |
| // =========================================================================
 | |
| 
 | |
| // Get a multidimensional array with tag attributes
 | |
| function parse_attr_string ($tags_attrs)
 | |
| {
 | |
|     $tag_attrs_processed = array();
 | |
| 
 | |
|     // Go through the tag attributes
 | |
|     foreach($tags_attrs as $attrib_list) {
 | |
| 
 | |
|       // Get attr name and values
 | |
|       preg_match_all("!(.+)=\\s*([\"'])\\s*(.+)\\2!U", $attrib_list, $attribs);
 | |
| 
 | |
|       // Assign all attributes to one associative array
 | |
|       $attrib_array = array();
 | |
|       foreach ($attribs[1] as $num => $attrname) {
 | |
|         $attrib_array[trim($attrname)] = trim($attribs[3][$num]);
 | |
|       }
 | |
| 
 | |
|       // Collect in order of tags received
 | |
|       $tag_attrs_processed[] = $attrib_array;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     // Retrun with collected attributes
 | |
|     return $tag_attrs_processed;
 | |
| 
 | |
| } // parse_attr_string() end
 | |
| 
 | |
| // Parse the translation.xml file for
 | |
| // translation related meta information
 | |
| function parse_translation($DOCDIR, $LANG, $MAINT)
 | |
| {
 | |
|     global $files_by_mark;
 | |
|     
 | |
|     // Path to find translation.xml file, set default values,
 | |
|     // in case we can't find the translation file
 | |
|     $translation_xml = $DOCDIR.$LANG."/translation.xml";
 | |
|     $output_charset  = 'iso-8859-1';
 | |
|     $translation     = array(
 | |
|         "intro"    => "",
 | |
|         "persons"  => array(),
 | |
|         "files"    => array(),
 | |
|         "allfiles" => array(),
 | |
|     );
 | |
|     
 | |
|     // Check for file availability, return with default
 | |
|     // values, if we cannot find the file
 | |
|     if (!@file_exists($translation_xml)) {
 | |
|         return array($output_charset, $translation);
 | |
|     }
 | |
|     
 | |
|     // Else go on, and load in the file, replacing all
 | |
|     // space type chars with one space
 | |
|     $txml = join("", file($translation_xml));
 | |
|     $txml = preg_replace("/\\s+/", " ", $txml);
 | |
| 
 | |
|     // Get intro text (different for a persons info and
 | |
|     // for a whole group info page)
 | |
|     if (empty($MAINT)) {
 | |
|         preg_match("!<intro>(.+)</intro>!s", $txml, $match);
 | |
|         $translation["intro"] = trim($match[1]);
 | |
|     } else {
 | |
|         $translation["intro"] = "Personal Statistics for ".$MAINT;
 | |
|     }
 | |
|     
 | |
|     // Get encoding for the output, from the translation.xml
 | |
|     // file encoding (should be the same as the used encoding
 | |
|     // in HTML)
 | |
|     preg_match("!<\?xml(.+)\?>!U", $txml, $match);
 | |
|     $xmlinfo = parse_attr_string($match);
 | |
|     $output_charset = $xmlinfo[1]["encoding"];
 | |
|     
 | |
|     // Get persons list preg pattern, only check for a specific
 | |
|     // maintainer, if the users asked for it
 | |
|     if (empty($MAINT)) {
 | |
|         $pattern = "!<person(.+)/\\s?>!U";
 | |
|     } else {
 | |
|         $pattern = "!<person([^<]+nick=\"".$MAINT."\".+)/\\s?>!U";
 | |
|     }
 | |
|     
 | |
|     // Find all persons matching the pattern
 | |
|     preg_match_all($pattern, $txml, $matches);
 | |
|     $translation['persons'] = parse_attr_string($matches[1]);
 | |
|     
 | |
|     // Get list of work in progress files
 | |
|     if (empty($MAINT)) {
 | |
| 
 | |
|         // Get all wip files
 | |
|         preg_match_all("!<file(.+)/\\s?>!U", $txml, $matches);
 | |
|         $translation['files'] = parse_attr_string($matches[1]);
 | |
| 
 | |
|         // Provide info about number of WIP files
 | |
|         $files_by_mark[REV_WIP] += count($translation['files']);
 | |
| 
 | |
|     } else {
 | |
|         
 | |
|         // Only check for a specific maintainer, if we were asked to
 | |
|         preg_match_all("!<file([^<]+person=\"".$MAINT."\".+)/\\s?>!U", $txml, $matches);
 | |
|         $translation['files'] = parse_attr_string($matches[1]);
 | |
| 
 | |
|         // Other maintainers wip files need to be cleared from
 | |
|         // available files list in the future, so store that info too.
 | |
|         preg_match_all("!<file(.+)/\\s?>!U", $txml, $matches);
 | |
|         $translation['allfiles'] = parse_attr_string($matches[1]);
 | |
|         
 | |
|         // Provide info about number of WIP files
 | |
|         $files_by_mark[REV_WIP] += count($translation['allfiles']);
 | |
| 
 | |
|     }
 | |
|     
 | |
|     // Return with collected info in two vars
 | |
|     return array($output_charset, $translation);
 | |
| 
 | |
| } // parse_translation() function end()
 | |
| 
 | |
| // =========================================================================
 | |
| // Debug functions for all the functions and code on this page
 | |
| // =========================================================================
 | |
| 
 | |
| // Print preformatted (debug function)
 | |
| function print_pre($var)
 | |
| {
 | |
|     print("<pre>");
 | |
|     print_r($var);
 | |
|     print("</pre>");
 | |
| } // print_pre() function end
 | |
| 
 | |
| // =========================================================================
 | |
| // Start of the program execution
 | |
| // =========================================================================
 | |
| 
 | |
| // Check for directory validity
 | |
| if (!@is_dir($DOCDIR . $LANG)) {
 | |
|     die("The $LANG language code is not valid");
 | |
| }
 | |
|   
 | |
| // Parse translation.xml file for more information
 | |
| list($charset, $translation) = parse_translation($DOCDIR, $LANG, $MAINT);
 | |
| 
 | |
| // Add WIP files to maintainers file count and figure out,
 | |
| // if we need to use optional date and revision columns
 | |
| $using_date = FALSE; $using_rev = FALSE;
 | |
| foreach ($translation["files"] as $num => $fileinfo) {
 | |
|     $files_by_maint[$fileinfo["person"]][REV_WIP]++;
 | |
|     if (isset($fileinfo["date"]))     { $using_date = TRUE; }
 | |
|     if (isset($fileinfo["revision"])) { $using_rev = TRUE; }
 | |
| }
 | |
| 
 | |
| // Get all files status
 | |
| $files_status = get_dir_status($DOCDIR."en/");
 | |
| 
 | |
| 
 | |
| $navbar = "<p class=c><a href=\"#intro\">Introduction</a> | " .
 | |
|           "<a href=\"#translators\">Translators</a> | " .
 | |
|           "<a href=\"#filesummary\">File summary by type</a> | " .
 | |
|           "<a href=\"#files\">Files</a> | ";
 | |
| if (count($translation["files"]) != 0)
 | |
| 	$navbar .= "<a href=\"#wip\">Work in progress</a> | ";
 | |
| $navbar .= "<a href=\"#misstags\">Missing revision numbers</a> | " .
 | |
|            "<a href=\"#missfiles\">Untranslated files</a></p>\n";
 | |
| 
 | |
| 
 | |
| // Figure out generation date
 | |
| $date = date("r");
 | |
|   
 | |
| // =========================================================================
 | |
| // Start of HTML page
 | |
| // =========================================================================
 | |
| 
 | |
| print <<<END_OF_MULTILINE
 | |
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
 | |
| <html>
 | |
| <head>
 | |
| <title>Smarty Manual Revision-check</title>
 | |
| <meta http-equiv="Content-Type" content="text/html; charset={$charset}">
 | |
| <style type="text/css">
 | |
| <!--
 | |
| h2,td,a,p,a.ref,th { font-family:Arial,Helvetica,sans-serif; font-size:14px; }
 | |
| h2,th,a.ref { color:#FFFFFF; }
 | |
| td,a,p { color:#000000; }
 | |
| h2     { font-size:28px; }
 | |
| th     { font-weight:bold; }
 | |
| .blue  { background-color:#666699; }
 | |
| .act   { background-color:#68D888; }
 | |
| .norev { background-color:#f4a460; }
 | |
| .old   { background-color:#eee8aa; }
 | |
| .crit  { background-color:#ff6347; }
 | |
| .wip   { background-color:#dcdcdc; }
 | |
| .r     { text-align:right }
 | |
| .rb    { text-align:right; font-weight:bold; }
 | |
| .c     { text-align:center }
 | |
| body   { margin:0px 0px 0px 0px; background-color:#F0F0F0; }
 | |
| //-->
 | |
| </style>
 | |
| </head>
 | |
| <body>
 | |
| <table width="100%" border="0" cellspacing="0" bgcolor="#666699">
 | |
| <tr><td>
 | |
| <table width="100%" border="0" cellspacing="1" bgcolor="#9999CC">
 | |
| <tr><td><h2 class=c>Status of the translated Smarty Manual</h2><p class=c style="font-size:12px;">Generated: {$date}   /   Language: $LANG<br></p></td></tr>
 | |
| </table>
 | |
| </td></tr>
 | |
| </table>
 | |
| END_OF_MULTILINE;
 | |
| 
 | |
| print ($navbar);
 | |
| 
 | |
| // =========================================================================
 | |
| // Intro block goes here
 | |
| // =========================================================================
 | |
| 
 | |
| // If we have an introduction text, print it out, with an anchor
 | |
| if (!empty($translation["intro"])) {
 | |
|     print '<a name="intro"></a>';
 | |
|     print '<table width="800" align="center"><tr><td class=c>' .
 | |
|            $translation['intro'] . '</td></tr></table><p></p>';
 | |
| }
 | |
| 
 | |
| // =========================================================================
 | |
| // Translators table goes here
 | |
| // =========================================================================
 | |
| 
 | |
| // If person list available (valid translation.xml file in lang), print out
 | |
| // the person list, with respect to the maintainer parameter specified
 | |
| if (!empty($translation["persons"])) {
 | |
| 
 | |
| print <<<END_OF_MULTILINE
 | |
| <a name="translators"></a>
 | |
| <table width="820" border="0" cellpadding="4" cellspacing="1" align="center">
 | |
| <tr class=blue>
 | |
| <th rowspan=2>Translator's name</th>
 | |
| <th rowspan=2>Contact email</th>
 | |
| <th rowspan=2>Nick</th>
 | |
| <th rowspan=2>C<br>V<br>S</th>
 | |
| <th colspan=7>Files maintained</th>
 | |
| </tr>
 | |
| <tr>
 | |
| <th class="{$CSS[REV_CREDIT]}" style="color:#000000">cre-<br>dits</th>
 | |
| <th class="{$CSS[REV_UPTODATE]}" style="color:#000000">upto-<br>date</th>
 | |
| <th class="{$CSS[REV_OLD]}" style="color:#000000">old</th>
 | |
| <th class="{$CSS[REV_CRITICAL]}" style="color:#000000">cri-<br>tical</th>
 | |
| <th class="{$CSS[REV_NOREV]}" style="color:#000000">no<br>rev</th>
 | |
| <th class="{$CSS[REV_WIP]}" style="color:#000000">wip</th>
 | |
| <th class="blue">sum</th>
 | |
| </tr>
 | |
| END_OF_MULTILINE;
 | |
| 
 | |
|     // ' Please leave this comment here
 | |
| 
 | |
|     // We will collect the maintainers by nick here
 | |
|     $maint_by_nick = array();
 | |
|     
 | |
|     // Print out a line for each maintainer (with respect to
 | |
|     // maintainer setting provided in command line)
 | |
|     foreach($translation["persons"] as $num => $person) {
 | |
|         
 | |
|         // Do not print out this person, if a
 | |
|         // specific maintainer info is asked for
 | |
|         if (!empty($MAINT) && $person["nick"] != $MAINT) {
 | |
|             continue;
 | |
|         }
 | |
|         
 | |
|         // Put maintaner number into associative array
 | |
|         // [Used in further tables for referencing]
 | |
|         $maint_by_nick[$person["nick"]] = $num;
 | |
|         
 | |
|         // Decide on the CVS text and the color of the line
 | |
|         if ($person["cvs"] === "yes") {
 | |
|             $cvsu = "x";
 | |
|             $col = "old";
 | |
|         } else {
 | |
|             $cvsu = " ";
 | |
|             $col = "wip";
 | |
|         }
 | |
|         
 | |
|         // Try to do some antispam actions
 | |
|         $person["email"] = str_replace(
 | |
|             "@",
 | |
|             "<small>:at:</small>",
 | |
|             $person["email"]
 | |
|         );
 | |
|         
 | |
|         // Get file info for this person
 | |
|         if (isset($files_by_maint[$person["nick"]])) {
 | |
|             $pi = $files_by_maint[$person["nick"]];
 | |
|         } else {
 | |
|             $pi = array();
 | |
|         }
 | |
|         
 | |
|         print("<tr class=$col>" .
 | |
|               "<td><a name=\"maint$num\">$person[name]</a></td>" .
 | |
|               "<td>$person[email]</td>" .
 | |
|               "<td>$person[nick]</td>" .
 | |
|               "<td class=c>$cvsu</td>" .
 | |
|               "<td class=c>" . $pi[REV_CREDIT]   . "</td>" .
 | |
|               "<td class=c>" . $pi[REV_UPTODATE] . "</td>" .
 | |
|               "<td class=c>" . $pi[REV_OLD]      . "</td>" .
 | |
|               "<td class=c>" . $pi[REV_CRITICAL] . "</td>" .
 | |
|               "<td class=c>" . $pi[REV_NOREV]    . "</td>" .
 | |
|               "<td class=c>" . $pi[REV_WIP]      . "</td>" .
 | |
|               "<th class=blue>" . array_sum($pi) . "</th>" .
 | |
|               "</tr>\n");
 | |
|     }
 | |
|   
 | |
|     print "</table>\n<p> </p>\n";
 | |
| } 
 | |
| 
 | |
| // =========================================================================
 | |
| // Files summary table goes here
 | |
| // =========================================================================
 | |
| 
 | |
| // Do not print out file summary table, if we are printing out a page
 | |
| // for only one maintainer (his personal summary is in the table above)
 | |
| if (empty($MAINT)) {
 | |
| 
 | |
| 	print <<<END_OF_MULTILINE
 | |
| <a name="filesummary"></a>
 | |
| <table width="450" border="0" cellpadding="4" cellspacing="1" align="center">
 | |
| <tr class=blue>
 | |
| <th>File status type</th>
 | |
| <th>Number of files</th>
 | |
| <th>Percent of files</th>
 | |
| <th>Size of files (kB)</th>
 | |
| <th>Percent of size</th>
 | |
| </tr>
 | |
| END_OF_MULTILINE;
 | |
| 
 | |
|     $files_sum = array_sum($files_by_mark);
 | |
|     $file_sizes_sum = array_sum($file_sizes_by_mark);
 | |
|     
 | |
|     $file_types = array(
 | |
|       array (REV_UPTODATE, "Up to date files"),
 | |
|       array (REV_OLD,      "Old files"),
 | |
|       array (REV_CRITICAL, "Critical files"),
 | |
|       array (REV_WIP,      "Work in progress"),
 | |
|       array (REV_NOREV,    "Files without revision number"),
 | |
|       array (REV_NOTAG,    "Files without revision tag"),
 | |
|       array (REV_NOTRANS,  "Files available for translation")
 | |
|     );
 | |
|     
 | |
|     foreach ($file_types as $num => $type) {
 | |
|     	print "<tr class=".$CSS[$type[0]].">".
 | |
|     		  "<td>".$type[1]."</td>".
 | |
|     		  "<td class=c>".intval($files_by_mark[$type[0]])."</td>".
 | |
|     		  "<td class=c>".number_format($files_by_mark[$type[0]] * 100 / $files_sum, 2 ).
 | |
|     		  "%</td>".
 | |
|                   "<td class=c>".intval($file_sizes_by_mark[$type[0]])."</td>".
 | |
|                   "<td class=c>".number_format($file_sizes_by_mark[$type[0]] * 100 / $file_sizes_sum, 2).
 | |
|                   "%</td></tr>\n";
 | |
|     }
 | |
| 
 | |
| 	print "<tr class=blue><th>Files total</th><th>$files_sum</th><th>100%</th><th>$file_sizes_sum</th><th>100%</th></tr>\n".
 | |
| 		  "</table>\n<p> </p>\n";
 | |
| 
 | |
| }
 | |
| 
 | |
| print ($navbar."<p> </p>\n");
 | |
| 
 | |
| 
 | |
| // =========================================================================
 | |
| // Files table goes here
 | |
| // =========================================================================
 | |
| 
 | |
| print <<<END_OF_MULTILINE
 | |
| <a name="files"></a>
 | |
| <table width="820" border="0" cellpadding="4" cellspacing="1" align="center">
 | |
| <tr class=blue>
 | |
| <th rowspan=2>Translated file</th>
 | |
| <th colspan=3>Revision</th>
 | |
| <th colspan=3>Size in kB</th>
 | |
| <th colspan=3>Age in days</th>
 | |
| <th rowspan=2>Maintainer</th>
 | |
| <th rowspan=2>Status</th>
 | |
| </tr>
 | |
| <tr class=blue>
 | |
| <th>en</th>
 | |
| <th>$LANG</th>
 | |
| <th>diff</th>
 | |
| <th>en</th>
 | |
| <th>$LANG</th>
 | |
| <th>diff</th>
 | |
| <th>en</th>
 | |
| <th>$LANG</th>
 | |
| <th>diff</th>
 | |
| </tr>
 | |
| END_OF_MULTILINE;
 | |
| 
 | |
| // This was the previous directory [first]
 | |
| $prev_dir = $new_dir = $DOCDIR."en";
 | |
| 
 | |
| // Go through all files collected
 | |
| foreach ($files_status as $num => $file) {
 | |
| 
 | |
|     // Make the maintainer a link, if we have that maintainer in the list
 | |
|     if (isset($maint_by_nick[$file["maintainer"]])) {
 | |
|       $file["maintainer"] = '<a href="#maint' . $maint_by_nick[$file["maintainer"]] .
 | |
|                             '">' . $file["maintainer"] . '</a>';
 | |
|     }
 | |
| 
 | |
|     // If we have a 'numeric' revision diff and it is not zero,
 | |
|     // make a link to the CVS repository's diff script
 | |
|     if ($file["revision"][2] != "n/a" && $file["revision"][2] !== 0) {
 | |
|         $file["short_name"] = "<a href=\"http://cvs.php.net/diff.php/" .
 | |
|                               preg_replace( "'^".$DOCDIR."'", "smarty/docs/", $file["full_name"]) .
 | |
|                               "?r1=" . $file["revision"][1] . 
 | |
|                               "&r2=" . $file["revision"][0] .
 | |
|                               CVS_OPT . "\">" . $file["short_name"] . "</a>";
 | |
|     }
 | |
| 
 | |
|     // Guess the new directory from the full name of the file
 | |
|     $new_dir = dirname($file["full_name"]);
 | |
|     
 | |
|     // If this is a new directory, put out dir headline
 | |
|     if ($new_dir != $prev_dir) {
 | |
|         
 | |
|         // Drop out the unneeded parts from the dirname...
 | |
|         $display_dir = str_replace($DOCDIR."en/", "", dirname($file["full_name"]));
 | |
|         
 | |
|         // Print out directory header
 | |
|         print "<tr class=blue><th colspan=12>$display_dir</th></tr>\n";
 | |
|         
 | |
|         // Store the new actual directory
 | |
|         $prev_dir = $new_dir;
 | |
|     }
 | |
|     
 | |
|     // Write out the line for the current file (get file name shorter)
 | |
|     print "<tr class={$CSS[$file['mark']]}><td>{$file['short_name']}</td>".
 | |
|           "<td> {$file['revision'][0]}</td>" .
 | |
|           "<td> {$file['revision'][1]}</td>".
 | |
|           "<td class=rb>{$file['revision'][2]} </td>".
 | |
|           "<td class=r>{$file['size'][0]} </td>".
 | |
|           "<td class=r>{$file['size'][1]} </td>".
 | |
|           "<td class=rb>{$file['size'][2]} </td>".
 | |
|           "<td class=r>{$file['date'][0]} </td>".
 | |
|           "<td class=r>{$file['date'][1]} </td>".
 | |
|           "<td class=rb>{$file['date'][2]} </td>".
 | |
|           "<td class=c>{$file['maintainer']}</td>".
 | |
|           "<td class=c>".trim($file['status'])."</td></tr>\n";
 | |
| 
 | |
| }
 | |
| 
 | |
| print("</table>\n<p> </p>\n$navbar<p> </p>\n");
 | |
| 
 | |
| 
 | |
| // =========================================================================
 | |
| // Work in progress table goes here
 | |
| // =========================================================================
 | |
| 
 | |
| // If work-in-progress list is available (valid translation.xml file in lang)
 | |
| if (count($translation["files"]) != 0) {
 | |
| 
 | |
|     // Print out files table header
 | |
|     print "<a name=\"wip\"></a>\n" .
 | |
|     "<table width=\"820\" border=\"0\" cellpadding=\"4\" cellspacing=\"1\" align=\"center\">\n" .
 | |
|     "<tr class=blue>".
 | |
|     "<th>Work in progress files</th>".
 | |
|     "<th>Translator</th>".
 | |
|     "<th>Type</th>";
 | |
|   
 | |
|     // Print out date and revision columns if needed
 | |
|     if ($using_date) {
 | |
|         print '<th>Date</th>';
 | |
|     }
 | |
|     if ($using_rev) {
 | |
|         print '<th>CO-Revision</th>' .
 | |
|               '<th>EN-Revision</th>';
 | |
|     }
 | |
|     print "</tr>\n";
 | |
|   
 | |
|     // Go through files, and print out lines for them
 | |
|     foreach($translation["files"] as $num => $finfo) {
 | |
|     
 | |
|         // If we have a valid maintainer, link to the summary
 | |
|         if (isset($maint_by_nick[$finfo["person"]])) {
 | |
|             $finfo["person"] = '<a href="#maint' . $maint_by_nick[$finfo["person"]] .
 | |
|                                '">' . $finfo["person"] . '</a>';
 | |
|         }
 | |
|        
 | |
|         // Print out the line with the first columns
 | |
|         print "<tr class=wip><td>$finfo[name]</td>" .
 | |
|               "<td>$finfo[person]</td><td>$finfo[type]</td>";
 | |
| 
 | |
|         // If we need the date column, print it out
 | |
|         if ($using_date) {
 | |
|             print "<td>$finfo[date]</td>";
 | |
|         }
 | |
| 
 | |
|         // If we need the revision column, print it out
 | |
|         if ($using_rev) {
 | |
|             print "<td>$finfo[revision]</td><td>" .
 | |
|                   $missing_files[$finfo["name"]][1] .
 | |
|                   "</td>";
 | |
|         }
 | |
|       
 | |
|         // End the line
 | |
|         print "</tr>\n";
 | |
| 
 | |
|         // Collect files in WIP list
 | |
|         $wip_files[$finfo["name"]] = TRUE;
 | |
|     } 
 | |
|   
 | |
|     print "</table>\n<p> </p>\n$navbar<p> </p>\n";
 | |
|     
 | |
| } 
 | |
| 
 | |
| // Files translated, but without a revision comment
 | |
| $count = count($missing_tags);
 | |
| if ($count > 0) {
 | |
|     print "<a name=\"misstags\"></a>" .
 | |
|           "<table width=\"400\" border=\"0\" cellpadding=\"3\" cellspacing=\"1\" align=\"center\">\n".
 | |
|           "<tr class=blue><th rowspan=2>Files without Revision-comment ($count files):</th>".
 | |
|           "<th colspan=3>Sizes in kB</th></tr>\n".
 | |
|           "<tr class=blue><th>en</th><th>$LANG</th><th>diff</th></tr>\n";
 | |
|     foreach($missing_tags as $val) {
 | |
|         // Shorten the filename (we have directory headers)
 | |
|         $short_file = basename($val[0]);
 | |
| 
 | |
|         // Guess the new directory from the full name of the file
 | |
|         $new_dir = dirname($val[0]);
 | |
|     
 | |
|         // If this is a new directory, put out dir headline
 | |
|         if ($new_dir != $prev_dir) {
 | |
|         
 | |
|             // Print out directory header
 | |
|             print "<tr class=blue><th colspan=4>$new_dir</th></tr>\n";
 | |
|         
 | |
|             // Store the new actual directory
 | |
|             $prev_dir = $new_dir;
 | |
|         }
 | |
|         print "<tr class=wip><td>$short_file</td><td class=r>$val[1]</td>".
 | |
|               "<td class=r>$val[2]</td><td class=r>$val[3]</td></tr>\n";
 | |
|     }
 | |
|     print "</table>\n<p> </p>\n$navbar<p> </p>\n";
 | |
| }
 | |
| 
 | |
| // Merge all work in progress files collected
 | |
| $wip_files = array_merge(
 | |
|     $translation["files"],    // Files for this translator
 | |
|     $translation["allfiles"]  // Files for all the translators
 | |
| );
 | |
| 
 | |
| // Delete wip entires from available files list
 | |
| foreach ($wip_files as $file) {
 | |
|     if (isset($missing_files[$file['name']])) {
 | |
|         unset($missing_files[$file['name']]);
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Files not translated and not "wip"
 | |
| $count = count($missing_files);
 | |
| if ($count > 0) {
 | |
|     print "<a name=\"missfiles\"></a>" .
 | |
|           "<table width=\"400\" border=\"0\" cellpadding=\"3\" cellspacing=\"1\" align=\"center\">\n" .
 | |
|           "<tr class=blue><th><a name=\"avail\" class=\"ref\">" .
 | |
|           " Available for translation</a> ($count files):</th><th>kB</th></tr>\n";
 | |
|     foreach($missing_files as $file => $info) {
 | |
|         // Shorten the filename (we have directory headers)
 | |
|         $short_file = basename($file);
 | |
| 
 | |
|         // Guess the new directory from the full name of the file
 | |
|         $new_dir = dirname($file);
 | |
|     
 | |
|         // If this is a new directory, put out dir headline
 | |
|         if ($new_dir != $prev_dir) {
 | |
|         
 | |
|             // Print out directory header if not "."
 | |
|             print "<tr class=blue><th colspan=2>$new_dir</th></tr>\n";
 | |
|         
 | |
|             // Store the new actual directory
 | |
|             $prev_dir = $new_dir;
 | |
|         }
 | |
| 
 | |
|         print "<tr class=wip><td><a href=\"http://cvs.php.net/co.php/smarty/docs/en/$file\">$short_file</a></td>" .
 | |
|               "<td class=r>$info[0]</td></tr>\n";
 | |
|     }
 | |
|     print "</table>\n<p> </p>\n$navbar<p> </p>\n";
 | |
| 
 | |
| }
 | |
| 
 | |
| // All OK, end the file
 | |
| print "</body>\n</html>\n";
 | |
| 
 | |
| ?>
 |