1
0
mirror of https://github.com/mrclay/minify.git synced 2025-09-04 03:25:33 +02:00

59 Commits

Author SHA1 Message Date
Elan Ruusamäe
e1c8b925be Fill changelog for 4.0.1 2025-02-03 10:53:27 +02:00
Elan Ruusamäe
9eb43c9f9f Add reflink to 4.0.0 release in changelog 2025-02-03 10:50:10 +02:00
Elan Ruusamäe
5597771d6e Update .semver to 4.0.1 2025-02-03 10:48:56 +02:00
Elan Ruusamäe
2d5ca3614e Fix ubuntu typo in github actions 2025-02-03 10:47:31 +02:00
Elan Ruusamäe
1a8cdbb6c7 Merge pull request #714 from thirsch/feature/php84
Add support for php 8.4
2025-02-03 10:31:59 +02:00
Thomas A. Hirsch
c222c65211 adding php 8.4 to github actions 2025-01-28 15:50:49 +01:00
Thomas A. Hirsch
60f49fa1e3 explicitly mark parameters as nullable 2025-01-28 15:50:41 +01:00
Elan Ruusamäe
230770a277 Merge pull request #711 from mrclay/deprecation
Recommend against use
2024-06-19 13:18:46 +03:00
Steve Clay
14b1d60448 Recommend against use 2024-06-13 23:57:49 -04:00
Steve Clay
43fb768c13 Fixes #693 2024-01-04 01:29:02 -05:00
Steve Clay
6166d3b785 Skip some tests on CI 2024-01-04 01:19:42 -05:00
Steve Clay
e84d55d4d6 Use Github actions 2024-01-04 01:12:40 -05:00
Steve Clay
45463786f8 Merge pull request #709 from mrclay/docker
Updates
2024-01-04 01:08:48 -05:00
Steve Clay
00e5e20abe Changelog update 2024-01-04 01:08:31 -05:00
Steve Clay
9e182a6255 Use scssphp/scssphp 2024-01-04 01:00:44 -05:00
Steve Clay
bc1ffdc5fc Test fixes 2024-01-04 01:00:44 -05:00
Steve Clay
aa3721156e Require PHP 8.1. Fixes #708 2024-01-04 01:00:35 -05:00
Steve Clay
3047f5c48f Add docker-compose setup 2024-01-03 21:41:47 -05:00
Elan Ruusamäe
104ccd2bfe Update .semver file 2023-05-05 15:03:33 +03:00
Elan Ruusamäe
dc02cdfba7 Fill changelog for 3.0.14 2023-05-05 15:03:06 +03:00
Elan Ruusamäe
23f055d3f5 Merge pull request #705 from rossbearman/monolog-v3 2023-04-13 23:03:05 +03:00
Ross Bearman
4970127e91 Support monolog v3 2023-04-12 16:11:35 +01:00
Elan Ruusamäe
39c37bdd8c Merge pull request #700 from turbulent/feat/allow-invalidation 2022-12-15 12:42:05 +02:00
Adrien Poupa
4a9d0595e3 feat: Allow invalidation from manual invocation 2022-12-14 15:21:52 -05:00
Elan Ruusamäe
ca8fdc6fdd Merge pull request #699 from tamakianimalife/php8.2
Add property declaration
2022-12-14 20:52:27 +02:00
tamakianimalife
8c69866874 Add property declaration 2022-12-14 17:30:53 +09:00
Elan Ruusamäe
ae5b9f0bfb Add changelog for #688 2022-10-03 00:12:43 +03:00
Elan Ruusamäe
e74adc4f6b Add changelog for 3.0.13 release 2022-10-03 00:11:04 +03:00
Elan Ruusamäe
5dee6538be Merge pull request #697 from croensch/apcu 2022-10-03 00:09:24 +03:00
Christoph Rönsch
455084b284 Minify_Cache_APCu replaces APC 2022-10-01 22:23:52 +02:00
Elan Ruusamäe
5112bb50f4 Merge pull request #688 from mrclay/lesserphp 2022-05-14 14:15:55 +03:00
Elan Ruusamäe
1962d3614c Fill changelog for 3.0.12 2022-05-14 14:11:27 +03:00
Elan Ruusamäe
2226a6add1 Merge pull request #696 from 0m3r/patch-1
Fix null argument to preg_split
2022-05-14 14:11:22 +03:00
Oleksandr Krasko
8b91de51c3 Fix null argument to preg_split
Deprecated Functionality: preg_split(): Passing null to parameter #3 ($limit) of type int is deprecated

https://www.php.net/manual/en/function.preg-split.php#refsect1-function.preg-split-parameters

limit:

If specified, then only substrings up to limit are returned with the
rest of the string being placed in the last substring. A limit of -1 or
0 means "no limit".

Refs:
- https://www.drupal.org/project/geshifilter/issues/3262325

Signed-off-by: Elan Ruusamäe <glen@pld-linux.org>
2022-05-14 14:01:14 +03:00
Elan Ruusamäe
1c000f9d05 Merge pull request #692 from venkatraj/dev-master 2022-01-04 10:14:13 +02:00
N. Venkat Raj
cbda49556e updated jquery version to avoid xss attacks 2022-01-04 13:36:07 +05:30
Elan Ruusamäe
b314554a0f Remove php 7.4 block for LessSourceTest 2021-03-11 17:54:46 +02:00
Elan Ruusamäe
9dac0ac873 Require marcusschwarz/lesserphp ^0.5.5
This resolves php 7.4 compatibility
2021-03-11 17:54:29 +02:00
Elan Ruusamäe
c80add80a2 Merge pull request #687 from mrclay/php-8-testing 2021-03-11 17:51:57 +02:00
Elan Ruusamäe
ad732493b8 Remove php 7.4 from allow failures 2021-03-11 14:04:50 +02:00
Elan Ruusamäe
ad0fb95556 Disable less tests on php 7.4+ 2021-03-11 14:04:45 +02:00
Elan Ruusamäe
f1572a580a Prepare for 3.0.11 release 2021-03-11 13:58:14 +02:00
Elan Ruusamäe
40f9dafe5f Merge pull request #685 from mrclay/php-8
Disable less tests on php 7.4+
2021-03-11 13:48:29 +02:00
Elan Ruusamäe
c814ff4bae Merge pull request #682 from angrybrad/master
Add PHP 8 support in composer.json
2021-03-11 13:47:59 +02:00
Elan Ruusamäe
8382fb85d8 Disable less tests on php 7.4+ 2020-12-01 16:16:43 +02:00
Elan Ruusamäe
efec97278f Merge pull request #677 from mrclay/php-7.4 2020-10-24 20:29:56 +03:00
Elan Ruusamäe
e9d4db41ac Add php nightly test
This adds php 8.0 to the test matrix
2020-10-24 18:52:22 +03:00
Elan Ruusamäe
b89bc57164 Fix Array and string offset access syntax with curly braces is deprecated 2020-10-24 18:52:22 +03:00
Brad Bell
69e3eb241f Add PHP 8 support in composer.json 2020-10-23 12:53:19 -07:00
Elan Ruusamäe
b17c00c05c Make code symmetric: Check on ConditionalGet as well
This partly reverts 5705fc9d89
2020-07-12 10:34:01 +03:00
Elan Ruusamäe
e3fe3001c3 Avoid calling get_magic_quotes_gpc() in tests for php >= 5.4 2020-07-12 10:33:58 +03:00
Elan Ruusamäe
8600312ed1 Merge pull request #672 from mrclay/fixer-psr2
Setup php-cs-fixer (@PSR2 rules only); Enable running in CI
2020-04-03 11:59:24 +03:00
Elan Ruusamäe
070c6c0349 Allow failures for php-cs-fixer 2020-04-03 10:48:29 +03:00
Elan Ruusamäe
b31855f6b8 Apply php-cs-fixer fixers
- braces
- function_declaration
- lowercase_keywords
- method_argument_space
- no_spaces_inside_parenthesis
- no_trailing_whitespace
- no_trailing_whitespace_in_comment
- single_blank_line_at_eof
2020-04-03 10:47:27 +03:00
Elan Ruusamäe
031e804d08 Run php-cs-fixer in Travis CI 2020-04-03 10:42:46 +03:00
Elan Ruusamäe
263381a23f Setup php-cs-fixer
Setup only to apply @PSR2 rules
2020-04-03 10:42:46 +03:00
Elan Ruusamäe
a36bfd50b0 Minor changelog fixes 2020-04-03 10:30:36 +03:00
Elan Ruusamäe
8dba84a2d2 Prepare for 3.0.10 release 2020-04-02 22:47:26 +03:00
Andrew Welch
0f607be23a Exclude SSI Comments (#670)
* Exclude SSI comments

Exclude Nginx & Apache Server Side Include (SSI) comments from being stripped via minification, the same way IE directives are not stripped.

Both Nginx & Apache SSI directives begin with:

<!—#

So we can just look for the # and don’t strip the comment in that case.

Nginx SSI: http://nginx.org/en/docs/http/ngx_http_ssi_module.html

Apache SSI: https://httpd.apache.org/docs/2.4/howto/ssi.html

* Add tests for Nginx/Apache SSI directives

Co-authored-by: Andrew Welch <andrew@keluli.local>
2020-04-02 22:45:11 +03:00
76 changed files with 702 additions and 363 deletions

54
.github/workflows/php.yml vendored Normal file
View File

@@ -0,0 +1,54 @@
name: PHP Composer
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-versions:
["8.1", "8.2", "8.3", "8.4"]
name: PHP ${{ matrix.php-versions }} Test on ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
coverage: none
tools: composer, wp-cli, phpunit-polyfills:1.0
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Validate composer.json and composer.lock
run: composer validate --strict
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install dependencies
run: composer install --prefer-dist --no-progress
# Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit"
# Docs: https://getcomposer.org/doc/articles/scripts.md
- name: Run test suite
run: composer run-script test

44
.php_cs
View File

@@ -1,27 +1,23 @@
<?php
$finder = Symfony\CS\Finder\DefaultFinder::create()
->in(__DIR__ . '/lib')
;
$rules = array(
'@PSR2' => true,
);
return Symfony\CS\Config\Config::create()
->level(Symfony\CS\FixerInterface::PSR2_LEVEL)
->setUsingCache(true)
->fixers(array(
'linefeed',
'trailing_spaces',
'unused_use',
'short_tag',
'return',
'visibility',
'php_closing_tag',
'extra_empty_lines',
'function_declaration',
'include',
'controls_spaces',
'elseif',
'-eof_ending',
'-method_argument_space',
))
->finder($finder)
;
$config = PhpCsFixer\Config::create();
$finder = $config->getFinder();
$finder
->in(array('.', 'builder/', 'lib/', 'tests/', 'min_extras/', 'static/'))
->name('*.php')
->ignoreDotFiles(true)
->ignoreVCS(true);
return $config
->setUsingCache(true)
->setRiskyAllowed(true)
->setRules($rules)
->setIndent(' ')
->setLineEnding("\n");
// vim:ft=php

View File

@@ -1,6 +1,6 @@
---
:major: 3
:major: 4
:minor: 0
:patch: 8
:patch: 1
:special: ''
:metadata: ''

View File

@@ -1,43 +0,0 @@
language: php
sudo: false
dist: trusty
jobs:
fast_finish: true
allow_failures:
- php: "7.4"
- php: "nightly"
include:
- php: "5.3"
dist: precise
- php: "5.4"
- php: "5.5"
- php: "5.6"
- php: "7.0"
- php: "7.1"
- php: "7.2"
- php: "7.3"
- php: "7.4"
env:
- CLOSURE_VERSION: 20161024
services:
- memcached
cache:
directories:
- $HOME/.composer/cache
- vendor
install:
- composer update --no-interaction --prefer-source
before_script:
- tests/dl-closure.sh
script:
- composer validate
- vendor/bin/phpunit --verbose
# vim:ts=2:sw=2:et

View File

@@ -5,6 +5,74 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
## [4.0.1] - 2025-02-03
- Recommend against use, [#711]
- Fix htmlspecialchars incompatibility with php 8.1, [#693]
- Support PHP 8.4, [#714]
[4.0.1]: https://github.com/mrclay/minify/compare/4.0.0...4.0.1
[#711]: https://github.com/mrclay/minify/pull/711
[#693]: https://github.com/mrclay/minify/issues/693
[#714]: https://github.com/mrclay/minify/pull/714
## [4.0.0] - 2024-01-04
- Support PHP 8.1+
- Update PHPUnit to 8.x
- Replace `leafo/scssphp` with `scssphp/scssphp`
[4.0.0]: https://github.com/mrclay/minify/compare/3.0.14...4.0.0
## [3.0.14] - 2023-05-05
- Support monolog v3, [#705]
- Allow invalidation from manual invocation, [#700]
- Add property declaration, [#699]
[3.0.14]: https://github.com/mrclay/minify/compare/3.0.13...3.0.14
[#705]: https://github.com/mrclay/minify/pull/705
[#700]: https://github.com/mrclay/minify/pull/700
[#699]: https://github.com/mrclay/minify/pull/699
## [3.0.13] - 2022-10-03
- Add `Minify_Cache_APCu` to replace `Minify_Cache_APC`, [#697]
- Require `marcusschwarz/lesserphp:^0.5.5` to fix php 7.4 compatibility, [#688]
[3.0.13]: https://github.com/mrclay/minify/compare/3.0.12...3.0.13
[#697]: https://github.com/mrclay/minify/pull/697
[#688]: https://github.com/mrclay/minify/pull/688
## [3.0.12] - 2022-05-14
- Update jquery to 1.12.4 to avoid xss attacks, [#692]
- Fix null argument to preg_split, [#696], [#695]
[3.0.12]: https://github.com/mrclay/minify/compare/3.0.11...3.0.12
[#692]: https://github.com/mrclay/minify/pull/692
[#696]: https://github.com/mrclay/minify/pull/696
[#695]: https://github.com/mrclay/minify/issues/695
## [3.0.11] - 2021-03-11
- PHP 8.0 support, [#685], [#682], [#677]
[3.0.11]: https://github.com/mrclay/minify/compare/3.0.10...3.0.11
[#685]: https://github.com/mrclay/minify/pull/685
[#682]: https://github.com/mrclay/minify/pull/682
[#677]: https://github.com/mrclay/minify/pull/677
## [3.0.10] - 2020-04-02
- Exclude SSI Comments from HTML minify, [#670], [#671]
[3.0.10]: https://github.com/mrclay/minify/compare/3.0.9...3.0.10
[#671]: https://github.com/mrclay/minify/issues/671
[#670]: https://github.com/mrclay/minify/pull/670
## [3.0.9] - 2020-03-24
- Allow `intervention/httpauth` 3.x, [#667], [#666], [#664]

View File

@@ -1,4 +1,10 @@
# Welcome to Minify!
## Minify is no longer regularly maintained
The original authors no longer recommend using Minify, especially previous versions, which were not designed to handle modern JS and CSS syntax. Instead, use an up-to-date performance measurement tool like [Lighthouse](https://developer.chrome.com/docs/lighthouse/overview) and follow its recommendations.
In 2010, Minify offered a fine improvement for some websites, but browsers and HTTP servers are now much better, and Minify may offer only a marginal performance benefit in narrow cases. Also both JS and CSS now change rapidly, and new syntaxes are likely to lead to broken code being served through Minify.
## About
Minify is an HTTP server for JS and CSS assets. It compresses and combines files
and serves it with appropriate headers, allowing conditional GET or long-Expires.

View File

@@ -1,4 +1,4 @@
<?php
<?php
$app = (require __DIR__ . '/../bootstrap.php');
/* @var \Minify\App $app */
@@ -153,8 +153,8 @@ by Minify. E.g. <code>@import "<span class=minRoot>/min/?</span>g=css2";</code><
list</a>.</p>
<p><small>Powered by Minify <?php echo Minify::VERSION; ?></small></p>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="jquery-1.6.3.min.js"><\/script>')</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="jquery-1.12.4.min.js"><\/script>')</script>
<script>
(function () {
// workaround required to test when /min isn't child of web root

5
builder/jquery-1.12.4.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
<?php
/**
* AJAX checks for zlib.output_compression
*
*
* @package Minify
*/
@@ -29,7 +29,6 @@ if ($app->env->get('hello')) {
));
$he->encode();
$he->sendAll();
} else {
// echo status "0" or "1"
header('Content-Type: text/plain');

View File

@@ -37,7 +37,7 @@ if (isset($_GET['oc'])) {
echo "<p class=topNote><strong>\$_SERVER['SUBDOMAIN_DOCUMENT_ROOT'] is set.</strong> "
. "You may need to set \$min_documentRoot to this in config.php</p>";
}
}
//*/
//*/

View File

@@ -17,32 +17,36 @@
"wiki": "https://github.com/mrclay/minify/blob/master/docs"
},
"autoload": {
"classmap": ["lib/"]
"classmap": [
"lib/"
]
},
"autoload-dev": {
"psr-4": {"Minify\\Test\\": "tests/"}
"psr-4": {
"Minify\\Test\\": "tests/"
}
},
"config": {
"platform": {
"php": "5.3.29"
"php": "8.1.0"
},
"sort-packages": true
},
"require": {
"php": "^5.3.0 || ^7.0",
"php": "^8.1",
"ext-pcre": "*",
"intervention/httpauth": "^2.0|^3.0",
"marcusschwarz/lesserphp": "^0.5.1",
"monolog/monolog": "~1.1|~2.0",
"marcusschwarz/lesserphp": "^0.5.5",
"monolog/monolog": "~1.1|~2.0|~3.0",
"mrclay/jsmin-php": "~2",
"mrclay/props-dic": "^2.2|^3.0",
"mrclay/props-dic": "^4",
"tubalmartin/cssmin": "~4"
},
"require-dev": {
"firephp/firephp-core": "~0.4.0",
"leafo/scssphp": "^0.3 || ^0.6 || ^0.7",
"meenie/javascript-packer": "~1.1",
"phpunit/phpunit": "^4.8.36",
"phpunit/phpunit": "^8",
"scssphp/scssphp": "^1.12",
"tedivm/jshrink": "~1.1.0"
},
"suggest": {

View File

@@ -4,7 +4,6 @@
*
* To test config options, place them in this file and add "&test" to your Minify URL.
* Note that if this is on a public server, anyone can execute your test.
*
*
* @package Minify
*/

View File

@@ -2,7 +2,7 @@
/**
* Configuration for "min", the default application built with the Minify
* library
*
*
* @package Minify
*/
@@ -47,7 +47,7 @@ $min_errorLogger = false;
* /min/f=file1.js send the cookie minDebug=file1.js
* You can manually enable debugging by appending "&debug" to a URI.
* E.g. /min/?f=script1.js,script2.js&debug
*
*
* In 'debug' mode, Minify combines files with no minification and adds comments
* to indicate line #s of the original files.
*/
@@ -73,11 +73,11 @@ $min_allowDebugFlag = false;
/**
* Leave an empty string to use PHP's $_SERVER['DOCUMENT_ROOT'].
*
* On some servers, this value may be misconfigured or missing. If so, set this
* On some servers, this value may be misconfigured or missing. If so, set this
* to your full document root path with no trailing slash.
* E.g. '/home/accountname/public_html' or 'c:\\xampp\\htdocs'
*
* If /min/ is directly inside your document root, just uncomment the
* If /min/ is directly inside your document root, just uncomment the
* second line. The third line might work on some Apache servers.
*/
$min_documentRoot = '';
@@ -87,7 +87,7 @@ $min_documentRoot = '';
/**
* Cache file locking. Set to false if filesystem is NFS. On at least one
* Cache file locking. Set to false if filesystem is NFS. On at least one
* NFS system flock-ing attempts stalled PHP for 30 seconds!
*/
$min_cacheFileLocking = true;
@@ -96,9 +96,9 @@ $min_cacheFileLocking = true;
/**
* Combining multiple CSS files can place @import declarations after rules, which
* is invalid. Minify will attempt to detect when this happens and place a
* warning comment at the top of the CSS output. To resolve this you can either
* move the @imports within your CSS files, or enable this option, which will
* move all @imports to the top of the output. Note that moving @imports could
* warning comment at the top of the CSS output. To resolve this you can either
* move the @imports within your CSS files, or enable this option, which will
* move all @imports to the top of the output. Note that moving @imports could
* affect CSS values (which is why this option is disabled by default).
*/
$min_serveOptions['bubbleCssImports'] = false;
@@ -134,8 +134,8 @@ $min_serveOptions['maxAge'] = 1800;
* particular directories below DOCUMENT_ROOT, set this here.
* You will still need to include the directory in the
* f or b GET parameters.
*
* // = shortcut for DOCUMENT_ROOT
*
* // = shortcut for DOCUMENT_ROOT
*/
//$min_serveOptions['minApp']['allowDirs'] = array('//js', '//css');
@@ -149,7 +149,7 @@ $min_serveOptions['minApp']['groupsOnly'] = false;
/**
* By default, Minify will not minify files with names containing .min or -min
* before the extension. E.g. myFile.min.js will not be processed by JSMin
*
*
* To minify all files, set this option to null. You could also specify your
* own pattern that is matched against the filename.
*/
@@ -160,8 +160,8 @@ $min_serveOptions['minApp']['groupsOnly'] = false;
* If you minify CSS files stored in symlink-ed directories, the URI rewriting
* algorithm can fail. To prevent this, provide an array of link paths to
* target paths, where the link paths are within the document root.
*
* Because paths need to be normalized for this to work, use "//" to substitute
*
* Because paths need to be normalized for this to work, use "//" to substitute
* the doc root in the link paths (the array keys). E.g.:
* <code>
* array('//symlink' => '/real/target/path') // unix
@@ -173,17 +173,17 @@ $min_symlinks = array();
/**
* If you upload files from Windows to a non-Windows server, Windows may report
* incorrect mtimes for the files. This may cause Minify to keep serving stale
* incorrect mtimes for the files. This may cause Minify to keep serving stale
* cache files when source file changes are made too frequently (e.g. more than
* once an hour).
*
* Immediately after modifying and uploading a file, use the touch command to
*
* Immediately after modifying and uploading a file, use the touch command to
* update the mtime on the server. If the mtime jumps ahead by a number of hours,
* set this variable to that number. If the mtime moves back, this should not be
* set this variable to that number. If the mtime moves back, this should not be
* needed.
*
* In the Windows SFTP client WinSCP, there's an option that may fix this
* issue without changing the variable below. Under login > environment,
* In the Windows SFTP client WinSCP, there's an option that may fix this
* issue without changing the variable below. Under login > environment,
* select the option "Adjust remote timestamp with DST".
* @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
*/
@@ -198,4 +198,3 @@ $min_uploaderHoursBehind = 0;
*/
//$min_factories['minify'] = ... a callable accepting a Minify\App object
//$min_factories['controller'] = ... a callable accepting a Minify\App object

8
docker-compose.yml Normal file
View File

@@ -0,0 +1,8 @@
version: "3.7"
services:
apache:
image: php:8.3-apache
ports:
- 8080:80
volumes:
- .:/var/www/html/min

View File

@@ -1,9 +1,9 @@
<?php
/**
* Sets up MinApp controller and serves files
*
*
* DO NOT EDIT! Configure this utility via config.php and groupsConfig.php
*
*
* @package Minify
*/

View File

@@ -317,7 +317,9 @@ class HTTP_ConditionalGet
if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
return false;
}
$clientEtagList = $_SERVER['HTTP_IF_NONE_MATCH'];
$clientEtagList = PHP_VERSION_ID < 50400 && get_magic_quotes_gpc()
? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])
: $_SERVER['HTTP_IF_NONE_MATCH'];
$clientEtags = explode(',', $clientEtagList);
$compareTo = $this->normalizeEtag($this->_etag);

View File

@@ -204,9 +204,10 @@ class HTTP_Encoder
}
// gzip checks (slow)
if (preg_match(
'@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
,$ae
,$m)) {
'@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
$ae,
$m
)) {
return array('gzip', $m[1]);
}
if ($allowDeflate) {
@@ -217,14 +218,17 @@ class HTTP_Encoder
|| 0 === strpos($ae, 'deflate,') // opera
// slow parsing
|| preg_match(
'@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@', $ae)) {
'@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
$ae
)) {
return array('deflate', 'deflate');
}
}
if ($allowCompress && preg_match(
'@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
,$ae
,$m)) {
'@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
$ae,
$m
)) {
return array('compress', $m[1]);
}

View File

@@ -85,7 +85,7 @@ class Minify
* @param Minify_CacheInterface $cache
* @param LoggerInterface $logger
*/
public function __construct(Minify_CacheInterface $cache, LoggerInterface $logger = null)
public function __construct(Minify_CacheInterface $cache, ?LoggerInterface $logger = null)
{
$this->cache = $cache;
$this->logger = $logger;
@@ -118,6 +118,7 @@ class Minify
'quiet' => false, // serve() will send headers and output
'debug' => false,
'concatOnly' => false,
'invalidate' => false,
// if you override these, the response codes MUST be directly after
// the first space.
@@ -242,7 +243,7 @@ class Minify
if (! $this->options['quiet']) {
$this->errorExit($this->options['badRequestHeader'], self::URL_DEBUG);
} else {
list(,$statusCode) = explode(' ', $this->options['badRequestHeader']);
list(, $statusCode) = explode(' ', $this->options['badRequestHeader']);
return array(
'success' => false,
@@ -284,6 +285,7 @@ class Minify
'lastModifiedTime' => $this->options['lastModifiedTime'],
'isPublic' => $this->options['isPublic'],
'encoding' => $this->options['encodeMethod'],
'invalidate' => $this->options['invalidate'],
);
if ($this->options['maxAge'] > 0) {
@@ -469,8 +471,8 @@ class Minify
*/
public function errorExit($header, $url = '', $msgHtml = '')
{
$url = htmlspecialchars($url, ENT_QUOTES);
list(,$h1) = explode(' ', $header, 2);
$url = htmlspecialchars($url);
list(, $h1) = explode(' ', $header, 2);
$h1 = htmlspecialchars($h1);
// FastCGI environments require 3rd arg to header() to be set
list(, $code) = explode(' ', $header, 3);
@@ -593,7 +595,8 @@ class Minify
! $source // yes, we ran out of sources
|| $type === self::TYPE_CSS // yes, to process CSS individually (avoiding PCRE bugs/limits)
|| $minifier !== $lastMinifier // yes, minifier changed
|| $options !== $lastOptions)) { // yes, options changed
|| $options !== $lastOptions // yes, options changed
)) {
// minify previous sources with last settings
$imploded = implode($implodeSeparator, $groupToProcessTogether);
$groupToProcessTogether = array();

View File

@@ -82,8 +82,7 @@ class App extends Container
$varDefined = get_defined_vars();
$varNames = array_filter($varNames, function($name) use($varDefined)
{
$varNames = array_filter($varNames, function ($name) use ($varDefined) {
return array_key_exists($name, $varDefined);
});
@@ -123,7 +122,7 @@ class App extends Container
$type = $that->typeOf($ctrl);
throw new RuntimeException('$min_factories["controller"] callable must return an implementation'
." of Minify_CacheInterface. Returned $type");
. " of Minify_CacheInterface. Returned $type");
};
$this->docRoot = function (App $app) {
@@ -189,7 +188,7 @@ class App extends Container
$type = $that->typeOf($value);
throw new RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
." Given $type");
. " Given $type");
};
$this->minify = function (App $app) use ($that) {
@@ -206,7 +205,7 @@ class App extends Container
$type = $that->typeOf($minify);
throw new RuntimeException('$min_factories["minify"] callable must return a Minify object.'
." Returned $type");
. " Returned $type");
};
$this->serveOptions = function (App $app) {
@@ -233,7 +232,7 @@ class App extends Container
}
// check for URI versioning
if ($env->get('v') !== null || preg_match('/&\\d/', $app->env->server('QUERY_STRING'))) {
if ($env->get('v') !== null || preg_match('/&\\d/', $app->env->server('QUERY_STRING') ?? '')) {
$ret['maxAge'] = 31536000;
}

View File

@@ -259,7 +259,7 @@ class Minify_CSS_Compressor
{
// Issue 210: must not eliminate WS between words in unquoted families
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
$pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], null, $flags);
$pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], -1, $flags);
$out = 'font-family:';
while (null !== ($piece = array_shift($pieces))) {

View File

@@ -73,16 +73,16 @@ class Minify_CSSmin
}
if ($options['currentDir']) {
return Minify_CSS_UriRewriter::rewrite(
$css
,$options['currentDir']
,$options['docRoot']
,$options['symlinks']
$css,
$options['currentDir'],
$options['docRoot'],
$options['symlinks']
);
}
return Minify_CSS_UriRewriter::prepend(
$css
,$options['prependRelativePath']
$css,
$options['prependRelativePath']
);
}
}

View File

@@ -13,6 +13,8 @@
*
* @package Minify
* @author Chris Edwards
*
* @deprecated Use Minify_Cache_APCu
**/
class Minify_Cache_APC implements Minify_CacheInterface
{

136
lib/Minify/Cache/APCu.php Normal file
View File

@@ -0,0 +1,136 @@
<?php
/**
* Class Minify_Cache_APCu
* @package Minify
*/
/**
* APCu-based cache class for Minify
*
* <code>
* Minify::setCache(new Minify_Cache_APCu());
* </code>
*
* @package Minify
* @author Chris Edwards
**/
class Minify_Cache_APCu implements Minify_CacheInterface
{
/**
* Create a Minify_Cache_APCu object, to be passed to
* Minify::setCache().
*
*
* @param int $expire seconds until expiration (default = 0
* meaning the item will not get an expiration date)
*
* @return null
*/
public function __construct($expire = 0)
{
$this->_exp = $expire;
}
/**
* Write data to cache.
*
* @param string $id cache id
*
* @param string $data
*
* @return bool success
*/
public function store($id, $data)
{
return apcu_store($id, "{$_SERVER['REQUEST_TIME']}|{$data}", $this->_exp);
}
/**
* Get the size of a cache entry
*
* @param string $id cache id
*
* @return int size in bytes
*/
public function getSize($id)
{
if (! $this->_fetch($id)) {
return false;
}
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
return mb_strlen($this->_data, '8bit');
} else {
return strlen($this->_data);
}
}
/**
* Does a valid cache entry exist?
*
* @param string $id cache id
*
* @param int $srcMtime mtime of the original source file(s)
*
* @return bool exists
*/
public function isValid($id, $srcMtime)
{
return ($this->_fetch($id) && ($this->_lm >= $srcMtime));
}
/**
* Send the cached content to output
*
* @param string $id cache id
*/
public function display($id)
{
echo $this->_fetch($id) ? $this->_data : '';
}
/**
* Fetch the cached content
*
* @param string $id cache id
*
* @return string
*/
public function fetch($id)
{
return $this->_fetch($id) ? $this->_data : '';
}
private $_exp = null;
// cache of most recently fetched id
private $_lm = null;
private $_data = null;
private $_id = null;
/**
* Fetch data and timestamp from apcu, store in instance
*
* @param string $id
*
* @return bool success
*/
private function _fetch($id)
{
if ($this->_id === $id) {
return true;
}
$ret = apcu_fetch($id);
if (false === $ret) {
$this->_id = null;
return false;
}
list($this->_lm, $this->_data) = explode('|', $ret, 2);
$this->_id = $id;
return true;
}
}

View File

@@ -29,7 +29,7 @@ class Minify_Cache_File implements Minify_CacheInterface
* @param bool $fileLocking
* @param LoggerInterface $logger
*/
public function __construct($path = '', $fileLocking = false, LoggerInterface $logger = null)
public function __construct($path = '', $fileLocking = false, ?LoggerInterface $logger = null)
{
if (! $path) {
$path = sys_get_temp_dir();

View File

@@ -64,4 +64,4 @@ class Minify_Cache_Null implements Minify_CacheInterface
public function fetch($id)
{
}
}
}

View File

@@ -136,4 +136,4 @@ class Minify_Cache_WinCache implements Minify_CacheInterface
return true;
}
}
}

View File

@@ -188,7 +188,7 @@ class Minify_ClosureCompiler
*/
protected function checkTempdir($tempDir)
{
if (!is_dir($tempDir)) {
if ($tempDir === null || !is_dir($tempDir)) {
throw new Minify_ClosureCompiler_Exception('$tempDir(' . $tempDir . ') is not a valid direcotry.');
}
if (!is_writable($tempDir)) {

View File

@@ -38,7 +38,7 @@ abstract class Minify_Controller_Base implements Minify_ControllerInterface
* @param Minify_Source_Factory $sourceFactory
* @param LoggerInterface $logger
*/
public function __construct(Minify_Env $env, Minify_Source_Factory $sourceFactory, LoggerInterface $logger = null)
public function __construct(Minify_Env $env, Minify_Source_Factory $sourceFactory, ?LoggerInterface $logger = null)
{
$this->env = $env;
$this->sourceFactory = $sourceFactory;

View File

@@ -68,4 +68,3 @@ class Minify_Controller_Files extends Minify_Controller_Base
return new Minify_ServeConfiguration($options, $sources);
}
}

View File

@@ -73,4 +73,3 @@ class Minify_Controller_Groups extends Minify_Controller_Files
return parent::createConfiguration($options);
}
}

View File

@@ -66,4 +66,3 @@ class Minify_Controller_Page extends Minify_Controller_Base
return new Minify_ServeConfiguration($options, $sources, $selectionId);
}
}

View File

@@ -19,4 +19,4 @@ interface Minify_ControllerInterface
* @return Minify_Env
*/
public function getEnv();
}
}

View File

@@ -22,6 +22,11 @@ class Minify_HTML
* @var boolean
*/
protected $_jsCleanComments = true;
/**
* @var string
*/
protected $_html;
/**
* "Minify" an HTML page
@@ -99,32 +104,34 @@ class Minify_HTML
// replace SCRIPTs (and minify) with placeholders
$this->_html = preg_replace_callback(
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/iu'
,array($this, '_removeScriptCB')
,$this->_html);
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/iu',
array($this, '_removeScriptCB'),
$this->_html
);
// replace STYLEs (and minify) with placeholders
$this->_html = preg_replace_callback(
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/iu'
,array($this, '_removeStyleCB')
,$this->_html);
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/iu',
array($this, '_removeStyleCB'),
$this->_html
);
// remove HTML comments (not containing IE conditional comments).
$this->_html = preg_replace_callback(
'/<!--([\\s\\S]*?)-->/u'
,array($this, '_commentCB')
,$this->_html);
'/<!--([\\s\\S]*?)-->/u',
array($this, '_commentCB'),
$this->_html
);
// replace PREs with placeholders
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/iu'
,array($this, '_removePreCB')
,$this->_html);
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/iu', array($this, '_removePreCB'), $this->_html);
// replace TEXTAREAs with placeholders
$this->_html = preg_replace_callback(
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/iu'
,array($this, '_removeTextareaCB')
,$this->_html);
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/iu',
array($this, '_removeTextareaCB'),
$this->_html
);
// trim each line.
// @todo take into account attribute values that span multiple lines.
@@ -139,24 +146,25 @@ class Minify_HTML
// remove ws outside of all elements
$this->_html = preg_replace(
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</u'
,'>$1$2$3<'
,$this->_html);
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</u',
'>$1$2$3<',
$this->_html
);
// use newlines before 1st attribute in open tags (to limit line lengths)
$this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/iu', "$1\n$2", $this->_html);
// fill placeholders
$this->_html = str_replace(
array_keys($this->_placeholders)
,array_values($this->_placeholders)
,$this->_html
array_keys($this->_placeholders),
array_values($this->_placeholders),
$this->_html
);
// issue 229: multi-pass to catch scripts that didn't get replaced in textareas
$this->_html = str_replace(
array_keys($this->_placeholders)
,array_values($this->_placeholders)
,$this->_html
array_keys($this->_placeholders),
array_values($this->_placeholders),
$this->_html
);
return $this->_html;
@@ -164,7 +172,7 @@ class Minify_HTML
protected function _commentCB($m)
{
return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<!['))
return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<![') || 0 === strpos($m[1], '#'))
? $m[0]
: '';
}
@@ -209,7 +217,8 @@ class Minify_HTML
: 'trim';
$css = call_user_func($minifier, $css);
return $this->_reservePlace($this->_needsCdata($css)
return $this->_reservePlace(
$this->_needsCdata($css)
? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
: "{$openStyle}{$css}</style>"
);
@@ -238,7 +247,8 @@ class Minify_HTML
: 'trim';
$js = call_user_func($minifier, $js);
return $this->_reservePlace($this->_needsCdata($js)
return $this->_reservePlace(
$this->_needsCdata($js)
? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
: "{$ws1}{$openScript}{$js}</script>{$ws2}"
);

View File

@@ -52,7 +52,7 @@ class Minify_HTML_Helper
}
$uri = $h->getRawUri($opts['farExpires'], $opts['debug']);
return htmlspecialchars($uri, ENT_QUOTES, $opts['charset']);
return htmlspecialchars($uri, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, $opts['charset']);
}
/**
@@ -163,7 +163,7 @@ class Minify_HTML_Helper
* @return \Minify\App
* @internal
*/
public static function app(\Minify\App $app = null)
public static function app(?\Minify\App $app = null)
{
static $cached;
if ($app) {

View File

@@ -66,7 +66,7 @@ class Minify_ImportProcessor
$this->_currentDir = dirname($file);
// remove UTF-8 BOM if present
if (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) {
if (pack("CCC", 0xef, 0xbb, 0xbf) === substr($content, 0, 3)) {
$content = substr($content, 3);
}
// ensure uniform EOLs
@@ -182,7 +182,7 @@ class Minify_ImportProcessor
private function truepath($path)
{
// whether $path is unix or not
$unipath = ('' === $path) || ($path{0} !== '/');
$unipath = ('' === $path) || ($path[0] !== '/');
// attempts to detect if path is relative in which case, add cwd
if (strpos($path, ':') === false && $unipath) {

View File

@@ -195,13 +195,13 @@ class Minify_JS_ClosureCompiler
curl_close($ch);
} else {
throw new Minify_JS_ClosureCompiler_Exception(
"Could not make HTTP request: allow_url_open is false and cURL not available"
"Could not make HTTP request: allow_url_open is false and cURL not available"
);
}
if (false === $contents) {
throw new Minify_JS_ClosureCompiler_Exception(
"No HTTP response from server"
"No HTTP response from server"
);
}

View File

@@ -110,4 +110,4 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
$this->shell("$serverCommand </dev/null >/dev/null 2>/dev/null & sleep 10");
}
}
}

View File

@@ -1,7 +1,6 @@
<?php
use Leafo\ScssPhp\Compiler;
use Leafo\ScssPhp\Server;
use Leafo\ScssPhp\Version;
use ScssPhp\ScssPhp\Compiler;
use ScssPhp\ScssPhp\Version;
/**
* Class for using SCSS files
@@ -152,12 +151,12 @@ class Minify_ScssCssSource extends Minify_Source
// and will treat the @import line as css import
$scss->setImportPaths(dirname($filename));
$css = $scss->compile(file_get_contents($filename), $filename);
$css = $scss->compileString(file_get_contents($filename), $filename)->getCss();
$elapsed = round((microtime(true) - $start), 4);
$v = Version::VERSION;
$ts = date('r', $start);
$css = "/* compiled by scssphp $v on $ts (${elapsed}s) */\n\n" . $css;
$ts = date('r', (int) $start);
$css = "/* compiled by scssphp $v on $ts ({$elapsed}s) */\n\n" . $css;
$imports = $scss->getParsedFiles();

View File

@@ -44,7 +44,7 @@ class Minify_Source_Factory
* @param Minify_CacheInterface $cache Optional cache for handling .less files.
*
*/
public function __construct(Minify_Env $env, array $options = array(), Minify_CacheInterface $cache = null)
public function __construct(Minify_Env $env, array $options = array(), ?Minify_CacheInterface $cache = null)
{
$this->env = $env;
$this->options = array_merge(array(
@@ -170,7 +170,7 @@ class Minify_Source_Factory
if ($this->options['noMinPattern'] && preg_match($this->options['noMinPattern'], $basename)) {
if (preg_match('~\.(css|less)$~i', $basename)) {
$spec['minifyOptions']['compress'] = false;
// we still want URI rewriting to work for CSS
// we still want URI rewriting to work for CSS
} else {
$spec['minifier'] = 'Minify::nullMinifier';
}

View File

@@ -154,4 +154,3 @@ class Minify_YUICompressor
}
}
}

View File

@@ -108,7 +108,7 @@ class Cli
* @return Arg
* @throws InvalidArgumentException
*/
public function addArgument($letter, $required, Arg $arg = null)
public function addArgument($letter, $required, ?Arg $arg = null)
{
if (! preg_match('/^[a-zA-Z]$/', $letter)) {
throw new InvalidArgumentException('$letter must be in [a-zA-Z]');
@@ -390,4 +390,3 @@ class Cli
$this->errors[$letter][] = sprintf($msg, $value);
}
}

View File

@@ -27,7 +27,7 @@ $outfile = $cli->values['o'];
$testRun = $cli->values['t'];
$docRoot = $cli->values['d'];
$pathRewriter = function($css, $options) {
$pathRewriter = function ($css, $options) {
return Minify_CSS_UriRewriter::rewrite($css, $options['currentDir'], $options['docRoot']);
};
@@ -54,9 +54,8 @@ $combined = Minify::combine($sources) . "\n";
if ($testRun) {
echo $combined;
echo Minify_CSS_UriRewriter::$debugText . "\n";
} else {
} else {
$fp = $cli->openOutput();
fwrite($fp, $combined);
$cli->closeOutput();
}

View File

@@ -4,6 +4,6 @@
require __DIR__ . '/../config.php';
$minifyCachePath = isset($min_cachePath)
? $min_cachePath
$minifyCachePath = isset($min_cachePath)
? $min_cachePath
: '';

View File

@@ -13,7 +13,8 @@ $app->cache = new Minify_Cache_Null();
$env = $app->env;
function h($txt) {
function h($txt)
{
return htmlspecialchars($txt, ENT_QUOTES, 'UTF-8');
}
@@ -22,13 +23,12 @@ if ($env->post('textIn')) {
}
if ($env->post('method') === 'Minify and serve') {
$base = trim($env->post('base'));
if ($base) {
$textIn = preg_replace(
'@(<head\\b[^>]*>)@i'
,'$1<base href="' . h($base) . '" />'
,$textIn
'@(<head\\b[^>]*>)@i',
'$1<base href="' . h($base) . '" />',
$textIn
);
}
@@ -58,7 +58,6 @@ $tpl = array();
$tpl['classes'] = array('Minify_HTML', 'JSMin\\JSMin', 'Minify_CSS', 'Minify_Lines');
if (in_array($env->post('method'), $tpl['classes'])) {
$args = array($textIn);
if ($env->post('method') === 'Minify_HTML') {
$args[] = array(
@@ -88,7 +87,8 @@ sendPage($tpl);
* @param string $input
* @return string HTML
*/
function getExceptionMsg(Exception $e, $input) {
function getExceptionMsg(Exception $e, $input)
{
$msg = "<p>" . h($e->getMessage()) . "</p>";
if (0 === strpos(get_class($e), 'JSMin_Unterminated')
&& preg_match('~byte (\d+)~', $e->getMessage(), $m)) {
@@ -113,37 +113,35 @@ function getExceptionMsg(Exception $e, $input) {
*
* @param array $vars
*/
function sendPage($vars) {
header('Content-Type: text/html; charset=utf-8');
?>
function sendPage($vars)
{
header('Content-Type: text/html; charset=utf-8'); ?>
<!DOCTYPE html><head><title>minifyTextarea</title></head>
<p><strong>Warning! Please do not place this application on a public site.</strong> This should be used only for testing.</p>
<?php
if (isset($vars['exceptionMsg'])) {
echo $vars['exceptionMsg'];
}
if (isset($vars['time'])) {
echo "
echo $vars['exceptionMsg'];
}
if (isset($vars['time'])) {
echo "
<table>
<tr><th>Bytes in</th><td>{$vars['inBytes']} (after line endings normalized to <code>\\n</code>)</td></tr>
<tr><th>Bytes out</th><td>{$vars['outBytes']} (reduced " . round(100 - (100 * $vars['outBytes'] / $vars['inBytes'])) . "%)</td></tr>
<tr><th>Time (s)</th><td>" . round($vars['time'], 5) . "</td></tr>
</table>
";
}
?>
} ?>
<form action="?2" method="post">
<p><label>Content<br><textarea name="textIn" cols="80" rows="35" style="width:99%"><?php
if (isset($vars['output'])) {
echo h($vars['output']);
}
?></textarea></label></p>
echo h($vars['output']);
} ?></textarea></label></p>
<p>Minify with:
<?php foreach ($vars['classes'] as $minClass): ?>
<input type="submit" name="method" value="<?php echo $minClass; ?>">
<?php endForEach; ?>
<?php endforeach; ?>
</p>
<p>...or <input type="submit" name="method" value="Minify and serve"> this HTML to the browser. Also minify:
<label>CSS <input type="checkbox" name="minCss" checked></label> :

View File

@@ -12,23 +12,26 @@ $app->cache = new Minify_Cache_Null();
$env = $app->env;
function getPost($key) {
function getPost($key)
{
if (! isset($_POST[$key])) {
return null;
}
return get_magic_quotes_gpc()
return (PHP_VERSION_ID < 50400 && get_magic_quotes_gpc())
? stripslashes($_POST[$key])
: $_POST[$key];
}
function sniffType($headers) {
function sniffType($headers)
{
$charset = 'utf-8';
$type = null;
$headers = "\n\n" . implode("\n\n", $headers) . "\n\n";
if (preg_match(
'@\\n\\nContent-Type: *([\\w/\\+-]+)( *; *charset *= *([\\w-]+))? *\\n\\n@i'
,$headers
,$m)) {
'@\\n\\nContent-Type: *([\\w/\\+-]+)( *; *charset *= *([\\w-]+))? *\\n\\n@i',
$headers,
$m
)) {
$sentType = $m[1];
if (isset($m[3])) {
$charset = $m[3];
@@ -49,7 +52,6 @@ function sniffType($headers) {
}
if (isset($_POST['url'])) {
require '../config.php';
$url = trim($env->post('url'));
@@ -88,13 +90,13 @@ if (isset($_POST['url'])) {
die('Unrecognized Content-Type: ' . $type['sent']);
}
if ($type['minify'] === 'text/html'
if ($type['minify'] === 'text/html'
&& isset($_POST['addBase'])
&& ! preg_match('@<base\\b@i', $content)) {
$content = preg_replace(
'@(<head\\b[^>]*>)@i'
,'$1<base href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" />'
,$content
'@(<head\\b[^>]*>)@i',
'$1<base href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" />',
$content
);
}

View File

@@ -8,9 +8,13 @@ $env = $app->env;
header('Content-Type: text/html;charset=utf-8');
function h($str) { return htmlspecialchars($str, ENT_QUOTES); }
function h($str)
{
return htmlspecialchars($str, ENT_QUOTES);
}
function getInput($name, $default = '', $size = 50) {
function getInput($name, $default = '', $size = 50)
{
global $env;
$val = $env->post($name, $default);
return "<input type='text' name='{$name}' value='" . h($val) . "' size='{$size}' />";

View File

@@ -13,7 +13,8 @@ if (!$enabled) {
die('Set $enabled to true to see server info.');
}
function assertTrue($test, $message) {
function assertTrue($test, $message)
{
if (!$test) {
echo "Warning: $message\n";
}

View File

@@ -7,12 +7,12 @@ if (is_file(__DIR__ . '/bootstrap.php')) {
$bootstrap_file = __DIR__ . '/../bootstrap.php';
}
$send_400 = function($content = 'Bad URL') {
$send_400 = function ($content = 'Bad URL') {
http_response_code(400);
die($content);
};
$send_301 = function($url) {
$send_301 = function ($url) {
http_response_code(301);
header("Cache-Control: max-age=31536000");
header("Location: $url");

View File

@@ -10,7 +10,8 @@ namespace Minify\StaticService;
* @param string $type "css" or "js"
* @return string
*/
function build_uri($static_uri, $query, $type) {
function build_uri($static_uri, $query, $type)
{
$static_uri = rtrim($static_uri, '/');
$query = ltrim($query, '?');
@@ -30,7 +31,8 @@ function build_uri($static_uri, $query, $type) {
* @param bool $auto_create Automatically create the directory if missing?
* @return null|string null if missing or can't create
*/
function get_cache_time($auto_create = true) {
function get_cache_time($auto_create = true)
{
foreach (scandir(__DIR__) as $entry) {
if (ctype_digit($entry)) {
return $entry;
@@ -50,14 +52,16 @@ function get_cache_time($auto_create = true) {
return $time;
}
function flush_cache() {
function flush_cache()
{
$time = get_cache_time(false);
if ($time) {
remove_tree(__DIR__ . "/$time");
}
}
function remove_tree($dir) {
function remove_tree($dir)
{
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {

View File

@@ -127,7 +127,7 @@ class HTTPConditionalGetTest extends TestCase
if (null === $inm) {
unset($_SERVER['HTTP_IF_NONE_MATCH']);
} else {
$_SERVER['HTTP_IF_NONE_MATCH'] = get_magic_quotes_gpc()
$_SERVER['HTTP_IF_NONE_MATCH'] = PHP_VERSION_ID < 50400 && get_magic_quotes_gpc()
? addslashes($inm) :
$inm;
}

View File

@@ -113,10 +113,12 @@ class HTTPEncoderTest extends TestCase
);
foreach ($encodingTests as $test) {
$e = new HTTP_Encoder(array(
'content' => $variedContent,
'method' => $test['method'],
));
$e = new HTTP_Encoder(
array(
'content' => $variedContent,
'method' => $test['method'],
)
);
$e->encode(9);
$ret = $this->countBytes($e->getContent());
@@ -153,12 +155,12 @@ function _gzdecode($data)
}
// http://www.php.net/manual/en/function.gzdecode.php#82930
function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
function _phpman_gzdecode($data, &$filename = '', &$error = '', $maxlength = 0)
{
$mbIntEnc = null;
$hasMbOverload = (function_exists('mb_strlen')
&& (ini_get('mbstring.func_overload') !== '')
&& ((int)ini_get('mbstring.func_overload') & 2));
&& (ini_get('mbstring.func_overload') !== '')
&& ((int) ini_get('mbstring.func_overload') & 2));
if ($hasMbOverload) {
$mbIntEnc = mb_internal_encoding();
mb_internal_encoding('8bit');
@@ -166,15 +168,15 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
if ($len < 18 || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
$error = "Not in GZIP format.";
if ($mbIntEnc !== null) {
mb_internal_encoding($mbIntEnc);
}
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
$method = ord(substr($data, 2, 1)); // Compression method
$flags = ord(substr($data, 3, 1)); // Flags
if ($flags & 31 != $flags) {
$error = "Reserved bits not allowed.";
if ($mbIntEnc !== null) {
@@ -183,13 +185,13 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack("V", substr($data,4,4));
$mtime = unpack("V", substr($data, 4, 4));
$mtime = $mtime[1];
$xfl = substr($data,8,1);
$os = substr($data,8,1);
$xfl = substr($data, 8, 1);
$os = substr($data, 8, 1);
$headerlen = 10;
$extralen = 0;
$extra = "";
$extralen = 0;
$extra = "";
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len - $headerlen - 2 < 8) {
@@ -198,7 +200,7 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return false; // invalid
}
$extralen = unpack("v",substr($data,8,2));
$extralen = unpack("v", substr($data, 8, 2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
if ($mbIntEnc !== null) {
@@ -206,7 +208,7 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return false; // invalid
}
$extra = substr($data,10,$extralen);
$extra = substr($data, 10, $extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
@@ -219,14 +221,14 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return false; // invalid
}
$filenamelen = strpos(substr($data,$headerlen),chr(0));
$filenamelen = strpos(substr($data, $headerlen), chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
if ($mbIntEnc !== null) {
mb_internal_encoding($mbIntEnc);
}
return false; // invalid
}
$filename = substr($data,$headerlen,$filenamelen);
$filename = substr($data, $headerlen, $filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
@@ -239,14 +241,14 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return false; // invalid
}
$commentlen = strpos(substr($data,$headerlen),chr(0));
$commentlen = strpos(substr($data, $headerlen), chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
if ($mbIntEnc !== null) {
mb_internal_encoding($mbIntEnc);
}
return false; // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$comment = substr($data, $headerlen, $commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
@@ -258,8 +260,8 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return false; // invalid
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$calccrc = crc32(substr($data, 0, $headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data, $headerlen, 2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
$error = "Header checksum failed.";
@@ -271,12 +273,12 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
$headerlen += 2;
}
// GZIP FOOTER
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = sprintf('%u',$datacrc[1] & 0xFFFFFFFF);
$isize = unpack("V",substr($data,-4));
$datacrc = unpack("V", substr($data, -8, 4));
$datacrc = sprintf('%u', $datacrc[1] & 0xFFFFFFFF);
$isize = unpack("V", substr($data, -4));
$isize = $isize[1];
// decompression:
$bodylen = $len-$headerlen-8;
$bodylen = $len - $headerlen - 8;
if ($bodylen < 1) {
// IMPLEMENTATION BUG!
if ($mbIntEnc !== null) {
@@ -284,28 +286,28 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
}
return null;
}
$body = substr($data,$headerlen,$bodylen);
$body = substr($data, $headerlen, $bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body,$maxlength);
break;
default:
$error = "Unknown compression method.";
if ($mbIntEnc !== null) {
mb_internal_encoding($mbIntEnc);
}
return false;
case 8:
// Currently the only supported compression method:
$data = gzinflate($body, $maxlength);
break;
default:
$error = "Unknown compression method.";
if ($mbIntEnc !== null) {
mb_internal_encoding($mbIntEnc);
}
return false;
}
} // zero-byte body content is allowed
// Verifiy CRC32
$crc = sprintf("%u",crc32($data));
$crc = sprintf("%u", crc32($data));
$crcOK = $crc == $datacrc;
$lenOK = $isize == strlen($data);
if (!$lenOK || !$crcOK) {
$error = ( $lenOK ? '' : 'Length check FAILED. ') . ( $crcOK ? '' : 'Checksum FAILED.');
$error = ($lenOK ? '' : 'Length check FAILED. ') . ($crcOK ? '' : 'Checksum FAILED.');
$ret = false;
}
$ret = $data;
@@ -313,4 +315,4 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
mb_internal_encoding($mbIntEnc);
}
return $ret;
}
}

View File

@@ -126,4 +126,4 @@ class JSMinTest extends TestCase
),
);
}
}
}

View File

@@ -32,8 +32,11 @@ class JsClosureCompilerTest extends TestCase
$this->compile($src);
} catch (Minify_JS_ClosureCompiler_Exception $e) {
}
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
'Throws Minify_JS_ClosureCompiler_Exception');
$this->assertInstanceOf(
'Minify_JS_ClosureCompiler_Exception',
$e,
'Throws Minify_JS_ClosureCompiler_Exception'
);
}
// Test maximum byte size check (default)
@@ -46,8 +49,11 @@ class JsClosureCompilerTest extends TestCase
$this->compile($src);
} catch (Minify_JS_ClosureCompiler_Exception $e) {
}
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
'Throws Minify_JS_ClosureCompiler_Exception');
$this->assertInstanceOf(
'Minify_JS_ClosureCompiler_Exception',
$e,
'Throws Minify_JS_ClosureCompiler_Exception'
);
$expected = 'POST content larger than ' . Minify_JS_ClosureCompiler::DEFAULT_MAX_BYTES . ' bytes';
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
@@ -76,8 +82,11 @@ class JsClosureCompilerTest extends TestCase
));
} catch (Minify_JS_ClosureCompiler_Exception $e) {
}
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
'Throws Minify_JS_ClosureCompiler_Exception');
$this->assertInstanceOf(
'Minify_JS_ClosureCompiler_Exception',
$e,
'Throws Minify_JS_ClosureCompiler_Exception'
);
$expected = 'POST content larger than ' . $allowedBytes . ' bytes';
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
@@ -96,8 +105,11 @@ class JsClosureCompilerTest extends TestCase
));
} catch (Minify_JS_ClosureCompiler_Exception $e) {
}
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
'Throws Minify_JS_ClosureCompiler_Exception');
$this->assertInstanceOf(
'Minify_JS_ClosureCompiler_Exception',
$e,
'Throws Minify_JS_ClosureCompiler_Exception'
);
}
public function test7()

View File

@@ -6,7 +6,9 @@ use Minify_HTML_Helper;
class LessSourceTest extends TestCase
{
public function setUp()
public string $realDocRoot;
public function setUp(): void
{
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
@@ -39,4 +41,4 @@ class LessSourceTest extends TestCase
$this->assertEquals("/min/g=less&amp;{$max}", $res);
}
}
}

View File

@@ -25,4 +25,4 @@ class MinifyBuildTest extends TestCase
$this->assertEquals($b->uri('/path'), "/path?{$maxTime}", 'uri() with no querystring');
$this->assertEquals($b->uri('/path?hello'), "/path?hello&amp;{$maxTime}", 'uri() with existing querystring');
}
}
}

View File

@@ -6,7 +6,7 @@ use Minify_CSS_UriRewriter;
class MinifyCSSUriRewriterTest extends TestCase
{
public function setUp()
public function setUp(): void
{
Minify_CSS_UriRewriter::$debugText = '';
}
@@ -16,9 +16,10 @@ class MinifyCSSUriRewriterTest extends TestCase
$in = file_get_contents(self::$test_files . '/css_uriRewriter/in.css');
$expected = file_get_contents(self::$test_files . '/css_uriRewriter/exp.css');
$actual = Minify_CSS_UriRewriter::rewrite(
$in
, self::$test_files . '/css_uriRewriter' // currentDir
, self::$document_root // use DOCUMENT_ROOT = '/full/path/to/min_unit_tests'
$in,
self::$test_files . '/css_uriRewriter' // currentDir
,
self::$document_root // use DOCUMENT_ROOT = '/full/path/to/min_unit_tests'
);
$this->assertEquals($expected, $actual, 'rewrite, debug: ' . Minify_CSS_UriRewriter::$debugText);
@@ -47,9 +48,9 @@ class MinifyCSSUriRewriterTest extends TestCase
$in = '../../../../assets/skins/sam/sprite.png';
$exp = '/yui/assets/skins/sam/sprite.png';
$actual = Minify_CSS_UriRewriter::rewriteRelative(
$in
, 'sf_root_dir\web\yui\menu\assets\skins\sam'
, 'sf_root_dir\web'
$in,
'sf_root_dir\web\yui\menu\assets\skins\sam',
'sf_root_dir\web'
);
$this->assertEquals($exp, $actual, 'Issue 99, debug: ' . Minify_CSS_UriRewriter::$debugText);

View File

@@ -6,10 +6,9 @@ use Minify_Cache_APC;
class MinifyCacheAPCTest extends TestCase
{
public function setUp()
public function setUp(): void
{
if (!function_exists('apc_store')) {
// FIXME: is APCu extension ok too?
$this->markTestSkipped("To test this component, install APC extension");
}
}
@@ -22,4 +21,4 @@ class MinifyCacheAPCTest extends TestCase
$cache = new Minify_Cache_APC();
$this->assertTestCache($cache, $id, $data);
}
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Minify\Test;
use Minify_Cache_APCu;
class MinifyCacheAPCuTest extends TestCase
{
public function setUp(): void
{
if (getenv('GITHUB_ACTION')) {
$this->markTestSkipped("Skipping on CI");
return;
}
if (!function_exists('apcu_store')) {
$this->markTestSkipped("To test this component, install APCu extension");
}
ini_set('apc.enable_cli', 1);
}
public function test1()
{
$data = str_repeat(md5(time()) . 'í', 100); // 3400 bytes in UTF-8
$id = 'Minify_test_cache';
$cache = new Minify_Cache_APCu();
$this->assertTestCache($cache, $id, $data);
}
}

View File

@@ -10,8 +10,13 @@ class MinifyCacheMemcacheTest extends TestCase
/** @var Memcache */
private $mc;
public function setUp()
public function setUp(): void
{
if (getenv('GITHUB_ACTION')) {
$this->markTestSkipped("Skipping on CI");
return;
}
if (!function_exists('memcache_set')) {
$this->markTestSkipped("To test this component, install memcache in PHP");
}
@@ -45,4 +50,3 @@ class MinifyCacheMemcacheTest extends TestCase
$this->assertTestCache($cache, $id, $data);
}
}

View File

@@ -6,7 +6,7 @@ use Minify_Cache_WinCache;
class MinifyCacheWinCacheTest extends TestCase
{
public function setUp()
public function setUp(): void
{
if (!function_exists('wincache_ucache_info')) {
$this->markTestSkipped("To test this component, install WinCache extension");
@@ -21,4 +21,4 @@ class MinifyCacheWinCacheTest extends TestCase
$cache = new Minify_Cache_WinCache();
$this->assertTestCache($cache, $id, $data);
}
}
}

View File

@@ -6,7 +6,7 @@ use Minify_Cache_ZendPlatform;
class MinifyCacheZendPlatformTest extends TestCase
{
public function setUp()
public function setUp(): void
{
if (!function_exists('output_cache_put')) {
// FIXME: be specific what to actually install
@@ -22,4 +22,4 @@ class MinifyCacheZendPlatformTest extends TestCase
$cache = new Minify_Cache_ZendPlatform();
$this->assertTestCache($cache, $id, $data);
}
}
}

View File

@@ -7,7 +7,7 @@ use Minify_ClosureCompiler;
class MinifyClosureCompilerTest extends TestCase
{
public static function setupBeforeClass()
public static function setupBeforeClass(): void
{
parent::setupBeforeClass();
Minify_ClosureCompiler::$isDebug = true;

View File

@@ -31,4 +31,4 @@ class MinifyCommentPreserverTest extends TestCase
++$callCount;
return $callCount . strtoupper($content);
}
}
}

View File

@@ -9,14 +9,14 @@ class MinifyHTMLHelperTest extends TestCase
{
private $realDocRoot;
public function setUp()
public function setUp(): void
{
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
}
// TODO: this is probably not needed if backupGlobals is enabled?
public function tearDown()
public function tearDown(): void
{
$_SERVER['DOCUMENT_ROOT'] = $this->realDocRoot;
}
@@ -43,13 +43,16 @@ class MinifyHTMLHelperTest extends TestCase
$this->assertEquals($expected, $actual, 'non-existent group & debug');
$expected = "/myApp/min/?g=css&amp;{$maxTime}";
$actual = Minify_HTML_Helper::getUri('css', array(
'rewriteWorks' => false
,
'minAppUri' => '/myApp/min/'
,
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
));
$actual = Minify_HTML_Helper::getUri(
'css',
array(
'rewriteWorks' => false
,
'minAppUri' => '/myApp/min/'
,
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
)
);
$this->assertEquals($expected, $actual, 'existing group');
@@ -58,26 +61,33 @@ class MinifyHTMLHelperTest extends TestCase
require_once $utilsFile;
$fiveSecondsAgo = $_SERVER['REQUEST_TIME'] - 5;
$obj = new Minify_Source(array(
'id' => '1',
'content' => '1',
'lastModified' => $fiveSecondsAgo,
));
$obj = new Minify_Source(
array(
'id' => '1',
'content' => '1',
'lastModified' => $fiveSecondsAgo,
)
);
$output = Minify_mtime(array($uri1, $uri2, $obj));
$this->assertEquals($fiveSecondsAgo, $output, 'utils.php : Minify_mtime w/ files & obj');
$obj = new Minify_Source(array(
'id' => '2',
'content' => '2',
'lastModified' => strtotime('2000-01-01'),
));
$output = Minify_mtime(array(
$obj
,
'css'
), self::$test_files . '/htmlHelper_groupsConfig.php');
$obj = new Minify_Source(
array(
'id' => '2',
'content' => '2',
'lastModified' => strtotime('2000-01-01'),
)
);
$output = Minify_mtime(
array(
$obj
,
'css'
),
self::$test_files . '/htmlHelper_groupsConfig.php'
);
$this->assertEquals($maxTime, $output, 'utils.php : Minify_mtime w/ obj & group');
}
}
}
}

View File

@@ -23,7 +23,10 @@ class MinifyImportProcessorTest extends TestCase
realpath($linDir . '/lib/css/example.css'),
);
$this->assertEquals($expectedIncludes, Minify_ImportProcessor::$filesIncluded,
'included right files in right order');
$this->assertEquals(
$expectedIncludes,
Minify_ImportProcessor::$filesIncluded,
'included right files in right order'
);
}
}

View File

@@ -8,7 +8,7 @@ use Minify_NailgunClosureCompiler;
class MinifyNailgunClosureCompilerTest extends TestCase
{
public static function setupBeforeClass()
public static function setupBeforeClass(): void
{
parent::setupBeforeClass();
Minify_ClosureCompiler::$isDebug = true;
@@ -54,4 +54,4 @@ class MinifyNailgunClosureCompilerTest extends TestCase
$this->markTestSkipped($e->getMessage());
}
}
}
}

View File

@@ -62,8 +62,8 @@ class MinifyTest extends TestCase
$content = preg_replace('/\\r\\n?/', "\n", file_get_contents($minifyTestPath . '/minified.js'));
$lastModified = max(
filemtime($minifyTestPath . '/email.js')
, filemtime($minifyTestPath . '/QueryString.js')
filemtime($minifyTestPath . '/email.js'),
filemtime($minifyTestPath . '/QueryString.js')
);
$expected = array(
'success' => true,
@@ -153,8 +153,10 @@ class MinifyTest extends TestCase
));
$output = $output['content'];
$this->assertFalse(strpos($output, $defaultOptions['importWarning']),
'Issue 89 : don\'t warn about valid imports');
$this->assertFalse(
strpos($output, $defaultOptions['importWarning']),
'Issue 89 : don\'t warn about valid imports'
);
// Test Issue 132
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
@@ -164,8 +166,11 @@ class MinifyTest extends TestCase
'encodeOutput' => false,
));
$this->assertEquals(77, $output['headers']['Content-Length'],
'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length');
$this->assertEquals(
77,
$output['headers']['Content-Length'],
'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length'
);
}
// Test minifying CSS and responding with Etag/Last-Modified

View File

@@ -7,7 +7,7 @@ use Minify_YUICompressor;
class MinifyYuiCSSTest extends TestCase
{
public static function setupBeforeClass()
public static function setupBeforeClass(): void
{
parent::setupBeforeClass();
@@ -18,7 +18,7 @@ class MinifyYuiCSSTest extends TestCase
Minify_YUICompressor::$tempDir = sys_get_temp_dir();
}
public function setUp()
public function setUp(): void
{
$this->assertHasJar();
}
@@ -60,4 +60,4 @@ class MinifyYuiCSSTest extends TestCase
$this->markTestSkipped($e->getMessage());
}
}
}
}

View File

@@ -6,7 +6,9 @@ use Minify_HTML_Helper;
class ScssSourceTest extends TestCase
{
public function setUp()
public string $realDocRoot;
public function setUp(): void
{
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
@@ -39,4 +41,4 @@ class ScssSourceTest extends TestCase
$this->assertEquals("/min/g=scss&amp;{$max}", $res);
}
}
}

View File

@@ -11,7 +11,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
/** @var string */
protected static $test_files;
public static function setupBeforeClass()
public static function setupBeforeClass(): void
{
self::$document_root = __DIR__;
self::$test_files = __DIR__ . '/_test_files';
@@ -25,7 +25,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
*/
protected function countBytes($str)
{
return (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2))
return (function_exists('mb_strlen') && ((int) ini_get('mbstring.func_overload') & 2))
? mb_strlen($str, '8bit')
: strlen($str);
}
@@ -70,4 +70,4 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
return $contents;
}
}
}

View File

@@ -9,6 +9,11 @@
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design." />
<meta name="robots" content="all" />
<title>css Zen Garden: The Beauty in CSS Design</title>
<!--# if expr="$HTTP_COOKIE=/minify\=1/" -->
<meta name="generator" content="minify-cookie" />
<!--# else -->
<meta name="generator" content="minify-no-cookie" />
<!--# endif -->
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
<script type="text/javascript"><!--
@@ -63,11 +68,11 @@ css hack {
display:none;
}
</style>
<link
<link
rel="Shortcut Icon"
type="image/x-icon"
href="http://www.csszengarden.com/favicon.ico" />
<link
<link
rel="alternate"
type="application/rss+xml"
title="RSS"
@@ -78,7 +83,7 @@ css hack {
<div id="container">
<div id="pageHeader">
<h1><span>css Zen Garden</span></h1>
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
Design</span></h2>
</div>
<pre>

View File

@@ -4,7 +4,12 @@ http-equiv="content-type" content="text/html; charset=iso-8859-1" /><meta
name="author" content="Dave Shea" /><meta
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display" /><meta
name="description" content="A demonstration of what can be accomplished visually through CSS-based design." /><meta
name="robots" content="all" /><title>css Zen Garden: The Beauty in CSS Design</title> <script type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
name="robots" content="all" /><title>css Zen Garden: The Beauty in CSS Design</title>
<!--# if expr="$HTTP_COOKIE=/minify\=1/" --><meta
name="generator" content="minify-cookie" />
<!--# else --><meta
name="generator" content="minify-no-cookie" />
<!--# endif --> <script type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}</script> <script type="text/javascript">/*<![CDATA[*/var i=0;while(++i<10)
{}/*]]>*/</script> <script type="text/javascript">i=1;</script> <script type="text/javascript">/*<![CDATA[*/(i<1);/*]]>*/</script> <!--[if IE 6]><style type="text/css">/*<![CDATA[*//*! copyright: you'll need CDATA for this < & */

View File

@@ -9,6 +9,11 @@
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design.">
<meta name="robots" content="all">
<title>css Zen Garden: The Beauty in CSS Design</title>
<!--# if expr="$HTTP_COOKIE=/minify\=1/" -->
<meta name="generator" content="minify-cookie" />
<!--# else -->
<meta name="generator" content="minify-no-cookie" />
<!--# endif -->
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
<script type="text/javascript"><!--
@@ -61,11 +66,11 @@ css hack {
display:none;
}
</style>
<link
<link
rel="Shortcut Icon"
type="image/x-icon"
href="http://www.csszengarden.com/favicon.ico">
<link
<link
rel="alternate"
type="application/rss+xml"
title="RSS"
@@ -76,7 +81,7 @@ css hack {
<div id="container">
<div id="pageHeader">
<h1><span>css Zen Garden</span></h1>
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
Design</span></h2>
</div>
<pre>

View File

@@ -4,7 +4,12 @@ http-equiv="content-type" content="text/html; charset=iso-8859-1"><meta
name="author" content="Dave Shea"><meta
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display"><meta
name="description" content="A demonstration of what can be accomplished visually through CSS-based design."><meta
name="robots" content="all"><title>css Zen Garden: The Beauty in CSS Design</title> <script type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
name="robots" content="all"><title>css Zen Garden: The Beauty in CSS Design</title>
<!--# if expr="$HTTP_COOKIE=/minify\=1/" --><meta
name="generator" content="minify-cookie" />
<!--# else --><meta
name="generator" content="minify-no-cookie" />
<!--# endif --> <script type="text/javascript">var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}</script> <script type="text/javascript">var i=0;while(++i<10)
{}</script> <script type="text/javascript">i=1;</script> <script type="text/javascript">(i<1);</script> <!--[if IE 6]><style type="text/css">/*! copyright: you'll need CDATA for this < & */

View File

@@ -48,7 +48,7 @@ function Minify_getUri($keyOrFiles, $opts = array())
*
* Since this makes a bunch of stat() calls, you might not want to check this
* on every request.
*
*
* @param array $keysAndFiles group keys and/or file paths/URIs.
* @return int latest modification time of all given keys/files
*/