Version 4.6.0

This commit is contained in:
Neo committed 2025-12-19 05:55:31 -08:00
1 parent f79dcf067a
commit 517a5e1f70
2036 files changed
+110041 -26162

No files matched your search

+23 -18
View File
@@ -1,24 +1,29 @@
BSD 3-Clause License
Copyright (c) 2009, Robert Hafner
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Stash Project nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL Robert Hafner BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+37 -16
View File
@@ -38,6 +38,13 @@ class Minifier
*/
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
* processed.
@@ -77,7 +84,7 @@ class Minifier
/**
* 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
@@ -86,7 +93,7 @@ class Minifier
*
* @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
@@ -94,7 +101,7 @@ class Minifier
*
* @var array
*/
protected $locks = array();
protected $locks = [];
/**
* Takes a string containing javascript and removes unneeded characters in
@@ -105,7 +112,7 @@ class Minifier
* @throws \Exception
* @return bool|string
*/
public static function minify($js, $options = array())
public static function minify($js, $options = [])
{
try {
ob_start();
@@ -157,21 +164,34 @@ class Minifier
protected function initialize($js, $options)
{
$this->options = array_merge(static::$defaultOptions, $options);
$js = str_replace("\r\n", "\n", $js);
$js = str_replace('/**/', '', $js);
$this->input = str_replace("\r", "\n", $js);
$this->input = str_replace(["\r\n", '/**/', "\r"], ["\n", "", "\n"], $js);
// 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
// comment error that can otherwise occur.
$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
// entering the loop
$this->a = "\n";
$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,
* outputting anything that's relevant and discarding anything that is not.
@@ -183,7 +203,7 @@ class Minifier
// new lines
case "\n":
// 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;
$this->saveString();
break;
@@ -226,7 +246,7 @@ class Minifier
break;
}
// no break
// no break
default:
// check for some regex that breaks stuff
if ($this->a === '/' && ($this->b === '\'' || $this->b === '"')) {
@@ -257,6 +277,7 @@ class Minifier
protected function clean()
{
unset($this->input);
$this->len = 0;
$this->index = 0;
$this->a = $this->b = '';
unset($this->c);
@@ -276,7 +297,7 @@ class Minifier
unset($this->c);
} else {
// 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 (isset($char) && $char === false) {
@@ -289,7 +310,7 @@ class Minifier
// Normalize all whitespace except for the newline character into a
// standard space.
if ($char !== "\n" && ord($char) < 32) {
if ($char !== "\n" && $char < "\x20") {
return ' ';
}
@@ -340,7 +361,7 @@ class Minifier
*/
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
$this->getNext("\n");
@@ -429,7 +450,7 @@ class Minifier
$this->index = $pos;
// 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;
// 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;
}
@@ -557,7 +578,7 @@ class Minifier
/* lock things like <code>"asd" + ++x;</code> */
$lock = '"LOCK---' . crc32(time()) . '"';
$matches = array();
$matches = [];
preg_match('/([+-])(\s+)([+-])/S', $js, $matches);
if (empty($matches)) {
return $js;
@@ -589,4 +610,4 @@ class Minifier
return $js;
}
}
}
+12 -1
View File
@@ -5,7 +5,6 @@
[![Coverage Status](https://coveralls.io/repos/tedious/JShrink/badge.png?branch=master)](https://coveralls.io/r/tedivm/JShrink?branch=master)
[![Total Downloads](http://img.shields.io/packagist/dt/tedivm/jshrink.svg)](https://packagist.org/packages/tedivm/JShrink)
JShrink is a php class that minifies javascript so that it can be delivered to the client quicker. This code can be used
by any product looking to minify their javascript on the fly (although caching the results is suggested for performance
reasons). Unlike many other products this is not a port into php but a native application, resulting in better
@@ -59,3 +58,15 @@ Releases of JShrink are available on [Github](https://github.com/tedious/JShrink
JShrink is licensed under the BSD License. See the LICENSE file for details.
In the spirit of open source, use of this library for evil is discouraged but not prohibited.
## Reporting Security and Vulnerability Issues
This project utilizes the [Tidelift Security Reporting System](https://tidelift.com/security) for security and vulnerability reporting.
## Support
Issues can be opened directly in Github for issues that aren't related to security.
[Professionally supported JShrink is now available with Tidelift.](https://tidelift.com/subscription/pkg/packagist-tedivm-jshrink?utm_source=packagist-tedivm-jshrink&utm_medium=referral&utm_campaign=readme)
+4 -4
View File
@@ -12,12 +12,12 @@
}
],
"require": {
"php": ">=5.3.0"
"php": "^5.6|^7.0|^8.0"
},
"require-dev": {
"phpunit/phpunit": "4.0.*",
"fabpot/php-cs-fixer": "0.4.0",
"satooshi/php-coveralls": "dev-master"
"phpunit/phpunit": "^6",
"friendsofphp/php-cs-fixer": "^2.8",
"php-coveralls/php-coveralls": "^1.1.0"
},
"autoload": {
"psr-0": {"JShrink": "src/"}
-23
View File
@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="./tests/bootstrap.php" colors="true">
<testsuites>
<testsuite name="JShrink Test Suite">
<directory suffix="Test.php">./tests/JShrink/</directory>
</testsuite>
</testsuites>
<groups>
<exclude>
<group>requests</group>
<group>development</group>
</exclude>
</groups>
<filter>
<whitelist>
<directory suffix=".php">./src/JShrink/</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
</logging>
</phpunit>