From 1af09bcf5c682321e1ab22782fab94ed643fc267 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Tue, 5 Jan 2010 05:14:16 +0000 Subject: [PATCH] Fake template engine added, variables can now be compiled for config entries: - New fake template engine ConsoleTemplateEngine added (unfinished) - New method to compile configuration entries in 'general' variable stack added --- .gitattributes | 2 + .../template/class_BaseTemplateEngine.php | 51 +++++++--- inc/classes/main/template/console/.htaccess | 1 + .../console/class_ConsoleTemplateEngine.php | 96 +++++++++++++++++++ 4 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 inc/classes/main/template/console/.htaccess create mode 100644 inc/classes/main/template/console/class_ConsoleTemplateEngine.php diff --git a/.gitattributes b/.gitattributes index 7f6e83f5..c45a449a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -490,6 +490,8 @@ inc/classes/main/streams/crypto/class_NullCryptoStream.php -text inc/classes/main/template/.htaccess -text inc/classes/main/template/class_ -text inc/classes/main/template/class_BaseTemplateEngine.php -text +inc/classes/main/template/console/.htaccess -text +inc/classes/main/template/console/class_ConsoleTemplateEngine.php -text inc/classes/main/template/image/.htaccess -text inc/classes/main/template/image/class_ImageTemplateEngine.php -text inc/classes/main/template/mail/.htaccess -text diff --git a/inc/classes/main/template/class_BaseTemplateEngine.php b/inc/classes/main/template/class_BaseTemplateEngine.php index fe332f2d..2256fab0 100644 --- a/inc/classes/main/template/class_BaseTemplateEngine.php +++ b/inc/classes/main/template/class_BaseTemplateEngine.php @@ -197,13 +197,12 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // Is the variable found? if ($found !== false) { // Read it - $found = $this->varStack[$this->currGroup][$found]['value']; + $content = $this->varStack[$this->currGroup][$found]['value']; } // END - if - //* DEBUG: */ echo __METHOD__.": group=".$this->currGroup.",var=".$var.", found=".$found."
\n"; - // Return the current position - return $found; + //* DEBUG: */ echo __METHOD__.": group=".$this->currGroup.",var=".$var.", content[".gettype($content)."]=".$content."
\n"; + return $content; } /** @@ -475,7 +474,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { if ($idx !== false) { // Remove this variable $this->varStack->offsetUnset($idx); - } + } // END - if } /** @@ -988,6 +987,27 @@ class BaseTemplateEngine extends BaseFrameworkSystem { $this->loadTemplate($template); } + /** + * Compiles configuration place-holders in all variables. This 'walks' + * through the variable stack 'general'. It interprets all values from that + * variables as configuration entries after compiling them. + * + * @return void + */ + public final function compileConfigInVariables () { + // Iterate through all general variables + foreach ($this->varStack['general'] as $idx=>$currVariable) { + // Compile the value + $value = $this->compileRawCode($this->readVariable($currVariable['name']), true); + + // Remove it from stack + unset($this->varStack['general'][$idx]); + + // Re-assign the variable + $this->assignConfigVariable($value); + } // END - foreach + } + /** * Compile all variables by inserting their respective values * @@ -1242,16 +1262,17 @@ class BaseTemplateEngine extends BaseFrameworkSystem { /** * "Compiles" a variable by replacing {?var?} with it's content * - * @param $rawCode Raw code to compile + * @param $rawCode Raw code to compile + * @param $setMatchAsCode Sets $match if readVariable() returns empty result * @return $rawCode Compile code with inserted variable value */ - public function compileRawCode ($rawCode) { + public function compileRawCode ($rawCode, $setMatchAsCode=false) { // Find the variables - //* DEBUG: */ echo "rawCode=
".htmlentities($rawCode)."
\n"; + //* DEBUG: */ echo __METHOD__.":rawCode=
".htmlentities($rawCode)."
\n"; preg_match_all($this->regExpVarValue, $rawCode, $varMatches); // Compile all variables - //* DEBUG: */ echo "
".print_r($varMatches, true)."
"; + //* DEBUG: */ echo __METHOD__.":
".print_r($varMatches, true)."
\n"; foreach ($varMatches[0] as $match) { // Add variable tags around it $varCode = '{?' . $match . '?}'; @@ -1259,12 +1280,20 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // Is the variable found in code? (safes some calls) if (strpos($rawCode, $varCode) !== false) { // Replace the variable with it's value, if found - //* DEBUG: */ echo __METHOD__.": match=".$match."
\n"; - $rawCode = str_replace($varCode, $this->readVariable($match), $rawCode); + $value = $this->readVariable($match); + //* DEBUG: */ echo __METHOD__.": match=".$match.",value[".gettype($value)."]=".$value."
\n"; + if (($setMatchAsCode === true) && (is_null($value))) { + // Insert match + $rawCode = str_replace($varCode, $match, $rawCode); + } else { + // Insert value + $rawCode = str_replace($varCode, $value, $rawCode); + } } // END - if } // END - foreach // Return the compiled data + //* DEBUG: */ echo __METHOD__.":rawCode=
".htmlentities($rawCode)."
\n"; return $rawCode; } diff --git a/inc/classes/main/template/console/.htaccess b/inc/classes/main/template/console/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/template/console/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/template/console/class_ConsoleTemplateEngine.php b/inc/classes/main/template/console/class_ConsoleTemplateEngine.php new file mode 100644 index 00000000..ce4230f0 --- /dev/null +++ b/inc/classes/main/template/console/class_ConsoleTemplateEngine.php @@ -0,0 +1,96 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class ConsoleTemplateEngine extends BaseTemplateEngine implements CompileableTemplate { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of the class TemplateEngine and prepares it for usage + * + * @param $appInstance A manageable application + * @return $tplInstance An instance of TemplateEngine + * @throws BasePathIsEmptyException If the provided $templateBasePath is empty + * @throws InvalidBasePathStringException If $templateBasePath is no string + * @throws BasePathIsNoDirectoryException If $templateBasePath is no + * directory or not found + * @throws BasePathReadProtectedException If $templateBasePath is + * read-protected + */ + public final static function createConsoleTemplateEngine (ManageableApplication $appInstance) { + // Get a new instance + $tplInstance = new ConsoleTemplateEngine(); + + // Get language and file I/O instances from application + $langInstance = $appInstance->getLanguageInstance(); + $ioInstance = $appInstance->getFileIoInstance(); + + // Determine base path + $templateBasePath = $tplInstance->getConfigInstance()->getConfigEntry('application_base_path') . $appInstance->getRequestInstance()->getRequestElement('app') . '/'; + + // Is the base path valid? + if (empty($templateBasePath)) { + // Base path is empty + throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + } elseif (!is_string($templateBasePath)) { + // Is not a string + throw new InvalidBasePathStringException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING); + } elseif (!is_dir($templateBasePath)) { + // Is not a path + throw new BasePathIsNoDirectoryException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME); + } elseif (!is_readable($templateBasePath)) { + // Is not readable + throw new BasePathReadProtectedException(array($tplInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH); + } + + // Get configuration instance + $configInstance = FrameworkConfiguration::getInstance(); + + // Set the base path + $tplInstance->setTemplateBasePath($templateBasePath); + + // Set the language and IO instances + $tplInstance->setLanguageInstance($langInstance); + $tplInstance->setFileIoInstance($ioInstance); + + // Set template extensions + $tplInstance->setRawTemplateExtension($configInstance->getConfigEntry('raw_template_extension')); + $tplInstance->setCodeTemplateExtension($configInstance->getConfigEntry('code_template_extension')); + + // Absolute output path for compiled templates + $tplInstance->setCompileOutputPath($configInstance->getConfigEntry('base_path') . $configInstance->getConfigEntry('compile_output_path')); + + // Return the prepared instance + return $tplInstance; + } +} + +// [EOF] +?> -- 2.39.5