diff --git a/class.templater.php b/class.templater.php
index c2e1d3f..ad0d840 100644
--- a/class.templater.php
+++ b/class.templater.php
@@ -23,6 +23,7 @@ class Templater
private $tpl = NULL;
private $tpl_rendered = NULL;
public $templatename = "";
+ public $root = null;
public function Load($template)
{
@@ -280,12 +281,13 @@ class Templater
$template->Load($templatename);
$template->Localize($localize);
$template->Parse($compile);
- return $template->Render();
+ //return $template->Render();
}
- public function Parse($strings)
+ public function Parse($data)
{
$tree = $this->BuildSyntaxTree();
+ echo($this->root->Evaluate($data));
}
public function BuildSyntaxTree()
@@ -381,7 +383,6 @@ class Templater
if($type == CPHP_TEMPLATER_TYPE_TAG_OPEN)
{
// This was an opening tag.
- //echo("Opening tag found, start position [{$tag_start}], end position [{$tag_end}], identifier [{$identifier}], statement [ {$statement} ]
");
echo("[{$depth}]" . str_repeat(" ", $depth) . "{$identifier} {$statement}
");
$child = $this->CreateSyntaxElement($identifier, $statement, $offset + 1);
$current_element[$depth] = $child;
@@ -399,7 +400,6 @@ class Templater
elseif($type == CPHP_TEMPLATER_TYPE_TAG_CLOSE)
{
// This was a closing tag.
- //pretty_dump("$current_tag vs $identifier at $tag_start in depth $depth with statement ($statement)");
$depth -= 1;
if($identifier == $current_tag[$depth])
@@ -423,7 +423,7 @@ class Templater
$switch = CPHP_TEMPLATER_SWITCH_NONE;
$type = CPHP_TEMPLATER_TYPE_TAG_NONE;
$identifier = "";
- //$statement = "";
+ $statement = "";
}
else
{
@@ -447,7 +447,7 @@ class Templater
$current_element[0]->children[] = $current_text_element;
}
- pretty_dump($current_element[0]);
+ $this->root = $current_element[0];
}
function CreateSyntaxElement($identifier, $statement)
@@ -497,6 +497,58 @@ class TemplateSyntaxElement
{
public $parent = null;
public $children = array();
+ public $data = array();
+
+ public function Evaluate($data)
+ {
+ $result = "";
+
+ foreach($this->children as $child)
+ {
+ $result .= $child->Evaluate($data);
+ }
+
+ return $result;
+ }
+
+ public function FetchVariable($name, $data)
+ {
+ if(strpos($name, "[") === false)
+ {
+ return $data[$name];
+ }
+ else
+ {
+ // Variable refers to a subset of the data, traverse up the tree to find the matching dataset
+ $open_brace = strpos($name, "[");
+ $closing_brace = strpos($name, "]");
+
+ $source = substr($name, 0, $open_brace);
+ $item = substr($name, $open_brace + 1, ($closing_brace - $open_brace - 1));
+
+ $current_element = $this;
+
+ while(!is_null($current_element))
+ {
+ $current_element = $current_element->parent;
+
+ if(isset($current_element->varname))
+ {
+ if($current_element->varname == $source)
+ {
+ if(isset($current_element->data[$item]))
+ {
+ return $current_element->data[$item];
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
}
class TemplateRootElement extends TemplateSyntaxElement {}
@@ -504,6 +556,11 @@ class TemplateRootElement extends TemplateSyntaxElement {}
class TemplateTextElement extends TemplateSyntaxElement
{
public $text = "";
+
+ public function Evaluate($data)
+ {
+ return $this->text;
+ }
}
class TemplateIfElement extends TemplateSyntaxElement
@@ -512,6 +569,42 @@ class TemplateIfElement extends TemplateSyntaxElement
public $left = "";
public $right = "";
public $operator = "";
+
+ public function Evaluate($data)
+ {
+ $a = $this->FetchVariable($this->left, $data);
+ $b = $this->right;
+
+ switch($this->operator)
+ {
+ case "=":
+ case "==":
+ $result = ($a == $b);
+ break;
+ case ">":
+ $result = ($a > $b);
+ break;
+ case "<":
+ $result = ($a < $b);
+ break;
+ case ">=":
+ $result = ($a >= $b);
+ break;
+ case "<=":
+ $result = ($a <= $b);
+ break;
+ case "!=":
+ $result = ($a != $b);
+ break;
+ default:
+ $result = false;
+ }
+
+ if($result == true)
+ {
+ return parent::Evaluate($data);
+ }
+ }
}
class TemplateForEachElement extends TemplateSyntaxElement
@@ -520,4 +613,24 @@ class TemplateForEachElement extends TemplateSyntaxElement
public $source = "";
public $varname = "";
public $block = "";
+ public $data = array();
+
+ public function Evaluate($data)
+ {
+ $target = $this->FetchVariable($this->source, $data);
+
+ $result = "";
+
+ foreach($target as $iteration)
+ {
+ $this->data = $iteration;
+
+ foreach($this->children as $child)
+ {
+ $result .= $child->Evaluate($data);
+ }
+ }
+
+ return $result;
+ }
}