mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-30 11:51:41 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			291 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*  
 | |
|   +----------------------------------------------------------------------+
 | |
|   | PHP Version 4                                                        |
 | |
|   +----------------------------------------------------------------------+
 | |
|   | 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:    Hartmut Holzgraefe <hholzgra@php.net>                    |
 | |
|   |             Gabor Hojtsy <goba@php.net>                              |
 | |
|   +----------------------------------------------------------------------+
 | |
|   
 | |
|   $Id$
 | |
| */
 | |
| 
 | |
| /**
 | |
|  *
 | |
|  * Create smarty/docs/entities/file-entities.ent with respect
 | |
|  * to all the specialities needed:
 | |
|  *
 | |
|  *  . Translated language files with English ones as fallbacks
 | |
|  *
 | |
|  * Also take in account, that if XSLT style sheets are used,
 | |
|  * special file:/// prefixed path values are needed.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| // Always flush output
 | |
| ob_implicit_flush();
 | |
| // This script runs for a long time
 | |
| set_time_limit(0);
 | |
| 
 | |
| // ......:ARGUMENT PARSING:.....................................................
 | |
| 
 | |
| // when php complied on cygwin, the working path have to be /cygdrive..
 | |
| // the below preg_replace have to be done only using binary php complied on MSVC.
 | |
| // let's find if php was complied by cygwin:
 | |
| $cygwin_complied = eregi("CYGWIN",php_uname()) ? true : false;
 | |
| 	
 | |
| // The output directory, which we need to parse for windows specific
 | |
| // things, and correct all problems is needed.
 | |
| // Also use absolute path to have meaningful error messages
 | |
| $out_dir = abs_path(strip_cygdrive("@WORKDIR@"));
 | |
| 
 | |
| // this path if used for saving the ent file:
 | |
| $script_out_dir = $cygwin_complied ? "@WORKDIR@" : $out_dir;
 | |
| 
 | |
| // The source directory is passed in the 5th argument counting from backwards.
 | |
| $srcdir = abs_path("@SRCDIR@");
 | |
| 
 | |
| // The translation dir is passed as the 6th argument, counting
 | |
| // from the end of the argument list
 | |
| $trans_dir = "$srcdir/@LANG@";
 | |
| 
 | |
| // The original directory is in the base directory, and named "en"
 | |
| $orig_dir = "$srcdir/en";
 | |
| 
 | |
| // ......:ENTITY CREATION:......................................................
 | |
| 
 | |
| // Put all the file entitites info $entities
 | |
| $entities = array();
 | |
| file_entities($orig_dir, $trans_dir, $orig_dir, $entities);
 | |
| 
 | |
| // Open file for appending and write out all entitities
 | |
| $fp = fopen("$script_out_dir/entities/file-entities.ent", "w");
 | |
| if (!$fp) {
 | |
|     die("ERROR: Failed to open $script_out_dir/entities/file-entities.ent for writing\n");
 | |
| }
 | |
| 
 | |
| echo "\ncreating entities/file-entities.ent...\n";
 | |
| 
 | |
| // File header
 | |
| fputs($fp, "<!-- DON'T TOUCH - AUTOGENERATED BY file-entities.php -->\n\n");
 | |
| 
 | |
| 
 | |
| // Write out all entities
 | |
| foreach ($entities as $entity) {
 | |
|     fputs($fp, $entity);
 | |
| }
 | |
| fclose($fp);
 | |
| 
 | |
| // Here is the end of the code
 | |
| exit;
 | |
| 
 | |
| // ......:FUNCTION DECLARATIONS:................................................
 | |
| 
 | |
| /**
 | |
|  * Generate absolute path from a relative path, taking accout
 | |
|  * the current working directory.
 | |
|  *
 | |
|  * @param string $path Relative path
 | |
|  * @return string Absolute path generated
 | |
|  */
 | |
| function abs_path($path) {
 | |
| 
 | |
|     // This is already an absolute path (begins with / or a drive letter)
 | |
|     if (preg_match("!^(/|\\w:)!", $path)) { return $path; }
 | |
| 
 | |
|     // Get directory parts
 | |
| 
 | |
|     $absdir  = str_replace("\\", "/", getcwd());
 | |
|     $absdirs = explode("/", preg_replace("!/scripts$!", "", $absdir));
 | |
|     $dirs    = explode("/", $path);
 | |
| 
 | |
|     // Generate array representation of absolute path
 | |
|     foreach ($dirs as $dir) {
 | |
|         if (empty($dir) or $dir == ".") continue;
 | |
|         else if ($dir == "..") array_pop($absdirs);
 | |
|         else array_push($absdirs, $dir);
 | |
|     }
 | |
| 
 | |
|     // Return with string
 | |
|     return join("/", $absdirs);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Create file entities, and put them into the array passed as the
 | |
|  * last argument (passed by reference).
 | |
|  *
 | |
|  * @param string $work_dir English files' directory
 | |
|  * @param string $trans_dir Translation's directory
 | |
|  * @param string $orig_dir Original directory
 | |
|  * @param array $entities Entities string array
 | |
|  * @return boolean Success signal
 | |
|  */
 | |
| function file_entities($work_dir, $trans_dir, $orig_dir, &$entities) {
 | |
|     
 | |
|     // Compute translated version's path
 | |
|     $trans_path = str_replace($orig_dir, $trans_dir, $work_dir);
 | |
|     
 | |
|     // Try to open English working directory
 | |
|     $dh = opendir($work_dir);
 | |
|     if (!$dh) { return FALSE; }
 | |
| 
 | |
|     // If the working directory is a reference functions directory
 | |
|     if (preg_match("!/reference/.*/functions$!", $work_dir)) {
 | |
|         
 | |
|         // Start new functions file with empty entity set
 | |
|         $function_entities = array();
 | |
|         $functions_file = "$work_dir.xml";
 | |
| 
 | |
|         // Get relative file path to original directory, and form an entity
 | |
|         $functions_file_entity = str_replace("$orig_dir/", "", $work_dir);
 | |
|         $functions_file_entity = fname2entname($functions_file_entity);
 | |
|         $entities[] = entstr($functions_file_entity, $functions_file);
 | |
|     }
 | |
| 
 | |
|     // While we can read that directory
 | |
|     while (($file = readdir($dh)) !== FALSE) {
 | |
| 
 | |
|         // If file name begins with . skip it
 | |
|         if ($file{0} == ".") { continue; }
 | |
| 
 | |
|         // If we found a directory, and it's name is not
 | |
|         // CVS, recursively go into it, and generate entities
 | |
|         if (is_dir($work_dir . "/" . $file)) {
 | |
|             if ($file == "CVS") { continue; }
 | |
|             file_entities($work_dir . "/" . $file, $trans_dir, $orig_dir, $entities);
 | |
|         }
 | |
| 
 | |
|         // If the file name ends in ".xml"
 | |
|         if (preg_match("!\\.xml$!", $file)) {
 | |
|             
 | |
|             // Get relative file name and get entity name for it
 | |
|             $name = str_replace(
 | |
|                 "$orig_dir/",
 | |
|                 "",
 | |
|                 $work_dir . "/" . preg_replace("!\\.xml$!", "", $file)
 | |
|             );
 | |
|             $name = fname2entname($name);
 | |
| 
 | |
|             // If this is a functions directory, collect it into
 | |
|             // the special $function_entities array
 | |
|             if (isset($function_entities)) {
 | |
|                 $function_entities[] = "&$name;";
 | |
|             }
 | |
|  
 | |
|             // If we have a translated file, use it, otherwise fall back to English
 | |
|             if (file_exists("$trans_path/$file")) {
 | |
|                 $path = "$trans_path/$file";
 | |
|             } else {
 | |
|                 $path = "$work_dir/$file";
 | |
|             }
 | |
| 
 | |
|             // Append to entities array
 | |
|             $entities[] = entstr($name, $path);
 | |
| 
 | |
|         } // end of "if xml file"
 | |
|     } // end of readdir loop
 | |
|     
 | |
|     // Close directory
 | |
|     closedir($dh);
 | |
| 
 | |
|     // If we created a function entities list, write it out
 | |
|     if (isset($function_entities)) {
 | |
|         
 | |
|         // Sort by name
 | |
|         sort($function_entities);
 | |
|         
 | |
|         // Write out all entities with newlines
 | |
|         $fp = fopen($functions_file, "w");
 | |
|         foreach ($function_entities as $entity) {
 | |
|             fputs($fp, "$entity\n");
 | |
|         }
 | |
|         fclose($fp);
 | |
|     }
 | |
| 
 | |
|     // Find all files available in the translation but not in the original English tree
 | |
|     if ($orig_dir != $trans_dir && file_exists($trans_path) && is_dir($trans_path)) {
 | |
| 
 | |
|         // Open translation path
 | |
|         $dh = @opendir($trans_path);
 | |
| 
 | |
|         if ($dh) {
 | |
| 
 | |
|             while (($file = readdir($dh)) !== FALSE) {
 | |
|                 if ($file{0} =="." || $file == "CVS") { continue; }
 | |
|                 if (is_dir($trans_path."/".$file)) { continue; }
 | |
|                 
 | |
|                 // If this is an XML file
 | |
|                 if (preg_match("!\\.xml$!",$file)) {
 | |
|                     
 | |
|                     // Generate relative file path and entity name out of it
 | |
|                     $name = str_replace(
 | |
|                         "$orig_dir/",
 | |
|                         "",
 | |
|                         $work_dir . "/" . preg_replace("!\\.xml$!", "", $file)
 | |
|                     );
 | |
|                     $name = fname2entname($name);
 | |
|                     
 | |
|                     // If the file found is not in the English dir, append to entities list
 | |
|                     if (!file_exists("$work_dir/$file")) {
 | |
|                         $path = "$trans_path/$file";
 | |
|                         $entities[] = entstr($name, $path);
 | |
|                     }
 | |
| 
 | |
|                 } // if this is an XML file end
 | |
| 
 | |
|             } // readdir iteration end
 | |
|             closedir($dh);
 | |
|         }
 | |
|     }
 | |
|     
 | |
| } // end of funciton file_entities()
 | |
| 
 | |
| /**
 | |
|  * Convert a file name (with path) to an entity name.
 | |
|  *
 | |
|  * Converts: _ => - and / => .
 | |
|  *
 | |
|  * @param string $fname File name
 | |
|  * @return string Entity name
 | |
|  */
 | |
| function fname2entname($fname)
 | |
| {
 | |
|     return str_replace("_", "-", str_replace("/", ".", $fname));
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Return entity string with the given entityname and filename.
 | |
|  * 
 | |
|  * @param string $entname Entity name
 | |
|  * @param string $filename Name of file
 | |
|  * @return string Entity declaration string
 | |
|  */
 | |
| function entstr($entname, $filename)
 | |
| {
 | |
|     // If we have no file, than this is not a system entity
 | |
|     if ($filename == "") {
 | |
|         return sprintf("<!ENTITY %-40s        ''>\n", $entname);
 | |
|     } else {
 | |
|         return sprintf("<!ENTITY %-40s SYSTEM '%s'>\n", $entname, strip_cygdrive($filename));
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Return windows style path for cygwin.
 | |
|  * 
 | |
|  * @param string $path Orginal path
 | |
|  */
 | |
| function strip_cygdrive($path){
 | |
| 	return preg_replace("!^/cygdrive/(\\w)/!", "\\1:/", $path);
 | |
| }
 |