* and emails.
*
* @author Roland Haeder <webmaster@mxchange.org>
- * @version 0.3.0
+ * @version 0.0.0
* @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
* @license GNU GPL 3.0 or any newer version
- * @link http://www.mxchange.org
+ * @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
* 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 <http://www.gnu.org/licenses/>.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate {
/**
*/
private $configVariables = array();
- /**
- * The language instance which should link to an object of LanguageSystem
- */
- private $langInstance = null;
-
/**
* Loaded templates for recursive protection and detection
*/
const EXCEPTION_INVALID_VIEW_HELPER = 0xa02;
/**
- * Private constructor
+ * Protected constructor
*
* @return void
*/
- private final function __construct () {
+ protected function __construct () {
// Call parent constructor
- parent::constructor(__CLASS__);
+ parent::__construct(__CLASS__);
// Set part description
- $this->setPartDescr("Template-Engine");
+ $this->setObjectDescription("Template-Engine");
// Create unique ID number
$this->createUniqueID();
/**
* Creates an instance of the class TemplateEngine and prepares it for usage
*
- * @param $basePath The local base path for all templates
- * @param $langInstance An instance of LanguageSystem (default)
- * @param $ioInstance An instance of FileIOHandler (default, middleware!)
+ * @param $basePath The local base path for all templates
+ * @param $langInstance An instance of LanguageSystem (default)
+ * @param $ioInstance An instance of FileIOHandler (default, middleware!)
* @return $tplInstance An instance of TemplateEngine
* @throws BasePathIsEmptyException If the provided $basePath is empty
* @throws InvalidBasePathStringException If $basePath is no string
* @throws BasePathIsNoDirectoryException If $basePath is no
- * directory or not found
+ * directory or not found
* @throws BasePathReadProtectedException If $basePath is
- * read-protected
+ * read-protected
*/
- public final static function createTemplateEngine ($basePath, $langInstance, $ioInstance) {
+ public final static function createTemplateEngine ($basePath, ManageableLanguage $langInstance, FileIOHandler $ioInstance) {
// Get a new instance
$tplInstance = new TemplateEngine();
// Set the language and IO instances
$tplInstance->setLanguageInstance($langInstance);
- $tplInstance->setIOInstance($ioInstance);
+ $tplInstance->setFileIOInstance($ioInstance);
// Set template extensions
$tplInstance->setRawTemplateExtension($cfgInstance->readConfig("raw_template_extension"));
* Search for a variable in the stack
*
* @param $var The variable we are looking for
- * @return $idx FALSE means not found, > 0 means found on a specific index
+ * @return $idx FALSE means not found, >=0 means found on a specific index
*/
private function isVariableAlreadySet ($var) {
// First everything is not found
return $found;
}
+ /**
+ * Return a content of a variable or null if not found
+ *
+ * @param $var The variable we are looking for
+ * @return $content Content of the variable or null if not found
+ */
+ private function readVariable ($var) {
+ // First everything is not found
+ $content = null;
+
+ // Now search for it
+ for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) {
+ // Get current item
+ $currEntry = $idx->current();
+
+ // Is the entry found?
+ if ($currEntry['name'] == $var) {
+ // Found!
+ $content = $currEntry['value'];
+ break;
+ }
+ }
+
+ // Return the current position
+ return $content;
+ }
+
/**
* Add a variable to the stack
*
$this->varStack = new FrameworkArrayObject();
}
- /**
- * Setter for language instance which should be LanguageSystem
- *
- * @param $langInstance The language instance
- * @return void
- */
- public final function setLanguageInstance (ManageableLanguage $langInstance) {
- $this->langInstance = $langInstance;
- }
-
- /**
- * Setter for file I/O instance which should be FileIOHandler
- *
- * @param $ioInstance The file I/O instance
- * @return void
- */
- public final function setIOInstance (FileIOHandler $ioInstance) {
- $this->ioInstance = $ioInstance;
- }
-
- /**
- * Getter for file I/O instance which should be FileIOHandler
- *
- * @return $ioInstance The file I/O instance
- */
- public final function getIOInstance () {
- return $this->ioInstance;
- }
-
/**
* Setter for base path
*
// Construct the FQFN for the template by honoring the current language
$fqfn = sprintf("%s%s/%s/%s%s",
$this->getBasePath(),
- $this->langInstance->getLanguageCode(),
+ $this->getLanguageInstance()->getLanguageCode(),
$this->getTemplateType(),
$template,
$ext
));
// Get a input/output instance from the middleware
- $ioInstance = $this->getIOInstance();
+ $ioInstance = $this->getFileIOInstance();
// Validate the instance
if (is_null($ioInstance)) {
/**
* Extract variables from a given raw data stream
*
- * @param $rawData The raw template data we shall analyze
+ * @param $rawData The raw template data we shall analyze
* @return void
* @throws InvalidTemplateVariableNameException If a variable name
- * in a template is
- * invalid
+ * in a template is
+ * invalid
*/
private function extractVariablesFromRawData ($rawData) {
// Cast to string
* [2] => Array - An array with right part of a match including ":"
* [3] => Array - An array with right part of a match excluding ":"
*/
- private function analyzeTemplate ($templateMatches) {
+ private function analyzeTemplate (array $templateMatches) {
// Backup raw template data
$backup = $this->getRawTemplateData();
// RECURSIVE PROTECTION!
$this->loadedTemplates[] = $template;
} catch (FilePointerNotOpenedException $e) {
- // Template not found!
- $this->rawTemplates[] = $template;
+ // Template not found, but maybe variable assigned?
+ if ($this->isVariableAlreadySet($template) !== false) {
+ // Use that content here
+ $this->loadedRawData[$template] = $this->readVariable($template);
+
+ // Recursive protection:
+ $this->loadedTemplates[] = $template;
+ } else {
+ // Even this is not done... :/
+ $this->rawTemplates[] = $template;
+ }
}
} // if ((!isset( ...
* @param $templateMatches See method analyzeTemplate()
* @return void
*/
- private function insertAllTemplates ($templateMatches) {
+ private function insertAllTemplates (array $templateMatches) {
// Run through all loaded codes
- foreach ($this->loadedRawData as $template => $code) {
+ foreach ($this->loadedRawData as $template=>$code) {
// Search for the template
$foundIndex = array_search($template, $templateMatches[1]);
// Lookup the matching template replacement
- if (isset($templateMatches[0][$foundIndex])) {
+ if (($foundIndex !== false) && (isset($templateMatches[0][$foundIndex]))) {
// Get the current raw template
$rawData = $this->getRawTemplateData();
// Set the new raw data
$this->setRawTemplateData($rawData);
- }
- }
+
+ } // END - if
+
+ } // END - foreach
}
/**
* @param $varMatches An array full of variable/value pairs.
* @return void
*/
- private function assignAllVariables ($varMatches) {
+ private function assignAllVariables (array $varMatches) {
// Search for all variables
foreach ($varMatches[1] as $key=>$var) {
$this->assignVariable($var, $varMatches[3][$key]);
} else {
// Non-string found so we need some deeper analysis...
+ // @TODO Unfinished work or don't die here.
die("Deeper analysis not yet implemented!");
}
* @param $templateMatches See method analyzeTemplate() for details
* @return void
*/
- private function compileRawTemplateData ($templateMatches) {
+ private function compileRawTemplateData (array $templateMatches) {
// Are some code-templates found which we need to compile?
if (count($this->loadedRawData) > 0) {
// Then compile all!
- foreach ($this->loadedRawData as $template => $code) {
+ foreach ($this->loadedRawData as $template=>$code) {
+
+ // Is this template already compiled?
+ if (in_array($template, $this->compiledTemplates)) {
+ // Then skip it
+ continue;
+ }
// Search for the template
$foundIndex = array_search($template, $templateMatches[1]);
// Lookup the matching variable data
- if (isset($templateMatches[3][$foundIndex])) {
+ if (($foundIndex !== false) && (isset($templateMatches[3][$foundIndex]))) {
// Split it up with another reg. exp. into variable=value pairs
- @preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches);
+ preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches);
// Assign all variables
$this->assignAllVariables($varMatches);
$this->extractVariablesFromRawData($rawData);
// Search for code-tags which are {? ?}
- @preg_match_all($this->regExpCodeTags, $rawData, $templateMatches);
+ preg_match_all($this->regExpCodeTags, $rawData, $templateMatches);
// Analyze the matches array
if ((is_array($templateMatches)) && (count($templateMatches) == 4) && (count($templateMatches[0]) > 0)) {
// Return the requested instance
return $this->helpers[$helperName];
}
+
+ /**
+ * Assigns the last loaded raw template content with a given variable
+ *
+ * @param $templateName Name of the template we want to assign
+ * @param $variableName Name of the variable we want to assign
+ * @return void
+ */
+ public function assignTemplateWithVariable ($templateName, $variableName) {
+ // Get the content from last loaded raw template
+ $content = $this->getRawTemplateData();
+
+ // Assign the variable
+ $this->assignVariable($variableName, $content);
+
+ // Purge raw content
+ $this->setRawTemplateData("");
+ }
}
// [EOF]