135 $string = iconv('utf-8', 'us-ascii//TRANSLIT', $string);
137 $string = trim($string, '_');
138 // Remove duplicate _
139 $string = preg_replace('/_+/', '_', $string);
140 if (true === $lowercase) {
141 return self::lowercase($string);
147 public static function limit(string $string, int $limit = 100, string $end = '..'): string
149 if (mb_strwidth($string, 'UTF-8') <= $limit) {
153 return rtrim(mb_strimwidth($string, 0, $limit, '', 'UTF-8')) . $end;
157 public static function limitWords(string $string, int $limit = 10, string $end = '...'): string
159 $arrayWords = explode(' ', $string);
104 return str_replace('//', DIRECTORY_SEPARATOR, rtrim(sprintf('%s/%s.%s', stripos($file, ROOT_DIR) === false ? ($this->resource_dir ?? '') : ROOT_DIR, $this->templateName(str_ireplace(ROOT_DIR, '', $file)), $this->getExtension()), DIRECTORY_SEPARATOR));
107 public function getContent(string $path, array $params = []): string
109 if (!file_exists($path)) {
110 throw new HtmlException('view file: ' . $path . ' does not exists');
117 return $this->isMinified() === true ? $this->minify(ob_get_clean()) : ob_get_clean();
29 if(isset(ob_get_status()['buffer_size']) && ob_get_status()['buffer_size'] > 0){
37 public function render(array $params = []): string
39 $params = array_merge($this->params, $params);
40 $content = $this->getContent($this->ViewLocation($this->getTemplate()), $params);
42 if ($this->layout !== null) {
43 return str_replace('{{content}}', $content, $this->getContent($this->ViewLocation($this->getLayout()), $params));
49 public function include(...$args)
51 return $this->selfLoad('include', ...$args);
10 protected const EXTENSION = 'php', BASE_DIR = 'resources/views';
11 protected Html $engine;
13 public function __construct()
15 $this->engine = new Html;
16 $this->engine->resourceDir(self::BASE_DIR)->extension(self::EXTENSION);
19 public function dispatchView(string $template, array $paramiters = []): string
21 return $this->getEngine()->template($template)->render($paramiters);
24 public function getEngine(): Html
15 $this->setDriver($Driver ?: new HtmlDriver);
18 public function setDriver(IViewDriver $Driver): self
20 $this->Driver = $Driver;
24 public function render(...$args): string
26 return $this->getDriver()->dispatchView(...$args);
29 public function getDriver(): IViewDriver
54 return app()->getAuth();
57 function user(?string $var = null)
59 return $var !== null ? auth()->getUser()?->{$var} : auth()->getUser();
63 function view(...$args)
65 $engine = new View(new HtmlDriver);
66 return !empty($args) ? $engine->render(...$args) : $engine;
70 function config(string $map, $default = null): mixed
74 $map = explode('.', $map);
75 $stage = array_shift($map);
77 if (!isset($config[$stage])) {
78 $config[$stage] = require __DIR__ . '/../../config/' . $stage . '.php';
99 guex()->set('platform', 'guides');
101 $author = User::find(['username' => $username]);
102 if ($author === false) {
105 $posts = Post::select('p.*, t1.title, t1.slug, t1.content, t1.language, t1.updated_at')
106 ->join(PostMetadata::class, 't1.post = p.id AND t1.language = "' . $language . '"')
108 ->where(['type' => Post::TYPES['post'], 'user' => $author->id])
111 return view('public.author', ['posts' => $posts, 'author' => $author]);
114 public function SingleFaq(string $language, string $slug)
116 $this->set_lang($language);
117 guex()->set('platform', 'guides');
119 $post = Post::select('p.*, t1.title, t1.slug, t1.content, t1.language, t1.updated_at')
120 ->join(PostMetadata::class, 't1.post = p.id AND t1.language = "' . $language . '" AND t1.slug = "' . $slug . '"')
124 if ($post === false) {
44 return array_values($inputs);
47 protected function loadClass($callback, array $params = [])
49 if (is_array($callback) && !method_exists($callback[0], $callback[1])) {
50 throw new Exception('Method: ' . $callback[1] . ' does not exists in Class: ' . get_class($callback[0]));
53 return call_user_func($callback, ...$params);
56 protected function createClass(string $class, ...$args)
58 return new $class(...$args);
55 } elseif ($method === 'post') {
56 $callback[1] = 'store';
57 } elseif ($method === 'get' && isset($params[$action])) {
58 $callback[1] = 'show';
60 $callback[1] = 'index';
65 request()->setRoute($route);
67 return $this->loadClass($callback, $this->reflectParamiters($this->excapeParamiters($route->getParameters()), (is_array($callback) ? [$callback[0]::class, $callback[1]] : $callback)));
70 protected function callMiddlewares($middlewares): void
72 foreach ((array) $middlewares as $middleware) {
74 $class = $this->createClass($middleware);
76 if (!$class instanceof IMiddleware) {
77 throw new MiddlewareException($middleware . ' must be implement interface: ' . IMiddleware::class);
80 $this->loadClass([$class, 'handle'], $this->reflectParamiters([], [$middleware, 'handle']));
49 // call route middlewares
50 $this->callMiddlewares($route->getMiddlewares());
52 // utilize method required paramiters
53 $params = $this->utilizeRouteParam($matches, $route);
55 // set router paramiters
56 if (!empty($params)) {
57 $route->parameters($this->reflectParamiters($params, $route->getCallback()));
60 // dispatch route callback
61 return $this->dispatchRoute($route);
65 // not found any route for this path
66 // throw new NotFoundException('the route does not matched..');
70 public function route(string $name, $params = null): IRoute
72 foreach ($this->getRoutes() as $single_route) {
73 if (in_array($name, (array) $single_route->getName())) {
129 $this->triggerEvent(self::EVENT['created']);
132 public function run(): void
134 // Before Application Start Event
135 $this->triggerEvent(self::EVENT['beforeMount']);
137 // Start Application Route
138 echo $this->router->resolve();
140 // After Application Start Event
141 $this->triggerEvent(self::EVENT['mounted']);
144 public function getAuth(): Auth
146 if (!isset($this->auth)) {
147 $this->auth = new Auth;
29 // <div style="background:#000;color:#fff;padding:10px 20px;">
30 // <h3 style="font-size:25px;font-style: italic;color:blue;"></h3>
31 // <div style="border-bottom:1px solid rgba(255,255,255,0.25);padding:10px;margin-bottom:15px;">App Execution Has Started: {$started}</div>
32 // <div style="border-bottom:1px solid rgba(255,255,255,0.25);padding:10px;margin-bottom:15px;">App Execution Has End: {$end}</div>
33 // <div style="border-bottom:1px solid rgba(255,255,255,0.25);padding:10px;margin-bottom:15px;">App Total Execution: {$total}</div>
38 // run the application