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" +``` + +Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ этот способ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°Ρ…. 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 0000000..05afd33 Binary files /dev/null and b/content/posts/2023/php/lightweight-template-engine-php/splash.png differ