@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+113 -77
+3 -77
scripts/celerity/generate_sprites.php
··· 3 3 4 4 require_once dirname(dirname(__FILE__)).'/__init_script__.php'; 5 5 6 - $args = new PhutilArgumentParser($argv); 7 - $args->setTagline(pht('regenerate CSS sprite sheets')); 8 - $args->setSynopsis(<<<EOHELP 9 - **sprites** 10 - Rebuild CSS sprite sheets. 11 - 12 - EOHELP 13 - ); 14 - $args->parseStandardArguments(); 15 - $args->parse( 16 - array( 17 - array( 18 - 'name' => 'force', 19 - 'help' => pht('Force regeneration even if sources have not changed.'), 20 - ), 21 - )); 22 - 23 - $root = dirname(phutil_get_library_root('phabricator')); 24 - $webroot = $root.'/webroot/rsrc'; 25 - $webroot = Filesystem::readablePath($webroot); 26 - 27 - $generator = new CeleritySpriteGenerator(); 28 - 29 - $sheets = array( 30 - 'tokens' => $generator->buildTokenSheet(), 31 - 'login' => $generator->buildLoginSheet(), 32 - ); 33 - 34 - list($err) = exec_manual('optipng'); 35 - if ($err) { 36 - $have_optipng = false; 37 - echo phutil_console_format( 38 - "<bg:red> %s </bg> %s\n%s\n", 39 - pht('WARNING'), 40 - pht('`%s` not found in PATH.', 'optipng'), 41 - pht('Sprites will not be optimized! Install `%s`!', 'optipng')); 42 - } else { 43 - $have_optipng = true; 44 - } 45 - 46 - foreach ($sheets as $name => $sheet) { 47 - 48 - $sheet->setBasePath($root); 49 - 50 - $manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json'; 51 - if (!$args->getArg('force')) { 52 - if (Filesystem::pathExists($manifest_path)) { 53 - $data = Filesystem::readFile($manifest_path); 54 - $data = phutil_json_decode($data); 55 - if (!$sheet->needsRegeneration($data)) { 56 - continue; 57 - } 58 - } 59 - } 60 - 61 - $sheet 62 - ->generateCSS($webroot."/css/sprite-{$name}.css") 63 - ->generateManifest($root."/resources/sprite/manifest/{$name}.json"); 64 - 65 - foreach ($sheet->getScales() as $scale) { 66 - if ($scale == 1) { 67 - $sheet_name = "sprite-{$name}.png"; 68 - } else { 69 - $sheet_name = "sprite-{$name}-X{$scale}.png"; 70 - } 71 - 72 - $full_path = "{$webroot}/image/{$sheet_name}"; 73 - $sheet->generateImage($full_path, $scale); 74 - 75 - if ($have_optipng) { 76 - echo pht('Optimizing...')."\n"; 77 - phutil_passthru('optipng -o7 -clobber %s', $full_path); 78 - } 79 - } 80 - } 81 - 82 - echo pht('Done.')."\n"; 6 + echo pht('This script was replaced with `%s`!.', './bin/celerity sprites'); 7 + echo "\n"; 8 + exit(13);
+2
src/__phutil_library_map__.php
··· 318 318 'CelerityDefaultPostprocessor' => 'applications/celerity/postprocessor/CelerityDefaultPostprocessor.php', 319 319 'CelerityHighContrastPostprocessor' => 'applications/celerity/postprocessor/CelerityHighContrastPostprocessor.php', 320 320 'CelerityLargeFontPostprocessor' => 'applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php', 321 + 'CelerityManagementGenerateSpritesWorkflow' => 'applications/celerity/management/CelerityManagementGenerateSpritesWorkflow.php', 321 322 'CelerityManagementMapWorkflow' => 'applications/celerity/management/CelerityManagementMapWorkflow.php', 322 323 'CelerityManagementSyntaxWorkflow' => 'applications/celerity/management/CelerityManagementSyntaxWorkflow.php', 323 324 'CelerityManagementWorkflow' => 'applications/celerity/management/CelerityManagementWorkflow.php', ··· 6311 6312 'CelerityDefaultPostprocessor' => 'CelerityPostprocessor', 6312 6313 'CelerityHighContrastPostprocessor' => 'CelerityPostprocessor', 6313 6314 'CelerityLargeFontPostprocessor' => 'CelerityPostprocessor', 6315 + 'CelerityManagementGenerateSpritesWorkflow' => 'CelerityManagementWorkflow', 6314 6316 'CelerityManagementMapWorkflow' => 'CelerityManagementWorkflow', 6315 6317 'CelerityManagementSyntaxWorkflow' => 'CelerityManagementWorkflow', 6316 6318 'CelerityManagementWorkflow' => 'PhabricatorManagementWorkflow',
+108
src/applications/celerity/management/CelerityManagementGenerateSpritesWorkflow.php
··· 1 + <?php 2 + 3 + final class CelerityManagementGenerateSpritesWorkflow 4 + extends CelerityManagementWorkflow { 5 + 6 + protected function didConstruct() { 7 + $this 8 + ->setName('sprites') 9 + ->setExamples('**sprites** [options]') 10 + ->setSynopsis(pht('Rebuild CSS sprite sheets.')) 11 + ->setArguments( 12 + array( 13 + array( 14 + 'name' => 'force', 15 + 'help' => pht('Force regeneration even no sources have changed.'), 16 + ), 17 + array( 18 + 'name' => 'no-map', 19 + 'help' => 20 + pht( 21 + 'Do not invoke `%s` after updating sprites', 22 + 'celerity map'), 23 + ), 24 + )); 25 + } 26 + 27 + public function execute(PhutilArgumentParser $args) { 28 + $resources_map = CelerityPhysicalResources::getAll(); 29 + 30 + $console = PhutilConsole::getConsole(); 31 + 32 + $root = dirname(phutil_get_library_root('phorge')); 33 + $webroot = $root.'/webroot/rsrc'; 34 + $webroot = Filesystem::readablePath($webroot); 35 + 36 + $generator = new CeleritySpriteGenerator(); 37 + 38 + $sheets = array( 39 + 'tokens' => $generator->buildTokenSheet(), 40 + 'login' => $generator->buildLoginSheet(), 41 + ); 42 + 43 + list($err) = exec_manual('optipng'); 44 + if ($err) { 45 + $have_optipng = false; 46 + $console->writeErr( 47 + "<bg:red> %s </bg> %s\n%s\n", 48 + pht('WARNING'), 49 + pht('`%s` not found in PATH.', 'optipng'), 50 + pht('Sprites will not be optimized! Install `%s`!', 'optipng')); 51 + } else { 52 + $have_optipng = true; 53 + } 54 + 55 + foreach ($sheets as $name => $sheet) { 56 + 57 + $sheet->setBasePath($root); 58 + 59 + $manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json'; 60 + if (!$args->getArg('force')) { 61 + if (Filesystem::pathExists($manifest_path)) { 62 + $data = Filesystem::readFile($manifest_path); 63 + $data = phutil_json_decode($data); 64 + if (!$sheet->needsRegeneration($data)) { 65 + continue; 66 + } 67 + } 68 + } 69 + 70 + $sheet 71 + ->generateCSS($webroot."/css/sprite-{$name}.css") 72 + ->generateManifest($root."/resources/sprite/manifest/{$name}.json"); 73 + 74 + foreach ($sheet->getScales() as $scale) { 75 + if ($scale == 1) { 76 + $sheet_name = "sprite-{$name}.png"; 77 + } else { 78 + $sheet_name = "sprite-{$name}-X{$scale}.png"; 79 + } 80 + 81 + $full_path = "{$webroot}/image/{$sheet_name}"; 82 + $sheet->generateImage($full_path, $scale); 83 + 84 + if ($have_optipng) { 85 + $console->writeOut("%s\n", pht('Optimizing...')); 86 + phutil_passthru('optipng -o7 -clobber %s', $full_path); 87 + } 88 + } 89 + } 90 + 91 + $run_map = !$args->getArg('no-map'); 92 + 93 + if ($run_map) { 94 + $console->writeOut( 95 + "%s\n", 96 + pht('Done generating sprites - updating map...')); 97 + $map_flow = id($args->getWorkflows())['map']; 98 + // this is very hacky, but it works because `map` has no arguments. 99 + $map_flow->execute($args); 100 + } else { 101 + $console->writeOut("%s\n", pht('Done.')); 102 + return 0; 103 + } 104 + 105 + } 106 + 107 + 108 + }