parent
4bc5350eba
commit
dc7a8c8d8b
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue