1
0
mirror of https://github.com/flarum/core.git synced 2025-08-02 14:37:49 +02:00
This commit is contained in:
Daniël Klabbers
2022-07-26 02:24:56 +02:00
parent fe20e2c212
commit 01bdfcca33
13 changed files with 265 additions and 118 deletions

View File

@@ -19,6 +19,9 @@ use Flarum\Foundation\ErrorHandling\WhoopsFormatter;
use Flarum\Foundation\Event\ClearingCache;
use Flarum\Frontend\AddLocaleAssets;
use Flarum\Frontend\AddTranslations;
use Flarum\Frontend\Asset\Css;
use Flarum\Frontend\Asset\Js;
use Flarum\Frontend\Asset\Type;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Flarum\Frontend\RecompileFrontendAssets;
use Flarum\Http\Middleware as HttpMiddleware;
@@ -94,16 +97,41 @@ class AdminServiceProvider extends AbstractServiceProvider
/** @var \Flarum\Frontend\Assets $assets */
$assets = $container->make('flarum.assets.factory')('admin');
$assets->js(function (SourceCollector $sources) {
$assets->addAsset((new Js('admin.js'))->addSource(function (SourceCollector $sources) {
$sources->addFile(__DIR__.'/../../js/dist/admin.js');
}));
$assets->getAssets()
->ofType('css')
->first()
->addSource(function (SourceCollector $sources) {
$sources->addFile(__DIR__ . '/../../less/admin.less');
});
$assets->css(function (SourceCollector $sources) {
$sources->addFile(__DIR__.'/../../less/admin.less');
/** @var LocaleManager $locales */
$locales = $container[LocaleManager::class];
/** @var AddLocaleAssets $addLocaleAssets */
$addLocaleAssets = $container->make(AddLocaleAssets::class);
foreach ($locales->getLocales() as $locale => $_) {
$localeJs = new Js("admin-$locale.js", $locale);
$localeJs
->addSource([$container->make(AddTranslations::class)->forFrontend('admin'), 'getSources'])
->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) {
$addLocaleAssets->getLocaleJs($collector, $locale);
});
$container->make(AddTranslations::class)->forFrontend('admin')->to($assets);
$container->make(AddLocaleAssets::class)->to($assets);
$assets->addAsset($localeJs);
$localeCss = new Css("admin-$locale.css", $locale);
$localeCss
->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) {
$addLocaleAssets->getLocaleCss($collector, $locale);
});
$assets->addAsset($localeCss);
}
return $assets;
});

View File

@@ -189,7 +189,7 @@ class Frontend implements ExtenderInterface
$container->resolving($abstract, function (Assets $assets) use ($moduleName) {
if ($this->js) {
$assets->js(function (SourceCollector $sources) use ($moduleName) {
$assets->getAssets()->ofType('js')->first()->addSource(function (SourceCollector $sources) use ($moduleName) {
$sources->addString(function () {
return 'var module={};';
});
@@ -201,7 +201,7 @@ class Frontend implements ExtenderInterface
}
if ($this->css) {
$assets->css(function (SourceCollector $sources) use ($moduleName) {
$assets->getAssets()->ofType('css')->first()->addSource(function (SourceCollector $sources) use ($moduleName) {
foreach ($this->css as $path) {
$sources->addFile($path, $moduleName);
}

View File

@@ -20,6 +20,9 @@ use Flarum\Foundation\ErrorHandling\WhoopsFormatter;
use Flarum\Foundation\Event\ClearingCache;
use Flarum\Frontend\AddLocaleAssets;
use Flarum\Frontend\AddTranslations;
use Flarum\Frontend\Asset\Css;
use Flarum\Frontend\Asset\Js;
use Flarum\Frontend\Asset\Type;
use Flarum\Frontend\Assets;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Flarum\Frontend\RecompileFrontendAssets;
@@ -106,22 +109,44 @@ class ForumServiceProvider extends AbstractServiceProvider
/** @var Assets $assets */
$assets = $container->make('flarum.assets.factory')('forum');
$assets->js(function (SourceCollector $sources) use ($container) {
$assets->addAsset((new Js('forum.js'))->addSource(function (SourceCollector $sources) use ($container) {
$sources->addFile(__DIR__.'/../../js/dist/forum.js');
$sources->addString(function () use ($container) {
return $container->make(Formatter::class)->getJs();
});
});
}));
$assets->css(function (SourceCollector $sources) use ($container) {
$assets->getAssets()->ofType('css')->first()->addSource(function (SourceCollector $sources) use ($container) {
$sources->addFile(__DIR__.'/../../less/forum.less');
$sources->addString(function () use ($container) {
return $container->make(SettingsRepositoryInterface::class)->get('custom_less', '');
});
});
$container->make(AddTranslations::class)->forFrontend('forum')->to($assets);
$container->make(AddLocaleAssets::class)->to($assets);
/** @var LocaleManager $locales */
$locales = $container[LocaleManager::class];
/** @var AddLocaleAssets $addLocaleAssets */
$addLocaleAssets = $container->make(AddLocaleAssets::class);
foreach ($locales->getLocales() as $locale => $_) {
$localeJs = new Js("forum-$locale.js", $locale);
$localeJs
->addSource([$container->make(AddTranslations::class)->forFrontend('forum'), 'getSources'])
->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) {
$addLocaleAssets->getLocaleJs($collector, $locale);
});
$assets->addAsset($localeJs);
$localeCss = new Css("forum-$locale.css", $locale);
$localeCss
->addSource(function (SourceCollector $collector) use ($addLocaleAssets, $locale) {
$addLocaleAssets->getLocaleCss($collector, $locale);
});
$assets->addAsset($localeCss);
}
return $assets;
});

View File

@@ -32,16 +32,20 @@ class AddLocaleAssets
public function to(Assets $assets)
{
$assets->localeJs(function (SourceCollector $sources, string $locale) {
$assets->localeJs([$this, 'getLocaleJs']);
$assets->localeCss([$this, 'getLocaleCss']);
}
public function getLocaleJs(SourceCollector $sources, string $locale) {
foreach ($this->locales->getJsFiles($locale) as $file) {
$sources->addFile($file);
}
});
}
$assets->localeCss(function (SourceCollector $sources, string $locale) {
public function getLocaleCss(SourceCollector $sources, string $locale) {
foreach ($this->locales->getCssFiles($locale) as $file) {
$sources->addFile($file);
}
});
}
}

View File

@@ -43,15 +43,17 @@ class AddTranslations
return $this;
}
public function to(Assets $assets)
{
$assets->localeJs(function (SourceCollector $sources, string $locale) {
public function getSources(SourceCollector $sources, string $locale) {
$sources->addString(function () use ($locale) {
$translations = $this->getTranslations($locale);
return 'flarum.core.app.translator.addTranslations('.json_encode($translations).')';
});
});
}
public function to(Assets $assets)
{
$assets->localeJs([$this, 'getSources']);
}
private function getTranslations(string $locale)

View File

@@ -0,0 +1,22 @@
<?php
namespace Flarum\Frontend\Asset;
use Illuminate\Support\Collection;
class AssetCollection extends Collection
{
protected array $quickMap = [
'css' => Css::class,
'js' => Js::class,
];
public function ofType(string $type)
{
$type = $this->quickMap[$type] ?? $type;
return $this->filter(function (Type $asset) use ($type) {
return $asset instanceof $type;
});
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Flarum\Frontend\Asset;
use Flarum\Frontend\Compiler\LessCompiler;
class Css extends Type
{
protected string $compilerClass = LessCompiler::class;
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Flarum\Frontend\Asset;
use Flarum\Frontend\Compiler\JsCompiler;
class Js extends Type
{
protected string $compilerClass = JsCompiler::class;
}

View File

@@ -0,0 +1,81 @@
<?php
namespace Flarum\Frontend\Asset;
use Flarum\Frontend\Compiler\CompilerInterface;
use Flarum\Frontend\Compiler\Source\SourceCollector;
abstract class Type
{
/** @var array|callable[] */
protected array $sources;
protected string $compilerClass;
protected ?CompilerInterface $compiler = null;
protected string $filename;
protected string $type;
protected ?string $locale;
public function __construct(string $filename, string $locale = null)
{
$this->filename = $filename;
$this->locale = $locale;
}
public function addSource(callable $source)
{
$this->sources[] = $source;
return $this;
}
public function getSources(): array
{
return $this->sources;
}
public function setSources(array $sources): static
{
$this->sources = $sources;
return $this;
}
public function sources(): array
{
$collector = new SourceCollector;
foreach ($this->sources as $source) {
$source($collector);
}
return $collector->getSources();
}
public function getFilename(): string
{
return $this->filename;
}
public function getCompilerClass(): string
{
return $this->compilerClass;
}
public function setCompiler(CompilerInterface $compiler): static
{
$compiler->addSources(function (SourceCollector $sources) {
foreach ($this->sources as $callback) {
$callback($sources, $this->locale);
}
});
$this->compiler = $compiler;
return $this;
}
public function getCompiler(): CompilerInterface
{
return $this->compiler;
}
}

View File

@@ -9,10 +9,10 @@
namespace Flarum\Frontend;
use Flarum\Frontend\Compiler\CompilerInterface;
use Flarum\Frontend\Asset\AssetCollection;
use Flarum\Frontend\Asset\Type;
use Flarum\Frontend\Compiler\JsCompiler;
use Flarum\Frontend\Compiler\LessCompiler;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Illuminate\Contracts\Filesystem\Filesystem;
/**
@@ -66,6 +66,10 @@ class Assets
* @var array
*/
protected $customFunctions = [];
/**
* @var array|Type[]
*/
protected array $assets = [];
public function __construct(string $name, Filesystem $assetsDir, string $cacheDir = null, array $lessImportDirs = null, array $customFunctions = [])
{
@@ -76,85 +80,26 @@ class Assets
$this->customFunctions = $customFunctions;
}
public function js($sources)
public function addAsset(Type $asset): static
{
$this->addSources('js', $sources);
$this->assets[$asset->getFilename()] = $asset;
return $this;
}
public function css($callback)
public function getAssets(): AssetCollection
{
$this->addSources('css', $callback);
return $this;
}
public function localeJs($callback)
{
$this->addSources('localeJs', $callback);
return $this;
}
public function localeCss($callback)
{
$this->addSources('localeCss', $callback);
return $this;
}
private function addSources($type, $callback)
{
$this->sources[$type][] = $callback;
}
private function populate(CompilerInterface $compiler, string $type, string $locale = null)
{
$compiler->addSources(function (SourceCollector $sources) use ($type, $locale) {
foreach ($this->sources[$type] as $callback) {
$callback($sources, $locale);
}
return AssetCollection::make($this->assets)
->each(function (Type $asset) {
$asset->setCompiler(
$asset->getCompilerClass() === JsCompiler::class
? $this->makeJsCompiler($asset->getFilename())
: $this->makeLessCompiler($asset->getFilename())
);
});
}
public function makeJs(): JsCompiler
{
$compiler = $this->makeJsCompiler($this->name.'.js');
$this->populate($compiler, 'js');
return $compiler;
}
public function makeCss(): LessCompiler
{
$compiler = $this->makeLessCompiler($this->name.'.css');
$this->populate($compiler, 'css');
return $compiler;
}
public function makeLocaleJs(string $locale): JsCompiler
{
$compiler = $this->makeJsCompiler($this->name.'-'.$locale.'.js');
$this->populate($compiler, 'localeJs', $locale);
return $compiler;
}
public function makeLocaleCss(string $locale): LessCompiler
{
$compiler = $this->makeLessCompiler($this->name.'-'.$locale.'.css');
$this->populate($compiler, 'localeCss', $locale);
return $compiler;
}
protected function makeJsCompiler(string $filename)
protected function makeJsCompiler(string $filename): JsCompiler
{
return new JsCompiler($this->assetsDir, $filename);
}

View File

@@ -10,6 +10,9 @@
namespace Flarum\Frontend\Content;
use Flarum\Foundation\Config;
use Flarum\Frontend\Asset\Css;
use Flarum\Frontend\Asset\Js;
use Flarum\Frontend\Asset\Type;
use Flarum\Frontend\Compiler\CompilerInterface;
use Flarum\Frontend\Document;
use Illuminate\Contracts\Container\Container;
@@ -74,9 +77,21 @@ class Assets
*/
protected function assembleCompilers(?string $locale): array
{
$assets = $this->assets->getAssets();
return [
'js' => [$this->assets->makeJs(), $this->assets->makeLocaleJs($locale)],
'css' => [$this->assets->makeCss(), $this->assets->makeLocaleCss($locale)]
'js' => $assets
->ofType('js')
->map(function (Type $asset) {
return $asset->getCompiler();
})
->toArray(),
'css' => $assets
->ofType('css')
->map(function (Type $asset) {
return $asset->getCompiler();
})
->toArray(),
];
}

View File

@@ -11,11 +11,13 @@ namespace Flarum\Frontend;
use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Foundation\Paths;
use Flarum\Frontend\Asset\Css;
use Flarum\Frontend\Compiler\Source\SourceCollector;
use Flarum\Frontend\Driver\BasicTitleDriver;
use Flarum\Frontend\Driver\TitleDriverInterface;
use Flarum\Http\SlugManager;
use Flarum\Http\UrlGenerator;
use Flarum\Locale\LocaleManager;
use Flarum\Settings\SettingsRepositoryInterface;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\View\Factory as ViewFactory;
@@ -40,8 +42,14 @@ class FrontendServiceProvider extends AbstractServiceProvider
$paths->vendor.'/components/font-awesome/less' => ''
]);
$assets->css([$this, 'addBaseCss']);
$assets->localeCss([$this, 'addBaseCss']);
$assets->addAsset((new Css("$name.css", null))->addSource([$this, 'addBaseCss']));
/** @var LocaleManager $locales */
$locales = $container[LocaleManager::class];
foreach ($locales->getLocales() as $locale => $_) {
$assets->addAsset((new Css("$name-$locale.css", $locale))->addSource([$this, 'addBaseCss']));
}
return $assets;
};

View File

@@ -9,6 +9,7 @@
namespace Flarum\Frontend;
use Flarum\Frontend\Asset\Type;
use Flarum\Locale\LocaleManager;
use Flarum\Settings\Event\Saved;
@@ -53,19 +54,15 @@ class RecompileFrontendAssets
protected function flushCss()
{
$this->assets->makeCss()->flush();
foreach ($this->locales->getLocales() as $locale => $name) {
$this->assets->makeLocaleCss($locale)->flush();
}
$this->assets->getAssets()->ofType('css')->each(function (Type $asset) {
$asset->getCompiler()->commit();
});
}
protected function flushJs()
{
$this->assets->makeJs()->flush();
foreach ($this->locales->getLocales() as $locale => $name) {
$this->assets->makeLocaleJs($locale)->flush();
}
$this->assets->getAssets()->ofType('js')->each(function (Type $asset) {
$asset->getCompiler()->commit();
});
}
}