mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-05 00:30:54 +02:00
291 lines
9.3 KiB
PHP
291 lines
9.3 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:.....................................................
|
|
|
|
$not_windows = !eregi('WIN',PHP_OS);
|
|
|
|
// The dir for PHP. If the cygwin wasn't compiled on Cygwin, the path needs to be striped.
|
|
$out_dir = ($not_windows || eregi('CYGWIN',php_uname()))? "@WORKDIR@" : abs_path(strip_cygdrive("@WORKDIR@"));
|
|
|
|
|
|
// ......:ENTITY CREATION:......................................................
|
|
|
|
// Put all the file entitites info $entities
|
|
$entities = array();
|
|
file_entities("$out_dir/en", "$out_dir/@LANG@", "$out_dir/en", $entities);
|
|
|
|
// Open file for appending and write out all entitities
|
|
$fp = fopen("$out_dir/entities/file-entities.ent", "w");
|
|
if (!$fp) {
|
|
die("ERROR: Failed to open $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, file2jade($filename));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return windows style path for cygwin.
|
|
*
|
|
* @param string $path Orginal path
|
|
* @return string windows style path
|
|
*/
|
|
function strip_cygdrive($path){
|
|
return preg_replace(array('!^/cygdrive/(\w)/!', '@^/home/.+$@'), array('\1:/', strtr(dirname(dirname(__FILE__)), '\\', '/')), $path);
|
|
}
|
|
|
|
|
|
/* Converts a path to the appropriate style for Jade */
|
|
function file2jade($path) {
|
|
|
|
if ($GLOBALS['not_windows'])
|
|
return $path;
|
|
|
|
if ((bool)@WINJADE@) {
|
|
return strip_cygdrive($path);
|
|
} else {
|
|
return preg_replace('@^([a-zA-Z]):/@S', '/cygdrive/$1/', $path);
|
|
}
|
|
}
|
|
|
|
?>
|