Update formatting config

This commit is contained in:
Matthias Mullie 2022-11-18 16:43:18 +01:00
parent 51d1aa4f9b
commit f09a06e6f9
18 changed files with 239 additions and 214 deletions

1
.gitattributes vendored
View File

@ -11,3 +11,4 @@
/makefile export-ignore
/phpunit.xml export-ignore
/README.md export-ignore
/ruleset.xml.dist export-ignore

View File

@ -5,10 +5,16 @@ $finder = PhpCsFixer\Finder::create()
->in(__DIR__);
$config = new PhpCsFixer\Config();
return $config->setRules(array(
'@Symfony' => true,
'array_syntax' => array('syntax' => 'long'),
'visibility_required' => array('elements' => array('property', 'method')),
))
return $config
->setRules(array(
'@Symfony' => true,
'array_syntax' => array('syntax' => 'long'),
'single_line_throw' => false,
'yoda_style' => array('equal' => false, 'identical' => false, 'less_and_greater' => false),
'@PSR12' => true,
'class_definition' => false, // @see https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/5463
'visibility_required' => array('elements' => array('property', 'method')),
))
->setFinder($finder)
->setUsingCache(false);

View File

@ -41,7 +41,7 @@ to run php-cs-fixer before submitting the code, it'll take care of the
formatting for you:
```sh
make php-cs-fixer
make format
```
Document the code thoroughly!

View File

@ -9,5 +9,5 @@ RUN apt-get install --reinstall -y ca-certificates
RUN apt-get install -y zip unzip libzip-dev git
RUN docker-php-ext-install zip pcntl
RUN pecl install xdebug || pecl install xdebug-3.1.6 || pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug || true
RUN curl -sS https://getcomposer.org/installer | php
RUN ./composer.phar install
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install

View File

@ -19,9 +19,10 @@
"matthiasmullie/path-converter": "~1.1"
},
"require-dev": {
"friendsofphp/php-cs-fixer": ">=2.0",
"matthiasmullie/scrapbook": ">=1.3",
"phpunit/phpunit": ">=4.8",
"friendsofphp/php-cs-fixer": ">=2.0"
"squizlabs/php_codesniffer": ">=3.0"
},
"suggest": {
"psr/cache-implementation": "Cache implementation to use with Minify::cache"

View File

@ -11,8 +11,8 @@ test:
test $$(docker images -q matthiasmullie/minify:$$VERSION) || docker build -t matthiasmullie/minify:$$VERSION . --build-arg VERSION=$$VERSION;\
docker run -v $$(pwd)/src:/var/www/src -v $$(pwd)/tests:/var/www/tests -v $$(pwd)/build:/var/www/build matthiasmullie/minify:$$VERSION env XDEBUG_MODE=coverage vendor/bin/phpunit $(TEST) --coverage-clover build/coverage-$(PHP)-$(TEST).clover
php-cs-fixer:
format:
test $$(docker images -q matthiasmullie/minify:cli) || docker build -t matthiasmullie/minify:cli .
docker run -v $$(pwd)/src:/var/www/src -v $$(pwd)/tests:/var/www/tests matthiasmullie/minify:cli vendor/bin/php-cs-fixer fix
docker run -v $$(pwd)/src:/var/www/src -v $$(pwd)/tests:/var/www/tests matthiasmullie/minify:cli sh -c "vendor/bin/php-cs-fixer fix && vendor/bin/phpcbf --standard=ruleset.xml"
.PHONY: docs

10
ruleset.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<ruleset>
<rule ref="PSR12" />
<file>./src</file>
<file>./tests</file>
<arg name="extensions" value="php" />
<arg name="encoding" value="UTF-8" />
</ruleset>

View File

@ -1,4 +1,5 @@
<?php
/**
* CSS Minifier.
*
@ -96,7 +97,7 @@ class CSS extends Minify
}
// add to top
$content = implode(';', $matches[2]).';'.trim($content, ';');
$content = implode(';', $matches[2]) . ';' . trim($content, ';');
}
return $content;
@ -203,7 +204,7 @@ class CSS extends Minify
// loop the matches
foreach ($matches as $match) {
// get the path for the file that will be imported
$importPath = dirname($source).'/'.$match['path'];
$importPath = dirname($source) . '/' . $match['path'];
// only replace the import with the content if we can grab the
// content of the file
@ -214,7 +215,7 @@ class CSS extends Minify
// check if current file was not imported previously in the same
// import chain.
if (in_array($importPath, $parents)) {
throw new FileImportException('Failed to import file "'.$importPath.'": circular reference detected.');
throw new FileImportException('Failed to import file "' . $importPath . '": circular reference detected.');
}
// grab referenced file & minify it (which may include importing
@ -226,7 +227,7 @@ class CSS extends Minify
// check if this is only valid for certain media
if (!empty($match['media'])) {
$importContent = '@media '.$match['media'].'{'.$importContent.'}';
$importContent = '@media ' . $match['media'] . '{' . $importContent . '}';
}
// add to replacement array
@ -265,7 +266,7 @@ class CSS extends Minify
// get the path for the file that will be imported
$path = $match[2];
$path = dirname($source).'/'.$path;
$path = dirname($source) . '/' . $path;
// only replace the import with the content if we're able to get
// the content of the file, and it's relatively small
@ -276,7 +277,7 @@ class CSS extends Minify
// build replacement
$search[] = $match[0];
$replace[] = 'url('.$this->importExtensions[$extension].';base64,'.$importContent.')';
$replace[] = 'url(' . $this->importExtensions[$extension] . ';base64,' . $importContent . ')';
}
}
@ -432,7 +433,7 @@ class CSS extends Minify
// loop all urls
foreach ($matches as $match) {
// determine if it's a url() or an @import match
$type = (0 === strpos($match[0], '@import') ? 'import' : 'url');
$type = (strpos($match[0], '@import') === 0 ? 'import' : 'url');
$url = $match['path'];
if ($this->canImportByPath($url)) {
@ -462,15 +463,15 @@ class CSS extends Minify
*/
$url = trim($url);
if (preg_match('/[\s\)\'"#\x{7f}-\x{9f}]/u', $url)) {
$url = $match['quotes'].$url.$match['quotes'];
$url = $match['quotes'] . $url . $match['quotes'];
}
// build replacement
$search[] = $match[0];
if ('url' === $type) {
$replace[] = 'url('.$url.')';
} elseif ('import' === $type) {
$replace[] = '@import "'.$url.'"';
if ($type === 'url') {
$replace[] = 'url(' . $url . ')';
} elseif ($type === 'import') {
$replace[] = '@import "' . $url . '"';
}
}
@ -529,7 +530,7 @@ class CSS extends Minify
);
return preg_replace_callback(
'/(?<=[: ])('.implode('|', array_keys($colors)).')(?=[; }])/i',
'/(?<=[: ])(' . implode('|', array_keys($colors)) . ')(?=[; }])/i',
function ($match) use ($colors) {
return $colors[strtoupper($match[0])];
},
@ -552,10 +553,10 @@ class CSS extends Minify
);
$callback = function ($match) use ($weights) {
return $match[1].$weights[$match[2]];
return $match[1] . $weights[$match[2]];
};
return preg_replace_callback('/(font-weight\s*:\s*)('.implode('|', array_keys($weights)).')(?=[;}])/', $callback, $content);
return preg_replace_callback('/(font-weight\s*:\s*)(' . implode('|', array_keys($weights)) . ')(?=[;}])/', $callback, $content);
}
/**
@ -587,19 +588,19 @@ class CSS extends Minify
// practice, Webkit (especially Safari) seems to stumble over at least
// 0%, potentially other units as well. Only stripping 'px' for now.
// @see https://github.com/matthiasmullie/minify/issues/60
$content = preg_replace('/'.$before.'(-?0*(\.0+)?)(?<=0)px'.$after.'/', '\\1', $content);
$content = preg_replace('/' . $before . '(-?0*(\.0+)?)(?<=0)px' . $after . '/', '\\1', $content);
// strip 0-digits (.0 -> 0)
$content = preg_replace('/'.$before.'\.0+'.$units.'?'.$after.'/', '0\\1', $content);
$content = preg_replace('/' . $before . '\.0+' . $units . '?' . $after . '/', '0\\1', $content);
// strip trailing 0: 50.10 -> 50.1, 50.10px -> 50.1px
$content = preg_replace('/'.$before.'(-?[0-9]+\.[0-9]+)0+'.$units.'?'.$after.'/', '\\1\\2', $content);
$content = preg_replace('/' . $before . '(-?[0-9]+\.[0-9]+)0+' . $units . '?' . $after . '/', '\\1\\2', $content);
// strip trailing 0: 50.00 -> 50, 50.00px -> 50px
$content = preg_replace('/'.$before.'(-?[0-9]+)\.0+'.$units.'?'.$after.'/', '\\1\\2', $content);
$content = preg_replace('/' . $before . '(-?[0-9]+)\.0+' . $units . '?' . $after . '/', '\\1\\2', $content);
// strip leading 0: 0.1 -> .1, 01.1 -> 1.1
$content = preg_replace('/'.$before.'(-?)0+([0-9]*\.[0-9]+)'.$units.'?'.$after.'/', '\\1\\2\\3', $content);
$content = preg_replace('/' . $before . '(-?)0+([0-9]*\.[0-9]+)' . $units . '?' . $after . '/', '\\1\\2\\3', $content);
// strip negative zeroes (-0 -> 0) & truncate zeroes (00 -> 0)
$content = preg_replace('/'.$before.'-?0+'.$units.'?'.$after.'/', '0\\1', $content);
$content = preg_replace('/' . $before . '-?0+' . $units . '?' . $after . '/', '0\\1', $content);
// IE doesn't seem to understand a unitless flex-basis value (correct -
// it goes against the spec), so let's add it in again (make it `%`,
@ -635,7 +636,7 @@ class CSS extends Minify
$minifier = $this;
$callback = function ($match) use ($minifier) {
$count = count($minifier->extracted);
$placeholder = '/*'.$count.'*/';
$placeholder = '/*' . $count . '*/';
$minifier->extracted[$placeholder] = $match[0];
return $placeholder;
@ -673,7 +674,7 @@ class CSS extends Minify
// not in things like `calc(3px + 2px)`, shorthands like `3px -2px`, or
// selectors like `div.weird- p`
$pseudos = array('nth-child', 'nth-last-child', 'nth-last-of-type', 'nth-of-type');
$content = preg_replace('/:('.implode('|', $pseudos).')\(\s*([+-]?)\s*(.+?)\s*([+-]?)\s*(.*?)\s*\)/', ':$1($2$3$4$5)', $content);
$content = preg_replace('/:(' . implode('|', $pseudos) . ')\(\s*([+-]?)\s*(.+?)\s*([+-]?)\s*(.*?)\s*\)/', ':$1($2$3$4$5)', $content);
// remove semicolon/whitespace followed by closing bracket
$content = str_replace(';}', '}', $content);
@ -688,7 +689,7 @@ class CSS extends Minify
protected function extractMath()
{
$functions = array('calc', 'clamp', 'min', 'max');
$pattern = '/\b('.implode('|', $functions).')(\(.+?)(?=$|;|})/m';
$pattern = '/\b(' . implode('|', $functions) . ')(\(.+?)(?=$|;|})/m';
// PHP only supports $this inside anonymous functions since 5.4
$minifier = $this;
@ -706,25 +707,25 @@ class CSS extends Minify
for ($i = 0; $i < $length; ++$i) {
$char = $match[2][$i];
$expr .= $char;
if ('(' === $char) {
if ($char === '(') {
++$opened;
} elseif (')' === $char && 0 === --$opened) {
} elseif ($char === ')' && --$opened === 0) {
break;
}
}
// now that we've figured out where the calc() starts and ends, extract it
$count = count($minifier->extracted);
$placeholder = 'math('.$count.')';
$minifier->extracted[$placeholder] = $function.'('.trim(substr($expr, 1, -1)).')';
$placeholder = 'math(' . $count . ')';
$minifier->extracted[$placeholder] = $function . '(' . trim(substr($expr, 1, -1)) . ')';
// and since we've captured more code than required, we may have some leftover
// calc() in here too - go recursive on the remaining but of code to go figure
// that out and extract what is needed
$rest = $minifier->str_replace_first($function.$expr, '', $match[0]);
$rest = $minifier->str_replace_first($function . $expr, '', $match[0]);
$rest = preg_replace_callback($pattern, $callback, $rest);
return $placeholder.$rest;
return $placeholder . $rest;
};
$this->registerPattern($pattern, $callback);
@ -741,8 +742,8 @@ class CSS extends Minify
$this->registerPattern(
'/(?<=^|[;}{])\s*(--[^:;{}"\'\s]+)\s*:([^;{}]+)/m',
function ($match) use ($minifier) {
$placeholder = '--custom-'.count($minifier->extracted).':0';
$minifier->extracted[$placeholder] = $match[1].':'.trim($match[2]);
$placeholder = '--custom-' . count($minifier->extracted) . ':0';
$minifier->extracted[$placeholder] = $match[1] . ':' . trim($match[2]);
return $placeholder;
}
@ -770,7 +771,7 @@ class CSS extends Minify
*/
protected function canImportByPath($path)
{
return 0 === preg_match('/^(data:|https?:|\\/)/', $path);
return preg_match('/^(data:|https?:|\\/)/', $path) === 0;
}
/**

View File

@ -1,4 +1,5 @@
<?php
/**
* Base Exception.
*

View File

@ -1,4 +1,5 @@
<?php
/**
* Basic exception.
*

View File

@ -1,4 +1,5 @@
<?php
/**
* File Import Exception.
*

View File

@ -1,4 +1,5 @@
<?php
/**
* IO Exception.
*

View File

@ -1,4 +1,5 @@
<?php
/**
* JavaScript minifier.
*
@ -128,14 +129,14 @@ class JS extends Minify
{
call_user_func_array(array('parent', '__construct'), func_get_args());
$dataDir = __DIR__.'/../data/js/';
$dataDir = __DIR__ . '/../data/js/';
$options = FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES;
$this->keywordsReserved = file($dataDir.'keywords_reserved.txt', $options);
$this->keywordsBefore = file($dataDir.'keywords_before.txt', $options);
$this->keywordsAfter = file($dataDir.'keywords_after.txt', $options);
$this->operators = file($dataDir.'operators.txt', $options);
$this->operatorsBefore = file($dataDir.'operators_before.txt', $options);
$this->operatorsAfter = file($dataDir.'operators_after.txt', $options);
$this->keywordsReserved = file($dataDir . 'keywords_reserved.txt', $options);
$this->keywordsBefore = file($dataDir . 'keywords_before.txt', $options);
$this->keywordsAfter = file($dataDir . 'keywords_after.txt', $options);
$this->operators = file($dataDir . 'operators.txt', $options);
$this->operatorsBefore = file($dataDir . 'operators_before.txt', $options);
$this->operatorsAfter = file($dataDir . 'operators_after.txt', $options);
}
/**
@ -176,7 +177,7 @@ class JS extends Minify
$js = $this->stripWhitespace($js);
// combine js: separating the scripts by a ;
$content .= $js.';';
$content .= $js . ';';
}
// clean up leftover `;`s from the combination of multiple scripts
@ -201,20 +202,20 @@ class JS extends Minify
$minifier = $this;
$callback = function ($match) use ($minifier) {
if (
'!' === substr($match[2], 0, 1) ||
false !== strpos($match[2], '@license') ||
false !== strpos($match[2], '@preserve')
substr($match[2], 0, 1) === '!' ||
strpos($match[2], '@license') !== false ||
strpos($match[2], '@preserve') !== false
) {
// preserve multi-line comments that start with /*!
// or contain @license or @preserve annotations
$count = count($minifier->extracted);
$placeholder = '/*'.$count.'*/';
$placeholder = '/*' . $count . '*/';
$minifier->extracted[$placeholder] = $match[0];
return $match[1].$placeholder.$match[3];
return $match[1] . $placeholder . $match[3];
}
return $match[1].$match[3];
return $match[1] . $match[3];
};
// multi-line comments
@ -247,7 +248,7 @@ class JS extends Minify
$minifier = $this;
$callback = function ($match) use ($minifier) {
$count = count($minifier->extracted);
$placeholder = '"'.$count.'"';
$placeholder = '"' . $count . '"';
$minifier->extracted[$placeholder] = $match[0];
return $placeholder;
@ -266,7 +267,7 @@ class JS extends Minify
// of the RegExp methods (a `\` followed by a variable or value is
// likely part of a division, not a regex)
$keywords = array('do', 'in', 'new', 'else', 'throw', 'yield', 'delete', 'return', 'typeof');
$before = '(^|[=:,;\+\-\*\?\/\}\(\{\[&\|!]|'.implode('|', $keywords).')\s*';
$before = '(^|[=:,;\+\-\*\?\/\}\(\{\[&\|!]|' . implode('|', $keywords) . ')\s*';
$propertiesAndMethods = array(
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Properties_2
'constructor',
@ -286,8 +287,8 @@ class JS extends Minify
);
$delimiters = array_fill(0, count($propertiesAndMethods), '/');
$propertiesAndMethods = array_map('preg_quote', $propertiesAndMethods, $delimiters);
$after = '(?=\s*([\.,;:\)\}&\|+]|\/\/|$|\.('.implode('|', $propertiesAndMethods).')))';
$this->registerPattern('/'.$before.'\K'.$pattern.$after.'/', $callback);
$after = '(?=\s*([\.,;:\)\}&\|+]|\/\/|$|\.(' . implode('|', $propertiesAndMethods) . ')))';
$this->registerPattern('/' . $before . '\K' . $pattern . $after . '/', $callback);
// regular expressions following a `)` are rather annoying to detect...
// quite often, `/` after `)` is a division operator & if it happens to
@ -301,8 +302,8 @@ class JS extends Minify
// if a regex following `)` is not followed by `.<property or method>`,
// it's quite likely not a regex
$before = '\)\s*';
$after = '(?=\s*\.('.implode('|', $propertiesAndMethods).'))';
$this->registerPattern('/'.$before.'\K'.$pattern.$after.'/', $callback);
$after = '(?=\s*\.(' . implode('|', $propertiesAndMethods) . '))';
$this->registerPattern('/' . $before . '\K' . $pattern . $after . '/', $callback);
// 1 more edge case: a regex can be followed by a lot more operators or
// keywords if there's a newline (ASI) in between, where the operator
@ -310,8 +311,8 @@ class JS extends Minify
// (https://github.com/matthiasmullie/minify/issues/56)
$operators = $this->getOperatorsForRegex($this->operatorsBefore, '/');
$operators += $this->getOperatorsForRegex($this->keywordsReserved, '/');
$after = '(?=\s*\n\s*('.implode('|', $operators).'))';
$this->registerPattern('/'.$pattern.$after.'/', $callback);
$after = '(?=\s*\n\s*(' . implode('|', $operators) . '))';
$this->registerPattern('/' . $pattern . $after . '/', $callback);
}
/**
@ -355,8 +356,8 @@ class JS extends Minify
unset($operatorsBefore['+'], $operatorsBefore['-'], $operatorsAfter['+'], $operatorsAfter['-']);
$content = preg_replace(
array(
'/('.implode('|', $operatorsBefore).')\s+/',
'/\s+('.implode('|', $operatorsAfter).')/',
'/(' . implode('|', $operatorsBefore) . ')\s+/',
'/\s+(' . implode('|', $operatorsAfter) . ')/',
),
'\\1',
$content
@ -373,8 +374,8 @@ class JS extends Minify
);
// collapse whitespace around reserved words into single space
$content = preg_replace('/(^|[;\}\s])\K('.implode('|', $keywordsBefore).')\s+/', '\\2 ', $content);
$content = preg_replace('/\s+('.implode('|', $keywordsAfter).')(?=([;\{\s]|$))/', ' \\1', $content);
$content = preg_replace('/(^|[;\}\s])\K(' . implode('|', $keywordsBefore) . ')\s+/', '\\2 ', $content);
$content = preg_replace('/\s+(' . implode('|', $keywordsAfter) . ')(?=([;\{\s]|$))/', ' \\1', $content);
/*
* We didn't strip whitespace after a couple of operators because they
@ -384,8 +385,8 @@ class JS extends Minify
*/
$operatorsDiffBefore = array_diff($operators, $operatorsBefore);
$operatorsDiffAfter = array_diff($operators, $operatorsAfter);
$content = preg_replace('/('.implode('|', $operatorsDiffBefore).')[^\S\n]+/', '\\1', $content);
$content = preg_replace('/[^\S\n]+('.implode('|', $operatorsDiffAfter).')/', '\\1', $content);
$content = preg_replace('/(' . implode('|', $operatorsDiffBefore) . ')[^\S\n]+/', '\\1', $content);
$content = preg_replace('/[^\S\n]+(' . implode('|', $operatorsDiffAfter) . ')/', '\\1', $content);
/*
* Whitespace after `return` can be omitted in a few occasions
@ -494,7 +495,7 @@ class JS extends Minify
// don't confuse = with other assignment shortcuts (e.g. +=)
$chars = preg_quote('+-*\=<>%&|', $delimiter);
$operators['='] = '(?<!['.$chars.'])\=';
$operators['='] = '(?<![' . $chars . '])\=';
return $operators;
}
@ -516,7 +517,7 @@ class JS extends Minify
// add word boundaries
array_walk($keywords, function ($value) {
return '\b'.$value.'\b';
return '\b' . $value . '\b';
});
$keywords = array_combine($keywords, $escaped);
@ -553,11 +554,11 @@ class JS extends Minify
* array['key-here'] can't be replaced by array.key-here since '-'
* is not a valid character there.
*/
if (!preg_match('/^'.$minifier::REGEX_VARIABLE.'$/u', $property)) {
if (!preg_match('/^' . $minifier::REGEX_VARIABLE . '$/u', $property)) {
return $match[0];
}
return '.'.$property;
return '.' . $property;
};
/*
@ -578,9 +579,9 @@ class JS extends Minify
* separate look-behind assertions, one for each keyword.
*/
$keywords = $this->getKeywordsForRegex($keywords);
$keywords = '(?<!'.implode(')(?<!', $keywords).')';
$keywords = '(?<!' . implode(')(?<!', $keywords) . ')';
return preg_replace_callback('/(?<='.$previousChar.'|\])'.$keywords.'\[\s*(([\'"])[0-9]+\\2)\s*\]/u', $callback, $content);
return preg_replace_callback('/(?<=' . $previousChar . '|\])' . $keywords . '\[\s*(([\'"])[0-9]+\\2)\s*\]/u', $callback, $content);
}
/**
@ -600,11 +601,11 @@ class JS extends Minify
* character and check if it's a `.`
*/
$callback = function ($match) {
if ('.' === trim($match[1])) {
if (trim($match[1]) === '.') {
return $match[0];
}
return $match[1].('true' === $match[2] ? '!0' : '!1');
return $match[1] . ($match[2] === 'true' ? '!0' : '!1');
};
$content = preg_replace_callback('/(^|.\s*)\b(true|false)\b(?!:)/', $callback, $content);

View File

@ -1,4 +1,5 @@
<?php
/**
* Abstract minifier class.
*
@ -130,7 +131,7 @@ abstract class Minify
// check if we can read the file
if (!$this->canImportFile($path)) {
throw new IOException('The file "'.$path.'" could not be opened for reading. Check if PHP has enough permissions.');
throw new IOException('The file "' . $path . '" could not be opened for reading. Check if PHP has enough permissions.');
}
$this->add($path);
@ -151,7 +152,7 @@ abstract class Minify
$content = $this->execute($path);
// save to path
if (null !== $path) {
if ($path !== null) {
$this->save($content, $path);
}
@ -172,7 +173,7 @@ abstract class Minify
$content = gzencode($content, $level, FORCE_GZIP);
// save to path
if (null !== $path) {
if ($path !== null) {
$this->save($content, $path);
}
@ -217,7 +218,7 @@ abstract class Minify
$data = file_get_contents($data);
// strip BOM, if any
if ("\xef\xbb\xbf" == substr($data, 0, 3)) {
if (substr($data, 0, 3) == "\xef\xbb\xbf") {
$data = substr($data, 3);
}
}
@ -286,7 +287,7 @@ abstract class Minify
// we can safely ignore patterns for positions we've unset earlier,
// because we know these won't show up anymore
if (false == array_key_exists($i, $positions)) {
if (array_key_exists($i, $positions) == false) {
continue;
}
@ -383,7 +384,7 @@ abstract class Minify
$minifier = $this;
$callback = function ($match) use ($minifier, $placeholderPrefix) {
// check the second index here, because the first always contains a quote
if ('' === $match[2]) {
if ($match[2] === '') {
/*
* Empty strings need no placeholder; they can't be confused for
* anything else anyway.
@ -394,8 +395,8 @@ abstract class Minify
}
$count = count($minifier->extracted);
$placeholder = $match[1].$placeholderPrefix.$count.$match[1];
$minifier->extracted[$placeholder] = $match[1].$match[2].$match[1];
$placeholder = $match[1] . $placeholderPrefix . $count . $match[1];
$minifier->extracted[$placeholder] = $match[1] . $match[2] . $match[1];
return $placeholder;
};
@ -412,7 +413,7 @@ abstract class Minify
* considered as escape-char (times 2) and to get it in the regex,
* escaped (times 2)
*/
$this->registerPattern('/(['.$chars.'])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
$this->registerPattern('/([' . $chars . '])(.*?(?<!\\\\)(\\\\\\\\)*+)\\1/s', $callback);
}
/**
@ -471,8 +472,8 @@ abstract class Minify
*/
protected function openFileForWriting($path)
{
if ('' === $path || ($handler = @fopen($path, 'w')) === false) {
throw new IOException('The file "'.$path.'" could not be opened for writing. Check if PHP has enough permissions.');
if ($path === '' || ($handler = @fopen($path, 'w')) === false) {
throw new IOException('The file "' . $path . '" could not be opened for writing. Check if PHP has enough permissions.');
}
return $handler;
@ -494,14 +495,14 @@ abstract class Minify
($result = @fwrite($handler, $content)) === false ||
($result < strlen($content))
) {
throw new IOException('The file "'.$path.'" could not be written to. Check your disk space and file permissions.');
throw new IOException('The file "' . $path . '" could not be written to. Check your disk space and file permissions.');
}
}
protected static function str_replace_first($search, $replace, $subject)
{
$pos = strpos($subject, $search);
if (false !== $pos) {
if ($pos !== false) {
return substr_replace($subject, $replace, $pos, strlen($search));
}

View File

@ -68,7 +68,7 @@ class CSSTest extends CompatTestCase
{
$this->expectException('MatthiasMullie\Minify\Exceptions\FileImportException');
$testFile = __DIR__.'/sample/loop/first.css';
$testFile = __DIR__ . '/sample/loop/first.css';
$minifier = $this->mockMinifier();
$minifier->add($testFile);
@ -106,8 +106,8 @@ class CSSTest extends CompatTestCase
// passing in an array of css inputs
$tests[] = array(
array(
__DIR__.'/sample/combine_imports/index.css',
__DIR__.'/sample/bom/bom.css',
__DIR__ . '/sample/combine_imports/index.css',
__DIR__ . '/sample/bom/bom.css',
'p { width: 55px , margin: 0 0 0 0}',
),
'body{color:red}body{color:red}p{width:55px,margin:0 0 0 0}',
@ -115,27 +115,27 @@ class CSSTest extends CompatTestCase
// try importing, with both @import syntax types & media queries
$tests[] = array(
__DIR__.'/sample/combine_imports/index.css',
__DIR__ . '/sample/combine_imports/index.css',
'body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/combine_imports/index2.css',
__DIR__ . '/sample/combine_imports/index2.css',
'body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/combine_imports/index3.css',
__DIR__ . '/sample/combine_imports/index3.css',
'body{color:red}body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/combine_imports/index4.css',
__DIR__ . '/sample/combine_imports/index4.css',
'@media only screen{body{color:red}}@media only screen{body{color:red}}',
);
$tests[] = array(
__DIR__.'/sample/combine_imports/index5.css',
__DIR__ . '/sample/combine_imports/index5.css',
'body{color:red}body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/combine_imports/index6a.css',
__DIR__ . '/sample/combine_imports/index6a.css',
'body{color:red}',
);
@ -147,8 +147,8 @@ class CSSTest extends CompatTestCase
// import files
$tests[] = array(
__DIR__.'/sample/import_files/index.css',
'body{background:url(data:image/png;base64,'.base64_encode(file_get_contents(__DIR__.'/sample/import_files/file.png')).')}',
__DIR__ . '/sample/import_files/index.css',
'body{background:url(data:image/png;base64,' . base64_encode(file_get_contents(__DIR__ . '/sample/import_files/file.png')) . ')}',
);
// strip comments
@ -194,7 +194,7 @@ class CSSTest extends CompatTestCase
);
$tests[] = array(
<<<'JS'
<<<'JS'
p * i , html
/* remove spaces */
@ -231,7 +231,7 @@ JS
// strip BOM
$tests[] = array(
__DIR__.'/sample/bom/bom.css',
__DIR__ . '/sample/bom/bom.css',
'body{color:red}',
);
@ -337,15 +337,15 @@ margin-left: -0.3125rem;
// https://github.com/matthiasmullie/minify/issues/49
$tests[] = array(
__DIR__.'/sample/import_files/issue49.css',
'.social-btn a[href*="facebook"]{background-image:url(data:image/png;base64,'.base64_encode(file_get_contents(__DIR__.'/sample/import_files/facebook.png')).')}'.
'.social-btn a[href*="vimeo"]{background-image:url(data:image/png;base64,'.base64_encode(file_get_contents(__DIR__.'/sample/import_files/vimeo.png')).')}'.
'.social-btn a[href*="instagram"]{background-image:url(data:image/png;base64,'.base64_encode(file_get_contents(__DIR__.'/sample/import_files/instagram.png')).')}',
__DIR__ . '/sample/import_files/issue49.css',
'.social-btn a[href*="facebook"]{background-image:url(data:image/png;base64,' . base64_encode(file_get_contents(__DIR__ . '/sample/import_files/facebook.png')) . ')}' .
'.social-btn a[href*="vimeo"]{background-image:url(data:image/png;base64,' . base64_encode(file_get_contents(__DIR__ . '/sample/import_files/vimeo.png')) . ')}' .
'.social-btn a[href*="instagram"]{background-image:url(data:image/png;base64,' . base64_encode(file_get_contents(__DIR__ . '/sample/import_files/instagram.png')) . ')}',
);
// https://github.com/matthiasmullie/minify/issues/68
$tests[] = array(
__DIR__.'/sample/external_imports/issue68.css',
__DIR__ . '/sample/external_imports/issue68.css',
'@import url(http://localhost/file.css);body{background:green}',
);
@ -494,15 +494,15 @@ only screen and (min-device-pixel-ratio: 1.5) {
// https://github.com/matthiasmullie/minify/issues/139
$tests[] = array(
__DIR__.'/sample/line_endings/lf/parent.css',
__DIR__ . '/sample/line_endings/lf/parent.css',
'p{color:green}body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/line_endings/cr/parent.css',
__DIR__ . '/sample/line_endings/cr/parent.css',
'p{color:green}body{color:red}',
);
$tests[] = array(
__DIR__.'/sample/line_endings/crlf/parent.css',
__DIR__ . '/sample/line_endings/crlf/parent.css',
'p{color:green}body{color:red}',
);
@ -864,73 +864,73 @@ margin-left: calc(20px + var(--some-var));
{
$tests = array();
$source = __DIR__.'/sample/convert_relative_path/source';
$target = __DIR__.'/sample/convert_relative_path/target';
$source = __DIR__ . '/sample/convert_relative_path/source';
$target = __DIR__ . '/sample/convert_relative_path/target';
// external link
$tests[] = array(
$source.'/external.css',
$target.'/external.css',
file_get_contents($source.'/external.css'),
$source . '/external.css',
$target . '/external.css',
file_get_contents($source . '/external.css'),
);
// absolute path
$tests[] = array(
$source.'/absolute.css',
$target.'/absolute.css',
file_get_contents($source.'/absolute.css'),
$source . '/absolute.css',
$target . '/absolute.css',
file_get_contents($source . '/absolute.css'),
);
// relative paths
$tests[] = array(
$source.'/relative.css',
$target.'/relative.css',
$source . '/relative.css',
$target . '/relative.css',
'@import url(stylesheet.css);',
);
$tests[] = array(
$source.'/../source/relative.css',
$target.'/target/relative.css',
$source . '/../source/relative.css',
$target . '/target/relative.css',
'@import url(../stylesheet.css);',
);
// https://github.com/matthiasmullie/minify/issues/29
$tests[] = array(
$source.'/issue29.css',
$target.'/issue29.css',
$source . '/issue29.css',
$target . '/issue29.css',
'@import url(http://myurl.de);',
);
// https://github.com/matthiasmullie/minify/issues/38
$tests[] = array(
$source.'/relative.css',
$source . '/relative.css',
null, // no output file
file_get_contents($source.'/relative.css'),
file_get_contents($source . '/relative.css'),
);
// https://github.com/matthiasmullie/minify/issues/39
$tests[] = array(
$source.'/issue39.css',
$source . '/issue39.css',
null, // no output file
// relative paths should remain untouched
"@font-face{font-family:'blackcat';src:url(../webfont/blackcat.eot);src:url('../webfont/blackcat.eot?#iefix') format('embedded-opentype'),url('../webfont/blackcat.svg#blackcat') format('svg'),url(../webfont/blackcat.woff) format('woff'),url(../webfont/blackcat.ttf) format('truetype');font-weight:400;font-style:normal}",
);
$tests[] = array(
$source.'/issue39.css',
$target.'/issue39.css',
$source . '/issue39.css',
$target . '/issue39.css',
// relative paths should remain untouched
"@font-face{font-family:'blackcat';src:url(../webfont/blackcat.eot);src:url('../webfont/blackcat.eot?#iefix') format('embedded-opentype'),url('../webfont/blackcat.svg#blackcat') format('svg'),url(../webfont/blackcat.woff) format('woff'),url(../webfont/blackcat.ttf) format('truetype');font-weight:400;font-style:normal}",
);
$tests[] = array(
$source.'/issue39.css',
$target.'/target/issue39.css',
$source . '/issue39.css',
$target . '/target/issue39.css',
// relative paths should have changed
"@font-face{font-family:'blackcat';src:url(../../webfont/blackcat.eot);src:url('../../webfont/blackcat.eot?#iefix') format('embedded-opentype'),url('../../webfont/blackcat.svg#blackcat') format('svg'),url(../../webfont/blackcat.woff) format('woff'),url(../../webfont/blackcat.ttf) format('truetype');font-weight:400;font-style:normal}",
);
// https://github.com/forkcms/forkcms/issues/1121
$tests[] = array(
$source.'/nested/nested.css',
$target.'/nested.css',
$source . '/nested/nested.css',
$target . '/nested.css',
'@import url(stylesheet.css);',
);
@ -946,8 +946,8 @@ margin-left: calc(20px + var(--some-var));
// https://github.com/matthiasmullie/minify/issues/77#issuecomment-172844822
$tests[] = array(
$source.'/get-params.css',
$target.'/get-params.css',
$source . '/get-params.css',
$target . '/get-params.css',
'@import url(../source/some-file.css?some=param);',
);
@ -956,113 +956,113 @@ margin-left: calc(20px + var(--some-var));
// from and/or to are relative links
$tests[] = array(
$sourceRelative.'/relative.css',
$target.'/relative.css',
$sourceRelative . '/relative.css',
$target . '/relative.css',
'@import url(stylesheet.css);',
);
// note: relative target only works if the file already exists: it has
// to be able to realpath()
$tests[] = array(
$source.'/relative.css',
$targetRelative.'/relative.css',
$source . '/relative.css',
$targetRelative . '/relative.css',
'@import url(stylesheet.css);',
);
$tests[] = array(
$sourceRelative.'/relative.css',
$targetRelative.'/relative.css',
$sourceRelative . '/relative.css',
$targetRelative . '/relative.css',
'@import url(stylesheet.css);',
);
$source = __DIR__.'/sample/symlink';
$target = __DIR__.'/sample/symlink/target';
$source = __DIR__ . '/sample/symlink';
$target = __DIR__ . '/sample/symlink/target';
$sourceRelative = 'tests/CSS/sample/symlink';
$targetRelative = 'tests/CSS/sample/symlink/target';
// import symlinked files: relative, absolute & mix
$tests[] = array(
$source.'/import_symlinked_file.css',
$target.'/import_symlinked_file.css',
$source . '/import_symlinked_file.css',
$target . '/import_symlinked_file.css',
'',
);
$tests[] = array(
$sourceRelative.'/import_symlinked_file.css',
$targetRelative.'/import_symlinked_file.css',
$sourceRelative . '/import_symlinked_file.css',
$targetRelative . '/import_symlinked_file.css',
'',
);
$tests[] = array(
$source.'/import_symlinked_file.css',
$targetRelative.'/import_symlinked_file.css',
$source . '/import_symlinked_file.css',
$targetRelative . '/import_symlinked_file.css',
'',
);
$tests[] = array(
$sourceRelative.'/import_symlinked_file.css',
$target.'/import_symlinked_file.css',
$sourceRelative . '/import_symlinked_file.css',
$target . '/import_symlinked_file.css',
'',
);
// move symlinked files: relative, absolute & mix
$tests[] = array(
$source.'/move_symlinked_file.css',
$target.'/move_symlinked_file.css',
$source . '/move_symlinked_file.css',
$target . '/move_symlinked_file.css',
'body{background-url:url(../assets/symlink.bmp)}',
);
$tests[] = array(
$sourceRelative.'/move_symlinked_file.css',
$targetRelative.'/move_symlinked_file.css',
$sourceRelative . '/move_symlinked_file.css',
$targetRelative . '/move_symlinked_file.css',
'body{background-url:url(../assets/symlink.bmp)}',
);
$tests[] = array(
$source.'/move_symlinked_file.css',
$targetRelative.'/move_symlinked_file.css',
$source . '/move_symlinked_file.css',
$targetRelative . '/move_symlinked_file.css',
'body{background-url:url(../assets/symlink.bmp)}',
);
$tests[] = array(
$source.'/move_symlinked_file.css',
$targetRelative.'/move_symlinked_file.css',
$source . '/move_symlinked_file.css',
$targetRelative . '/move_symlinked_file.css',
'body{background-url:url(../assets/symlink.bmp)}',
);
// import symlinked folders: relative, absolute & mix
$tests[] = array(
$source.'/import_symlinked_folder.css',
$target.'/import_symlinked_folder.css',
$source . '/import_symlinked_folder.css',
$target . '/import_symlinked_folder.css',
'',
);
$tests[] = array(
$sourceRelative.'/import_symlinked_folder.css',
$targetRelative.'/import_symlinked_folder.css',
$sourceRelative . '/import_symlinked_folder.css',
$targetRelative . '/import_symlinked_folder.css',
'',
);
$tests[] = array(
$source.'/import_symlinked_folder.css',
$targetRelative.'/import_symlinked_folder.css',
$source . '/import_symlinked_folder.css',
$targetRelative . '/import_symlinked_folder.css',
'',
);
$tests[] = array(
$sourceRelative.'/import_symlinked_folder.css',
$target.'/import_symlinked_folder.css',
$sourceRelative . '/import_symlinked_folder.css',
$target . '/import_symlinked_folder.css',
'',
);
// move symlinked folders: relative, absolute & mix
$tests[] = array(
$source.'/move_symlinked_folder.css',
$target.'/move_symlinked_folder.css',
$source . '/move_symlinked_folder.css',
$target . '/move_symlinked_folder.css',
'body{background-url:url(../assets_symlink/asset.bmp)}',
);
$tests[] = array(
$sourceRelative.'/move_symlinked_folder.css',
$targetRelative.'/move_symlinked_folder.css',
$sourceRelative . '/move_symlinked_folder.css',
$targetRelative . '/move_symlinked_folder.css',
'body{background-url:url(../assets_symlink/asset.bmp)}',
);
$tests[] = array(
$source.'/move_symlinked_folder.css',
$targetRelative.'/move_symlinked_folder.css',
$source . '/move_symlinked_folder.css',
$targetRelative . '/move_symlinked_folder.css',
'body{background-url:url(../assets_symlink/asset.bmp)}',
);
$tests[] = array(
$sourceRelative.'/move_symlinked_folder.css',
$target.'/move_symlinked_folder.css',
$sourceRelative . '/move_symlinked_folder.css',
$target . '/move_symlinked_folder.css',
'body{background-url:url(../assets_symlink/asset.bmp)}',
);

View File

@ -14,8 +14,8 @@ class AbstractTest extends CompatTestCase
{
public function testConstruct()
{
$path1 = __DIR__.'/sample/source/script1.js';
$path2 = __DIR__.'/sample/source/script2.js';
$path1 = __DIR__ . '/sample/source/script1.js';
$path2 = __DIR__ . '/sample/source/script2.js';
$content1 = file_get_contents($path1);
$content2 = file_get_contents($path2);
@ -29,7 +29,7 @@ class AbstractTest extends CompatTestCase
$minifier = new Minify\JS($content1, $content2);
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2, $result);
$this->assertEquals($content1 . ';' . $content2, $result);
// file in constructor
$minifier = new Minify\JS($path1);
@ -41,13 +41,13 @@ class AbstractTest extends CompatTestCase
$minifier = new Minify\JS($path1, $path2);
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2, $result);
$this->assertEquals($content1 . ';' . $content2, $result);
}
public function testAdd()
{
$path1 = __DIR__.'/sample/source/script1.js';
$path2 = __DIR__.'/sample/source/script2.js';
$path1 = __DIR__ . '/sample/source/script1.js';
$path2 = __DIR__ . '/sample/source/script2.js';
$content1 = file_get_contents($path1);
$content2 = file_get_contents($path2);
$content3 = 'var test=3';
@ -65,7 +65,7 @@ class AbstractTest extends CompatTestCase
$minifier->add($content2);
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2, $result);
$this->assertEquals($content1 . ';' . $content2, $result);
// file in add
$minifier = new Minify\JS();
@ -80,27 +80,27 @@ class AbstractTest extends CompatTestCase
$minifier->add($path2);
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2, $result);
$this->assertEquals($content1 . ';' . $content2, $result);
// array of files in add
$minifier = new Minify\JS();
$minifier->add(array($path1, $path2));
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2, $result);
$this->assertEquals($content1 . ';' . $content2, $result);
// array of files + overload in add
$minifier = new Minify\JS();
$minifier->add(array($path1, $path2), $content3);
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2.';'.$content3, $result);
$this->assertEquals($content1 . ';' . $content2 . ';' . $content3, $result);
$minifier = new Minify\JS();
$minifier->add($path1, array($path2, $content3));
$result = $minifier->minify();
$this->assertEquals($content1.';'.$content2.';'.$content3, $result);
$this->assertEquals($content1 . ';' . $content2 . ';' . $content3, $result);
}
public function testLoadBigString()
@ -128,11 +128,11 @@ class AbstractTest extends CompatTestCase
*/
$pid = pcntl_fork();
if (-1 === $pid) {
if ($pid === -1) {
// can't fork, ignore this test...
} elseif (0 === $pid) {
} elseif ($pid === 0) {
// https://github.com/matthiasmullie/minify/issues/111
ini_set('open_basedir', __DIR__.'/../..');
ini_set('open_basedir', __DIR__ . '/../..');
// instead of displaying warnings & moving to the next test, just
// quit with the error code; the other thread will pick it up
@ -159,9 +159,9 @@ class AbstractTest extends CompatTestCase
public function testSave()
{
$path = __DIR__.'/sample/source/script1.js';
$path = __DIR__ . '/sample/source/script1.js';
$content = file_get_contents($path);
$savePath = __DIR__.'/sample/target/script1.js';
$savePath = __DIR__ . '/sample/target/script1.js';
$minifier = new Minify\JS($path);
$minifier->minify($savePath);
@ -199,9 +199,9 @@ class AbstractTest extends CompatTestCase
public function testGzip()
{
$path = __DIR__.'/sample/source/script1.js';
$path = __DIR__ . '/sample/source/script1.js';
$content = file_get_contents($path);
$savePath = __DIR__.'/sample/target/script1.js.gz';
$savePath = __DIR__ . '/sample/target/script1.js.gz';
$minifier = new Minify\JS($path);
$minifier->gzip($savePath, 9);
@ -211,7 +211,7 @@ class AbstractTest extends CompatTestCase
public function testCache()
{
$path = __DIR__.'/sample/source/script1.js';
$path = __DIR__ . '/sample/source/script1.js';
$content = file_get_contents($path);
$cache = new MemoryStore();

View File

@ -34,7 +34,7 @@ class JSTest extends CompatTestCase
public function testAddFile()
{
$minifier = $this->mockMinifier();
$minifier->addFile(__DIR__.'/sample/source/script1.js');
$minifier->addFile(__DIR__ . '/sample/source/script1.js');
$result = $minifier->minify();
@ -65,8 +65,8 @@ class JSTest extends CompatTestCase
// adding multiple files
$tests[] = array(
array(
__DIR__.'/sample/source/script1.js',
__DIR__.'/sample/source/script2.js',
__DIR__ . '/sample/source/script1.js',
__DIR__ . '/sample/source/script2.js',
),
'var test=1;var test=2',
);
@ -74,9 +74,9 @@ class JSTest extends CompatTestCase
// adding multiple files and string
$tests[] = array(
array(
__DIR__.'/sample/source/script1.js',
__DIR__ . '/sample/source/script1.js',
'console.log(test)',
__DIR__.'/sample/source/script2.js',
__DIR__ . '/sample/source/script2.js',
),
'var test=1;console.log(test);var test=2',
);
@ -869,15 +869,15 @@ String(dateString).match(/^[0-9]*$/);',
// https://github.com/matthiasmullie/minify/issues/139
$tests[] = array(
__DIR__.'/sample/line_endings/lf/script.js',
__DIR__ . '/sample/line_endings/lf/script.js',
'var a=1',
);
$tests[] = array(
__DIR__.'/sample/line_endings/cr/script.js',
__DIR__ . '/sample/line_endings/cr/script.js',
'var a=1',
);
$tests[] = array(
__DIR__.'/sample/line_endings/crlf/script.js',
__DIR__ . '/sample/line_endings/crlf/script.js',
'var a=1',
);
@ -1267,14 +1267,14 @@ a = \'b\';',
// https://github.com/matthiasmullie/minify/issues/227
$tests[] = array(
__DIR__.'/sample/bugs/227/original.js',
file_get_contents(__DIR__.'/sample/bugs/227/minified.js'),
__DIR__ . '/sample/bugs/227/original.js',
file_get_contents(__DIR__ . '/sample/bugs/227/minified.js'),
);
// https://github.com/matthiasmullie/minify/issues/229
$tests[] = array(
__DIR__.'/sample/bugs/229/original.js',
file_get_contents(__DIR__.'/sample/bugs/229/minified.js'),
__DIR__ . '/sample/bugs/229/original.js',
file_get_contents(__DIR__ . '/sample/bugs/229/minified.js'),
);
// https://github.com/matthiasmullie/minify/issues/231
@ -1367,7 +1367,7 @@ b=2',
// known minified files to help doublecheck changes in places not yet
// anticipated in these tests
$files = glob(__DIR__.'/sample/minified/*.js');
$files = glob(__DIR__ . '/sample/minified/*.js');
foreach ($files as $file) {
$content = trim(file_get_contents($file));
$tests[] = array($content, $content);
@ -1381,8 +1381,8 @@ b=2',
// some other files that are minified correctly, ensure they stay like this
// https://github.com/matthiasmullie/minify/issues/393
$source = trim(file_get_contents(__DIR__.'/sample/source/Decrypt.js'));
$minified = trim(file_get_contents(__DIR__.'/sample/minified2/Decrypt.min.js'));
$source = trim(file_get_contents(__DIR__ . '/sample/source/Decrypt.js'));
$minified = trim(file_get_contents(__DIR__ . '/sample/minified2/Decrypt.min.js'));
$tests[] = array($source, $minified);
return $tests;

View File

@ -1,3 +1,3 @@
<?php
require __DIR__.'/../vendor/autoload.php';
require __DIR__ . '/../vendor/autoload.php';