--- /dev/null
+<?php
+// Own namespace
+namespace CoreFramework\Template\Xml;
+
+// Import framework stuff
+use CoreFramework\Manager\ManageableApplication;
+use CoreFramework\Response\Responseable;
+use CoreFramework\Template\CompileableTemplate;
+
+/**
+ * A decorator for XML template engines which rewrites the XML for compacting
+ * it.
+ *
+ * @author Roland Haeder <webmaster@shipsimu.org>
+ * @version 0.0.0
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @license GNU GPL 3.0 or any newer version
+ * @link http://www.shipsimu.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 <http://www.gnu.org/licenses/>.
+ */
+class XmlRewriterTemplateDecorator extends BaseDecorator 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 $innerTemplateInstance A CompileableTemplate instance
+ * @return $templateInstance An instance of TemplateEngine
+ */
+ public static final function createXmlRewriterTemplateDecorator (CompileableTemplate $innerTemplateInstance) {
+ // Get a new instance
+ $templateInstance = new XmlRewriterTemplateDecorator();
+
+ // Set the inner template engine
+ $templateInstance->setTemplateInstance($innerTemplateInstance);
+
+ // Return the prepared instance
+ return $templateInstance;
+ }
+
+ /**
+ * Settter for variable group
+ *
+ * @param $groupName Name of variable group
+ * @param $add Whether add this group
+ * @return void
+ */
+ public function setVariableGroup ($groupName, $add = TRUE) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->setVariableGroup($groupName, $add);
+ }
+
+ /**
+ * Adds a variable to current group
+ *
+ * @param $var Variable to set
+ * @param $value Value to store in variable
+ * @return void
+ */
+ public function addGroupVariable ($var, $value) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->addGroupVariable($var, $value);
+ }
+
+ /**
+ * Getter for base path
+ *
+ * @return $templateBasePath The relative base path for all templates
+ */
+ public final function getTemplateBasePath () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getTemplateBasePath();
+ }
+
+ /**
+ * Getter for generic base path
+ *
+ * @return $templateBasePath The relative base path for all templates
+ */
+ public final function getGenericBasePath () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getGenericBasePath();
+ }
+
+ /**
+ * Getter for template extension
+ *
+ * @return $templateExtension The file extension for all uncompiled templates
+ */
+ public final function getRawTemplateExtension () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getRawTemplateExtension();
+ }
+
+ /**
+ * Getter for given variable group
+ *
+ * @param $variableGroup Variable group to check
+ * @return $varStack Found variable group
+ */
+ public function getVarStack ($variableGroup) {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getVarStack($variableGroup);
+ }
+
+ /**
+ * Getter for code-template extension
+ *
+ * @return $codeExtension The file extension for all code templates
+ */
+ public final function getCodeTemplateExtension () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getCodeTemplateExtension();
+ }
+
+ /**
+ * Getter for template type
+ *
+ * @return $templateType The current template's type
+ */
+ public final function getTemplateType () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getTemplateType();
+ }
+
+ /**
+ * Assign (add) a given variable with a value
+ *
+ * @param $var The variable we are looking for
+ * @param $value The value we want to store in the variable
+ * @return void
+ */
+ public function assignVariable ($var, $value) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->assignVariable($var, $value);
+ }
+
+ /**
+ * Removes a given variable
+ *
+ * @param $variableName The variable we are looking for
+ * @param $variableGroup Name of variable group (default: 'general')
+ * @return void
+ */
+ public function removeVariable ($variableName, $variableGroup = 'general') {
+ // Call the inner class' method
+ $this->getTemplateInstance()->removeVariable($variableName, $variableGroup);
+ }
+
+ /**
+ * Load a specified HTML template into the engine
+ *
+ * @param $template The web template we shall load which is located in
+ * 'html' by default
+ * @return void
+ */
+ public function loadHtmlTemplate ($template) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->loadHtmlTemplate($template);
+ }
+
+ /**
+ * Assign a given congfiguration variable with a value
+ *
+ * @param $variableName The configuration variable we want to assign
+ * @return void
+ */
+ public function assignConfigVariable ($variableName) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->assignConfigVariable($variableName);
+ }
+
+ /**
+ * Load a specified code template into the engine
+ *
+ * @param $template The code template we shall load which is
+ * located in 'code' by default
+ * @return void
+ */
+ public function loadCodeTemplate ($template) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->loadCodeTemplate($template);
+ }
+
+ /**
+ * Load a specified email template into the engine for later compilation
+ * with other code/web/email templates.
+ *
+ * @param $template The email template we shall load which is
+ * located in "html" by default
+ * @return void
+ */
+ public function loadEmailTemplate ($template) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->loadEmailTemplate($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 function compileConfigInVariables () {
+ // Call the inner class' method
+ $this->getTemplateInstance()->compileConfigInVariables();
+ }
+
+ /**
+ * Compile all variables by inserting their respective values
+ *
+ * @return void
+ */
+ public function compileVariables () {
+ // Call the inner class' method
+ $this->getTemplateInstance()->compileVariables();
+ }
+
+ /**
+ * Compile all required templates into the current loaded one
+ *
+ * @return void
+ */
+ public function compileTemplate () {
+ // Call the inner class' method
+ $this->getTemplateInstance()->compileTemplate();
+ }
+
+ /**
+ * 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) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->assignTemplateWithVariable($templateName, $variableName);
+ }
+
+ /**
+ * Transfers the content of this template engine to a given response instance
+ *
+ * @param $responseInstance An instance of a Responseable class
+ * @return void
+ */
+ public function transferToResponse (Responseable $responseInstance) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->transportToResponse($responseInstance);
+ }
+
+ /**
+ * Assigns all the application data with template variables
+ *
+ * @param $applicationInstance A manageable application instance
+ * @return void
+ */
+ public function assignApplicationData (ManageableApplication $applicationInstance) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->assignApplicationData($applicationInstance);
+ }
+
+ /**
+ * "Compiles" a variable by replacing {?var?} with it's content
+ *
+ * @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, $setMatchAsCode = FALSE) {
+ return $this->getTemplateInstance()->compileRawCode($rawCode, $setMatchAsCode);
+ }
+
+ /**
+ * Getter for variable group array
+ *
+ * @return $variableGroups All variable groups
+ */
+ public final function getVariableGroups () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getVariableGroups();
+ }
+
+ /**
+ * Getter for raw template data
+ *
+ * @return $rawTemplateData The raw data from the template
+ */
+ public function getRawTemplateData () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->getRawTemplateData();
+ }
+
+ /**
+ * Renames a variable in code and in stack
+ *
+ * @param $oldName Old name of variable
+ * @param $newName New name of variable
+ * @return void
+ */
+ public function renameVariable ($oldName, $newName) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->renameVariable($oldName, $newName);
+ }
+
+ /**
+ * Renders the given XML content
+ *
+ * @param $content Valid XML content or if not set the current loaded raw content
+ * @return void
+ * @throws XmlParserException If an XML error was found
+ */
+ public function renderXmlContent ($content = NULL) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->renderXmlContent($content);
+ }
+
+ /**
+ * Enables or disables language support
+ *
+ * @param $languageSupport New language support setting
+ * @return void
+ */
+ public function enableLanguageSupport ($languageSupport = TRUE) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->enableLanguageSupport($languageSupport);
+ }
+
+ /**
+ * Checks whether language support is enabled
+ *
+ * @return $languageSupport Whether language support is enabled or disabled
+ */
+ public function isLanguageSupportEnabled () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->isLanguageSupportEnabled();
+ }
+
+ /**
+ * Enables or disables XML compacting
+ *
+ * @param $xmlCompacting New XML compacting setting
+ * @return void
+ */
+ public function enableXmlCompacting ($xmlCompacting = TRUE) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->enableXmlCompacting($xmlCompacting);
+ }
+
+ /**
+ * Checks whether XML compacting is enabled
+ *
+ * @return $xmlCompacting Whether XML compacting is enabled or disabled
+ */
+ public function isXmlCompactingEnabled () {
+ // Call the inner class' method
+ return $this->getTemplateInstance()->isXmlCompactingEnabled();
+ }
+
+ /**
+ * Handles the start element of an XML resource
+ *
+ * @param $resource XML parser resource (currently ignored)
+ * @param $element The element we shall handle
+ * @param $attributes All attributes
+ * @return void
+ * @throws InvalidXmlNodeException If an unknown/invalid XML node name was found
+ */
+ public function startElement ($resource, $element, array $attributes) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->startElement($resource, $element, $attributes);
+ }
+
+ /**
+ * Ends the main or sub node by sending out the gathered data
+ *
+ * @param $resource An XML resource pointer (currently ignored)
+ * @param $nodeName Name of the node we want to finish
+ * @return void
+ * @throws XmlNodeMismatchException If current main node mismatches the closing one
+ */
+ public function finishElement ($resource, $nodeName) {
+ // Call the inner class' method
+ $this->getTemplateInstance()->finishElement($resource, $nodeName);
+ }
+
+ /**
+ * Currently not used
+ *
+ * @param $resource XML parser resource (currently ignored)
+ * @param $characters Characters to handle
+ * @return void
+ * @todo Find something useful with this!
+ */
+ public function characterHandler ($resource, $characters) {
+ // Call the inner class' method but trim the characters before
+ $this->getTemplateInstance()->characterHandler($resource, trim($characters));
+ }
+
+ /**
+ * Removes all comments, tabs and new-line charcters to compact the content
+ *
+ * @param $uncompactedContent The uncompacted content
+ * @return $compactedContent The compacted content
+ */
+ public function compactContent ($uncompactedContent) {
+ // Compact it ...
+ $compactedContent = $this->getTemplateInstance()->compactContent($uncompactedContent);
+
+ // ... and return it
+ return $compactedContent;
+ }
+
+ /**
+ * Assigns a lot variables into the stack of currently loaded template.
+ * This method should only be used in very rare circumstances, e.g. when
+ * you have to copy a whole set of variables into the template engine.
+ * Before you use this method, please make sure you have considered all
+ * other possiblities.
+ *
+ * @param $variables An array with variables to be assigned
+ * @return void
+ */
+ public function assignMultipleVariables (array $variables) {
+ // Call the inner class' method but trim the characters before
+ $this->getTemplateInstance()->assignMultipleVariables($variables);
+ }
+
+}