MAPG-180 ability to inline CSS and JS assets
This commit is contained in:
2 files changed
+57
-43
No files matched your search
+55
-23
@@ -2,6 +2,8 @@
|
||||
|
||||
class Linker
|
||||
{
|
||||
const INLINE_ASSET_LIMIT = 2000;
|
||||
|
||||
private string $view;
|
||||
|
||||
public function __construct(string $view)
|
||||
@@ -14,9 +16,7 @@ class Linker
|
||||
$input = ROOT . '/views/' . $this->view . '.php';
|
||||
|
||||
$temporaryFiles = [];
|
||||
$css = [];
|
||||
$js = [];
|
||||
$sections = [];
|
||||
$sections = ['externalCss' => '', 'inlineCss' => '', 'externalJs' => '', 'inlineJs' => ''];
|
||||
$extra = ['', ''];
|
||||
|
||||
do {
|
||||
@@ -25,14 +25,14 @@ class Linker
|
||||
|
||||
$extends = $fragment->getExtends();
|
||||
|
||||
$css = array_merge($css, $fragment->getCss());
|
||||
$js = array_merge($js, $fragment->getJs());
|
||||
$this->generateAssets($fragment, $sections);
|
||||
|
||||
$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($css, $js, $extra, $input, ROOT . '/cache/views/' . $this->view . '.php');
|
||||
$this->writeFinal($extra, $input, ROOT . '/cache/views/' . $this->view . '.php');
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ class Linker
|
||||
fclose($outputFileHandle);
|
||||
}
|
||||
|
||||
private function writeFinal(array $css, array $js, array $extra, string $file, string $output): void
|
||||
private function writeFinal(array $extra, string $file, string $output): void
|
||||
{
|
||||
$dirname = pathinfo($output, PATHINFO_DIRNAME);
|
||||
if (!is_dir($dirname)) {
|
||||
@@ -95,22 +95,6 @@ class Linker
|
||||
throw new \Exception('Cannot open file ' . $output . 'for writing.');
|
||||
}
|
||||
|
||||
if (count($css) > 0) {
|
||||
fwrite($outputFileHandle, '<?php' . PHP_EOL . '$cssFiles = [];' . PHP_EOL);
|
||||
foreach ($css as $cssFile) {
|
||||
fwrite($outputFileHandle, '$cssFiles[] = ' . $cssFile . ';' . PHP_EOL);
|
||||
}
|
||||
fwrite($outputFileHandle, '?>' . PHP_EOL);
|
||||
}
|
||||
|
||||
if (count($js) > 0) {
|
||||
fwrite($outputFileHandle, '<?php' . PHP_EOL . '$jsFiles = [];' . PHP_EOL);
|
||||
foreach ($js as $jsFile) {
|
||||
fwrite($outputFileHandle, '$jsFiles[] = ' . $jsFile . ';' . PHP_EOL);
|
||||
}
|
||||
fwrite($outputFileHandle, '?>' . PHP_EOL);
|
||||
}
|
||||
|
||||
fwrite($outputFileHandle, $extra[0]);
|
||||
while (($line = fgets($inputFileHandle)) !== false) {
|
||||
fwrite($outputFileHandle, $line);
|
||||
@@ -120,4 +104,52 @@ class Linker
|
||||
fclose($inputFileHandle);
|
||||
fclose($outputFileHandle);
|
||||
}
|
||||
|
||||
private function generateAssets(ParsedFragment $fragment, array &$sections)
|
||||
{
|
||||
foreach ($fragment->getCss() as $cssFile) {
|
||||
$asset = $this->parseAsset($cssFile, 'css');
|
||||
if (isset($asset['code'])) {
|
||||
$sections['inlineCss'] .= '<style>' . PHP_EOL;
|
||||
$sections['inlineCss'] .= $asset['code'];
|
||||
$sections['inlineCss'] .= '</style>' . PHP_EOL;
|
||||
} elseif (isset($asset['file'])) {
|
||||
$sections['externalCss'] .= '<link href="' . $asset['file'] . '" rel="stylesheet">' . PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($fragment->getJs() as $jsFile) {
|
||||
$asset = $this->parseAsset($jsFile, 'js');
|
||||
if (isset($asset['code'])) {
|
||||
$sections['inlineJs'] .= '<script>' . PHP_EOL;
|
||||
$sections['inlineJs'] .= $asset['code'];
|
||||
$sections['inlineJs'] .= '</script>' . PHP_EOL;
|
||||
} elseif (isset($asset['file'])) {
|
||||
$sections['externalJs'] .= '<script src="' . $asset['file'] . '"></script>' . PHP_EOL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function parseAsset(string $asset, string $type): array
|
||||
{
|
||||
$output = [];
|
||||
|
||||
eval('$asset = ' . $asset . ';');
|
||||
|
||||
if (
|
||||
empty($_ENV['DEV']) &&
|
||||
preg_match('/^' . $type . '\/.*/', $asset) &&
|
||||
filesize(ROOT . '/public/static/' . $asset) < self::INLINE_ASSET_LIMIT
|
||||
) {
|
||||
$output['code'] = file_get_contents(ROOT . '/public/static/' . $asset);
|
||||
} else {
|
||||
if (!preg_match('/^http(s)?/', $asset)) {
|
||||
$output['file'] = $_ENV['STATIC_ROOT'] . '/' . $asset . '?rev=' . REVISION;
|
||||
} else {
|
||||
$output['file'] = $asset;
|
||||
}
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user