1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-21 22:32:41 +01:00

Teach ./bin/celerity about sprite maps

Summary:
Add `./bin/celerity sprites`, to replace script `./scripts/celerity/generate_sprites.php`.
Also make new workflow run `./bin/celerity map` at the same time.

Fixes T15437.

Test Plan: Changes a file that goes in the sprites, run new command

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15437

Differential Revision: https://we.phorge.it/D25274
This commit is contained in:
Aviv Eyal 2023-06-03 09:41:30 -07:00
parent d8d65f3f87
commit cb938d869c
3 changed files with 113 additions and 77 deletions

View file

@ -3,80 +3,6 @@
require_once dirname(dirname(__FILE__)).'/__init_script__.php';
$args = new PhutilArgumentParser($argv);
$args->setTagline(pht('regenerate CSS sprite sheets'));
$args->setSynopsis(<<<EOHELP
**sprites**
Rebuild CSS sprite sheets.
EOHELP
);
$args->parseStandardArguments();
$args->parse(
array(
array(
'name' => 'force',
'help' => pht('Force regeneration even if sources have not changed.'),
),
));
$root = dirname(phutil_get_library_root('phabricator'));
$webroot = $root.'/webroot/rsrc';
$webroot = Filesystem::readablePath($webroot);
$generator = new CeleritySpriteGenerator();
$sheets = array(
'tokens' => $generator->buildTokenSheet(),
'login' => $generator->buildLoginSheet(),
);
list($err) = exec_manual('optipng');
if ($err) {
$have_optipng = false;
echo phutil_console_format(
"<bg:red> %s </bg> %s\n%s\n",
pht('WARNING'),
pht('`%s` not found in PATH.', 'optipng'),
pht('Sprites will not be optimized! Install `%s`!', 'optipng'));
} else {
$have_optipng = true;
}
foreach ($sheets as $name => $sheet) {
$sheet->setBasePath($root);
$manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json';
if (!$args->getArg('force')) {
if (Filesystem::pathExists($manifest_path)) {
$data = Filesystem::readFile($manifest_path);
$data = phutil_json_decode($data);
if (!$sheet->needsRegeneration($data)) {
continue;
}
}
}
$sheet
->generateCSS($webroot."/css/sprite-{$name}.css")
->generateManifest($root."/resources/sprite/manifest/{$name}.json");
foreach ($sheet->getScales() as $scale) {
if ($scale == 1) {
$sheet_name = "sprite-{$name}.png";
} else {
$sheet_name = "sprite-{$name}-X{$scale}.png";
}
$full_path = "{$webroot}/image/{$sheet_name}";
$sheet->generateImage($full_path, $scale);
if ($have_optipng) {
echo pht('Optimizing...')."\n";
phutil_passthru('optipng -o7 -clobber %s', $full_path);
}
}
}
echo pht('Done.')."\n";
echo pht('This script was replaced with `%s`!.', './bin/celerity sprites');
echo "\n";
exit(13);

View file

@ -318,6 +318,7 @@ phutil_register_library_map(array(
'CelerityDefaultPostprocessor' => 'applications/celerity/postprocessor/CelerityDefaultPostprocessor.php',
'CelerityHighContrastPostprocessor' => 'applications/celerity/postprocessor/CelerityHighContrastPostprocessor.php',
'CelerityLargeFontPostprocessor' => 'applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php',
'CelerityManagementGenerateSpritesWorkflow' => 'applications/celerity/management/CelerityManagementGenerateSpritesWorkflow.php',
'CelerityManagementMapWorkflow' => 'applications/celerity/management/CelerityManagementMapWorkflow.php',
'CelerityManagementSyntaxWorkflow' => 'applications/celerity/management/CelerityManagementSyntaxWorkflow.php',
'CelerityManagementWorkflow' => 'applications/celerity/management/CelerityManagementWorkflow.php',
@ -6311,6 +6312,7 @@ phutil_register_library_map(array(
'CelerityDefaultPostprocessor' => 'CelerityPostprocessor',
'CelerityHighContrastPostprocessor' => 'CelerityPostprocessor',
'CelerityLargeFontPostprocessor' => 'CelerityPostprocessor',
'CelerityManagementGenerateSpritesWorkflow' => 'CelerityManagementWorkflow',
'CelerityManagementMapWorkflow' => 'CelerityManagementWorkflow',
'CelerityManagementSyntaxWorkflow' => 'CelerityManagementWorkflow',
'CelerityManagementWorkflow' => 'PhabricatorManagementWorkflow',

View file

@ -0,0 +1,108 @@
<?php
final class CelerityManagementGenerateSpritesWorkflow
extends CelerityManagementWorkflow {
protected function didConstruct() {
$this
->setName('sprites')
->setExamples('**sprites** [options]')
->setSynopsis(pht('Rebuild CSS sprite sheets.'))
->setArguments(
array(
array(
'name' => 'force',
'help' => pht('Force regeneration even no sources have changed.'),
),
array(
'name' => 'no-map',
'help' =>
pht(
'Do not invoke `%s` after updating sprites',
'celerity map'),
),
));
}
public function execute(PhutilArgumentParser $args) {
$resources_map = CelerityPhysicalResources::getAll();
$console = PhutilConsole::getConsole();
$root = dirname(phutil_get_library_root('phorge'));
$webroot = $root.'/webroot/rsrc';
$webroot = Filesystem::readablePath($webroot);
$generator = new CeleritySpriteGenerator();
$sheets = array(
'tokens' => $generator->buildTokenSheet(),
'login' => $generator->buildLoginSheet(),
);
list($err) = exec_manual('optipng');
if ($err) {
$have_optipng = false;
$console->writeErr(
"<bg:red> %s </bg> %s\n%s\n",
pht('WARNING'),
pht('`%s` not found in PATH.', 'optipng'),
pht('Sprites will not be optimized! Install `%s`!', 'optipng'));
} else {
$have_optipng = true;
}
foreach ($sheets as $name => $sheet) {
$sheet->setBasePath($root);
$manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json';
if (!$args->getArg('force')) {
if (Filesystem::pathExists($manifest_path)) {
$data = Filesystem::readFile($manifest_path);
$data = phutil_json_decode($data);
if (!$sheet->needsRegeneration($data)) {
continue;
}
}
}
$sheet
->generateCSS($webroot."/css/sprite-{$name}.css")
->generateManifest($root."/resources/sprite/manifest/{$name}.json");
foreach ($sheet->getScales() as $scale) {
if ($scale == 1) {
$sheet_name = "sprite-{$name}.png";
} else {
$sheet_name = "sprite-{$name}-X{$scale}.png";
}
$full_path = "{$webroot}/image/{$sheet_name}";
$sheet->generateImage($full_path, $scale);
if ($have_optipng) {
$console->writeOut("%s\n", pht('Optimizing...'));
phutil_passthru('optipng -o7 -clobber %s', $full_path);
}
}
}
$run_map = !$args->getArg('no-map');
if ($run_map) {
$console->writeOut(
"%s\n",
pht('Done generating sprites - updating map...'));
$map_flow = id($args->getWorkflows())['map'];
// this is very hacky, but it works because `map` has no arguments.
$map_flow->execute($args);
} else {
$console->writeOut("%s\n", pht('Done.'));
return 0;
}
}
}