diff --git a/example.php b/example.php
index f1b5555..19d442c 100644
--- a/example.php
+++ b/example.php
@@ -11,5 +11,5 @@ $tpl->compile('index.html');
echo $tpl->render(array(
'pagename' => 'awesome people',
- 'authors' => ['Paul', 'Jim', 'Jane']
+ 'authors' => [['name' => 'Paul', 'age' => 10], ['name' => 'Jim', 'age' => 11], ['name' => 'Jane', 'age' => 12]]
));
\ No newline at end of file
diff --git a/index.html b/index.html
index 6200efa..8270d6c 100644
--- a/index.html
+++ b/index.html
@@ -2,8 +2,9 @@
{{ pagename|title }}
{% for author in authors %}
- -
- {{ author }}
+
-
+
{{ author.name }}
+ {{ author.age }}
{% endfor %}
\ No newline at end of file
diff --git a/klein.php b/klein.php
index 5b82f79..99a43cb 100644
--- a/klein.php
+++ b/klein.php
@@ -4,38 +4,29 @@ class Klein {
private $code;
function compile($html) {
- $arg = function($name) {
- $list = explode(".", $name);
- $first = array_shift($list);
- return "$first" . implode("", array_map(function($x) { return "['$x']"; }, $list));
- };
-
- $rx = function ($grammar) use ($arg) {
- list($pattern, $result) = $grammar;
- $body = strtr($pattern, [" " => "\s*", "+" => "\s+", ":v" => "(\w+(\s*\.\s*\w+)*)", ":x" => "(\w+)"]);
+ $pattern = array_map(function ($grammar) {
+ list(, $result) = $grammar;
+ $body = strtr($grammar[0], [" " => "\s*", "+" => "\s+", ":var" => "(\w+(\s*\.\s*\w+)*)", ":id" => "(\w+)"]);
return ["/$body/",
- function ($x) use ($result, $arg) {
- $body = preg_replace_callback("/#(\d+)/", function ($s) use($x, $arg) {
- return $arg($x[$s[1]]);
- }, $result);
- return "";
+ function ($x) use ($result) {
+ return "";
}];
- };
-
- $pattern = array_map($rx, [
- ["{% for+:v+in+:v %}", "foreach(\$#3 as \$n => \$#1): \$loop = ['first' => \$n == 0];"],
+ }, [
+ ["{% for+:id+in+:var %}", "foreach(\$#2 as \$index => \$#1): \$loop = ['first' => \$index == 0, 'last' => \$index == count(\$#2) - 1];"],
["{% endfor %}", "endforeach;"],
- ["{% if+:v %}", "if(isset(\$#1) && \$#1 ):"],
+ ["{% if+:var %}", "if(isset(\$#1) && \$#1 ):"],
["{% endif %}", "endif;"],
- ["{{ :v }}", "echo \$#1;"],
- ["{{ :v\|:x }}", "echo #3(\$#1);"]
+ ["{{ :var }}", "echo \$#1;"],
+ ["{{ :var\|:id }}", "echo #3(\$#1);"]
]);
-
+
$result = file_get_contents($html);
foreach($pattern as $arg) {
- list($key, $value) = $arg;
- $result = preg_replace_callback($key, $value, $result);
+ $result = preg_replace_callback($arg[0], $arg[1], $result);
}
+
$this->code = $result;
}