From a56b64cf49c5eb68ea79a583f533b573a45c5d7c Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 20 Dec 2019 11:43:00 -0500 Subject: [PATCH] - Added a Picea's reference into templates. This allows extensions to call themselves after compilation. --- src/Builder/ClassTemplate.php | 8 ++-- src/Compiler.php | 11 +++++ src/Extension/UrlExtension.php | 88 ++++++++++++++++++++++++---------- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/Builder/ClassTemplate.php b/src/Builder/ClassTemplate.php index 4928d9e..db48740 100644 --- a/src/Builder/ClassTemplate.php +++ b/src/Builder/ClassTemplate.php @@ -22,11 +22,11 @@ class %CLASSNAME% %EXTENDS% { public function output(array $variablesList = []) : void { - ( function($___class__template, $___global_variables, $___variables) { - extract($___global_variables); - extract($___variables, \EXTR_OVERWRITE); + ( function($___class__template, $___global_variables, $___variables, $___picea) { + extract($___global_variables); unset($___global_variables); + extract($___variables, \EXTR_OVERWRITE); unset($___variables); ?>%CONTENT%call($this->thisProxy ?? new class(){}, $this, $this->variableList, $variablesList); + } )->call($this->thisProxy ?? new class(){}, $this, $this->variableList, $variablesList, $this->picea); %PARENT_OUTPUT% } diff --git a/src/Compiler.php b/src/Compiler.php index f5de5f2..6e34108 100644 --- a/src/Compiler.php +++ b/src/Compiler.php @@ -97,4 +97,15 @@ class Compiler return $this; } + + public function getExtensionFromToken(string $name) : Extension\Extension + { + if ( false === $this->extensionList[$name] ?? false ) { + throw new \InvalidArgumentException(<<extensionList[$name]; + } } diff --git a/src/Extension/UrlExtension.php b/src/Extension/UrlExtension.php index eb46764..a734bda 100644 --- a/src/Extension/UrlExtension.php +++ b/src/Extension/UrlExtension.php @@ -11,56 +11,96 @@ class UrlExtension implements Extension { public function __construct(string $urlBase = "") { $this->urlBase = $urlBase; } - - public function addRoute(string $routeName, string $url, array $parameters = []) - { - - } - public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) { - return ""; + public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : ?string + { + switch($token) { + case "url": + return "compiler->getExtensionFromToken('$token')->buildUrl($arguments) ?>"; + } + + return null; + } + + public function buildUrl(string $uri, array $parameters = []) : string + { + return $this->url() . $uri . ( $parameters ? "?" . http_build_query($parameters) : "" ); + } + + + public function url() : string + { + return $this->scheme() . $this->domain() . $this->base(); } /** * Return URI formatted */ - public function uri($query_string = false) { - $uri = $_SERVER['REQUEST_URI'] ?? $this->php_self() . ($query_string ? $this->query_string() : ""); + protected function uri(bool $queryString = false) : string + { + $uri = ( $_SERVER['REQUEST_URI'] ?? $_SERVER['PHP_SELF'] ?? "" ) . ( $queryString ? $this->queryString() : "" ); - if ( ! $query_string ) { + if ( ! $queryString ) { $uri = explode('?', $uri, 2)[0]; } - if (($base = $this->config['base'] ?? false) && ( stripos($uri, $base) === 0 )) { + if ( ($base = $this->config['base'] ?? false) && ( stripos($uri, $base) === 0 ) ) { $uri = substr($uri, strlen($base)); } + return '/' . ltrim($uri, '/'); } - public function php_self() { - return isset($_SERVER['PHP_SELF']) ? str_replace(NEX . '/', '', $_SERVER['PHP_SELF']) : null; - } - /** * Return query string */ - public function query_string() { + protected function queryString() : string + { return isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : ""; } + protected function scheme() : string + { + return ( $this->isHttps() ? "https" : "http" ) . "://"; + } + + protected function base() : string + { + return $this->urlBase ? $this->urlBase . "/" : ""; + } + /** * Check if Uri's segments are valid * @param array $segments The uri's segments */ - public function secure($segments = []) { - return array_diff($segments, ['..', '://']); + protected function secure($segments = []) : array + { + return array_diff($segments, [ '..', '://' ]); } - public function domain() { - $domain_list = (array) $this->config('Eckinox.system.url.root'); - $current = strtolower($_SERVER['HTTP_HOST']); - - return $domain = in_array($current, $domain_list) ? $current : $domain_list[0]; + protected function domain() : string + { + return strtolower($_SERVER['HTTP_HOST']); + } + + protected function isDefaultPort() : bool + { + return in_array($_SERVER['SERVER_PORT'], [ 80, 443 ]); + } + + protected function isHttps() : bool + { + $header = in_array('https', array_map("strtolower", [ + $_SERVER['X-Url-Scheme'] ?? "", + $_SERVER['Front-End-Https'] ?? "", + $_SERVER['X-Forwarded-Ssl'] ?? "", + $_SERVER['X-Forwarded-Proto'] ?? "", + $_SERVER['X-Forwarded-Protocol'] ?? "", + ])); + + return $header + || ( "443" === $_SERVER['SERVER_PORT'] ?? "" ) + || ( "https" === $_SERVER['REQUEST_SCHEME'] ?? "http" ) + || ( "off" !== strtolower($_SERVER['HTTPS'] ?? "off") ); } - } \ No newline at end of file