mirror of
https://github.com/flarum/core.git
synced 2025-08-02 14:37:49 +02:00
wip
This commit is contained in:
@@ -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;
|
||||
});
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
});
|
||||
|
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
|
22
framework/core/src/Frontend/Asset/AssetCollection.php
Normal file
22
framework/core/src/Frontend/Asset/AssetCollection.php
Normal 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;
|
||||
});
|
||||
}
|
||||
}
|
10
framework/core/src/Frontend/Asset/Css.php
Normal file
10
framework/core/src/Frontend/Asset/Css.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Flarum\Frontend\Asset;
|
||||
|
||||
use Flarum\Frontend\Compiler\LessCompiler;
|
||||
|
||||
class Css extends Type
|
||||
{
|
||||
protected string $compilerClass = LessCompiler::class;
|
||||
}
|
10
framework/core/src/Frontend/Asset/Js.php
Normal file
10
framework/core/src/Frontend/Asset/Js.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Flarum\Frontend\Asset;
|
||||
|
||||
use Flarum\Frontend\Compiler\JsCompiler;
|
||||
|
||||
class Js extends Type
|
||||
{
|
||||
protected string $compilerClass = JsCompiler::class;
|
||||
}
|
81
framework/core/src/Frontend/Asset/Type.php
Normal file
81
framework/core/src/Frontend/Asset/Type.php
Normal 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;
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
@@ -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(),
|
||||
];
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
};
|
||||
|
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user