mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-26 21:49:08 +01:00
Summary: If `jsxmin` is not available, use a pure PHP implementation instead (JsShrink). Test Plan: - Ran `arc lint --lintall` on all JS and fixed every relevant warning. - Forced minification on and browsed around the site using JS behaviors. Didn't hit anything problematic. Reviewers: vrana, btrahan Reviewed By: vrana CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D5670
122 lines
3.2 KiB
PHP
122 lines
3.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group celerity
|
|
*/
|
|
final class CelerityResourceTransformer {
|
|
|
|
private $minify;
|
|
private $rawResourceMap;
|
|
private $celerityMap;
|
|
private $translateURICallback;
|
|
|
|
public function setTranslateURICallback($translate_uricallback) {
|
|
$this->translateURICallback = $translate_uricallback;
|
|
return $this;
|
|
}
|
|
|
|
public function setMinify($minify) {
|
|
$this->minify = $minify;
|
|
return $this;
|
|
}
|
|
|
|
public function setRawResourceMap(array $raw_resource_map) {
|
|
$this->rawResourceMap = $raw_resource_map;
|
|
return $this;
|
|
}
|
|
|
|
public function setCelerityMap(CelerityResourceMap $celerity_map) {
|
|
$this->celerityMap = $celerity_map;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @phutil-external-symbol function jsShrink
|
|
*/
|
|
public function transformResource($path, $data) {
|
|
$type = self::getResourceType($path);
|
|
|
|
switch ($type) {
|
|
case 'css':
|
|
$data = preg_replace_callback(
|
|
'@url\s*\((\s*[\'"]?.*?)\)@s',
|
|
nonempty(
|
|
$this->translateURICallback,
|
|
array($this, 'translateResourceURI')),
|
|
$data);
|
|
break;
|
|
}
|
|
|
|
if (!$this->minify) {
|
|
return $data;
|
|
}
|
|
|
|
// Some resources won't survive minification (like Raphael.js), and are
|
|
// marked so as not to be minified.
|
|
if (strpos($data, '@'.'do-not-minify') !== false) {
|
|
return $data;
|
|
}
|
|
|
|
switch ($type) {
|
|
case 'css':
|
|
// Remove comments.
|
|
$data = preg_replace('@/\*.*?\*/@s', '', $data);
|
|
// Remove whitespace around symbols.
|
|
$data = preg_replace('@\s*([{}:;,])\s*@', '\1', $data);
|
|
// Remove unnecessary semicolons.
|
|
$data = preg_replace('@;}@', '}', $data);
|
|
// Replace #rrggbb with #rgb when possible.
|
|
$data = preg_replace(
|
|
'@#([a-f0-9])\1([a-f0-9])\2([a-f0-9])\3@i',
|
|
'#\1\2\3',
|
|
$data);
|
|
$data = trim($data);
|
|
break;
|
|
case 'js':
|
|
|
|
// If `jsxmin` is available, use it. jsxmin is the Javelin minifier and
|
|
// produces the smallest output, but is complicated to build.
|
|
if (Filesystem::binaryExists('jsxmin')) {
|
|
$future = new ExecFuture('jsxmin __DEV__:0');
|
|
$future->write($data);
|
|
list($err, $result) = $future->resolve();
|
|
if (!$err) {
|
|
$data = $result;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// If `jsxmin` is not available, use `JsShrink`, which doesn't compress
|
|
// quite as well but is always available.
|
|
$root = dirname(phutil_get_library_root('phabricator'));
|
|
require_once $root.'/externals/JsShrink/jsShrink.php';
|
|
$data = jsShrink($data);
|
|
|
|
break;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
public static function getResourceType($path) {
|
|
return last(explode('.', $path));
|
|
}
|
|
|
|
public function translateResourceURI(array $matches) {
|
|
$uri = trim($matches[1], "'\" \r\t\n");
|
|
|
|
if ($this->rawResourceMap) {
|
|
if (isset($this->rawResourceMap[$uri]['uri'])) {
|
|
$uri = $this->rawResourceMap[$uri]['uri'];
|
|
}
|
|
} else if ($this->celerityMap) {
|
|
$info = $this->celerityMap->lookupFileInformation($uri);
|
|
if ($info) {
|
|
$uri = $info['uri'];
|
|
}
|
|
}
|
|
|
|
return 'url('.$uri.')';
|
|
}
|
|
|
|
}
|