From 0c30dc230d962f529d1d1d2b3c6df2b911d4eaaf Mon Sep 17 00:00:00 2001 From: "origami11@yandex.ru" Date: Wed, 21 May 2025 15:50:17 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20psr4.=20=D0=9A=D0=B5=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + readme.md => README.md | 6 ++--- composer.json | 11 +++----- examples/example.php | 8 +++--- examples/example2.php | 52 +++++++++++++++++++------------------- examples/example3.php | 9 ++++--- examples/example4.php | 5 ++-- examples/template2.html | 2 +- Klein.php => src/Klein.php | 38 ++++++++++++++++++---------- 9 files changed, 71 insertions(+), 61 deletions(-) rename readme.md => README.md (88%) rename Klein.php => src/Klein.php (74%) diff --git a/.gitignore b/.gitignore index c3999dd..fa3fa8e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules temp /vendor/ +/examples/cache \ No newline at end of file diff --git a/readme.md b/README.md similarity index 88% rename from readme.md rename to README.md index 8178eed..efe7855 100644 --- a/readme.md +++ b/README.md @@ -4,13 +4,13 @@ # Переменные -Для переменной name=Андрей шаблон +Для переменной name=Ivan шаблон ```html Hello, {{ name }} ``` преобразуется в ```html -Hello, Андрей +Hello, Ivan ``` ```html @@ -18,7 +18,7 @@ ``` преобразуется в ```html -Hello, +Hello, ``` # Циклы diff --git a/composer.json b/composer.json index 742438f..f72f727 100644 --- a/composer.json +++ b/composer.json @@ -2,15 +2,10 @@ "name": "ctiso/klein", "description": "simple template engine", "license": "MIT", - "authors": [ - { - "name": "Phedor Podlesnov", - "email": "phedor@edu.yar.ru" - } - ], + "authors": [], "autoload": { - "psr-0": { - "Klein": "" + "psr-4": { + "ctiso\\": "src/" } }, "require": {} diff --git a/examples/example.php b/examples/example.php index 0d481cc..392b6cf 100644 --- a/examples/example.php +++ b/examples/example.php @@ -1,14 +1,16 @@ render([ +echo $tpl->render('template.html', [ 'pagename' => 'awesome people', 'authors' => [['name' => 'Paul', 'age' => 10], ['name' => 'Jim', 'age' => 11], ['name' => 'Jane', 'age' => 12]], 'city'=> [ diff --git a/examples/example2.php b/examples/example2.php index 82077fe..9c9fb67 100644 --- a/examples/example2.php +++ b/examples/example2.php @@ -1,34 +1,34 @@ 0, - 'id_table' => 0, - 'name' => '', - 'header' => 'Наименование муниципального образования', - 'comment' => '', - 'colspan' => 0, - 'rowspan' => 4, - 'row' => 0, - 'position' => 0, - 'type' => '', - ], - [ - 'id' => 1, - 'id_table' => 0, + [ + 'id' => 0, + 'id_table' => 0, 'name' => '', - 'header' => '', - 'comment' => 'Над строкой - Прибыло всего (взрослых и детей)', - 'rowspan' => 0, - 'row' => 0, - 'position' => 1, - 'type' => '', + 'header' => 'Header #1', + 'comment' => '', + 'colspan' => 0, + 'rowspan' => 4, + 'row' => 0, + 'position' => 0, + 'type' => '', + ], + [ + 'id' => 1, + 'id_table' => 0, + 'name' => '', + 'header' => '', + 'comment' => 'Header #2', + 'rowspan' => 0, + 'row' => 0, + 'position' => 1, + 'type' => '', ] ]; -require_once '../Klein.php'; - -$tpl = new Klein('template2.html'); - -echo $tpl->render(['content' => $data]); +$tpl = new Klein(__DIR__ . '/cache'); +echo $tpl->render('template2.html'. ['content' => $data]); diff --git a/examples/example3.php b/examples/example3.php index dd71fd4..918798d 100644 --- a/examples/example3.php +++ b/examples/example3.php @@ -1,9 +1,10 @@ render(['names' => $data]); +echo $tpl->render('template3.html', ['names' => $data]); diff --git a/examples/example4.php b/examples/example4.php index f7cc60e..08e1a7c 100644 --- a/examples/example4.php +++ b/examples/example4.php @@ -1,12 +1,13 @@ name = 'Paul'; @@ -20,7 +21,7 @@ $u3 = new stdClass(); $u3->name = 'Jane'; $u3->age = 12; -echo $tpl->render([ +echo $tpl->render('template.html', [ 'pagename' => 'awesome people', 'authors' => [$u1, $u2, $u3], 'city'=> [ diff --git a/examples/template2.html b/examples/template2.html index 57ad54a..ca537ed 100644 --- a/examples/template2.html +++ b/examples/template2.html @@ -1,7 +1,7 @@
{% for var in content %} {% for key, value in var %} - {{key}} - {{value}} + {{ key }} - {{ value }} {% endfor %} {% endfor %}
\ No newline at end of file diff --git a/Klein.php b/src/Klein.php similarity index 74% rename from Klein.php rename to src/Klein.php index bb4c601..f6dd576 100644 --- a/Klein.php +++ b/src/Klein.php @@ -1,9 +1,18 @@ cache = $cache; + if (!file_exists($cache)) { + mkdir($cache, 0777, true); + } + } + + function compile($html, $target, $hash) { $pattern = array_map(function ($grammar) { list(, $result) = $grammar; $body = strtr($grammar[0], [' ' => "\s*", '+' => "\s+", ':var' => "(\w+(\s*\.\s*\w+)*)", ':id' => "(\w+)", '{{' => "{{\!?"]); @@ -15,7 +24,7 @@ class Klein { $list = preg_split('/\.\s*/', $s); $first = array_shift($list); - return count($list) > 0 ? "Klein::get(".$pref.$first.", [".implode(",", array_map(function ($x) { return "'$x'"; }, $list))."])" : $pref.$first; + return count($list) > 0 ? "Klein::get(".$pref.$first.", [".implode(",", array_map(fn ($x) => "'$x'", $list))."])" : $pref.$first; }, preg_split("/\s*,\s*/", $x[$s[1]]))); }, $result) . " ?>"; return ($x[0][2] == '!') ? "" : $code; @@ -38,22 +47,17 @@ class Klein { ["{% endmacro %}", "}"] ]); - $result = file_get_contents($html); + $result = "" .file_get_contents($html); foreach($pattern as $arg) { $result = preg_replace_callback($arg[0], $arg[1], $result); } - - $this->code = $result; + file_put_contents($target, $result); } static function get($arr, $items) { $result = $arr; foreach ($items as $key) { - if (is_array($result)) { - $result = isset($result[$key]) ? $result[$key] : null; - } else { - $result = isset($result->{$key}) ? $result->{$key} : null; - } + $result = (is_array($result)) ? $result[$key] ?? null : $result->{$key} ?? null; } return $result; } @@ -66,10 +70,16 @@ class Klein { , 'even' => $is_even]; } - function render($vars) { + function render($html, $vars) { + $hash = md5($html . filemtime($html)); + $target = $this->cache . '/tpl_' . $hash . '.php'; + if (!file_exists($target)) { + $this->compile($html, $target, $hash); + } + extract($vars); ob_start(); - eval(" ?>".$this->code."