UIAsset
5 years ago
UIAssetFetcher
5 years ago
UIAssetMerger
5 years ago
UIAsset.php
5 years ago
UIAssetCacheBuster.php
5 years ago
UIAssetCatalog.php
5 years ago
UIAssetCatalogSorter.php
5 years ago
UIAssetFetcher.php
5 years ago
UIAssetMerger.php
5 years ago
UIAssetMinifier.php
5 years ago
UIAssetMinifier.php
67 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Matomo - free/libre analytics platform |
| 4 | * |
| 5 | * @link https://matomo.org |
| 6 | * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later |
| 7 | * |
| 8 | * @method static \Piwik\AssetManager\UIAssetMinifier getInstance() |
| 9 | */ |
| 10 | namespace Piwik\AssetManager; |
| 11 | |
| 12 | use Exception; |
| 13 | use JShrink\Minifier; |
| 14 | use Piwik\Singleton; |
| 15 | |
| 16 | class UIAssetMinifier extends Singleton |
| 17 | { |
| 18 | const MINIFIED_JS_RATIO = 100; |
| 19 | |
| 20 | protected function __construct() |
| 21 | { |
| 22 | self::validateDependency(); |
| 23 | parent::__construct(); |
| 24 | } |
| 25 | |
| 26 | /** |
| 27 | * Indicates if the provided JavaScript content has already been minified or not. |
| 28 | * The heuristic is based on a custom ratio : (size of file) / (number of lines). |
| 29 | * The threshold (100) has been found empirically on existing files : |
| 30 | * - the ratio never exceeds 50 for non-minified content and |
| 31 | * - it never goes under 150 for minified content. |
| 32 | * |
| 33 | * @param string $content Contents of the JavaScript file |
| 34 | * @return boolean |
| 35 | */ |
| 36 | public function isMinifiedJs($content) |
| 37 | { |
| 38 | $lineCount = substr_count($content, "\n"); |
| 39 | |
| 40 | if ($lineCount == 0) { |
| 41 | return true; |
| 42 | } |
| 43 | |
| 44 | $contentSize = strlen($content); |
| 45 | |
| 46 | $ratio = $contentSize / $lineCount; |
| 47 | |
| 48 | return $ratio > self::MINIFIED_JS_RATIO; |
| 49 | } |
| 50 | |
| 51 | /** |
| 52 | * @param string $content |
| 53 | * @return string |
| 54 | */ |
| 55 | public function minifyJs($content) |
| 56 | { |
| 57 | return Minifier::minify($content); |
| 58 | } |
| 59 | |
| 60 | private static function validateDependency() |
| 61 | { |
| 62 | if (!class_exists("JShrink\\Minifier")) { |
| 63 | throw new Exception("JShrink could not be found, maybe you are using Matomo from git and need to update Composer. $ php composer.phar update"); |
| 64 | } |
| 65 | } |
| 66 | } |
| 67 |