mirror of
https://github.com/mrclay/minify.git
synced 2025-09-19 10:21:31 +02:00
Compare commits
115 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
ae5b9f0bfb | ||
|
e74adc4f6b | ||
|
5dee6538be | ||
|
455084b284 | ||
|
5112bb50f4 | ||
|
1962d3614c | ||
|
2226a6add1 | ||
|
8b91de51c3 | ||
|
1c000f9d05 | ||
|
cbda49556e | ||
|
b314554a0f | ||
|
9dac0ac873 | ||
|
c80add80a2 | ||
|
ad732493b8 | ||
|
ad0fb95556 | ||
|
f1572a580a | ||
|
40f9dafe5f | ||
|
c814ff4bae | ||
|
8382fb85d8 | ||
|
efec97278f | ||
|
e9d4db41ac | ||
|
b89bc57164 | ||
|
69e3eb241f | ||
|
b17c00c05c | ||
|
e3fe3001c3 | ||
|
8600312ed1 | ||
|
070c6c0349 | ||
|
b31855f6b8 | ||
|
031e804d08 | ||
|
263381a23f | ||
|
a36bfd50b0 | ||
|
8dba84a2d2 | ||
|
0f607be23a | ||
|
d2a3e8c1d2 | ||
|
e59454bed5 | ||
|
eb5197f9d4 | ||
|
20f336f598 | ||
|
94829874f9 | ||
|
f0aa0aa7d7 | ||
|
5705fc9d89 | ||
|
3036ee9f55 | ||
|
6e3ae8417a | ||
|
d39fdd9e6b | ||
|
d35e780865 | ||
|
7378a0efe8 | ||
|
c0dd8f50a1 | ||
|
63a812af8d | ||
|
8836df06d2 | ||
|
2f33b69786 | ||
|
8e4b0ceb86 | ||
|
266ddd7d54 | ||
|
07ed67aa77 | ||
|
2bbcce054d | ||
|
9040437901 | ||
|
f954e1bd58 | ||
|
a8a77e6054 | ||
|
25065b1559 | ||
|
807f41903e | ||
|
b81ad2289a | ||
|
fecf395de3 | ||
|
2bd66ae3f9 | ||
|
4453f3a4cb | ||
|
f50353a952 | ||
|
bd7d1077b3 | ||
|
40f89b528c | ||
|
b1bbdccef0 | ||
|
258e495451 | ||
|
b97a1db01d | ||
|
3081a88dbd | ||
|
df7fddfa09 | ||
|
c580d24e1b | ||
|
f9c96b6a3c | ||
|
d3decb27e1 | ||
|
0038cdb5de | ||
|
5659799c42 | ||
|
57be61586e | ||
|
2198482600 | ||
|
c2f40feb0c | ||
|
5c300aca97 | ||
|
76c1edc6ff | ||
|
919fc10139 | ||
|
bb7fc74330 | ||
|
eb4c0f6541 | ||
|
b6ef6fa397 | ||
|
00b9f28630 | ||
|
be40d4f9b2 | ||
|
9ee5fb7701 | ||
|
7d60fb9d0f | ||
|
6236431c8f | ||
|
404664509c | ||
|
9ed7f9dc24 | ||
|
d9b392c474 | ||
|
004f6bf730 | ||
|
72ece76cdf | ||
|
bde7a41021 | ||
|
88aca4019d | ||
|
70952d88f9 | ||
|
6b274afd0b | ||
|
449f009b39 | ||
|
6a5b09a00e | ||
|
93a1edd34b | ||
|
a6531d3481 | ||
|
9de63f3acc | ||
|
ed239fbb8b | ||
|
332f4bc839 | ||
|
79e5a22321 | ||
|
80c01c6f02 | ||
|
b6e4b7f152 | ||
|
a1489b2d8a | ||
|
d041f763c9 | ||
|
8056a4a9fb | ||
|
e3555570ef | ||
|
a8304c5fb3 | ||
|
dfb97a5c85 | ||
|
4626f6c1e0 |
44
.php_cs
44
.php_cs
@@ -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
|
||||
|
6
.semver
Normal file
6
.semver
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
:major: 3
|
||||
:minor: 0
|
||||
:patch: 11
|
||||
:special: ''
|
||||
:metadata: ''
|
48
.travis.yml
48
.travis.yml
@@ -1,17 +1,31 @@
|
||||
language: php
|
||||
sudo: false
|
||||
dist: trusty
|
||||
|
||||
php:
|
||||
- 7.0
|
||||
- 5.6
|
||||
- 5.5
|
||||
- 5.4
|
||||
- hhvm
|
||||
|
||||
matrix:
|
||||
jobs:
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
- php: 7.0
|
||||
- php: "nightly"
|
||||
- name: "Php CS Fixer"
|
||||
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"
|
||||
- php: "nightly"
|
||||
- name: "Php CS Fixer"
|
||||
php: "7.3"
|
||||
env:
|
||||
- PHP_CS_FIXER=1
|
||||
|
||||
env:
|
||||
- CLOSURE_VERSION: 20161024
|
||||
|
||||
services:
|
||||
- memcached
|
||||
@@ -25,13 +39,17 @@ install:
|
||||
- composer update --no-interaction --prefer-source
|
||||
|
||||
before_script:
|
||||
- wget -c https://dl.google.com/closure-compiler/compiler-latest.zip -O vendor/compiler-latest.zip
|
||||
- unzip -od vendor/closure-compiler vendor/compiler-latest.zip
|
||||
- ln -sfn ../$(echo vendor/closure-compiler/closure-compiler-*.jar) tests/compiler.jar
|
||||
- java -jar tests/compiler.jar --version
|
||||
- tests/dl-closure.sh
|
||||
|
||||
script:
|
||||
- PATH=vendor/bin:$PATH
|
||||
- composer validate
|
||||
- phpunit --verbose
|
||||
- |
|
||||
if [ "$PHP_CS_FIXER" ]; then
|
||||
composer config --unset platform.php
|
||||
composer require --dev friendsofphp/php-cs-fixer:2.16
|
||||
php-cs-fixer fix --verbose --diff --dry-run --ansi
|
||||
fi
|
||||
- vendor/bin/phpunit --verbose
|
||||
|
||||
# vim:ts=2:sw=2:et
|
||||
|
@@ -1,20 +1,139 @@
|
||||
## Version 3.0.0 (unreleased)
|
||||
* The project root is now what is deployed as `min`
|
||||
* Adds feature to serve static files directly
|
||||
* Installation requires use of Composer to install dependencies
|
||||
* Removes JSMin+ (unmaintained, high memory usage)
|
||||
* Removes DooDigestAuth
|
||||
* Removes Minify_Loader (uses Composer)
|
||||
* Removes Minify_Logger (uses Monolog)
|
||||
* Removes `$min_libPath` option
|
||||
* The Minify, source, and controller components have changed APIs
|
||||
* Better CSS minification via Túbal Martín's CSSMin
|
||||
* Add config option for simply concatenating files
|
||||
* Add config option for altering creation of Minify/MinApp objects
|
||||
* Missing spec no longer redirects, instead links to docs
|
||||
* Minify::VERSION is an int that tracks the major version number
|
||||
# Changelog
|
||||
|
||||
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).
|
||||
|
||||
## [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]
|
||||
|
||||
[3.0.9]: https://github.com/mrclay/minify/compare/3.0.8...3.0.9
|
||||
[#664]: https://github.com/mrclay/minify/issues/664
|
||||
[#666]: https://github.com/mrclay/minify/pull/666
|
||||
[#667]: https://github.com/mrclay/minify/pull/667
|
||||
|
||||
## [3.0.8] - 2020-03-19
|
||||
|
||||
- Removed deprecated get_magic_quotes_gpc() function that since PHP 5.4.0 returns FALSE always, and since PHP 7.4 is deprecated, [#661]
|
||||
|
||||
[3.0.8]: https://github.com/mrclay/minify/compare/3.0.7...3.0.8
|
||||
[#661]: https://github.com/mrclay/minify/pull/661
|
||||
|
||||
## [3.0.7] - 2019-12-10
|
||||
|
||||
- Allow mrclay/props-dic ^3.0, [#658]
|
||||
|
||||
[3.0.7]: https://github.com/mrclay/minify/compare/3.0.6...3.0.7
|
||||
[#658]: https://github.com/mrclay/minify/pull/658
|
||||
|
||||
## [3.0.6] - 2019-10-28
|
||||
|
||||
- Bugfix for option sanitizer, [#654], [#655]
|
||||
|
||||
[3.0.6]: https://github.com/mrclay/minify/compare/3.0.5...3.0.6
|
||||
[#654]: https://github.com/mrclay/minify/issues/654
|
||||
[#655]: https://github.com/mrclay/minify/pull/655
|
||||
|
||||
## [3.0.5] - 2019-10-01
|
||||
|
||||
- Fix syntax error in composer.json, [#653]
|
||||
|
||||
[3.0.5]: https://github.com/mrclay/minify/compare/3.0.4...3.0.5
|
||||
[#653]: https://github.com/mrclay/minify/pull/653
|
||||
|
||||
## 3.0.4 - 2019-09-24
|
||||
|
||||
- Fix PHP 7.3 compatibility issues, [#648]
|
||||
|
||||
[3.0.4]: https://github.com/mrclay/minify/compare/3.0.3...3.0.4
|
||||
[#648]: https://github.com/mrclay/minify/issues/648
|
||||
|
||||
## [3.0.3] - 2017-11-03
|
||||
|
||||
- Fix closure-compiler's error "redirection limit reached". [#618], [#619]
|
||||
|
||||
[3.0.3]: https://github.com/mrclay/minify/compare/3.0.2...3.0.3
|
||||
[#618]: https://github.com/mrclay/minify/pull/618
|
||||
[#619]: https://github.com/mrclay/minify/issues/619
|
||||
|
||||
## [3.0.2] - 2017-09-14
|
||||
|
||||
- Fixes syntax error in Groups controller, [#613]
|
||||
- Better-maintained lessphp fork, [#610]
|
||||
- No longer corrupts some chars in some environments, [#608]
|
||||
|
||||
[3.0.2]: https://github.com/mrclay/minify/compare/3.0.1...3.0.2
|
||||
[#608]: https://github.com/mrclay/minify/pull/608
|
||||
[#610]: https://github.com/mrclay/minify/pull/610
|
||||
[#613]: https://github.com/mrclay/minify/issues/613
|
||||
|
||||
## [3.0.1] - 2017-06-09
|
||||
|
||||
- Update CSSmin to v4, [#599], [#590]
|
||||
|
||||
[3.0.1]: https://github.com/mrclay/minify/compare/3.0.0...3.0.1
|
||||
[#590]: https://github.com/mrclay/minify/issues/590
|
||||
[#599]: https://github.com/mrclay/minify/pull/599
|
||||
|
||||
## 3.0.0 - 2017-04-03
|
||||
|
||||
* Improved CSS minification via Túbal Martín's CSSMin
|
||||
* Easier error identification (just see error_log)
|
||||
* Adds feature to serve static files directly
|
||||
* Adds config option for simply concatenating files
|
||||
* Adds config option for altering creation of Minify/MinApp objects
|
||||
* Missing spec no longer redirects, instead links to docs
|
||||
* Installation requires use of Composer to install dependencies
|
||||
* Minify::VERSION is an int that tracks the major version number
|
||||
* BREAKING: The project root is now what gets deployed as `min`
|
||||
* BREAKING: Removes JSMin
|
||||
* BREAKING: Removes JSMin+ (unmaintained, high memory usage)
|
||||
* BREAKING: Removes DooDigestAuth
|
||||
* BREAKING: Removes Minify_Loader (uses Composer)
|
||||
* BREAKING: Removes Minify_Logger (uses Monolog)
|
||||
* BREAKING: Removes `$min_libPath` option
|
||||
* BREAKING: The Minify, source, and controller components have changed APIs
|
||||
|
||||
## 2.3.0 - 2016-03-11
|
||||
|
||||
## Version 2.3.0 (2016-03-11)
|
||||
* Adds `$min_concatOnly` option to just concatenate files
|
||||
* Deprecates use of Minify_Loader
|
||||
* Deprecates use of Minify_Logger
|
||||
@@ -22,13 +141,15 @@
|
||||
* Deprecates use of FirePHP
|
||||
* Deprecates use of DooDigestAuth
|
||||
|
||||
## Version 2.2.1 (2014-10-30)
|
||||
## 2.2.1 - 2014-10-30
|
||||
|
||||
* Builder styled with Bootstrap (thanks to help from acidvertigo)
|
||||
* Update CSSmin to v.2.4.8
|
||||
* Added WinCache
|
||||
* URLs with spaces properly rewritten
|
||||
|
||||
## Version 2.2.0 (2014-03-12)
|
||||
## 2.2.0 - 2014-03-12
|
||||
|
||||
* Fix handling of RegEx in certain situations in JSMin
|
||||
* Thanks to Vovan-VE for reporting this
|
||||
* Update composer.json with support info
|
||||
@@ -50,11 +171,13 @@
|
||||
* Allow far-future expiration and file versioning with the "v" querystirng parameter in addition to existing method
|
||||
* Lots of general code tidy ups
|
||||
|
||||
## Version 2.1.7 (2013-07-23)
|
||||
## 2.1.7 - 2013-07-23
|
||||
|
||||
* Fixes arbitrary file inclusion vulnerability on some systems
|
||||
* Thanks to Matt Mecham for reporting this
|
||||
|
||||
## Version 2.1.6 (2013-07-19)
|
||||
## 2.1.6 - 2013-07-19
|
||||
|
||||
* JSMin fixes
|
||||
* Prevents some Closure Compiler API failures
|
||||
* Uses autoloading for all class loading
|
||||
@@ -66,7 +189,8 @@
|
||||
* CLI script more portable
|
||||
* Adds composer.json
|
||||
|
||||
## Version 2.1.5 (2012-03-10)
|
||||
## 2.1.5 - 2012-03-10
|
||||
|
||||
* Removed XSS vulnerability
|
||||
* Disabled builder by default
|
||||
* command line tools to minify and rewrite URIs in CSS
|
||||
@@ -75,7 +199,8 @@
|
||||
* Closure Compiler uses cURL when allow\_url\_fopen is off
|
||||
* Missing file notices when using groups
|
||||
|
||||
## Version 2.1.4b (2010-07-10)
|
||||
## 2.1.4b - 2010-07-10
|
||||
|
||||
* Option to minify JS with Closure Compiler API w/ JSMin failover
|
||||
* Cookie/bookmarklet-based debug mode. No HTML editing!
|
||||
* Allows 1 file to be missing w/o complete failure
|
||||
@@ -91,7 +216,8 @@
|
||||
* Removed annoying maxFiles limit
|
||||
* mbstring.func\_overload usage is safer
|
||||
|
||||
## Version 2.1.3 (2009-06-30)
|
||||
## 2.1.3 - 2009-06-30
|
||||
|
||||
* CSS fixes
|
||||
* A few URI rewriting bugs fixed
|
||||
* comment/whitespace removal no longer breaks some values
|
||||
@@ -106,7 +232,8 @@
|
||||
* API: Can set contentType Minify\_Source objects (fixes an annoying [caveat](http://groups.google.com/group/minify/msg/8446d32ee99a4961))
|
||||
* [Resolved Issue list](http://code.google.com/p/minify/issues/list?can=1&q=label%3ARelease-2.1.2%20status%3AVerified)
|
||||
|
||||
## Version 2.1.2 (2009-03-04)
|
||||
## 2.1.2 - 2009-03-04
|
||||
|
||||
* Javascript fixes
|
||||
* Debug mode no longer confused by `*/*` in strings/RegExps (jQuery)
|
||||
* quote characters inside RegExp literals no longer cause exception
|
||||
@@ -118,14 +245,16 @@
|
||||
* Builder app doesn't fail on systems without gzdeflate()
|
||||
* APC caching class included
|
||||
|
||||
## Version 2.1.1 (2008-10-19)
|
||||
## 2.1.1 - 2008-10-19
|
||||
|
||||
* Bug fix release
|
||||
* Detection and workarounds for zlib.output\_compression and non-PHP encoding modules
|
||||
* Zlib not required (mod\_rewrite, et.al., can still be used for encoding)
|
||||
* HTML : More IE conditional comments preserved
|
||||
* Minify\_groupUri() utility fixed
|
||||
|
||||
## Version 2.1.0 (2008-09-18)
|
||||
## 2.1.0 - 2008-09-18
|
||||
|
||||
* "min" default application for quick deployment
|
||||
* Minify URI Builder app & bookmarklet for quickly creating minify URIs
|
||||
* Relative URIs in CSS file are fixed automatically by default
|
||||
@@ -141,8 +270,8 @@
|
||||
* Minify\_Cache\_File has flock()s (by default)
|
||||
* Workaround for Windows mtime reporting bug
|
||||
|
||||
## 2.0.0 - 2008-05-22
|
||||
|
||||
## Version 2.0.0 (2008-05-22)
|
||||
* Complete code overhaul. Minify is now a PEAR-style class and toolkit for building customized minifying file servers.
|
||||
* Content-Encoding: deflate/gzip/compress, based on request headers
|
||||
* Expanded CSS and HTML minifiers with test cases
|
||||
@@ -151,10 +280,12 @@
|
||||
* Compression & encoding modules lazy-loaded as needed (304 responses use minimal code)
|
||||
* Separate utility classes for HTTP encoding and cache control
|
||||
|
||||
## Version 1.0.1 (2007-05-05)
|
||||
## 1.0.1 - 2007-05-05
|
||||
|
||||
* Fixed various problems resolving pathnames when hosted on an NFS mount.
|
||||
* Fixed 'undefined constant' notice.
|
||||
* Replaced old JSMin library with a much faster custom implementation.
|
||||
|
||||
## Version 1.0.0 (2007-05-02)
|
||||
* First release.
|
||||
## 1.0.0 - 2007-05-02
|
||||
|
||||
* First release.
|
12
README.md
12
README.md
@@ -21,20 +21,20 @@ Post to the [Google Group](http://groups.google.com/group/minify).
|
||||
|
||||
## Installation
|
||||
|
||||
See the [install guide](https://github.com/mrclay/minify/blob/master/docs/Install.wiki.md).
|
||||
See the [install guide](docs/Install.wiki.md).
|
||||
|
||||
## Configuration & Usage
|
||||
|
||||
(Using 2.x? [Here are the 2.x docs](https://github.com/mrclay/minify/tree/2.x/docs).)
|
||||
|
||||
See the [user guide](https://github.com/mrclay/minify/blob/master/docs/UserGuide.wiki.md).
|
||||
See the [user guide](docs/UserGuide.wiki.md).
|
||||
|
||||
Minify also comes with a [URI Builder application](https://github.com/mrclay/minify/blob/master/docs/BuilderApp.wiki.md) that can help you write URLs
|
||||
Minify also comes with a [URI Builder application](docs/BuilderApp.wiki.md) that can help you write URLs
|
||||
for use with Minify or configure groups of files.
|
||||
|
||||
See the [cookbook](https://github.com/mrclay/minify/blob/master/docs/CookBook.wiki.md) for more advanced options for minification.
|
||||
See the [cookbook](docs/CookBook.wiki.md) for more advanced options for minification.
|
||||
|
||||
More [docs are available](https://github.com/mrclay/minify/tree/master/docs).
|
||||
More [docs are available](docs).
|
||||
|
||||
## Unit Testing
|
||||
|
||||
@@ -43,7 +43,7 @@ More [docs are available](https://github.com/mrclay/minify/tree/master/docs).
|
||||
|
||||
## Warnings
|
||||
|
||||
* Minify is designed for efficiency, but, for very high traffic sites, it will probably serve files slower than your HTTPd due to the CGI overhead of PHP. See the [FAQ](https://github.com/mrclay/minify/blob/master/docs/FAQ.wiki.md#how-fast-is-it) and [CookBook](https://github.com/mrclay/minify/blob/master/docs/CookBook.wiki.md) for more info.
|
||||
* Minify is designed for efficiency, but, for very high traffic sites, it will probably serve files slower than your HTTPd due to the CGI overhead of PHP. See the [FAQ](docs/FAQ.wiki.md#how-fast-is-it) and [CookBook](docs/CookBook.wiki.md) for more info.
|
||||
* If you combine a lot of CSS, watch out for [IE's 4096 selectors-per-file limit](http://stackoverflow.com/a/9906889/3779), affects IE 6 through 9.
|
||||
* Minify *should* work fine with files encoded in UTF-8 or other 8-bit encodings like ISO 8859/Windows-1252. By default Minify appends ";charset=utf-8" to the Content-Type headers it sends.
|
||||
|
||||
|
@@ -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
5
builder/jquery-1.12.4.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
builder/jquery-1.6.3.min.js
vendored
4
builder/jquery-1.6.3.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -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');
|
||||
|
@@ -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>";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//*/
|
||||
//*/
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "mrclay/minify",
|
||||
"type": "library",
|
||||
"description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers",
|
||||
"description": "Minify is a PHP app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers",
|
||||
"homepage": "https://github.com/mrclay/minify",
|
||||
"license": "BSD-3-Clause",
|
||||
"authors": [
|
||||
@@ -20,28 +20,33 @@
|
||||
"classmap": ["lib/"]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"classmap": ["tests/TestCase.php"]
|
||||
"psr-4": {"Minify\\Test\\": "tests/"}
|
||||
},
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "5.3.29"
|
||||
},
|
||||
"sort-packages": true
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.3.0 || ^7.0 || ^8.0",
|
||||
"ext-pcre": "*",
|
||||
"intervention/httpauth": "~2.0",
|
||||
"monolog/monolog": "~1.1",
|
||||
"intervention/httpauth": "^2.0|^3.0",
|
||||
"marcusschwarz/lesserphp": "^0.5.5",
|
||||
"monolog/monolog": "~1.1|~2.0",
|
||||
"mrclay/jsmin-php": "~2",
|
||||
"mrclay/props-dic": "^2.2",
|
||||
"php": "^5.3.0 || ^7.0",
|
||||
"tubalmartin/cssmin": "~2.4.8-p5"
|
||||
"mrclay/props-dic": "^2.2|^3.0",
|
||||
"tubalmartin/cssmin": "~4"
|
||||
},
|
||||
"require-dev": {
|
||||
"firephp/firephp-core": "~0.4.0",
|
||||
"leafo/lessphp": "~0.4.0",
|
||||
"leafo/scssphp": "~0.6.6",
|
||||
"leafo/scssphp": "^0.3 || ^0.6 || ^0.7",
|
||||
"meenie/javascript-packer": "~1.1",
|
||||
"phpunit/phpunit": "4.8.*",
|
||||
"phpunit/phpunit": "^4.8.36",
|
||||
"tedivm/jshrink": "~1.1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"firephp/firephp-core": "Use FirePHP for Log messages",
|
||||
"leafo/lessphp": "LESS support",
|
||||
"meenie/javascript-packer": "Keep track of the Packer PHP port using Composer"
|
||||
},
|
||||
"scripts": {
|
||||
|
@@ -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
|
||||
*/
|
||||
|
||||
|
39
config.php
39
config.php
@@ -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
|
||||
|
||||
|
@@ -26,7 +26,7 @@ Short answer: **use Minify 2.1.4+, use a pre-compressed version of your file, an
|
||||
|
||||
If the error is in your code, enable [debug mode](Debugging.wiki.md) while debugging your code in Firebug or your favorite browser's Javascript debugger. This will insert comments to allow you to keep track of the individual source locations in the combined file.
|
||||
|
||||
If you have Java on your web host, you can use the [wrapper for YUI Compressor](https://github.com/mrclay/minify/blob/master/lib/Minify/YUICompressor.php) instead of JSMin. [This thread](http://groups.google.com/group/minify/browse_thread/thread/f12f25f27e1256fe) shows how a user has done this.
|
||||
If you have Java on your web host, you can use the [wrapper for YUI Compressor](../lib/Minify/YUICompressor.php) instead of JSMin. [This thread](http://groups.google.com/group/minify/browse_thread/thread/f12f25f27e1256fe) shows how a user has done this.
|
||||
|
||||
## Javascript isn't being minified
|
||||
|
||||
@@ -48,7 +48,7 @@ Scriptaculous 1.8.2 (and probably all 1.x) has an [autoloader script](http://git
|
||||
|
||||
If you upload files using [Coda or Transmit](http://groups.google.com/group/coda-users/browse_thread/thread/572d2dc315ec02e7/) or from a Windows PC to a non-Windows server, your new files may end up with the wrong `mtime` (timestamp) on the server, confusing the cache system.
|
||||
|
||||
Setting the [$min\_uploaderHoursBehind option](https://github.com/mrclay/minify/blob/master/config.php#L171) in `config.php` can compensate for this.
|
||||
Setting the [$min\_uploaderHoursBehind option](../config.php#L171) in `config.php` can compensate for this.
|
||||
|
||||
WinSCP has a [Daylight Saving Time option](http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time) that can prevent this issue.
|
||||
|
||||
|
@@ -39,7 +39,7 @@ $min_cachePath = new Minify_Cache_WinCache();
|
||||
|
||||
## Closure Compiler API Wrapper
|
||||
|
||||
An [experimental wrapper for Google's closure compiler API](https://github.com/mrclay/minify/blob/master/min/lib/Minify/JS/ClosureCompiler.php) is available for compressing Javascript. If the API fails for any reason, JSMin is used as the default backup minifier.
|
||||
An [experimental wrapper for Google's closure compiler API](../lib/Minify/JS/ClosureCompiler.php) is available for compressing Javascript. If the API fails for any reason, JSMin is used as the default backup minifier.
|
||||
```php
|
||||
$min_serveOptions['minifiers'][Minify::TYPE_JS] = array('Minify_JS_ClosureCompiler', 'minify');
|
||||
```
|
||||
|
@@ -47,7 +47,7 @@ $controller = new Minify_Controller_Files($env, $sourceFactory);
|
||||
|
||||
## Set up service and controller options
|
||||
|
||||
A single array is used for configuring both the behavior of `Minify::serve` (see the [default options](https://github.com/mrclay/minify/blob/master/lib/Minify.php#L73)) and the controller, which has its own option keys.
|
||||
A single array is used for configuring both the behavior of `Minify::serve` (see the [default options](../lib/Minify.php#L73)) and the controller, which has its own option keys.
|
||||
|
||||
The Files controller only needs one key: `files`: the array of sources to be combined and served.
|
||||
|
||||
|
@@ -4,7 +4,7 @@ The simple JSMin algorithm is the most reliable in PHP, but check the [CookBook]
|
||||
|
||||
## How fast is it?
|
||||
|
||||
If you [serve static files](https://github.com/mrclay/minify/blob/master/static/README.md), it's as fast as your web server, and you should do this for high-traffic sites.
|
||||
If you [serve static files](../static/README.md), it's as fast as your web server, and you should do this for high-traffic sites.
|
||||
|
||||
The PHP-based server is not as fast, but still performs well thanks to an internal cache. Tips:
|
||||
|
||||
|
@@ -36,12 +36,12 @@ cp ${MINIFY}quick-test.css ${MIN}
|
||||
|
||||
Edit `min/index.php` to remove the ``die()`` statement and adjust the `vendor` path as needed.
|
||||
|
||||
**Note:** This does not install the [URL builder](https://github.com/mrclay/minify/blob/master/docs/BuilderApp.wiki.md), but it's not necessary for operation.
|
||||
**Note:** This does not install the [URL builder](BuilderApp.wiki.md), but it's not necessary for operation.
|
||||
|
||||
## Verifing it works
|
||||
|
||||
You can verify it works via these two URLs:
|
||||
|
||||
|
||||
* http://example.org/min/?f=min/quick-test.js
|
||||
* http://example.org/min/?f=min/quick-test.css
|
||||
|
||||
@@ -56,6 +56,6 @@ Write the [Google Group](http://groups.google.com/group/minify) for help.
|
||||
|
||||
## More links
|
||||
|
||||
* [Usage instructions](https://github.com/mrclay/minify/blob/master/docs/UserGuide.wiki.md)
|
||||
* [Cookbook](https://github.com/mrclay/minify/blob/master/docs/CookBook.wiki.md) for more advanced options
|
||||
* [All docs](https://github.com/mrclay/minify/tree/master/docs)
|
||||
* [Usage instructions](UserGuide.wiki.md)
|
||||
* [Cookbook](CookBook.wiki.md) for more advanced options
|
||||
* [All docs](docs)
|
||||
|
@@ -79,8 +79,6 @@ Browse to http://example.com/min/builder/
|
||||
|
||||
The Minify URI Builder will help you create URIs you can use to minify existing files on your site. You can see screenshots and get a feel for this process from this [walkthrough on mrclay.org](http://mrclay.org/index.php/2008/09/19/minify-21-on-mrclayorg/)
|
||||
|
||||
More info here: https://github.com/mrclay/minify/blob/master/MIN.txt
|
||||
|
||||
You may want to disable the [BuilderApp](BuilderApp.wiki.md) when not in use.
|
||||
|
||||
# Far-future Expires headers
|
||||
@@ -110,9 +108,9 @@ Known issue: files with comment-like strings/regexps can cause problems in this
|
||||
|
||||
# Configuration
|
||||
|
||||
See [config.php](https://github.com/mrclay/minify/blob/master/config.php) for general config options.
|
||||
See [config.php](../config.php) for general config options.
|
||||
|
||||
[groupsConfig.php](https://github.com/mrclay/minify/blob/master/groupsConfig.php) holds preset groups of files to minify. (The builder application can help with this).
|
||||
[groupsConfig.php](../groupsConfig.php) holds preset groups of files to minify. (The builder application can help with this).
|
||||
|
||||
[CookBook](CookBook.wiki.md) shows how to customize settings between production/development environments, and between groups.
|
||||
|
||||
|
@@ -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
|
||||
*/
|
||||
|
||||
|
@@ -128,8 +128,8 @@ class HTTP_ConditionalGet
|
||||
$etagAppend = '';
|
||||
if (isset($spec['encoding'])) {
|
||||
$this->_stripEtag = true;
|
||||
$this->_headers['Vary'] = 'Accept-Encoding';
|
||||
if ('' !== $spec['encoding']) {
|
||||
$this->_headers['Vary'] = 'Accept-Encoding';
|
||||
if (0 === strpos($spec['encoding'], 'x-')) {
|
||||
$spec['encoding'] = substr($spec['encoding'], 2);
|
||||
}
|
||||
@@ -317,7 +317,7 @@ class HTTP_ConditionalGet
|
||||
if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
|
||||
return false;
|
||||
}
|
||||
$clientEtagList = get_magic_quotes_gpc()
|
||||
$clientEtagList = PHP_VERSION_ID < 50400 && get_magic_quotes_gpc()
|
||||
? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])
|
||||
: $_SERVER['HTTP_IF_NONE_MATCH'];
|
||||
$clientEtags = explode(',', $clientEtagList);
|
||||
|
@@ -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]);
|
||||
}
|
||||
|
||||
|
@@ -14,9 +14,6 @@ use Psr\Log\LoggerInterface;
|
||||
* This library was inspired by {@link mailto:flashkot@mail.ru jscsscomp by Maxim Martynyuk}
|
||||
* and by the article {@link http://www.hunlock.com/blogs/Supercharged_Javascript "Supercharged JavaScript" by Patrick Hunlock}.
|
||||
*
|
||||
* Requires PHP 5.1.0.
|
||||
* Tested on PHP 5.1.6.
|
||||
*
|
||||
* @package Minify
|
||||
* @author Ryan Grove <ryan@wonko.com>
|
||||
* @author Stephen Clay <steve@mrclay.org>
|
||||
@@ -48,14 +45,14 @@ class Minify
|
||||
*
|
||||
* @var Minify_CacheInterface
|
||||
*/
|
||||
private $cache = null;
|
||||
private $cache;
|
||||
|
||||
/**
|
||||
* Active controller for current request
|
||||
*
|
||||
* @var Minify_Controller_Base
|
||||
*/
|
||||
protected $controller = null;
|
||||
protected $controller;
|
||||
|
||||
/**
|
||||
* @var Minify_Env
|
||||
@@ -77,12 +74,12 @@ class Minify
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = null;
|
||||
protected $options;
|
||||
|
||||
/**
|
||||
* @var LoggerInterface|null
|
||||
*/
|
||||
protected $logger = null;
|
||||
protected $logger;
|
||||
|
||||
/**
|
||||
* @param Minify_CacheInterface $cache
|
||||
@@ -245,7 +242,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,
|
||||
@@ -302,20 +299,20 @@ class Minify
|
||||
$cg->sendHeaders();
|
||||
|
||||
return;
|
||||
} else {
|
||||
return array(
|
||||
'success' => true,
|
||||
'statusCode' => 304,
|
||||
'content' => '',
|
||||
'headers' => $cg->getHeaders(),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// client will need output
|
||||
$headers = $cg->getHeaders();
|
||||
unset($cg);
|
||||
|
||||
return array(
|
||||
'success' => true,
|
||||
'statusCode' => 304,
|
||||
'content' => '',
|
||||
'headers' => $cg->getHeaders(),
|
||||
);
|
||||
}
|
||||
|
||||
// client will need output
|
||||
$headers = $cg->getHeaders();
|
||||
unset($cg);
|
||||
|
||||
if ($this->options['contentType'] === self::TYPE_CSS && $this->options['rewriteCssUris']) {
|
||||
$this->setupUriRewrites();
|
||||
}
|
||||
@@ -473,7 +470,7 @@ class Minify
|
||||
public function errorExit($header, $url = '', $msgHtml = '')
|
||||
{
|
||||
$url = htmlspecialchars($url, ENT_QUOTES);
|
||||
list(,$h1) = explode(' ', $header, 2);
|
||||
list(, $h1) = explode(' ', $header, 2);
|
||||
$h1 = htmlspecialchars($h1);
|
||||
// FastCGI environments require 3rd arg to header() to be set
|
||||
list(, $code) = explode(' ', $header, 3);
|
||||
@@ -517,7 +514,6 @@ class Minify
|
||||
if ($file
|
||||
&& !isset($minifyOptions['currentDir'])
|
||||
&& !isset($minifyOptions['prependRelativePath'])) {
|
||||
|
||||
$minifyOptions['currentDir'] = dirname($file);
|
||||
$source->setMinifierOptions($minifyOptions);
|
||||
}
|
||||
@@ -597,7 +593,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();
|
||||
|
@@ -2,23 +2,34 @@
|
||||
|
||||
namespace Minify;
|
||||
|
||||
use Minify_Cache_File;
|
||||
use Minify_CacheInterface;
|
||||
use Minify_Controller_MinApp;
|
||||
use Minify_ControllerInterface;
|
||||
use Minify_DebugDetector;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
use Props\Container;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use RuntimeException;
|
||||
use Monolog;
|
||||
use Minify;
|
||||
|
||||
/**
|
||||
* @property \Minify_CacheInterface $cache
|
||||
* @property \Minify\Config $config
|
||||
* @property Minify_CacheInterface $cache
|
||||
* @property Config $config
|
||||
* @property string $configPath
|
||||
* @property \Minify_ControllerInterface $controller
|
||||
* @property Minify_ControllerInterface $controller
|
||||
* @property string $dir
|
||||
* @property string $docRoot
|
||||
* @property \Minify_Env $env
|
||||
* @property \Monolog\Handler\ErrorLogHandler $errorLogHandler
|
||||
* @property Minify_Env $env
|
||||
* @property Monolog\Handler\ErrorLogHandler $errorLogHandler
|
||||
* @property array $groupsConfig
|
||||
* @property string $groupsConfigPath
|
||||
* @property \Psr\Log\LoggerInterface $logger
|
||||
* @property LoggerInterface $logger
|
||||
* @property \Minify $minify
|
||||
* @property array $serveOptions
|
||||
* @property \Minify_Source_Factory $sourceFactory
|
||||
* @property Minify_Source_Factory $sourceFactory
|
||||
* @property array $sourceFactoryOptions
|
||||
*/
|
||||
class App extends Container
|
||||
@@ -38,29 +49,29 @@ class App extends Container
|
||||
$this->cache = function (App $app) use ($that) {
|
||||
$config = $app->config;
|
||||
|
||||
if ($config->cachePath instanceof \Minify_CacheInterface) {
|
||||
if ($config->cachePath instanceof Minify_CacheInterface) {
|
||||
return $config->cachePath;
|
||||
}
|
||||
|
||||
if (!$config->cachePath || is_string($config->cachePath)) {
|
||||
return new \Minify_Cache_File($config->cachePath, $config->cacheFileLocking, $app->logger);
|
||||
return new Minify_Cache_File($config->cachePath, $config->cacheFileLocking, $app->logger);
|
||||
}
|
||||
|
||||
$type = $that->typeOf($config->cachePath);
|
||||
throw new \RuntimeException('$min_cachePath must be a path or implement Minify_CacheInterface.'
|
||||
throw new RuntimeException('$min_cachePath must be a path or implement Minify_CacheInterface.'
|
||||
. " Given $type");
|
||||
};
|
||||
|
||||
$this->config = function (App $app) {
|
||||
$config = (require $app->configPath);
|
||||
|
||||
if ($config instanceof \Minify\Config) {
|
||||
if ($config instanceof Minify\Config) {
|
||||
return $config;
|
||||
}
|
||||
|
||||
// copy from vars into properties
|
||||
|
||||
$config = new \Minify\Config();
|
||||
$config = new Minify\Config();
|
||||
|
||||
$propNames = array_keys(get_object_vars($config));
|
||||
|
||||
@@ -69,6 +80,12 @@ class App extends Container
|
||||
};
|
||||
$varNames = array_map($prefixer, $propNames);
|
||||
|
||||
$varDefined = get_defined_vars();
|
||||
|
||||
$varNames = array_filter($varNames, function ($name) use ($varDefined) {
|
||||
return array_key_exists($name, $varDefined);
|
||||
});
|
||||
|
||||
$vars = compact($varNames);
|
||||
|
||||
foreach ($varNames as $varName) {
|
||||
@@ -94,17 +111,17 @@ class App extends Container
|
||||
$config = $app->config;
|
||||
|
||||
if (empty($config->factories['controller'])) {
|
||||
$ctrl = new \Minify_Controller_MinApp($app->env, $app->sourceFactory, $app->logger);
|
||||
$ctrl = new Minify_Controller_MinApp($app->env, $app->sourceFactory, $app->logger);
|
||||
} else {
|
||||
$ctrl = call_user_func($config->factories['controller'], $app);
|
||||
}
|
||||
|
||||
if ($ctrl instanceof \Minify_ControllerInterface) {
|
||||
if ($ctrl instanceof Minify_ControllerInterface) {
|
||||
return $ctrl;
|
||||
}
|
||||
|
||||
$type = $that->typeOf($ctrl);
|
||||
throw new \RuntimeException('$min_factories["controller"] callable must return an implementation'
|
||||
throw new RuntimeException('$min_factories["controller"] callable must return an implementation'
|
||||
." of Minify_CacheInterface. Returned $type");
|
||||
};
|
||||
|
||||
@@ -118,13 +135,13 @@ class App extends Container
|
||||
};
|
||||
|
||||
$this->env = function (App $app) {
|
||||
return new \Minify_Env($app->config->envArgs);
|
||||
return new Minify_Env($app->config->envArgs);
|
||||
};
|
||||
|
||||
$this->errorLogHandler = function (App $app) {
|
||||
$format = "%channel%.%level_name%: %message% %context% %extra%";
|
||||
$handler = new \Monolog\Handler\ErrorLogHandler();
|
||||
$handler->setFormatter(new \Monolog\Formatter\LineFormatter($format));
|
||||
$handler = new Monolog\Handler\ErrorLogHandler();
|
||||
$handler->setFormatter(new Monolog\Formatter\LineFormatter($format));
|
||||
|
||||
return $handler;
|
||||
};
|
||||
@@ -138,11 +155,11 @@ class App extends Container
|
||||
$this->logger = function (App $app) use ($that) {
|
||||
$value = $app->config->errorLogger;
|
||||
|
||||
if ($value instanceof \Psr\Log\LoggerInterface) {
|
||||
if ($value instanceof LoggerInterface) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
$logger = new \Monolog\Logger('minify');
|
||||
$logger = new Monolog\Logger('minify');
|
||||
|
||||
if (!$value) {
|
||||
return $logger;
|
||||
@@ -150,12 +167,12 @@ class App extends Container
|
||||
|
||||
if ($value === true || $value instanceof \FirePHP) {
|
||||
$logger->pushHandler($app->errorLogHandler);
|
||||
$logger->pushHandler(new \Monolog\Handler\FirePHPHandler());
|
||||
$logger->pushHandler(new Monolog\Handler\FirePHPHandler());
|
||||
|
||||
return $logger;
|
||||
}
|
||||
|
||||
if ($value instanceof \Monolog\Handler\HandlerInterface) {
|
||||
if ($value instanceof Monolog\Handler\HandlerInterface) {
|
||||
$logger->pushHandler($value);
|
||||
|
||||
return $logger;
|
||||
@@ -163,14 +180,14 @@ class App extends Container
|
||||
|
||||
// BC
|
||||
if (is_object($value) && is_callable(array($value, 'log'))) {
|
||||
$handler = new \Minify\Logger\LegacyHandler($value);
|
||||
$handler = new Minify\Logger\LegacyHandler($value);
|
||||
$logger->pushHandler($handler);
|
||||
|
||||
return $logger;
|
||||
}
|
||||
|
||||
$type = $that->typeOf($value);
|
||||
throw new \RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
||||
throw new RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
||||
." Given $type");
|
||||
};
|
||||
|
||||
@@ -187,7 +204,7 @@ class App extends Container
|
||||
}
|
||||
|
||||
$type = $that->typeOf($minify);
|
||||
throw new \RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
||||
throw new RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
||||
." Returned $type");
|
||||
};
|
||||
|
||||
@@ -207,7 +224,7 @@ class App extends Container
|
||||
}
|
||||
|
||||
if ($config->allowDebugFlag) {
|
||||
$ret['debug'] = \Minify_DebugDetector::shouldDebugRequest($env);
|
||||
$ret['debug'] = Minify_DebugDetector::shouldDebugRequest($env);
|
||||
}
|
||||
|
||||
if ($config->concatOnly) {
|
||||
@@ -228,7 +245,7 @@ class App extends Container
|
||||
};
|
||||
|
||||
$this->sourceFactory = function (App $app) {
|
||||
return new \Minify_Source_Factory($app->env, $app->sourceFactoryOptions, $app->cache);
|
||||
return new Minify_Source_Factory($app->env, $app->sourceFactoryOptions, $app->cache);
|
||||
};
|
||||
|
||||
$this->sourceFactoryOptions = function (App $app) {
|
||||
|
@@ -80,7 +80,6 @@ class Minify_Build
|
||||
*
|
||||
* @param array $sources array of Minify_Source objects and/or file paths
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function __construct($sources)
|
||||
{
|
||||
|
@@ -89,9 +89,10 @@ class Minify_CSS
|
||||
$currentDir = $options['currentDir'];
|
||||
$docRoot = $options['docRoot'];
|
||||
$symlinks = $options['symlinks'];
|
||||
|
||||
return Minify_CSS_UriRewriter::rewrite($css, $currentDir, $docRoot, $symlinks);
|
||||
} else {
|
||||
return Minify_CSS_UriRewriter::prepend($css, $options['prependRelativePath']);
|
||||
}
|
||||
|
||||
return Minify_CSS_UriRewriter::prepend($css, $options['prependRelativePath']);
|
||||
}
|
||||
}
|
||||
|
@@ -217,6 +217,7 @@ class Minify_CSS_Compressor
|
||||
if (preg_match($pattern, $m, $n)) {
|
||||
// end hack mode after this comment, but preserve the hack and comment content
|
||||
$this->_inHack = false;
|
||||
|
||||
return "/*/{$n[1]}/**/";
|
||||
}
|
||||
}
|
||||
@@ -224,18 +225,21 @@ class Minify_CSS_Compressor
|
||||
if (substr($m, -1) === '\\') { // comment ends like \*/
|
||||
// begin hack mode and preserve hack
|
||||
$this->_inHack = true;
|
||||
|
||||
return '/*\\*/';
|
||||
}
|
||||
|
||||
if ($m !== '' && $m[0] === '/') { // comment looks like /*/ foo */
|
||||
// begin hack mode and preserve hack
|
||||
$this->_inHack = true;
|
||||
|
||||
return '/*/*/';
|
||||
}
|
||||
|
||||
if ($this->_inHack) {
|
||||
// a regular comment ends hack mode but should be preserved
|
||||
$this->_inHack = false;
|
||||
|
||||
return '/**/';
|
||||
}
|
||||
|
||||
@@ -255,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))) {
|
||||
|
@@ -52,7 +52,6 @@ class Minify_CSS_UriRewriter
|
||||
|
||||
// normalize symlinks in order to map to link
|
||||
foreach ($symlinks as $link => $target) {
|
||||
|
||||
$link = ($link === '//') ? self::$_docRoot : str_replace('//', self::$_docRoot . '/', $link);
|
||||
$link = strtr($link, '/', DIRECTORY_SEPARATOR);
|
||||
|
||||
@@ -272,6 +271,7 @@ class Minify_CSS_UriRewriter
|
||||
\\s*
|
||||
\\) # )
|
||||
/x';
|
||||
|
||||
return preg_replace($pattern, 'url($1)', $css);
|
||||
}
|
||||
|
||||
@@ -337,6 +337,7 @@ class Minify_CSS_UriRewriter
|
||||
private static function _owlifySvgPaths($css)
|
||||
{
|
||||
$pattern = '~\b((?:clip-path|mask|-webkit-mask)\s*\:\s*)url(\(\s*#\w+\s*\))~';
|
||||
|
||||
return preg_replace($pattern, '$1owl$2', $css);
|
||||
}
|
||||
|
||||
@@ -351,6 +352,7 @@ class Minify_CSS_UriRewriter
|
||||
private static function _unOwlify($css)
|
||||
{
|
||||
$pattern = '~\b((?:clip-path|mask|-webkit-mask)\s*\:\s*)owl~';
|
||||
|
||||
return preg_replace($pattern, '$1url', $css);
|
||||
}
|
||||
}
|
||||
|
@@ -4,6 +4,8 @@
|
||||
* @package Minify
|
||||
*/
|
||||
|
||||
use tubalmartin\CssMin\Minifier as CSSmin;
|
||||
|
||||
/**
|
||||
* Wrapper for CSSmin
|
||||
*
|
||||
@@ -71,16 +73,16 @@ class Minify_CSSmin
|
||||
}
|
||||
if ($options['currentDir']) {
|
||||
return Minify_CSS_UriRewriter::rewrite(
|
||||
$css
|
||||
,$options['currentDir']
|
||||
,$options['docRoot']
|
||||
,$options['symlinks']
|
||||
);
|
||||
} else {
|
||||
return Minify_CSS_UriRewriter::prepend(
|
||||
$css
|
||||
,$options['prependRelativePath']
|
||||
$css,
|
||||
$options['currentDir'],
|
||||
$options['docRoot'],
|
||||
$options['symlinks']
|
||||
);
|
||||
}
|
||||
|
||||
return Minify_CSS_UriRewriter::prepend(
|
||||
$css,
|
||||
$options['prependRelativePath']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,8 @@
|
||||
*
|
||||
* @package Minify
|
||||
* @author Chris Edwards
|
||||
*
|
||||
* @deprecated Use Minify_Cache_APCu
|
||||
**/
|
||||
class Minify_Cache_APC implements Minify_CacheInterface
|
||||
{
|
||||
@@ -62,7 +64,7 @@ class Minify_Cache_APC implements Minify_CacheInterface
|
||||
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
|
||||
return mb_strlen($this->_data, '8bit');
|
||||
} else {
|
||||
return strlen($this->_data);;
|
||||
return strlen($this->_data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,6 +126,7 @@ class Minify_Cache_APC implements Minify_CacheInterface
|
||||
$ret = apc_fetch($id);
|
||||
if (false === $ret) {
|
||||
$this->_id = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
136
lib/Minify/Cache/APCu.php
Normal file
136
lib/Minify/Cache/APCu.php
Normal 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;
|
||||
}
|
||||
}
|
@@ -109,6 +109,7 @@ class Minify_Cache_File implements Minify_CacheInterface
|
||||
{
|
||||
if (!$this->locking) {
|
||||
readfile($this->path . '/' . $id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -64,4 +64,4 @@ class Minify_Cache_Null implements Minify_CacheInterface
|
||||
public function fetch($id)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -136,4 +136,4 @@ class Minify_Cache_WinCache implements Minify_CacheInterface
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -38,14 +38,14 @@ class Minify_ClosureCompiler
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $jarFile = null;
|
||||
public static $jarFile;
|
||||
|
||||
/**
|
||||
* Writable temp directory. This must be set before calling minifyJs().
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $tempDir = null;
|
||||
public static $tempDir;
|
||||
|
||||
/**
|
||||
* Filepath of "java" executable (may be needed if not in shell's PATH)
|
||||
@@ -129,7 +129,7 @@ class Minify_ClosureCompiler
|
||||
$this->getOptionsCommandLine($userOptions)
|
||||
);
|
||||
|
||||
return join(' ', $args) . ' ' . escapeshellarg($tmpFile);
|
||||
return implode(' ', $args) . ' ' . escapeshellarg($tmpFile);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -68,4 +68,3 @@ class Minify_Controller_Files extends Minify_Controller_Base
|
||||
return new Minify_ServeConfiguration($options, $sources);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -48,7 +48,7 @@ class Minify_Controller_Groups extends Minify_Controller_Files
|
||||
if (isset($server['ORIG_PATH_INFO'])) {
|
||||
$pathInfo = substr($server['ORIG_PATH_INFO'], 1);
|
||||
} elseif (isset($server['PATH_INFO'])) {
|
||||
$pathInfo = substr($server['PATH_INFO'], 1)
|
||||
$pathInfo = substr($server['PATH_INFO'], 1);
|
||||
} else {
|
||||
$pathInfo = false;
|
||||
}
|
||||
@@ -73,4 +73,3 @@ class Minify_Controller_Groups extends Minify_Controller_Files
|
||||
return parent::createConfiguration($options);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -66,4 +66,3 @@ class Minify_Controller_Page extends Minify_Controller_Base
|
||||
return new Minify_ServeConfiguration($options, $sources, $selectionId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -19,4 +19,4 @@ interface Minify_ControllerInterface
|
||||
* @return Minify_Env
|
||||
*/
|
||||
public function getEnv();
|
||||
}
|
||||
}
|
||||
|
@@ -102,10 +102,10 @@ class Minify_Env
|
||||
return $path;
|
||||
}
|
||||
|
||||
protected $server = null;
|
||||
protected $get = null;
|
||||
protected $post = null;
|
||||
protected $cookie = null;
|
||||
protected $server;
|
||||
protected $get;
|
||||
protected $post;
|
||||
protected $cookie;
|
||||
|
||||
/**
|
||||
* Compute $_SERVER['DOCUMENT_ROOT'] for IIS using SCRIPT_FILENAME and SCRIPT_NAME.
|
||||
|
@@ -99,64 +99,67 @@ class Minify_HTML
|
||||
|
||||
// replace SCRIPTs (and minify) with placeholders
|
||||
$this->_html = preg_replace_callback(
|
||||
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
|
||||
,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*/i'
|
||||
,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]*?)-->/'
|
||||
,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*/i'
|
||||
,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*/i'
|
||||
,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.
|
||||
$this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);
|
||||
$this->_html = preg_replace('/^\\s+|\\s+$/mu', '', $this->_html);
|
||||
|
||||
// remove ws around block/undisplayed elements
|
||||
$this->_html = preg_replace('/\\s+(<\\/?(?:area|article|aside|base(?:font)?|blockquote|body'
|
||||
.'|canvas|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|figcaption|figure|footer|form'
|
||||
.'|frame(?:set)?|h[1-6]|head|header|hgroup|hr|html|legend|li|link|main|map|menu|meta|nav'
|
||||
.'|ol|opt(?:group|ion)|output|p|param|section|t(?:able|body|head|d|h||r|foot|itle)'
|
||||
.'|ul|video)\\b[^>]*>)/i', '$1', $this->_html);
|
||||
.'|ul|video)\\b[^>]*>)/iu', '$1', $this->_html);
|
||||
|
||||
// remove ws outside of all elements
|
||||
$this->_html = preg_replace(
|
||||
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</'
|
||||
,'>$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+([^>]+>)/i', "$1\n$2", $this->_html);
|
||||
$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 +167,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]
|
||||
: '';
|
||||
}
|
||||
@@ -177,11 +180,11 @@ class Minify_HTML
|
||||
return $placeholder;
|
||||
}
|
||||
|
||||
protected $_isXhtml = null;
|
||||
protected $_replacementHash = null;
|
||||
protected $_isXhtml;
|
||||
protected $_replacementHash;
|
||||
protected $_placeholders = array();
|
||||
protected $_cssMinifier = null;
|
||||
protected $_jsMinifier = null;
|
||||
protected $_cssMinifier;
|
||||
protected $_jsMinifier;
|
||||
|
||||
protected function _removePreCB($m)
|
||||
{
|
||||
@@ -198,7 +201,7 @@ class Minify_HTML
|
||||
$openStyle = "<style{$m[1]}";
|
||||
$css = $m[2];
|
||||
// remove HTML comments
|
||||
$css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
|
||||
$css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/u', '', $css);
|
||||
|
||||
// remove CDATA section markers
|
||||
$css = $this->_removeCdata($css);
|
||||
@@ -209,7 +212,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>"
|
||||
);
|
||||
@@ -226,7 +230,7 @@ class Minify_HTML
|
||||
|
||||
// remove HTML comments (and ending "//" if present)
|
||||
if ($this->_jsCleanComments) {
|
||||
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
|
||||
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/u', '', $js);
|
||||
}
|
||||
|
||||
// remove CDATA section markers
|
||||
@@ -238,7 +242,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}"
|
||||
);
|
||||
@@ -253,6 +258,6 @@ class Minify_HTML
|
||||
|
||||
protected function _needsCdata($str)
|
||||
{
|
||||
return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
|
||||
return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/u', $str));
|
||||
}
|
||||
}
|
||||
|
@@ -32,15 +32,15 @@ class Minify_ImportProcessor
|
||||
}
|
||||
|
||||
// allows callback funcs to know the current directory
|
||||
private $_currentDir = null;
|
||||
private $_currentDir;
|
||||
|
||||
// allows callback funcs to know the directory of the file that inherits this one
|
||||
private $_previewsDir = null;
|
||||
private $_previewsDir;
|
||||
|
||||
// allows _importCB to write the fetched content back to the obj
|
||||
private $_importedContent = '';
|
||||
|
||||
private static $_isCss = null;
|
||||
private static $_isCss;
|
||||
|
||||
/**
|
||||
* @param String $currentDir
|
||||
@@ -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 = (strlen($path) == 0) || ($path{0} != '/');
|
||||
$unipath = ('' === $path) || ($path[0] !== '/');
|
||||
|
||||
// attempts to detect if path is relative in which case, add cwd
|
||||
if (strpos($path, ':') === false && $unipath) {
|
||||
@@ -194,10 +194,10 @@ class Minify_ImportProcessor
|
||||
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
|
||||
$absolutes = array();
|
||||
foreach ($parts as $part) {
|
||||
if ('.' == $part) {
|
||||
if ('.' === $part) {
|
||||
continue;
|
||||
}
|
||||
if ('..' == $part) {
|
||||
if ('..' === $part) {
|
||||
array_pop($absolutes);
|
||||
} else {
|
||||
$absolutes[] = $part;
|
||||
|
@@ -54,7 +54,7 @@ class Minify_JS_ClosureCompiler
|
||||
/**
|
||||
* @var string $url URL of compiler server. defaults to Google's
|
||||
*/
|
||||
protected $serviceUrl = 'http://closure-compiler.appspot.com/compile';
|
||||
protected $serviceUrl = 'https://closure-compiler.appspot.com/compile';
|
||||
|
||||
/**
|
||||
* @var int $maxBytes The maximum JS size that can be sent to the compiler server in bytes
|
||||
@@ -174,6 +174,9 @@ class Minify_JS_ClosureCompiler
|
||||
$contents = file_get_contents($this->serviceUrl, false, stream_context_create(array(
|
||||
'http' => array(
|
||||
'method' => 'POST',
|
||||
'compilation_level' => 'SIMPLE',
|
||||
'output_format' => 'text',
|
||||
'output_info' => 'compiled_code',
|
||||
'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n",
|
||||
'content' => $postBody,
|
||||
'max_redirects' => 0,
|
||||
@@ -192,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"
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -49,7 +49,7 @@ class Minify_Lines
|
||||
$newLines = array();
|
||||
|
||||
while (null !== ($line = array_shift($lines))) {
|
||||
if (('' !== $id) && (0 == $i % 50)) {
|
||||
if (('' !== $id) && (0 === $i % 50)) {
|
||||
if ($inComment) {
|
||||
array_push($newLines, '', "/* {$id} *|", '');
|
||||
} else {
|
||||
|
@@ -63,7 +63,7 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
|
||||
$server = array(
|
||||
self::$javaExecutable,
|
||||
'-server',
|
||||
'-cp', join(':', $classPath),
|
||||
'-cp', implode(':', $classPath),
|
||||
self::NG_SERVER,
|
||||
);
|
||||
|
||||
@@ -101,13 +101,13 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
|
||||
|
||||
private function startServer()
|
||||
{
|
||||
$serverCommand = join(' ', $this->getServerCommandLine());
|
||||
$serverCommand = implode(' ', $this->getServerCommandLine());
|
||||
$psCommand = $this->shell("ps -o cmd= -C " . self::$javaExecutable);
|
||||
if (array_search($serverCommand, $psCommand) !== false) {
|
||||
if (in_array($serverCommand, $psCommand, true)) {
|
||||
// already started!
|
||||
return;
|
||||
}
|
||||
|
||||
$this->shell("$serverCommand </dev/null >/dev/null 2>/dev/null & sleep 10");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -19,12 +19,12 @@ class Minify_Source implements Minify_SourceInterface
|
||||
/**
|
||||
* @var int time of last modification
|
||||
*/
|
||||
protected $lastModified = null;
|
||||
protected $lastModified;
|
||||
|
||||
/**
|
||||
* @var callback minifier function specifically for this source.
|
||||
*/
|
||||
protected $minifier = null;
|
||||
protected $minifier;
|
||||
|
||||
/**
|
||||
* @var array minification options specific to this source.
|
||||
@@ -34,27 +34,27 @@ class Minify_Source implements Minify_SourceInterface
|
||||
/**
|
||||
* @var string full path of file
|
||||
*/
|
||||
protected $filepath = null;
|
||||
protected $filepath;
|
||||
|
||||
/**
|
||||
* @var string HTTP Content Type (Minify requires one of the constants Minify::TYPE_*)
|
||||
*/
|
||||
protected $contentType = null;
|
||||
protected $contentType;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $content = null;
|
||||
protected $content;
|
||||
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
protected $getContentFunc = null;
|
||||
protected $getContentFunc;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $id = null;
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* Create a Minify_Source
|
||||
@@ -137,7 +137,7 @@ class Minify_Source implements Minify_SourceInterface
|
||||
$minifier = 'Minify::nullMinifier';
|
||||
}
|
||||
if ($minifier !== null && !is_callable($minifier, true)) {
|
||||
throw new \InvalidArgumentException('minifier must be null or a valid callable');
|
||||
throw new InvalidArgumentException('minifier must be null or a valid callable');
|
||||
}
|
||||
$this->minifier = $minifier;
|
||||
}
|
||||
@@ -180,8 +180,13 @@ class Minify_Source implements Minify_SourceInterface
|
||||
} else {
|
||||
$content = file_get_contents($this->filepath);
|
||||
}
|
||||
|
||||
// remove UTF-8 BOM if present
|
||||
return ("\xEF\xBB\xBF" === substr($content, 0, 3)) ? substr($content, 3) : $content;
|
||||
if (strpos($content, "\xEF\xBB\xBF") === 0) {
|
||||
return substr($content, 3);
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -208,7 +213,6 @@ class Minify_Source implements Minify_SourceInterface
|
||||
if ($this->filepath
|
||||
&& !isset($this->minifyOptions['currentDir'])
|
||||
&& !isset($this->minifyOptions['prependRelativePath'])) {
|
||||
|
||||
$this->minifyOptions['currentDir'] = dirname($this->filepath);
|
||||
}
|
||||
}
|
||||
|
@@ -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';
|
||||
}
|
||||
|
@@ -38,7 +38,7 @@ class Minify_YUICompressor
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $jarFile = null;
|
||||
public static $jarFile;
|
||||
|
||||
/**
|
||||
* Writable temp directory. This must be set before calling minifyJs()
|
||||
@@ -46,7 +46,7 @@ class Minify_YUICompressor
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $tempDir = null;
|
||||
public static $tempDir;
|
||||
|
||||
/**
|
||||
* Filepath of "java" executable (may be needed if not in shell's PATH)
|
||||
@@ -154,4 +154,3 @@ class Minify_YUICompressor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -390,4 +390,3 @@ class Cli
|
||||
$this->errors[$letter][] = sprintf($msg, $value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -4,6 +4,6 @@
|
||||
|
||||
require __DIR__ . '/../config.php';
|
||||
|
||||
$minifyCachePath = isset($min_cachePath)
|
||||
? $min_cachePath
|
||||
$minifyCachePath = isset($min_cachePath)
|
||||
? $min_cachePath
|
||||
: '';
|
||||
|
@@ -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> :
|
||||
|
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -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}' />";
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!-- http://phpunit.de/manual/current/en/appendixes.configuration.html -->
|
||||
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
|
||||
<phpunit
|
||||
backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
@@ -10,7 +10,6 @@
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
bootstrap="vendor/autoload.php">
|
||||
|
||||
<testsuites>
|
||||
@@ -32,6 +31,7 @@
|
||||
<directory>.</directory>
|
||||
<exclude>
|
||||
<directory>tests</directory>
|
||||
<directory>vendor</directory>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
</filter>
|
||||
|
@@ -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";
|
||||
}
|
||||
|
@@ -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");
|
||||
|
@@ -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) {
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use HTTP_ConditionalGet;
|
||||
|
||||
class HTTPConditionalGetTest extends TestCase
|
||||
{
|
||||
public function TestData()
|
||||
@@ -123,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;
|
||||
}
|
||||
|
@@ -1,9 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use HTTP_Encoder;
|
||||
|
||||
class HTTPEncoderTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider testToIe6Data
|
||||
* @dataProvider ToIe6DataProvider
|
||||
* @preserveGlobals
|
||||
*/
|
||||
public function testToIe6($ua, $ae, $exp, $desc)
|
||||
@@ -16,7 +20,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$this->assertSame($exp, $ret, $desc);
|
||||
}
|
||||
|
||||
public function testToIe6Data()
|
||||
public function ToIe6DataProvider()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@@ -65,7 +69,7 @@ class HTTPEncoderTest extends TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider testEncodeNonIeData
|
||||
* @dataProvider EncodeNonIeDataProvider
|
||||
*/
|
||||
public function testEncodeNonIe($ua, $ae, $exp, $desc)
|
||||
{
|
||||
@@ -77,7 +81,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$this->assertSame($exp, $ret, $desc);
|
||||
}
|
||||
|
||||
public function testEncodeNonIeData()
|
||||
public function EncodeNonIeDataProvider()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@@ -104,7 +108,7 @@ class HTTPEncoderTest extends TestCase
|
||||
|
||||
$encodingTests = array(
|
||||
array('method' => 'deflate', 'inv' => 'gzinflate', 'exp' => 32268),
|
||||
array('method' => 'gzip', 'inv' => '_gzdecode', 'exp' => 32286),
|
||||
array('method' => 'gzip', 'inv' => __NAMESPACE__ . '\\_gzdecode', 'exp' => 32286),
|
||||
array('method' => 'compress', 'inv' => 'gzuncompress', 'exp' => 32325),
|
||||
);
|
||||
|
||||
@@ -117,7 +121,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$ret = $this->countBytes($e->getContent());
|
||||
|
||||
// test uncompression
|
||||
$roundTrip = @call_user_func($test['inv'], $e->getContent());
|
||||
$roundTrip = call_user_func($test['inv'], $e->getContent());
|
||||
$desc = "{$test['method']} : uncompress possible";
|
||||
$this->assertSame($variedContent, $roundTrip, $desc);
|
||||
|
||||
@@ -162,15 +166,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) {
|
||||
@@ -179,10 +183,10 @@ 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 = "";
|
||||
@@ -194,7 +198,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) {
|
||||
@@ -202,7 +206,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;
|
||||
@@ -215,14 +219,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;
|
||||
@@ -235,14 +239,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 = "";
|
||||
@@ -254,8 +258,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.";
|
||||
@@ -267,9 +271,9 @@ 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;
|
||||
@@ -280,13 +284,13 @@ 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);
|
||||
$data = gzinflate($body, $maxlength);
|
||||
break;
|
||||
default:
|
||||
$error = "Unknown compression method.";
|
||||
@@ -297,11 +301,11 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
||||
}
|
||||
} // 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;
|
||||
@@ -309,4 +313,4 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
||||
mb_internal_encoding($mbIntEnc);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
@@ -1,8 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use JSMin\JSMin;
|
||||
|
||||
class JsMinTest extends TestCase
|
||||
class JSMinTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
{
|
||||
@@ -54,7 +57,8 @@ class JsMinTest extends TestCase
|
||||
* @param string $label
|
||||
* @param string $expClass
|
||||
* @param string $expMessage
|
||||
* @dataProvider testJSMinExceptionData
|
||||
*
|
||||
* @dataProvider JSMinExceptionDataProvider
|
||||
*/
|
||||
public function testJSMinException($js, $label, $expClass, $expMessage)
|
||||
{
|
||||
@@ -68,7 +72,7 @@ class JsMinTest extends TestCase
|
||||
$this->assertTrue($eClass === $expClass && $eMsg === $expMessage, 'Throw on ' . $label);
|
||||
}
|
||||
|
||||
public function testJSMinExceptionData()
|
||||
public function JSMinExceptionDataProvider()
|
||||
{
|
||||
// $js, $label, $expClass, $expMessage
|
||||
return array(
|
||||
@@ -122,4 +126,4 @@ class JsMinTest extends TestCase
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,11 @@
|
||||
<?php
|
||||
|
||||
class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_JS_ClosureCompiler;
|
||||
use Minify_JS_ClosureCompiler_Exception;
|
||||
|
||||
class JsClosureCompilerTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
{
|
||||
@@ -27,7 +32,11 @@ class JsClosureCompilerTest extends PHPUnit_Framework_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)
|
||||
@@ -40,7 +49,11 @@ class JsClosureCompilerTest extends PHPUnit_Framework_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');
|
||||
@@ -69,7 +82,11 @@ class JsClosureCompilerTest extends PHPUnit_Framework_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');
|
||||
@@ -88,7 +105,11 @@ class JsClosureCompilerTest extends PHPUnit_Framework_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()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
|
||||
class LessSourceTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
@@ -35,4 +39,4 @@ class LessSourceTest extends TestCase
|
||||
|
||||
$this->assertEquals("/min/g=less&{$max}", $res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Build;
|
||||
use Minify_Source;
|
||||
|
||||
class MinifyBuildTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
@@ -20,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&{$maxTime}", 'uri() with existing querystring');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CSS_UriRewriter;
|
||||
|
||||
class MinifyCSSUriRewriterTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
@@ -12,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);
|
||||
@@ -43,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);
|
||||
|
@@ -1,11 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_APC;
|
||||
|
||||
class MinifyCacheAPCTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
if (!function_exists('apc_store')) {
|
||||
// FIXME: is APCu extension ok too?
|
||||
$this->markTestSkipped("To test this component, install APC extension");
|
||||
}
|
||||
}
|
||||
@@ -18,4 +21,4 @@ class MinifyCacheAPCTest extends TestCase
|
||||
$cache = new Minify_Cache_APC();
|
||||
$this->assertTestCache($cache, $id, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
25
tests/MinifyCacheAPCuTest.php
Normal file
25
tests/MinifyCacheAPCuTest.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_APCu;
|
||||
|
||||
class MinifyCacheAPCuTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_File;
|
||||
|
||||
class MinifyCacheFileTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Memcache;
|
||||
use Minify_Cache_Memcache;
|
||||
|
||||
class MinifyCacheMemcacheTest extends TestCase
|
||||
{
|
||||
/** @var Memcache */
|
||||
@@ -40,4 +45,3 @@ class MinifyCacheMemcacheTest extends TestCase
|
||||
$this->assertTestCache($cache, $id, $data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_WinCache;
|
||||
|
||||
class MinifyCacheWinCacheTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
@@ -17,4 +21,4 @@ class MinifyCacheWinCacheTest extends TestCase
|
||||
$cache = new Minify_Cache_WinCache();
|
||||
$this->assertTestCache($cache, $id, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_ZendPlatform;
|
||||
|
||||
class MinifyCacheZendPlatformTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
@@ -18,4 +22,4 @@ class MinifyCacheZendPlatformTest extends TestCase
|
||||
$cache = new Minify_Cache_ZendPlatform();
|
||||
$this->assertTestCache($cache, $id, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_ClosureCompiler;
|
||||
|
||||
class MinifyClosureCompilerTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CommentPreserver;
|
||||
|
||||
class MinifyCommentPreserverTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
@@ -27,4 +31,4 @@ class MinifyCommentPreserverTest extends TestCase
|
||||
++$callCount;
|
||||
return $callCount . strtoupper($content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
use Minify_Source;
|
||||
|
||||
class MinifyHTMLHelperTest extends TestCase
|
||||
{
|
||||
private $realDocRoot;
|
||||
@@ -40,8 +45,10 @@ class MinifyHTMLHelperTest extends TestCase
|
||||
$expected = "/myApp/min/?g=css&{$maxTime}";
|
||||
$actual = Minify_HTML_Helper::getUri('css', array(
|
||||
'rewriteWorks' => false
|
||||
, 'minAppUri' => '/myApp/min/'
|
||||
, 'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||
,
|
||||
'minAppUri' => '/myApp/min/'
|
||||
,
|
||||
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||
));
|
||||
$this->assertEquals($expected, $actual, 'existing group');
|
||||
|
||||
@@ -67,9 +74,10 @@ class MinifyHTMLHelperTest extends TestCase
|
||||
));
|
||||
$output = Minify_mtime(array(
|
||||
$obj
|
||||
, 'css'
|
||||
,
|
||||
'css'
|
||||
), self::$test_files . '/htmlHelper_groupsConfig.php');
|
||||
$this->assertEquals($maxTime, $output, 'utils.php : Minify_mtime w/ obj & group');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML;
|
||||
|
||||
class MinifyHTMLTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_ImportProcessor;
|
||||
|
||||
class MinifyImportProcessorTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
@@ -19,6 +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'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify;
|
||||
use Minify_Cache_Null;
|
||||
use Minify_Controller_Files;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
|
||||
class MinifyLinesTest extends TestCase
|
||||
{
|
||||
public function test_lines()
|
||||
|
@@ -1,5 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_ClosureCompiler;
|
||||
use Minify_NailgunClosureCompiler;
|
||||
|
||||
class MinifyNailgunClosureCompilerTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
@@ -48,4 +54,4 @@ class MinifyNailgunClosureCompilerTest extends TestCase
|
||||
$this->markTestSkipped($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify;
|
||||
use Minify_Cache_Null;
|
||||
use Minify_Controller_Files;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
|
||||
class MinifyTest extends TestCase
|
||||
{
|
||||
public function test_Minify()
|
||||
@@ -37,7 +45,6 @@ class MinifyTest extends TestCase
|
||||
'content' => '',
|
||||
'headers' => array(
|
||||
'Expires' => gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + 1800),
|
||||
'Vary' => 'Accept-Encoding',
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||
'ETag' => "\"pub{$lastModified}\"",
|
||||
'Cache-Control' => 'max-age=1800',
|
||||
@@ -55,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,
|
||||
@@ -146,7 +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)) {
|
||||
@@ -156,7 +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
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_YUICompressor;
|
||||
|
||||
class MinifyYuiCSSTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
@@ -13,7 +18,8 @@ class MinifyYuiCSSTest extends TestCase
|
||||
Minify_YUICompressor::$tempDir = sys_get_temp_dir();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp()
|
||||
{
|
||||
$this->assertHasJar();
|
||||
}
|
||||
|
||||
@@ -49,9 +55,9 @@ class MinifyYuiCSSTest extends TestCase
|
||||
{
|
||||
$this->assertNotEmpty(Minify_YUICompressor::$jarFile);
|
||||
try {
|
||||
$this->assertFileExists(Minify_YUICompressor::$jarFile , "Have YUI yuicompressor.jar");
|
||||
$this->assertFileExists(Minify_YUICompressor::$jarFile, "Have YUI yuicompressor.jar");
|
||||
} catch (Exception $e) {
|
||||
$this->markTestSkipped($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
|
||||
class ScssSourceTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
|
||||
$this->markTestSkipped('scssphp is not compatible with this PHP version.');
|
||||
}
|
||||
|
||||
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
||||
}
|
||||
@@ -39,4 +39,4 @@ class ScssSourceTest extends TestCase
|
||||
|
||||
$this->assertEquals("/min/g=scss&{$max}", $res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,10 @@
|
||||
<?php
|
||||
|
||||
class TestCase extends PHPUnit_Framework_TestCase
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CacheInterface;
|
||||
|
||||
abstract class TestCase extends \PHPUnit\Framework\TestCase
|
||||
{
|
||||
/** @var string */
|
||||
protected static $document_root;
|
||||
@@ -66,4 +70,4 @@ class TestCase extends PHPUnit_Framework_TestCase
|
||||
|
||||
return $contents;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -4,11 +4,16 @@ 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 < & */
|
||||
body{background:white}/*]]>*/</style><![endif]--><style type="text/css" title="currentStyle" media="screen">@import "/001/001.css";/*\*//**/css hack{display:none;display:none}</style><link
|
||||
body{background:#fff}/*]]>*/</style><![endif]--><style type="text/css" title="currentStyle" media="screen">@import "/001/001.css";css hack{display:none;display:none}</style><link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico" /><link
|
||||
|
@@ -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>
|
||||
|
@@ -4,11 +4,16 @@ 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 < & */
|
||||
body{background:white}</style><![endif]--><style type="text/css" title="currentStyle" media="screen">@import "/001/001.css";/*\*//**/css hack{display:none;display:none}</style><link
|
||||
body{background:#fff}</style><![endif]--><style type="text/css" title="currentStyle" media="screen">@import "/001/001.css";css hack{display:none;display:none}</style><link
|
||||
rel="Shortcut Icon"
|
||||
type="image/x-icon"
|
||||
href="http://www.csszengarden.com/favicon.ico"><link
|
||||
|
16
tests/dl-closure.sh
Executable file
16
tests/dl-closure.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
set -xe
|
||||
|
||||
: ${CLOSURE_VERSION:=20161024}
|
||||
|
||||
wget -c https://dl.google.com/closure-compiler/compiler-$CLOSURE_VERSION.zip -O vendor/compiler-$CLOSURE_VERSION.zip
|
||||
unzip -od vendor/closure-compiler vendor/compiler-$CLOSURE_VERSION.zip
|
||||
ln -sfn ../vendor/closure-compiler/closure-compiler-v$CLOSURE_VERSION.jar tests/compiler.jar
|
||||
|
||||
# test that version matches
|
||||
out=$(java -jar tests/compiler.jar --version)
|
||||
|
||||
version=$(echo "$out" | awk '/Version:/{print $NF}')
|
||||
version=${version#v}
|
||||
|
||||
test "$version" = "$CLOSURE_VERSION"
|
@@ -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
|
||||
*/
|
||||
|
Reference in New Issue
Block a user