| | Gabor Hojtsy | +----------------------------------------------------------------------+ $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, "\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("\n", $entname); } else { return sprintf("\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); }