diff --git a/src/View/Linker.php b/src/View/Linker.php index 360d69c..d426bc1 100644 --- a/src/View/Linker.php +++ b/src/View/Linker.php @@ -14,6 +14,8 @@ class Linker $input = ROOT . '/views/' . $this->view . '.php'; $temporaryFiles = []; + $css = []; + $js = []; $sections = []; $extra = ['', '']; @@ -23,12 +25,14 @@ class Linker $extends = $fragment->getExtends(); + $css = array_merge($css, $fragment->getCss()); + $js = array_merge($js, $fragment->getJs()); $sections = array_merge($sections, $fragment->getSections()); //TODO: detect if section defined multiple times $extra[0] = $fragment->getExtra()[0] . $extra[0]; $extra[1] = $extra[1] . $fragment->getExtra()[1]; if ($extends === null) { - $this->writeFinal($extra, $input, ROOT . '/cache/views/' . $this->view . '.php'); + $this->writeFinal($css, $js, $extra, $input, ROOT . '/cache/views/' . $this->view . '.php'); break; } @@ -74,7 +78,7 @@ class Linker fclose($outputFileHandle); } - private function writeFinal(array $extra, string $file, string $output): void + private function writeFinal(array $css, array $js, array $extra, string $file, string $output): void { $dirname = pathinfo($output, PATHINFO_DIRNAME); if (!is_dir($dirname)) { @@ -91,6 +95,22 @@ class Linker throw new \Exception('Cannot open file ' . $output . 'for writing.'); } + if (count($css) > 0) { + fwrite($outputFileHandle, '' . PHP_EOL); + } + + if (count($js) > 0) { + fwrite($outputFileHandle, '' . PHP_EOL); + } + fwrite($outputFileHandle, $extra[0]); while (($line = fgets($inputFileHandle)) !== false) { fwrite($outputFileHandle, $line); diff --git a/src/View/ParsedFragment.php b/src/View/ParsedFragment.php index 52bbb5b..a270a32 100644 --- a/src/View/ParsedFragment.php +++ b/src/View/ParsedFragment.php @@ -4,13 +4,19 @@ class ParsedFragment { private ?string $extends; + private array $css; + + private array $js; + private array $sections; private array $extra; - public function __construct(?string $extends, array $sections, array $extra) + public function __construct(?string $extends, array $css, array $js, array $sections, array $extra) { $this->extends = $extends; + $this->css = $css; + $this->js = $js; $this->sections = $sections; $this->extra = $extra; } @@ -20,6 +26,16 @@ class ParsedFragment return $this->extends; } + public function getCss(): array + { + return $this->css; + } + + public function getJs(): array + { + return $this->js; + } + public function getSections(): array { return $this->sections; diff --git a/src/View/Parser.php b/src/View/Parser.php index 6cbde82..0356027 100644 --- a/src/View/Parser.php +++ b/src/View/Parser.php @@ -11,11 +11,12 @@ class Parser public function parse(): ParsedFragment { - $sectionOpen = null; $extraOpen = false; $extends = null; + $js = []; + $css = []; $sections = []; $extra = ['', '']; @@ -28,6 +29,18 @@ class Parser while (($line = fgets($fileHandle)) !== false) { ++$lineNumber; + if (($cssMatched = $this->matchCss($line)) !== null) { + $css[] = $cssMatched; + + continue; + } + + if (($jsMatched = $this->matchJs($line)) !== null) { + $js[] = $jsMatched; + + continue; + } + if (($extendsMatched = $this->matchExtends($line)) !== null) { if ($extends !== null) { throw new \Exception('Error in file ' . $this->file . ' in line ' . $lineNumber . ' - There is already an \'@extends\' declared.'); @@ -90,7 +103,25 @@ class Parser fclose($fileHandle); - return new ParsedFragment($extends, $sections, $extra); + return new ParsedFragment($extends, $css, $js, $sections, $extra); + } + + private function matchCss(string $line): ?string + { + if (preg_match('/^\s*@css\((.*)\)\s*$/', $line, $matches)) { + return $matches[1]; + } + + return null; + } + + private function matchJs(string $line): ?string + { + if (preg_match('/^\s*@js\((.*)\)\s*$/', $line, $matches)) { + return $matches[1]; + } + + return null; } private function matchExtends(string $line): ?string diff --git a/views/admin/map_editor.php b/views/admin/map_editor.php index 1ca983f..c0d2e5a 100644 --- a/views/admin/map_editor.php +++ b/views/admin/map_editor.php @@ -1,19 +1,12 @@ -@extra - -@endextra +@css('node_modules/leaflet/dist/leaflet.css') +@css('css/map_editor.css') +@css('node_modules/leaflet.markercluster/dist/MarkerCluster.css') +@css('node_modules/leaflet.markercluster/dist/MarkerCluster.Default.css') + +@js('node_modules/leaflet/dist/leaflet.js') +@js('node_modules/leaflet.markercluster/dist/leaflet.markercluster.js') +@js('https://maps.googleapis.com/maps/api/js?key=' . $_ENV['GOOGLE_MAPS_JS_API_KEY']) +@js('js/map_editor.js') @extends('templates/layout_full') diff --git a/views/game.php b/views/game.php index bc4c63a..81dfc08 100644 --- a/views/game.php +++ b/views/game.php @@ -1,14 +1,7 @@ -@extra - -@endextra +@css('css/game.css') + +@js('https://maps.googleapis.com/maps/api/js?key=' . $_ENV['GOOGLE_MAPS_JS_API_KEY']) +@js('js/game.js') @extends('templates/layout_full') diff --git a/views/login/google_signup.php b/views/login/google_signup.php index 0f9fe9c..dd7b498 100644 --- a/views/login/google_signup.php +++ b/views/login/google_signup.php @@ -1,10 +1,4 @@ -@extra - -@endextra +@js('js/login/google_signup.js') @extends('templates/layout_normal') diff --git a/views/login/signup.php b/views/login/signup.php index 6912a27..ef63f04 100644 --- a/views/login/signup.php +++ b/views/login/signup.php @@ -1,10 +1,4 @@ -@extra - -@endextra +@js('js/login/signup.js') @extends('templates/layout_normal') diff --git a/views/maps.php b/views/maps.php index 002d3bb..22ecc11 100644 --- a/views/maps.php +++ b/views/maps.php @@ -1,16 +1,7 @@ -@extra - -@endextra +@css('css/maps.css') +@js('js/maps.js') +TODO: condition! +@js('js/maps_admin.js') @extends('templates/layout_normal') diff --git a/views/templates/mapguesser.php b/views/templates/mapguesser.php index 083fbb7..313d332 100644 --- a/views/templates/mapguesser.php +++ b/views/templates/mapguesser.php @@ -16,6 +16,7 @@ + @yields('inlineCss') @@ -62,6 +63,7 @@ + @yields('inlineJs')