X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2Fminify.php;h=820deb6acc5de84a99b75e9e0ead66e9d5561415;hb=e6e932d9df9fcd2369822852c1453de2fc3d93be;hp=ddae17d935badc62c721513ae492899101f701d7;hpb=993f0c6f1e1708d78cccca3e9133c62f9392e245;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/minify.php b/maintenance/minify.php index ddae17d935..820deb6acc 100644 --- a/maintenance/minify.php +++ b/maintenance/minify.php @@ -20,6 +20,7 @@ * @file * @ingroup Maintenance */ +use Wikimedia\AtEase\AtEase; require_once __DIR__ . '/Maintenance.php'; @@ -34,83 +35,66 @@ class MinifyScript extends Maintenance { public function __construct() { parent::__construct(); $this->addOption( 'outfile', - 'File for output. Only a single file may be specified for input.', - false, true ); - $this->addOption( 'outdir', - "Directory for output. If this is not specified, and neither is --outfile, then the\n" . - "output files will be sent to the same directories as the input files.", - false, true ); - $this->addDescription( "Minify a file or set of files.\n\n" . - "If --outfile is not specified, then the output file names will have a .min extension\n" . - "added, e.g. jquery.js -> jquery.min.js." + 'Write minified output to this file (instead of standard out).', + false, true, 'o' + ); + $this->addOption( 'type', + 'Override the input type (one of "js" or "css"). Defaults to file extension. ' . + 'Required if reading from standard input.', + false, true, 'o' + ); + $this->addArg( 'file', 'Input file. Use - to read from standard input.' ); + $this->addDescription( + "Minify one or more JavaScript or CSS files.\n" . + "If multiple input files are given, they will be concatenated." ); } public function execute() { - if ( !count( $this->mArgs ) ) { - $this->fatalError( "minify.php: At least one input file must be specified." ); - } - - if ( $this->hasOption( 'outfile' ) ) { - if ( count( $this->mArgs ) > 1 ) { - $this->fatalError( '--outfile may only be used with a single input file.' ); + $outputFile = $this->getOption( 'outfile', false ); + if ( $outputFile === false ) { + // Only output the minified result (or errors) + // Avoid output() because this should not honour --quiet + foreach ( $this->mArgs as $arg ) { + print $this->minify( $arg ) . "\n"; } - - // Minify one file - $this->minify( $this->getArg( 0 ), $this->getOption( 'outfile' ) ); - - return; - } - - $outDir = $this->getOption( 'outdir', false ); - - foreach ( $this->mArgs as $arg ) { - $inPath = realpath( $arg ); - $inName = basename( $inPath ); - $inDir = dirname( $inPath ); - - if ( strpos( $inName, '.min.' ) !== false ) { - $this->error( "Skipping $inName\n" ); - continue; + } else { + $result = ''; + foreach ( $this->mArgs as $arg ) { + $this->output( "Minifying {$arg} ...\n" ); + $result .= $this->minify( $arg ); } - - if ( !file_exists( $inPath ) ) { - $this->fatalError( "File does not exist: $arg" ); - } - - $extension = $this->getExtension( $inName ); - $outName = substr( $inName, 0, -strlen( $extension ) ) . 'min.' . $extension; - if ( $outDir === false ) { - $outPath = $inDir . '/' . $outName; - } else { - $outPath = $outDir . '/' . $outName; - } - - $this->minify( $inPath, $outPath ); + $this->output( "Writing to {$outputFile} ...\n" ); + file_put_contents( $outputFile, $result ); + $this->output( "Done!\n" ); } } public function getExtension( $fileName ) { $dotPos = strrpos( $fileName, '.' ); if ( $dotPos === false ) { - $this->fatalError( "No file extension, cannot determine type: $fileName" ); + $this->fatalError( "Unknown file type ($fileName). Use --type." ); } - return substr( $fileName, $dotPos + 1 ); } - public function minify( $inPath, $outPath ) { - $extension = $this->getExtension( $inPath ); - $this->output( basename( $inPath ) . ' -> ' . basename( $outPath ) . '...' ); - - $inText = file_get_contents( $inPath ); - if ( $inText === false ) { - $this->fatalError( "Unable to open file $inPath for reading." ); - } - $outFile = fopen( $outPath, 'w' ); - if ( !$outFile ) { - $this->fatalError( "Unable to open file $outPath for writing." ); + private function readFile( $fileName ) { + if ( $fileName === '-' ) { + $inText = $this->getStdin( self::STDIN_ALL ); + } else { + AtEase::suppressWarnings(); + $inText = file_get_contents( $fileName ); + AtEase::restoreWarnings(); + if ( $inText === false ) { + $this->fatalError( "Unable to open file $fileName for reading." ); + } } + return $inText; + } + + public function minify( $inPath ) { + $extension = $this->getOption( 'type', null ) ?? $this->getExtension( $inPath ); + $inText = $this->readFile( $inPath ); switch ( $extension ) { case 'js': @@ -120,12 +104,10 @@ class MinifyScript extends Maintenance { $outText = CSSMin::minify( $inText ); break; default: - $this->error( "No minifier defined for extension \"$extension\"" ); + $this->fatalError( "Unsupported file type \"$extension\"." ); } - fwrite( $outFile, $outText ); - fclose( $outFile ); - $this->output( " ok\n" ); + return $outText; } }