217 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace FML\Script;
 | 
						|
 | 
						|
use FML\Script\Sections\Constants;
 | 
						|
use FML\Script\Sections\Functions;
 | 
						|
use FML\Script\Sections\Globals;
 | 
						|
use FML\Script\Sections\Includes;
 | 
						|
use FML\Script\Sections\Labels;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class representing the Manialink Script
 | 
						|
 *
 | 
						|
 * @author steeffeen
 | 
						|
 */
 | 
						|
class Script {
 | 
						|
	/**
 | 
						|
	 * Protected properties
 | 
						|
	 */
 | 
						|
	protected $features = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add a script feature
 | 
						|
	 *
 | 
						|
	 * @param ScriptFeature $scriptFeature        	
 | 
						|
	 * @return \FML\Script\Script
 | 
						|
	 */
 | 
						|
	public function addFeature(ScriptFeature $scriptFeature) {
 | 
						|
		array_push($this->features, $scriptFeature);
 | 
						|
		return $this;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove all script features
 | 
						|
	 *
 | 
						|
	 * @return \FML\Script\Script
 | 
						|
	 */
 | 
						|
	public function removeFeatures() {
 | 
						|
		$this->features = array();
 | 
						|
		return $this;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Create the script xml tag
 | 
						|
	 *
 | 
						|
	 * @param \DOMDocument $domDocument        	
 | 
						|
	 * @return \DOMElement
 | 
						|
	 */
 | 
						|
	public function render(\DOMDocument $domDocument) {
 | 
						|
		$scriptXml = $domDocument->createElement('script');
 | 
						|
		$scriptText = $this->buildScriptText();
 | 
						|
		$scriptComment = $domDocument->createComment($scriptText);
 | 
						|
		$scriptXml->appendChild($scriptComment);
 | 
						|
		return $scriptXml;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Build the complete script text based on all script items
 | 
						|
	 *
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function buildScriptText() {
 | 
						|
		$scriptText = "";
 | 
						|
		$scriptText = $this->addHeaderPart($scriptText);
 | 
						|
		$scriptText = $this->addIncludesPart($scriptText);
 | 
						|
		$scriptText = $this->addConstantsPart($scriptText);
 | 
						|
		$scriptText = $this->addGlobalsPart($scriptText);
 | 
						|
		$scriptText = $this->addLabelsPart($scriptText);
 | 
						|
		$scriptText = $this->addFunctionsPart($scriptText);
 | 
						|
		$scriptText = $this->addMainPart($scriptText);
 | 
						|
		return $scriptText;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the header comment to the script
 | 
						|
	 * 
 | 
						|
	 * @param string $scriptText
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addHeaderPart($scriptText) {
 | 
						|
		$headerPart = file_get_contents(__DIR__ . '/Templates/Header.txt');
 | 
						|
		return $scriptText . $headerPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the includes to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addIncludesPart($scriptText) {
 | 
						|
		$includes = array();
 | 
						|
		foreach ($this->features as $feature) {
 | 
						|
			if (!($feature instanceof Includes)) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$featureIncludes = $feature->getIncludes();
 | 
						|
			foreach ($featureIncludes as $namespace => $fileName) {
 | 
						|
				$includes[$namespace] = $fileName;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$includesPart = PHP_EOL;
 | 
						|
		foreach ($includes as $namespace => $fileName) {
 | 
						|
			$includesPart .= "#Include \"{$fileName}\" as {$namespace}" . PHP_EOL;
 | 
						|
		}
 | 
						|
		return $scriptText . $includesPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the declared constants to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addConstantsPart($scriptText) {
 | 
						|
		$constants = array();
 | 
						|
		foreach ($this->features as $feature) {
 | 
						|
			if (!($feature instanceof Constants)) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$featureConstants = $feature->getConstants();
 | 
						|
			foreach ($featureConstants as $name => $value) {
 | 
						|
				$constants[$name] = $value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$constantsPart = PHP_EOL;
 | 
						|
		foreach ($constants as $name => $value) {
 | 
						|
			$constantsPart .= "#Const {$name} {$value}" . PHP_EOL;
 | 
						|
		}
 | 
						|
		return $scriptText . $constantsPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the declared global variables to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addGlobalsPart($scriptText) {
 | 
						|
		$globals = array();
 | 
						|
		foreach ($this->features as $feature) {
 | 
						|
			if (!($feature instanceof Globals)) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$featureGlobals = $feature->getGlobals();
 | 
						|
			foreach ($featureGlobals as $name => $type) {
 | 
						|
				$globals[$name] = $type;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$globalsPart = PHP_EOL;
 | 
						|
		foreach ($globals as $name => $type) {
 | 
						|
			$globalsPart .= "declare {$type} {$name};" . PHP_EOL;
 | 
						|
		}
 | 
						|
		return $scriptText . $globalsPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the implemented labels to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addLabelsPart($scriptText) {
 | 
						|
		$labels = array();
 | 
						|
		foreach ($this->features as $feature) {
 | 
						|
			if (!($feature instanceof Labels)) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$featureLabels = $feature->getLabels();
 | 
						|
			foreach ($featureLabels as $name => $implementation) {
 | 
						|
				$label = array($name, $implementation);
 | 
						|
				array_push($labels, $label);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$labelsPart = PHP_EOL;
 | 
						|
		foreach ($labels as $label) {
 | 
						|
			$labelsPart .= '***' . $label[0] . '***' . PHP_EOL . '***' . PHP_EOL . $label[1] . PHP_EOL . '***' . PHP_EOL;
 | 
						|
		}
 | 
						|
		return $scriptText . $labelsPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the declared functions to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addFunctionsPart($scriptText) {
 | 
						|
		$functions = array();
 | 
						|
		foreach ($this->features as $feature) {
 | 
						|
			if (!($feature instanceof Functions)) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$featureFunctions = $feature->getFunctions();
 | 
						|
			foreach ($featureFunctions as $signature => $implementation) {
 | 
						|
				$functions[$signature] = $implementation;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$functionsPart = PHP_EOL;
 | 
						|
		foreach ($functions as $signature => $implementation) {
 | 
						|
			$functionsPart .= $signature . '{' . PHP_EOL . $implementation . PHP_EOL . '}' . PHP_EOL;
 | 
						|
		}
 | 
						|
		return $scriptText . $functionsPart;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add the main function to the script
 | 
						|
	 *
 | 
						|
	 * @param string $scriptText        	
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	private function addMainPart($scriptText) {
 | 
						|
		$mainPart = file_get_contents(__DIR__ . '/Templates/Main.txt');
 | 
						|
		return $scriptText . $mainPart;
 | 
						|
	}
 | 
						|
}
 |