From aa0bdea0c538d2c3f2f5225d213f3651e664820a Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Mon, 18 Jul 2022 17:44:03 +0000 Subject: [PATCH 1/5] - added a new lang.raw and _.raw token to Lang extexion --- src/Compiler.php | 4 +--- src/Extension/LanguageExtension.php | 8 +++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Compiler.php b/src/Compiler.php index 640c672..f725e0f 100644 --- a/src/Compiler.php +++ b/src/Compiler.php @@ -113,9 +113,7 @@ class Compiler foreach($this->extensionList as $ext) { if ($ext instanceof FunctionExtension) { foreach ($ext->exportFunctions() as $name => $value) { - if ( is_string($value) ) { - $callable = fn(...$args) => call_user_func_array([ $ext, $value ], $args); - } + $callable = is_string($value) ? fn(...$args) => call_user_func_array([ $ext, $value ], $args) : null; $context->pushFunction(is_numeric($name) ? $value : $name, $callable ?? $value); } diff --git a/src/Extension/LanguageExtension.php b/src/Extension/LanguageExtension.php index 8949b9a..8bd3f50 100644 --- a/src/Extension/LanguageExtension.php +++ b/src/Extension/LanguageExtension.php @@ -6,7 +6,7 @@ use Picea\Compiler\Context; class LanguageExtension implements Extension, FunctionExtension { - public array $tokens = [ "lang", "_", "language.set" ]; + public array $tokens = [ "lang", "lang.raw", "_", "_.raw", "language.set" ]; public string $currentLanguage = ""; @@ -31,9 +31,15 @@ class LanguageExtension implements Extension, FunctionExtension { return "compiler->getExtensionFromToken('$token')->currentLanguage = $arguments; ?>"; case "lang": + return "compiler->getExtensionFromToken('$token')->absoluteLang($arguments), \ENT_QUOTES, ini_get('default_charset'), true) ?>"; + + case "lang.raw": return "compiler->getExtensionFromToken('$token')->absoluteLang($arguments) ?>"; case "_": + return "compiler->getExtensionFromToken('$token')->relativeLang($arguments), \ENT_QUOTES, ini_get('default_charset'), true) ?>"; + + case "_.raw": return "compiler->getExtensionFromToken('$token')->relativeLang($arguments) ?>"; } From 4c3772376c4d356389b5310051b9322a2d09cfab Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Mon, 18 Jul 2022 18:14:49 +0000 Subject: [PATCH 2/5] - Quickfix in block error message output without variables --- src/ControlStructure/BlockToken.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ControlStructure/BlockToken.php b/src/ControlStructure/BlockToken.php index f02787e..e369781 100644 --- a/src/ControlStructure/BlockToken.php +++ b/src/ControlStructure/BlockToken.php @@ -30,7 +30,7 @@ class BlockToken implements ControlStructure { } catch(\TypeError \$ex) { throw new \Exception( - sprintf('A block awaiting arguments `%s` instead received `%s` with values `%s`', '$arguments', implode(', ', array_map('gettype', \$inlineVariables)), json_encode(\$inlineVariables)) + sprintf('A block awaiting arguments `%s` instead received `%s` with values `%s`', '$arguments', implode(', ', array_map('gettype', \$inlineVariables ?? [])), json_encode(\$inlineVariables)) ); } ?> From 5bac6cd843d7a8da85bb5e462943407f173eeb26 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Mon, 10 Oct 2022 15:27:54 +0000 Subject: [PATCH 3/5] - Rencoding UTF-8 to manage problematics strings in data to encode --- src/Extension/JsonExtension.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Extension/JsonExtension.php b/src/Extension/JsonExtension.php index 68c9307..260dc2a 100644 --- a/src/Extension/JsonExtension.php +++ b/src/Extension/JsonExtension.php @@ -23,16 +23,32 @@ class JsonExtension implements Extension, FunctionExtension { return "flags}), ENT_QUOTES, 'UTF-8') ?>"; } - return ""; + $cls = static::class; + + return ""; } public function exportFunctions(): array { return [ 'json' => function($arguments, ? int $flags = null) { - return json_encode($arguments, \JSON_FORCE_OBJECT); + return json_encode($arguments, \JSON_FORCE_OBJECT); }, ]; } + public static function utf8($src) { + + if (is_array($src)) { + foreach ($src as $key => $value) { + $src[$key] = static::utf8($value); + } + } + elseif (is_string($src)) { + return mb_convert_encoding($src, "UTF-8", "UTF-8"); + } + + return $src; + } + } From 08201b1958a7d4920f9a7c81de0240f00be54a51 Mon Sep 17 00:00:00 2001 From: Dave M Date: Wed, 12 Oct 2022 18:25:39 +0000 Subject: [PATCH 4/5] - Remove the old {? / ?} token as a PHP opening - Added url versions if needed --- src/Extension/UrlExtension.php | 32 +++++++++------------------ src/Language/DefaultRegistrations.php | 2 -- src/Syntax/PhpTagToken.php | 18 --------------- 3 files changed, 11 insertions(+), 41 deletions(-) delete mode 100644 src/Syntax/PhpTagToken.php diff --git a/src/Extension/UrlExtension.php b/src/Extension/UrlExtension.php index 99a66df..fddab6e 100644 --- a/src/Extension/UrlExtension.php +++ b/src/Extension/UrlExtension.php @@ -14,7 +14,7 @@ class UrlExtension implements Extension { protected array $routesTarget; - public array $tokens = [ "url" , "route", "asset", "url.current", "url.parameters" ]; + public array $tokens = [ "url" , "route", "route.cacheless", "asset", "url.current", "url.parameters" ]; public function __construct(Context $context, string $urlBase = "", string $assetToken = "") { $this->urlBase = trim($urlBase, "/"); @@ -67,20 +67,20 @@ class UrlExtension implements Extension { return $this->buildUrl($this->uri(), $parameters); } - public function buildUrl(string $uri = "", array $parameters = []) : string + public function buildUrl(string $uri = "", array $parameters = [], bool $appendVersion = false) : string { - return $this->setUrlParameters($this->url() . "/" . ltrim($uri, "/"), $parameters); + return $this->setUrlParameters($this->url() . "/" . ltrim($uri, "/"), $appendVersion ? array_replace([ 'v' => $this->assetToken ], $parameters) : $parameters); } - public function buildAssetUrl(string $uri, array $parameters = []) : string + public function buildAssetUrl(string $uri, array $parameters = [], bool $appendVersion = true) : string { - return $this->buildUrl($uri, array_replace([ 'v' => $this->assetToken ], $parameters)); + return $this->buildUrl($uri, $parameters, $appendVersion); } - public function buildRouteUrl(string $name, array $parameters = []) : string + public function buildRouteUrl(string $name, array $parameters = [], bool $appendVersion = false) : string { if ( false !== ( $route = $this->routes[$name] ?? false ) ) { - return $this->buildUrl($this->prepareRoute($route['route'], $parameters), $parameters); + return $this->buildUrl($this->prepareRoute($route['route'], $parameters), $parameters, $appendVersion); } $routeList = json_encode($this->routes, \JSON_PRETTY_PRINT); @@ -165,7 +165,7 @@ class UrlExtension implements Extension { $_SERVER['X-Forwarded-Ssl'] ?? "", $_SERVER['X-Forwarded-Proto'] ?? "", $_SERVER['X-Forwarded-Protocol'] ?? "", - ])) || isset($_SERVER['HTTP_X_ARR_SSL']); + ])); return $header || ( "443" === ( $_SERVER['SERVER_PORT'] ?? "" ) ) @@ -183,7 +183,7 @@ class UrlExtension implements Extension { list($variable, $default) = explode('=', $item[1]); } elseif (strpos($item[1], ":") !== false) { - list($variable, $type) = explode(':', $item[1]); + list($variable, ) = explode(':', $item[1]); } else { $variable = $item[1]; @@ -191,7 +191,6 @@ class UrlExtension implements Extension { if ( array_key_exists($variable, $arguments) ) { $value = $arguments[ $variable ]; - unset($arguments[ $variable ]); } else { @@ -199,22 +198,13 @@ class UrlExtension implements Extension { } $search[ $item[0] ] = $value; + } $route = str_replace(array_keys($search), array_values($search), $route); } - /* - * @TODO - must also take into account that recursivity is possible here [/test[/another[/still]]], - * so the regex must be adjusted (or simply using another method could also be a possiblity) - * while(strpos($route, '[') !== false && strpos($route, ']') !== false ) { - if ( preg_match_all('~[(.*?)]~si', $route, $matches, PREG_SET_ORDER) ) { - - } - }*/ - $route = trim(str_replace([ '[', ']' ], '', $route), '/'); - return $route; - } + } } diff --git a/src/Language/DefaultRegistrations.php b/src/Language/DefaultRegistrations.php index 051d071..aea8a95 100644 --- a/src/Language/DefaultRegistrations.php +++ b/src/Language/DefaultRegistrations.php @@ -28,7 +28,6 @@ class DefaultRegistrations implements LanguageRegistration public function registerSyntax(Compiler $compiler) : void { - $compiler->registerSyntax(new \Picea\Syntax\PhpTagToken()); $compiler->registerSyntax(new \Picea\Syntax\CommentToken()); $compiler->registerSyntax(new \Picea\Syntax\EchoRawToken()); $compiler->registerSyntax(new \Picea\Syntax\EchoSafeToken()); @@ -49,7 +48,6 @@ class DefaultRegistrations implements LanguageRegistration $compiler->registerControlStructure(new \Picea\ControlStructure\SwitchToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\DefaultToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\BreakToken()); - $compiler->registerControlStructure(new \Picea\ControlStructure\ContinueToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\ExtendsToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\SectionToken()); $compiler->registerControlStructure(new \Picea\ControlStructure\BlockToken()); diff --git a/src/Syntax/PhpTagToken.php b/src/Syntax/PhpTagToken.php deleted file mode 100644 index 3dc0c6a..0000000 --- a/src/Syntax/PhpTagToken.php +++ /dev/null @@ -1,18 +0,0 @@ -tokenOpen})(.*?)({$this->tokenClose})#s", function ($matches) { - return ""; - }, $sourceCode); - } - -} From 7e80d4be6d1eb6ff4cdfb2102868add5580ad903 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Thu, 24 Nov 2022 20:00:43 +0000 Subject: [PATCH 5/5] - Added an 'urlize' method to the UrlExtension class --- src/Extension/UrlExtension.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/Extension/UrlExtension.php b/src/Extension/UrlExtension.php index 0d3b07c..537ae0e 100644 --- a/src/Extension/UrlExtension.php +++ b/src/Extension/UrlExtension.php @@ -6,6 +6,14 @@ use Picea\Compiler\Context; class UrlExtension implements Extension { + public const URLIZE_PATTERN_URL = <<)(?=[^\w/._\-&])~s + PATTERN; + + public const URLIZE_PATTERN_EMAIL = <<pushFunction("asset", [ $this, 'buildAssetUrl' ]); $context->pushFunction("route", [ $this, 'buildRouteUrl' ]); $context->pushFunction("slug", [ $this, 'slug' ]); + $context->pushFunction("urlize", [ $this, 'urlize' ]); } public function getRouteList(bool $full = false) : array @@ -66,6 +75,17 @@ class UrlExtension implements Extension { return $url . ( $parameters ? "?" . http_build_query($parameters) : "" ); } + public function urlize(string $string) : string + { + # Normal URL patterns + $string = preg_replace(static::URLIZE_PATTERN_URL, '$0', $string); + + # Email patterns + $string = preg_replace(static::URLIZE_PATTERN_EMAIL, '$0', $string); + + return $string; + } + public function currentUrl(array $parameters = []) : string { return $this->buildUrl($this->uri(), $parameters);