From b5389daa768ad3ba3da02ec7722a7eeba8a052a3 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Thu, 5 Oct 2023 06:34:51 +0300 Subject: [PATCH 1/2] simple php template engine --- .../lightweight-template-engine-php/index.md | 230 ++++++++++++++++++ .../splash.png | Bin 0 -> 19029 bytes 2 files changed, 230 insertions(+) create mode 100644 content/posts/2023/php/lightweight-template-engine-php/index.md create mode 100644 content/posts/2023/php/lightweight-template-engine-php/splash.png diff --git a/content/posts/2023/php/lightweight-template-engine-php/index.md b/content/posts/2023/php/lightweight-template-engine-php/index.md new file mode 100644 index 0000000..e375502 --- /dev/null +++ b/content/posts/2023/php/lightweight-template-engine-php/index.md @@ -0,0 +1,230 @@ +--- +title: "πŸ“ƒ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ класс ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° PHP" +date: 2023-10-05T06:12:03+03:00 +draft: false +tags: [php, tutorial] +--- + +![](splash.png) + +> ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄: https://codeshack.io/lightweight-template-engine-php/ + +Класс ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° являСтся Π»Ρ‘Π³ΠΊΠΈΠΌ, Π³ΠΈΠ±ΠΊΠΈΠΌ, быстрым +ΠΈ бСзопасным. Он ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ PHP ΠΊΠΎΠ΄. + +НиТС я ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡŽ ΠΏΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΎΠ³ΠΎ, +ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. + +# Π—Π°Ρ‡Π΅ΠΌ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€? + +The template engine keeps your design code away from your application code, +this reason alone is good practice and follows many design patterns. +Using a template engine is entirely up to you, if you prefer +to keep your code clean and tidy then using a template engine is ideal. + +If you're working with the MVC pattern then it is a good idea +to use a template engine. + +# Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ + +Create a new file and name it `Template.php` and add: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `Template.php` ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: + +```php +' . PHP_EOL . $code); + } + return $cached_file; + } + + static function clearCache() { + foreach(glob(self::$cache_path . '*') as $file) { + unlink($file); + } + } + + static function compileCode($code) { + $code = self::compileBlock($code); + $code = self::compileYield($code); + $code = self::compileEscapedEchos($code); + $code = self::compileEchos($code); + $code = self::compilePHP($code); + return $code; + } + + static function includeFiles($file) { + $code = file_get_contents($file); + preg_match_all('/{% ?(extends|include) ?\'?(.*?)\'? ?%}/i', $code, $matches, PREG_SET_ORDER); + foreach ($matches as $value) { + $code = str_replace($value[0], self::includeFiles($value[2]), $code); + } + $code = preg_replace('/{% ?(extends|include) ?\'?(.*?)\'? ?%}/i', '', $code); + return $code; + } + + static function compilePHP($code) { + return preg_replace('~\{%\s*(.+?)\s*\%}~is', '', $code); + } + + static function compileEchos($code) { + return preg_replace('~\{{\s*(.+?)\s*\}}~is', '', $code); + } + + static function compileEscapedEchos($code) { + return preg_replace('~\{{{\s*(.+?)\s*\}}}~is', '', $code); + } + + static function compileBlock($code) { + preg_match_all('/{% ?block ?(.*?) ?%}(.*?){% ?endblock ?%}/is', $code, $matches, PREG_SET_ORDER); + foreach ($matches as $value) { + if (!array_key_exists($value[1], self::$blocks)) self::$blocks[$value[1]] = ''; + if (strpos($value[2], '@parent') === false) { + self::$blocks[$value[1]] = $value[2]; + } else { + self::$blocks[$value[1]] = str_replace('@parent', self::$blocks[$value[1]], $value[2]); + } + $code = str_replace($value[0], '', $code); + } + return $code; + } + + static function compileYield($code) { + foreach(self::$blocks as $block => $value) { + $code = preg_replace('/{% ?yield ?' . $block . ' ?%}/', $value, $code); + } + $code = preg_replace('/{% ?yield ?(.*?) ?%}/i', '', $code); + return $code; + } + +} +?> +``` + +Когда ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ², Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, +ΠΎΠ±Π½ΠΎΠ²ΠΈΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ `$cache_enabled` ΠΈ `$cache_path variables`. + +# Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€ + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» `index.php` ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: + +```php + +``` + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ HTML Ρ„Π°ΠΉΠ» `layout.html` ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: + +```html + + + + {% yield title %} + + + + {% yield content %} + + +``` + +Π­Ρ‚ΠΎ ΠΌΠ°ΠΊΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ HTML Ρ„Π°ΠΉΠ» `index.html` ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄: + +```html +{% extends layout.html %} + +{% block title %}Home Page{% endblock %} + +{% block content %} +

Home

+

Welcome to the home page!

+{% endblock %} +``` + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» `index.php` ΠΈ посмотритС Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. + +Но Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π½Π°ΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… шаблонов? +ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ шаблона Π² `index.php` ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: + +```php +Template::view('about.html', [ + 'title' => 'Home Page', + 'colors' => ['red','blue','green'] +]); +``` + +И ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: + +```html +{% extends layout.html %} + +{% block title %}{{ $title }}{% endblock %} + +{% block content %} +

Home

+

Welcome to the home page, list of colors:

+ +{% endblock %} +``` + +Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, вмСсто: `{{ $output }}` +Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `{{{ $output }}}`. + +Для Ρ‚Π°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ функция +[`htmlspecialchars`](https://www.php.net/manual/en/function.htmlspecialchars.php). + +НаслСдованиС Π±Π»ΠΎΠΊΠΎΠ²: + +```html +{% block content %} +@parent +

Extends content block!

+{% endblock %} +``` + +Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ шаблонов: + +```text +{% include forms.html %} +``` + +Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ кСш, достаточно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΊΠ°Ρ‚ΠΎΠ°Π»ΠΎΠ³Π΅ `$cache_path` +ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `Template::clearCache();`` + +# Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ + +Π¨Π°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. +Он ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½-ΠΊΠΎΠ΄ ΠΎΡ‚ ΠΊΠΎΠ΄Π° прилоТСния. + +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ свободно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот класс шаблонов Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. + + + +**Автор:** David Adams | **MIT License** diff --git a/content/posts/2023/php/lightweight-template-engine-php/splash.png b/content/posts/2023/php/lightweight-template-engine-php/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..05afd33921f4514fc16a2d8c7422d7772a78033b GIT binary patch literal 19029 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 literal 0 HcmV?d00001 From e420791f7513145f5cf70a43dd22680707ea8acd Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Sun, 8 Oct 2023 22:41:23 +0300 Subject: [PATCH 2/2] gnome terminal title tab --- README.md | 1 + content/posts/2023/gnome-terminal-title.md | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 README.md create mode 100644 content/posts/2023/gnome-terminal-title.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9814081 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Download [Hugo](https://github.com/gohugoio/hugo/releases/tag/v0.119.0). diff --git a/content/posts/2023/gnome-terminal-title.md b/content/posts/2023/gnome-terminal-title.md new file mode 100644 index 0000000..6dca5da --- /dev/null +++ b/content/posts/2023/gnome-terminal-title.md @@ -0,0 +1,24 @@ +--- +title: "πŸ–₯️ ИзмСнСниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Π² Gnome Terminal" +date: 2023-10-08T22:33:04+03:00 +draft: false +tags: [linux, tips] +--- + +Π’ **Gnome Terminal 3.14** ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ измСнСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π²ΠΊΠ»Π°Π΄ΠΊΠΈ. + +Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΠΈΠ½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ESCAPE ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. + +НапримСр: + +```sh +printf "\e]2;YOUR TITLE GOES HERE\a" +``` + +ΠΈΠ»ΠΈ Π² Bash + +```sh +echo -ne "\033]0;YOUR TITLE GOES HERE\007" +``` + +Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ этот способ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ….