Update JShrink for PHP 8 support. (#4298)

refs #4287
This commit is contained in:
Bas Couwenberg 2021-04-09 14:45:17 +02:00 committed by GitHub
parent 4bc5350eba
commit dc7a8c8d8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 17 deletions

View File

@ -38,6 +38,13 @@ class Minifier
*/ */
protected $input; protected $input;
/**
* Length of input javascript.
*
* @var int
*/
protected $len = 0;
/** /**
* The location of the character (in the input string) that is next to be * The location of the character (in the input string) that is next to be
* processed. * processed.
@ -77,7 +84,7 @@ class Minifier
/** /**
* These characters are used to define strings. * These characters are used to define strings.
*/ */
protected $stringDelimiters = ['\'', '"', '`']; protected $stringDelimiters = ['\'' => true, '"' => true, '`' => true];
/** /**
* Contains the default options for minification. This array is merged with * Contains the default options for minification. This array is merged with
@ -86,7 +93,7 @@ class Minifier
* *
* @var array * @var array
*/ */
protected static $defaultOptions = array('flaggedComments' => true); protected static $defaultOptions = ['flaggedComments' => true];
/** /**
* Contains lock ids which are used to replace certain code patterns and * Contains lock ids which are used to replace certain code patterns and
@ -94,7 +101,7 @@ class Minifier
* *
* @var array * @var array
*/ */
protected $locks = array(); protected $locks = [];
/** /**
* Takes a string containing javascript and removes unneeded characters in * Takes a string containing javascript and removes unneeded characters in
@ -105,7 +112,7 @@ class Minifier
* @throws \Exception * @throws \Exception
* @return bool|string * @return bool|string
*/ */
public static function minify($js, $options = array()) public static function minify($js, $options = [])
{ {
try { try {
ob_start(); ob_start();
@ -157,21 +164,34 @@ class Minifier
protected function initialize($js, $options) protected function initialize($js, $options)
{ {
$this->options = array_merge(static::$defaultOptions, $options); $this->options = array_merge(static::$defaultOptions, $options);
$js = str_replace("\r\n", "\n", $js); $this->input = str_replace(["\r\n", '/**/', "\r"], ["\n", "", "\n"], $js);
$js = str_replace('/**/', '', $js);
$this->input = str_replace("\r", "\n", $js);
// We add a newline to the end of the script to make it easier to deal // We add a newline to the end of the script to make it easier to deal
// with comments at the bottom of the script- this prevents the unclosed // with comments at the bottom of the script- this prevents the unclosed
// comment error that can otherwise occur. // comment error that can otherwise occur.
$this->input .= PHP_EOL; $this->input .= PHP_EOL;
// save input length to skip calculation every time
$this->len = strlen($this->input);
// Populate "a" with a new line, "b" with the first character, before // Populate "a" with a new line, "b" with the first character, before
// entering the loop // entering the loop
$this->a = "\n"; $this->a = "\n";
$this->b = $this->getReal(); $this->b = $this->getReal();
} }
/**
* Characters that can't stand alone preserve the newline.
*
* @var array
*/
protected $noNewLineCharacters = [
'(' => true,
'-' => true,
'+' => true,
'[' => true,
'@' => true];
/** /**
* The primary action occurs here. This function loops through the input string, * The primary action occurs here. This function loops through the input string,
* outputting anything that's relevant and discarding anything that is not. * outputting anything that's relevant and discarding anything that is not.
@ -183,7 +203,7 @@ class Minifier
// new lines // new lines
case "\n": case "\n":
// if the next line is something that can't stand alone preserve the newline // if the next line is something that can't stand alone preserve the newline
if ($this->b !== false && strpos('(-+[@', $this->b) !== false) { if ($this->b !== false && isset($this->noNewLineCharacters[$this->b])) {
echo $this->a; echo $this->a;
$this->saveString(); $this->saveString();
break; break;
@ -226,7 +246,7 @@ class Minifier
break; break;
} }
// no break // no break
default: default:
// check for some regex that breaks stuff // check for some regex that breaks stuff
if ($this->a === '/' && ($this->b === '\'' || $this->b === '"')) { if ($this->a === '/' && ($this->b === '\'' || $this->b === '"')) {
@ -243,7 +263,7 @@ class Minifier
// do reg check of doom // do reg check of doom
$this->b = $this->getReal(); $this->b = $this->getReal();
if (($this->b == '/' && strpos('(,=:[!&|?*+-%', $this->a) !== false)) { if (($this->b == '/' && strpos('(,=:[!&|?', $this->a) !== false)) {
$this->saveRegex(); $this->saveRegex();
} }
} }
@ -257,6 +277,7 @@ class Minifier
protected function clean() protected function clean()
{ {
unset($this->input); unset($this->input);
$this->len = 0;
$this->index = 0; $this->index = 0;
$this->a = $this->b = ''; $this->a = $this->b = '';
unset($this->c); unset($this->c);
@ -276,7 +297,7 @@ class Minifier
unset($this->c); unset($this->c);
} else { } else {
// Otherwise we start pulling from the input. // Otherwise we start pulling from the input.
$char = substr($this->input, $this->index, 1); $char = $this->index < $this->len ? $this->input[$this->index] : false;
// If the next character doesn't exist return false. // If the next character doesn't exist return false.
if (isset($char) && $char === false) { if (isset($char) && $char === false) {
@ -289,7 +310,7 @@ class Minifier
// Normalize all whitespace except for the newline character into a // Normalize all whitespace except for the newline character into a
// standard space. // standard space.
if ($char !== "\n" && ord($char) < 32) { if ($char !== "\n" && $char < "\x20") {
return ' '; return ' ';
} }
@ -340,7 +361,7 @@ class Minifier
*/ */
protected function processOneLineComments($startIndex) protected function processOneLineComments($startIndex)
{ {
$thirdCommentString = substr($this->input, $this->index, 1); $thirdCommentString = $this->index < $this->len ? $this->input[$this->index] : false;
// kill rest of line // kill rest of line
$this->getNext("\n"); $this->getNext("\n");
@ -429,7 +450,7 @@ class Minifier
$this->index = $pos; $this->index = $pos;
// Return the first character of that string. // Return the first character of that string.
return substr($this->input, $this->index, 1); return $this->index < $this->len ? $this->input[$this->index] : false;
} }
/** /**
@ -447,7 +468,7 @@ class Minifier
$this->a = $this->b; $this->a = $this->b;
// If this isn't a string we don't need to do anything. // If this isn't a string we don't need to do anything.
if (!in_array($this->a, $this->stringDelimiters)) { if (!isset($this->stringDelimiters[$this->a])) {
return; return;
} }
@ -557,7 +578,7 @@ class Minifier
/* lock things like <code>"asd" + ++x;</code> */ /* lock things like <code>"asd" + ++x;</code> */
$lock = '"LOCK---' . crc32(time()) . '"'; $lock = '"LOCK---' . crc32(time()) . '"';
$matches = array(); $matches = [];
preg_match('/([+-])(\s+)([+-])/S', $js, $matches); preg_match('/([+-])(\s+)([+-])/S', $js, $matches);
if (empty($matches)) { if (empty($matches)) {
return $js; return $js;

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
set -eux set -eux
VERSION=1.3.2 VERSION=1.4.0
curl -LsS https://github.com/tedious/JShrink/archive/v"$VERSION".tar.gz -o /tmp/JShrink.tar.gz curl -LsS https://github.com/tedious/JShrink/archive/v"$VERSION".tar.gz -o /tmp/JShrink.tar.gz
tar xzf /tmp/JShrink.tar.gz --strip-components 1 JShrink-"$VERSION"/LICENSE tar xzf /tmp/JShrink.tar.gz --strip-components 1 JShrink-"$VERSION"/LICENSE
tar xzf /tmp/JShrink.tar.gz --strip-components 3 JShrink-"$VERSION"/src/JShrink/Minifier.php tar xzf /tmp/JShrink.tar.gz --strip-components 3 JShrink-"$VERSION"/src/JShrink/Minifier.php