From d52527b68a1c5e3b5b38605b38a86cf99bf2e5db Mon Sep 17 00:00:00 2001 From: didou Date: Tue, 13 Apr 2004 07:26:17 +0000 Subject: [PATCH] now the files entites are generated dynamically --- docs/configure.in | 21 +- docs/manual.xml.in | 63 ++---- docs/scripts/file-entities.php.in | 314 ++++++++++++++++++++++++++++++ 3 files changed, 355 insertions(+), 43 deletions(-) create mode 100644 docs/scripts/file-entities.php.in diff --git a/docs/configure.in b/docs/configure.in index a4707840..f20a5d02 100755 --- a/docs/configure.in +++ b/docs/configure.in @@ -3,6 +3,9 @@ dnl $Id$ dnl autoconf initialisation AC_INIT() WORKDIR=`pwd` +SRCDIR=$srcdir +AC_SUBST(SRCDIR) + AC_SUBST(WORKDIR) dnl debug output @@ -217,7 +220,6 @@ AC_SUBST(CATALOG) dnl }}} - dnl {{{ language specific stuff AC_MSG_CHECKING(for language) @@ -297,4 +299,21 @@ done AC_OUTPUT($OUTFILES) dnl }}} +dnl {{{ generate entity mapping file, missing entities and IDs + +dnl if we have PHP use it for all of these things +if test $PHP != "no" +then + + dnl create entity mapping file + $PHP -c $INIPATH -q ./scripts/file-entities.php + +else + + echo ERROR: configure process cannot continue, PHP is not found + +fi + +dnl }}} + dnl }}} diff --git a/docs/manual.xml.in b/docs/manual.xml.in index 0fccd94b..bc7e47ef 100644 --- a/docs/manual.xml.in +++ b/docs/manual.xml.in @@ -19,30 +19,9 @@ %global.entities; - - - + - - - - - - - - - - - - - - - - - - - - +%file.entities; ]> @@ -52,37 +31,37 @@ &bookinfo; &preface; - &getting.started; + &getting-started; &SMARTYDesigners; - &language.basic.syntax; - &language.variables; - &language.modifiers; - &language.combining.modifiers; - &language.builtin.functions; - &language.custom.functions; - &config.files; - &chapter.debugging.console; + &designers.language-basic-syntax; + &designers.language-variables; + &designers.language-modifiers; + &designers.language-combining-modifiers; + &designers.language-builtin-functions; + &designers.language-custom-functions; + &designers.config-files; + &designers.chapter-debugging-console; &SMARTYProgrammers; - &smarty.constants; - &api.variables; - &api.functions; - &caching; - &advanced.features; - &plugins; + &programmers.smarty-constants; + &programmers.api-variables; + &programmers.api-functions; + &programmers.caching; + &programmers.advanced-features; + &programmers.plugins; &Appendixes; - &troubleshooting; - &tips; - &resources; - &bugs; + &appendixes.troubleshooting; + &appendixes.tips; + &appendixes.resources; + &appendixes.bugs; diff --git a/docs/scripts/file-entities.php.in b/docs/scripts/file-entities.php.in new file mode 100644 index 00000000..b2de422a --- /dev/null +++ b/docs/scripts/file-entities.php.in @@ -0,0 +1,314 @@ + | + | Gabor Hojtsy | + +----------------------------------------------------------------------+ + + $Id$ +*/ + +/** + * + * Create smarty/docs/entities/file-entities.ent with respect + * to all the specialities needed: + * + * . CHM only appendix integration + * . 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 other 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 wokring 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) { + + // Skip the function directory not under "reference". That + // folder is only kept for backward compatibility and only + // in the English version of the docs. + if (strpos($work_dir, "functions") && !preg_match("!reference/.*/functions!", $work_dir)) { + return; + } + + // 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;"; + } + + // Special treatment for function reference entities if splitted version available + if (strstr($work_dir,"/functions")) { + $splitfile = str_replace(".xml", "/reference.xml", $file); + $splitpath = str_replace("/functions", "/reference", $trans_path) . "/" . $splitfile; + if (file_exists($splitpath)) { + $entities[] = entstr($name, $splitpath); + continue; + } + $splitpath = str_replace("/functions", "/reference", $trans_path) . "/" . $splitfile; + if (file_exists($splitpath)) { + $entities[] = entstr($name, $splitpath); + continue; + } + } + + // 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); +} +?>