diff --git a/class.templater.php b/class.templater.php
index d1c83e6..1e66f0a 100644
--- a/class.templater.php
+++ b/class.templater.php
@@ -18,10 +18,11 @@ $template_global_vars = array();
class Templater
{
- private $basedir = "templates/";
- private $extension = ".tpl";
+ public $basedir = "templates/";
+ public $extension = ".tpl";
private $tpl = NULL;
private $tpl_rendered = NULL;
+ public $templatename = "";
public function Load($template)
{
@@ -271,4 +272,149 @@ class Templater
$template->Compile($compile);
return $template->Render();
}
+
+ public static function AdvancedParse($templatename, $localize = array(), $compile = array())
+ {
+ $template = new Templater();
+ $template->templatename = $template->basedir . $templatename . $template->extension;;
+ $template->Load($templatename);
+ $template->Localize($localize);
+ $template->Parse($compile);
+ return $template->Render();
+ }
+
+ public function Parse($strings)
+ {
+ $tree = $this->BuildSyntaxTree();
+ }
+
+ public function BuildSyntaxTree()
+ {
+ $content = $this->tpl_rendered;
+ $length = strlen($content);
+ $offset = 0;
+ $depth = 0;
+ $current_tag = "";
+ $current_element = null;
+ $root = array();
+ $tag_start = 0;
+ $tag_end = 0;
+
+ define("CPHP_TEMPLATER_SWITCH_NONE", 1);
+ define("CPHP_TEMPLATER_SWITCH_TAG_OPEN", 2);
+ define("CPHP_TEMPLATER_SWITCH_TAG_SYNTAX", 3);
+ define("CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER", 4);
+ define("CPHP_TEMPLATER_SWITCH_TAG_STATEMENT", 5);
+ define("CPHP_TEMPLATER_TYPE_TAG_NONE", 10);
+ define("CPHP_TEMPLATER_TYPE_TAG_OPEN", 11);
+ define("CPHP_TEMPLATER_TYPE_TAG_CLOSE", 12);
+
+ $switch = CPHP_TEMPLATER_SWITCH_NONE;
+ $type = CPHP_TEMPLATER_TYPE_TAG_NONE;
+
+ while($offset < $length)
+ {
+ $char = $content[$offset];
+ //echo("
");
+ //pretty_dump("**");
+ if($char == "{" && $switch == CPHP_TEMPLATER_SWITCH_NONE)
+ {
+ $switch = CPHP_TEMPLATER_SWITCH_TAG_OPEN;
+ $tag_start = $offset;
+ }
+ elseif($char == "%" && $switch == CPHP_TEMPLATER_SWITCH_TAG_OPEN)
+ {
+ $switch = CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER;
+ $identifier = "";
+ }
+ elseif($char != "%" && $switch == CPHP_TEMPLATER_SWITCH_TAG_OPEN)
+ {
+ // Not a templater tag, abort.
+ $switch = CPHP_TEMPLATER_SWITCH_NONE;
+ $type = CPHP_TEMPLATER_TYPE_TAG_NONE;
+ }
+ elseif($switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_NONE)
+ {
+ if($char == "/")
+ {
+ //pretty_dump("close $char {$identifier}");
+ $type = CPHP_TEMPLATER_TYPE_TAG_CLOSE;
+ }
+ else
+ {
+ //pretty_dump("open {$identifier}");
+ $type = CPHP_TEMPLATER_TYPE_TAG_OPEN;
+ continue;
+ }
+ }
+ else
+ {
+ //pretty_dump(">> $char");
+ //pretty_dump(($char != "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_CLOSE));
+ //pretty_dump(($char == "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_CLOSE));
+ if(($char != " " && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_OPEN) ||
+ ($char != "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_CLOSE))
+ {
+ //pretty_dump("identifier");
+ $identifier .= $char;
+ }
+ elseif($char == " " && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_OPEN)
+ {
+ //pretty_dump("switch statement");
+ $switch = CPHP_TEMPLATER_SWITCH_TAG_STATEMENT;
+ $statement = "";
+ }
+ elseif($char != "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_STATEMENT)
+ {
+ //pretty_dump("statement");
+ $statement .= $char;
+ }
+ elseif(($char == "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_STATEMENT && $type == CPHP_TEMPLATER_TYPE_TAG_OPEN) ||
+ ($char == "}" && $switch == CPHP_TEMPLATER_SWITCH_TAG_IDENTIFIER && $type == CPHP_TEMPLATER_TYPE_TAG_CLOSE))
+ {
+ //pretty_dump("Identifier: {$identifier}");
+ //pretty_dump("Statement: {$statement}");
+
+ $tag_end = $offset;
+
+ 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} ]
");
+ }
+ elseif($type == CPHP_TEMPLATER_TYPE_TAG_CLOSE)
+ {
+ // This was a closing tag.
+ echo("Closing tag found, start position [{$tag_start}], end position [{$tag_end}], identifier [{$identifier}]
");
+ }
+ else
+ {
+ throw new TemplateParsingException("The type of tag could not be determined.", $this->templatename, $tag_start, $tag_end);
+ }
+
+ $switch = CPHP_TEMPLATER_SWITCH_NONE;
+ $type = CPHP_TEMPLATER_TYPE_TAG_NONE;
+ $identifier = "";
+ $statement = "";
+ }
+ }
+
+ $offset += 1;
+ }
+ }
+}
+
+class TemplateSyntaxElement
+{
+ public $parent = null;
+ public $children = array();
+}
+
+class TemplateIfElement extends TemplateSyntaxElement
+{
+ public $left = "";
+ public $right = "";
+ public $operator = "";
+ public $if_block = "";
+ public $else_block = "";
}
diff --git a/include.exceptions.php b/include.exceptions.php
index 229efa2..1acecfd 100644
--- a/include.exceptions.php
+++ b/include.exceptions.php
@@ -21,3 +21,23 @@ class ConstructorException extends Exception {}
class MissingDataException extends Exception {}
class DatabaseException extends Exception {}
class TypeException extends Exception {}
+
+class TemplateException extends Exception
+{
+ public $message = "";
+ public $file = "";
+ public $startpos = 0;
+ public $endpos = 0;
+ public $code = 0;
+
+ public function __construct($message, $file, $startpos, $endpos, $code)
+ {
+ $this->message = $message;
+ $this->file = $file;
+ $this->startpos = $startpos;
+ $this->endpos = $endpos;
+ }
+}
+
+class TemplateSyntaxException extends TemplateException {}
+class TemplateParsingException extends TemplateException {}