diff options
| author | Savetheinternet <savetheinternet@n0v4.com> | 2010-11-02 21:57:33 +1100 |
|---|---|---|
| committer | Savetheinternet <savetheinternet@n0v4.com> | 2010-11-02 21:57:33 +1100 |
| commit | 3d92990b1817ac20935274682764711080e8b254 (patch) | |
| tree | 4eb12e4952e1a3c7f8454edad37056ed09c41def /inc/template.php | |
first commit
Diffstat (limited to 'inc/template.php')
| -rw-r--r-- | inc/template.php | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/inc/template.php b/inc/template.php new file mode 100644 index 00000000..95fa2ff7 --- /dev/null +++ b/inc/template.php @@ -0,0 +1,182 @@ +<?php
+
+ // PHP Template Preprocessor by Savetheinternet
+ // http://codecanyon.net/user/Savetheinternet
+ // savetheinternet@n0v4.com
+
+ // -----------------------------------------------------
+ // Standard configuration
+ //
+ // Folder where the template files are kept
+ $templateDir = './templates';
+ //
+ // Enable global things like %gentime, etc.
+ $templateGlobals = true;
+
+ // If $templateGlobals is enabled.
+ // Do not change the keys, but the values (if you must), or it will not work. (Prefixed with %)
+ $templateGlobalsNames = Array(
+ 'gentime' => 'gentime',
+ 'template' => 'template'
+ );
+
+ // Allow {$phpvar}, etc, to be placed in the template file. This will use a (global) variable defined in PHP.
+ // Requires eval() to be enabled. Might be a security risk, so ensure your template files aren't writable before
+ // enabling this. (Prefixed with $)
+ $templateVariables = false;
+
+ // End config
+ // -----------------------------------------------------
+
+ //'/\{(!?[$%]?[\w\[\]]+)(([=\?:])(([^{^}]|\{.+?\})?)?\}/s'
+
+
+
+
+ // Don't change this if you don't know what you're doing.
+ // EXTREMELY CONFUSING RECURSION!
+ $templateRegex = '/\{(!?[$%]?[\w\[\]]+)(([=\?:])((?>[^{^}]|\{[^{^}]+\}|(?R))+?))?\}/s';
+
+ function templateParse($template, array $options, $globals = null, $templateFile = null) {
+ global $templateGlobals, $templateGlobalsNames, $templateVariables, $templateRegex;
+ //For the global variable {%gentime}
+ if($globals == null) {
+ $globals = Array();
+ if(isset($templateFile)) $globals['template'] = $templateFile;
+ $globals['gentime'] = microtime(true);
+ }
+
+ // What we'll end up finishing with
+ $templateBody = '';
+
+ $previousPosition = 0;
+ // Find the matches
+ if(preg_match_all($templateRegex, $template, $templateMatch)) {
+ //Iterate through matches
+ for($matchIndex=0;$matchIndex<count($templateMatch[0]);$matchIndex++) {
+ $optionName = $templateMatch[1][$matchIndex];
+ $optionValue = $templateMatch[0][$matchIndex];
+ $optionDelim = $templateMatch[3][$matchIndex];
+ $optionBlock = $templateMatch[4][$matchIndex];
+ $option = (isset($options[$optionName])?$options[$optionName]:null);
+
+ $position = strpos($template, $templateMatch[0][$matchIndex]);
+ // Replace the found string with "xxxx[...]". ("Bug fix"; allows duplicate tags)
+ $template = substr_replace($template, str_repeat('x', strlen($templateMatch[0][$matchIndex])), $position, strlen($templateMatch[0][$matchIndex]));
+
+
+ if($optionName[0] == '!') {
+ $optionReversed = true;
+ $optionName = substr($optionName, 1);
+ } else $optionReversed = false;
+
+ if($optionName[0] == '%') {
+ $tmpOptionName = substr($optionName, 1);
+ // $templateGlobals
+ if($tmpOptionName == $templateGlobalsNames['gentime']) {
+ $option = microtime(true)-$globals['gentime'].'s';
+ } elseif(isset($globals[$tmpOptionName])) {
+ $option = $globals[$tmpOptionName];
+ }
+ unset($tmpOptionName);
+ }
+
+
+ if(preg_match('/(.+?)\[/', $optionName, $optionArrayMatches)) {
+ $optionArrayKey = $optionArrayMatches[1];
+ $arrayOptionsTemp = $options[$optionArrayKey];
+ if(is_array($arrayOptionsTemp)) {
+ if(preg_match_all('/\[(.+?)\]/', $optionName, $optionArrayMatches)) {
+ for($optionArrayIndex=0;$optionArrayIndex<count($optionArrayMatches[0]);$optionArrayIndex++) {
+ if(isset($arrayOptionsTemp[$optionArrayMatches[1][$optionArrayIndex]])) {
+ $arrayOptionsTemp = $arrayOptionsTemp[$optionArrayMatches[1][$optionArrayIndex]];
+ $option = $arrayOptionsTemp;
+ } else break;
+ }
+ }
+ }
+ }
+
+ if($optionDelim==':') {
+ if(isset($option) && $option) {
+ if(is_array($option)) {
+ $optionValue = '';
+ for($optionIndex=0;$optionIndex<count($option);$optionIndex++) {
+ $tmpOption = $option[$optionIndex];
+ $tmpOptions = $options;
+ $tmpOptions[$optionName] = $tmpOption;
+
+
+ if($optionIndex == count($option)-1)
+ $globals['last'] = true;
+ else {
+ unset($globals['last']);
+ if($optionIndex == 0)
+ $globals['first'] = true;
+ else
+ unset($globals['first']);
+ }
+ $optionValue .= templateParse($optionBlock, $tmpOptions, $globals);
+ }
+ unset($tmpOption);
+ unset($tmpOptions);
+ unset($optionIndex);
+ unset($globals['first']);
+ unset($globals['last']);
+ } else {
+ $optionValue = templateParse($optionBlock, $options, $globals);
+ }
+ } else {
+ $optionValue = '';
+ }
+ } elseif($optionDelim=='?') {
+ // Conditionals
+ if((!$optionReversed && isset($option) && $option) || ($optionReversed && (!isset($option) || !$option))) {
+ /*echo print_r(Array(
+ $optionReversed?'reversed':'no',
+ isset($option)?'exists':'does not exist',
+ $option,
+ $optionName
+ ));*/
+ $optionValue = templateParse($optionBlock, $options, $globals);
+ } else {
+ $optionValue = '';
+ }
+ } elseif(isset($option)) {
+ // If the value is specified...
+ if(is_array($option)) {
+ $optionValue = implode($option);
+ } else {
+ $optionValue = $option;
+ }
+ } elseif($optionDelim=='=') {
+ // If it has a default
+ $optionValue = templateParse($optionBlock, $options, $globals);
+ $options[$optionName] = $optionValue;
+ } elseif($templateVariables && $optionName[0] == '$') {
+ // Conditionals
+ $optionValue = eval("global ${optionName}; return ${optionName};");
+ }
+ // Append it to the body
+ $templateBody .= substr($template, $previousPosition, $position-$previousPosition).$optionValue;
+ $previousPosition = $position+strlen($templateMatch[0][$matchIndex]);
+ unset($position);
+ unset($optionValue);
+ }
+ }
+ // Append the rest of the template
+ $templateBody .= substr($template, $previousPosition);
+ return $templateBody;
+ }
+
+ function Element($templateFile, array $options) {
+ global $templateDir;
+ // Read the template file
+ if($template = @file_get_contents("${templateDir}/${templateFile}")) {
+ return templateParse($template, $options, null, $templateFile);
+ } else {
+ throw new Exception("Template file '${templateFile}' does not exist or is empty in '${templateDir}'!");
+ }
+ }
+
+?>
\ No newline at end of file |
