loadLang($language); } public function parse($template_file) { if(!file_exists($template_file)) throw new Exception("Template: {$template_file} does not exist."); if(!$template_buffer = file_get_contents($template_file)) throw new Exception("Cannot read template {$template_file}."); $template_buffer = preg_replace('~{\$(.*)}~U', 'getVar("$1"); ?>', $template_buffer); $template_buffer = preg_replace('~{\@(.*)}~U', 'getText("$1"); ?>', $template_buffer); $tag_array = preg_split("~<(/?)tpl:([^>]*)>~", $template_buffer, -1, PREG_SPLIT_DELIM_CAPTURE); $node_stack = array(); for($i = 0; $i < count($tag_array); $i++) { switch($i % 3) { case 0: # Text break; case 1 || 2: $tag_parts = preg_split("~([^\W]*)(=(\"|')?([a-z0-9\s.-_]*)(\"|')?)~i", $tag_array[$i + 1], -1, PREG_SPLIT_DELIM_CAPTURE); $tag_name = trim(strtolower($tag_parts[0])); for($i = 1; $i < count($tag_parts); $i += 6) { $tag_args[$tag_parts[$i]] = $tag_parts[$i + 3]; } if($tag_array[$i] != '/') { $node = array_pop($node_stack); $last_node = end($node_stack); } else { $node = array_pop($node_stack); } $i++; break; default: throw new Exception("WTF?"); break; } } return $template_buffer; } public function render($file) { $template_file = "templates/{$file}"; $cache_file = "cache/{$file}"; if(file_exists($cache_file) && filemtime($cache_file) > filemtime($template_file)) { require_once($cache_file); } else { $template_buffer = $this->parse($template_file); $this->cache($cache_file, $template_buffer); require_once($cache_file); } } public function cache($cache_file, $template_buffer) { $cache_file = fopen($cache_file, 'w'); fwrite($cache_file, $template_buffer); fclose($cache_file); } private function getVar($variable) { return ($this->variables[$variable]) ? $this->variables[$variable] : '{$' . $variable . '}'; } private function getText($text) { return ($this->language[$text]) ? $this->language[$text] : $text; } private function loadLang($language) { $language_file = "locale/{$language}.php"; if(!file_exists($language_file)) throw new Exception("Language: {$language} can not be loaded."); require_once($language_file); } public function __set($variable, $value) { $this->set($variable, $value); } public function set($variable, $value) { $this->variables[$variable] = $value; } } $Template = new Template(); $Template->set('title', 'Template Test Page'); $Template->hello = "Andrew"; $Template->lol = "k4st says..."; $Template->render('index.html'); ?>