| 
									
										
										
										
											2004-04-13 07:26:17 +00:00
										 |  |  | <?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"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-13 12:19:16 +00:00
										 |  |  | // Write out all entities
 | 
					
						
							| 
									
										
										
										
											2004-04-13 07:26:17 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2004-04-13 12:19:16 +00:00
										 |  |  |  * the current working directory. | 
					
						
							| 
									
										
										
										
											2004-04-13 07:26:17 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @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); | 
					
						
							| 
									
										
										
										
											2004-04-13 08:47:40 +00:00
										 |  |  |     if (!$dh) { return FALSE; } | 
					
						
							| 
									
										
										
										
											2004-04-13 07:26:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 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;"; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2004-04-13 12:19:16 +00:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2004-04-13 07:26:17 +00:00
										 |  |  |             // 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); | 
					
						
							|  |  |  | } |