<?php
-class CubeIT_Util_Css_Compressor {
-
- /**
- *
- * @var Sabberworm\CSS\CSSList\Document
- */
- protected $_currentDoc;
-
- /**
- *
- * @var Sabberworm\CSS\Rule\Rule
- */
- protected $_currentRule;
-
- /**
- *
- * @var Sabberworm\CSS\Ruleset\DeclarationBlock
- */
- protected $_currentRuleset;
-
- /**
- *
- * @var boolean
- */
- protected $_pie;
-
- public function __construct() {
- CubeIT_Util_PHP::neverStop();
- CubeIT_Library::CSSParser();
- $this->_pie = Bootstrap::getInstance()->getOpt('head.pie', false);
- }
-
- public function process($_files) {
- $files = array();
- $hash = '';
- foreach ($_files as $c) {
- $f = PUBLIC_PATH . '/' . trim($c, "/");
- if (!file_exists($f)) {
- continue;
- }
- $files[] = $f;
- $hash .= $f;
- }
-
- if (!count($files)) {
- return;
- }
-
- $furl = '/css/min/' . substr(sha1($hash), 0, 8) . '.css';
- $final = PUBLIC_PATH . $furl;
-
- if (file_exists($final)) {
- $reload = false;
- $finalmtime = filemtime($final);
- foreach ($files as $f) {
- if (filemtime($f) > $finalmtime) {
- $reload = true;
- break;
- }
- }
- } else {
- $reload = true;
- }
-
- if (!$reload && filemtime(__FILE__) > $finalmtime) {
- $reload = true;
- }
-
- if ($reload) {
- $css = '';
- $d = dirname($final);
- $fdir = realpath($d);
- if (!file_exists($d)) {
- mkdir($d, 0777, true);
- }
- foreach ($files as $f) {
- $css .= $this->_processCSS($f, $fdir) . "\n";
- }
-
- file_put_contents($final, $css);
-
- $finalmtime = time();
- }
-
- return $furl;
- }
-
- protected function _processCSS($file, $finalDir) {
- $dir = realpath(dirname($file));
-
- $content = file_get_contents($file);
-
- $cacheId = 'css_compressor_' . sha1($content) . '_' . filemtime(__FILE__) . '_' . $this->_pie;
- $cache = Bootstrap::getInstance()->getCoreCache();
-
- if (($res = $cache->load($cacheId)) === false) {
-
- $parser = new Sabberworm\CSS\Parser($content);
- $this->_currentDoc = $parser->parse();
-
- $pie = array('border-radius', 'box-shadow');
-
- foreach ($this->_currentDoc->getAllDeclarationBlocks() as $ruleset) {
- /* @var $ruleset Sabberworm\CSS\Ruleset\DeclarationBlock */
- $this->_currentRuleset = $ruleset;
- $addpie = false;
-
- foreach ($ruleset->getRules() as $rule) {
- /* @var $rule Sabberworm\CSS\Rule\Rule */
- $this->_correctURL($rule, $dir, $finalDir);
- $this->_html5Rule($rule, $ruleset);
-
- if ($this->_pie) {
- if (in_array($rule->getRule(), $pie)) {
- $addpie = true;
- }
- }
- }
-
- if ($addpie) {
- $r = new Sabberworm\CSS\Rule\Rule('behavior');
- $r->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString('/CubeIT/js/pie/PIE.htc')));
- $ruleset->addRule($r);
- }
- }
- $res = $this->_currentDoc;
- $cache->save($res->render(), $cacheId, array('css'));
- }
- return $res;
- }
-
- /**
- *
- * @param Sabberworm\CSS\Rule\Rule $rule
- * @param Sabberworm\CSS\RuleSet\RuleSet $ruleset
- */
- protected function _html5Rule($rule, $ruleset) {
- $html5 = array('outline-radius', 'border-radius', 'box-shadow', 'text-shadow', 'box-sizing', 'user-select', 'touch-callout', 'transform', 'transition', 'appearance', 'filter');
-
- $prefixs = array('moz', 'webkit', 'o', 'ms', 'khtml');
- $rulename = $rule->getRule();
- if ($rulename == 'background-image') {
- return $this->_fixGradients($rule, $ruleset);
- } else if ($rulename == 'background-size') {
- $r = new Sabberworm\CSS\Rule\Rule('behavior');
- $r->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString('/CubeIT/js/ie/backgroundsize.htc')));
- if ($this->_pie) {
- $ruleset->addRule($r);
- }
- }
- if (in_array($rulename, $html5)) {
- $ruleset->removeRule($rule);
- foreach ($prefixs as $p) {
- $clone = $this->_cloneRule($rule);
- $clone->setRule('-' . $p . '-' . $rulename);
- $ruleset->addRule($clone);
- }
- $ruleset->addRule($rule);
- }
- }
-
- /**
- *
- * @param Sabberworm\CSS\Rule\Rule $rule
- * @param Sabberworm\CSS\RuleSet\RuleSet $ruleset
- */
- protected function _fixGradients($rule, $ruleset) {
- $value = $rule->getValue();
-
- /* @var $liste Sabberworm\CSS\Value\RuleValueList */
- if (!($value instanceof Sabberworm\CSS\Value\RuleValueList)) {
- $liste = new Sabberworm\CSS\Value\RuleValueList();
- $liste->addListComponent($value);
- } else {
- $liste = $value;
- }
-
- $rule->setValue($liste);
-
- $count = count($liste->getListComponents());
- $gradients = array();
-
- foreach ($liste->getListComponents() as $i => $v) {
- if ($v instanceof Sabberworm\CSS\Value\CSSFunction) {
- /* @var $v Sabberworm\CSS\Value\CSSFunction */
- $fname = $v->getName();
- if ($fname == 'linear-gradient') {
- $gradients[$i] = new CubeIT_Util_Css_Gradient_Linear($v);
- } else if ($fname == 'radial-gradient') {
- //$gradients[$i] = new CubeIT_Util_Css_Gradient_Radial($v);
- }
- }
- }
-
-
- if (!count($gradients)) {
- return;
- }
-
- $clones = array(
- 'ie8' => $this->_cloneRule($rule),
- 'ie9' => $this->_cloneRule($rule),
- 'mozilla' => $this->_cloneRule($rule),
- 'webkit' => $this->_cloneRule($rule),
- 'opera' => $this->_cloneRule($rule),
- 'w3c' => $rule,
- );
-
- foreach ($clones as $nav => $c) {
- /* @var $v Sabberworm\CSS\Value\RuleValueList */
- $v = $c->getValue()->getListComponents();
- $l = new Sabberworm\CSS\Value\RuleValueList();
- $components = array();
- for ($i = 0; $i < $count; $i++) {
- if (isset($gradients[$i])) {
- $func = 'get' . ucfirst($nav);
- $components[$i] = $gradients[$i]->$func();
- } else {
- $components[$i] = $v[$i];
- }
- }
- $l->setListComponents($components);
-
- $c->setValue($l);
- $ruleset->addRule($c);
- }
- }
-
- /**
- *
- * @param Sabberworm\CSS\Rule\Rule $rule
- * @return Sabberworm\CSS\Rule\Rule
- */
- protected function _cloneRule($rule) {
- return CubeIT_Util_Object::cloneObject($rule);
- }
-
- /**
- *
- * @param Sabberworm\CSS\RuleSet\DeclarationBlock $ruleset
- * @param Boolean $withRules
- * @return Sabberworm\CSS\RuleSet\DeclarationBlock Description
- */
- protected function _cloneDeclarationBlock($ruleset, $withRules = true) {
- $ruleset = unserialize(serialize($ruleset));
- if (!$withRules) {
- foreach ($ruleset->getRulesAssoc() as $rule) {
- $ruleset->removeRule($rule);
- }
- }
- return $ruleset;
- }
-
- protected function _correctURL($e, $odir, $fdir) {
-
- if ($e instanceof Sabberworm\CSS\Rule\Rule) {
- $this->_currentRule = $e;
- $this->_correctURL($e->getValue(), $odir, $fdir);
- } else if ($e instanceof Sabberworm\CSS\Value\ValueList) {
- foreach ($e->getListComponents() as $c) {
- $this->_correctURL($c, $odir, $fdir);
- }
- } else if ($e instanceof Sabberworm\CSS\Value\URL) {
- /* @var $e Sabberworm\CSS\Value\URL */
- $url = trim($e->getURL(), '"\'');
- $absolute = $this->_isAbsolute($url);
- $local = $this->_isLocal($url);
-
- if ($absolute && !$local) {
- return;
- }
-
- $o = explode(DIRECTORY_SEPARATOR, $odir);
- $f = explode(DIRECTORY_SEPARATOR, $fdir);
- $l = min(count($o), count($f));
-
- for ($i = 0; $i < $l; $i++) {
- if ($o[$i] != $f[$i]) {
- break;
- }
- }
-
- $o = array_slice($o, $i);
- $f = array_slice($f, $i);
- $backs = count($f);
-
- if ($absolute && $local) {
- $url = str_repeat('../', $backs) . ltrim($url, '/');
- }
-
- $o = array_reverse($o);
- $u = explode('/', $url);
-
- foreach ($o as $p) {
- array_unshift($u, $p);
- }
- for ($i = 0; $i < $backs; $i++) {
- array_unshift($u, '..');
- }
-
- $url = implode('/', $u);
-
- $svg = $this->_checkSVG($url);
-
- if (!$svg && $absolute) {
- return;
- }
- $e->setURL(new Sabberworm\CSS\Value\CSSString($url));
- }
- }
-
- protected function _checkSVG($url) {
- if (!stristr($url, '.svg')) {
- return false;
- }
-
- $file = PUBLIC_PATH . '/css/min/' . $url;
-
- $raster = CubeIT_Image_SVG::rasterize($file);
-
- $url = '../..' . $raster['url'];
-
- $rule = $this->_cloneRule($this->_currentRule);
- $rule->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString($url)));
-
- $ruleset = $this->_cloneDeclarationBlock($this->_currentRuleset, false);
- $ruleset->addRule($rule);
-
- $selectors = $ruleset->getSelectors();
- $newSelectors = array();
- foreach ($selectors as $s) {
- $newSelectors[] = '.no-svg ' . $s;
- }
- $ruleset->setSelectors($newSelectors);
-
- $this->_currentDoc->append($ruleset);
- return true;
- }
-
- protected function _isAbsolute($url) {
- $e = parse_url($url);
- if (isset($e['scheme'])) {
- return true;
- }
- if (substr($e['path'], 0, 1) == '/') {
- return true;
- }
-
- return false;
- }
-
- protected function _isLocal($url) {
- $e = parse_url($url);
- if (isset($e['scheme'])) {
- return false;
- }
- return true;
- }
+class CubeIT_Util_Css_Compressor
+{
+
+ /**
+ *
+ * @var Sabberworm\CSS\CSSList\Document
+ */
+ protected $_currentDoc;
+
+ /**
+ *
+ * @var Sabberworm\CSS\Rule\Rule
+ */
+ protected $_currentRule;
+
+ /**
+ *
+ * @var Sabberworm\CSS\Ruleset\DeclarationBlock
+ */
+ protected $_currentRuleset;
+
+ /**
+ *
+ * @var boolean
+ */
+ protected $_pie;
+
+ public function __construct()
+ {
+ CubeIT_Util_PHP::neverStop();
+ CubeIT_Library::CSSParser();
+ $this->_pie = Bootstrap::getInstance()->getOpt('head.pie', false);
+ }
+
+ public function process($_files)
+ {
+ $files = array();
+ $hash = '';
+ foreach ($_files as $c) {
+ $f = PUBLIC_PATH . '/' . trim($c, "/");
+ if (!file_exists($f)) {
+ continue;
+ }
+ $files[] = $f;
+ $hash .= $f;
+ }
+
+ if (!count($files)) {
+ return;
+ }
+
+ $furl = '/css/min/' . substr(sha1($hash), 0, 8) . '.css';
+ $final = PUBLIC_PATH . $furl;
+
+ if (file_exists($final)) {
+ $reload = false;
+ $finalmtime = filemtime($final);
+ foreach ($files as $f) {
+ if (filemtime($f) > $finalmtime) {
+ $reload = true;
+ break;
+ }
+ }
+ } else {
+ $reload = true;
+ }
+
+ if (!$reload && filemtime(__FILE__) > $finalmtime) {
+ $reload = true;
+ }
+
+ if ($reload) {
+ $css = '';
+ $d = dirname($final);
+ $fdir = realpath($d);
+ if (!file_exists($d)) {
+ mkdir($d, 0777, true);
+ }
+ foreach ($files as $f) {
+ $css .= $this->_processCSS($f, $fdir) . "\n";
+ }
+ $css = str_replace("/application/css", "/css", $css);
+ $css = str_replace("application/css", "/css", $css);
+ $css = str_replace("/css/images/", "/images/", $css);
+ file_put_contents($final, $css);
+
+
+ $finalmtime = time();
+ }
+
+ return $furl;
+ }
+
+ protected function _processCSS($file, $finalDir)
+ {
+ $dir = realpath(dirname($file));
+
+ $content = file_get_contents($file);
+
+ $cacheId = 'css_compressor_' . sha1($content) . '_' . filemtime(__FILE__) . '_' . $this->_pie;
+ $cache = Bootstrap::getInstance()->getCoreCache();
+
+ if (($res = $cache->load($cacheId)) === false) {
+
+ $parser = new Sabberworm\CSS\Parser($content);
+ $this->_currentDoc = $parser->parse();
+
+ $pie = array('border-radius', 'box-shadow');
+
+ foreach ($this->_currentDoc->getAllDeclarationBlocks() as $ruleset) {
+ /* @var $ruleset Sabberworm\CSS\Ruleset\DeclarationBlock */
+ $this->_currentRuleset = $ruleset;
+ $addpie = false;
+
+ foreach ($ruleset->getRules() as $rule) {
+ /* @var $rule Sabberworm\CSS\Rule\Rule */
+ $this->_correctURL($rule, $dir, $finalDir);
+ $this->_html5Rule($rule, $ruleset);
+
+ if ($this->_pie) {
+ if (in_array($rule->getRule(), $pie)) {
+ $addpie = true;
+ }
+ }
+ }
+
+ if ($addpie) {
+ $r = new Sabberworm\CSS\Rule\Rule('behavior');
+ $r->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString('/CubeIT/js/pie/PIE.htc')));
+ $ruleset->addRule($r);
+ }
+ }
+ $res = $this->_currentDoc;
+ $cache->save($res->render(), $cacheId, array('css'));
+ }
+ return $res;
+ }
+
+ /**
+ *
+ * @param Sabberworm\CSS\Rule\Rule $rule
+ * @param Sabberworm\CSS\RuleSet\RuleSet $ruleset
+ */
+ protected function _html5Rule($rule, $ruleset)
+ {
+ $html5 = array('outline-radius', 'border-radius', 'box-shadow', 'text-shadow', 'box-sizing', 'user-select', 'touch-callout', 'transform', 'transition', 'appearance', 'filter');
+
+ $prefixs = array('moz', 'webkit', 'o', 'ms', 'khtml');
+ $rulename = $rule->getRule();
+ if ($rulename == 'background-image') {
+ return $this->_fixGradients($rule, $ruleset);
+ } else if ($rulename == 'background-size') {
+ $r = new Sabberworm\CSS\Rule\Rule('behavior');
+ $r->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString('/CubeIT/js/ie/backgroundsize.htc')));
+ if ($this->_pie) {
+ $ruleset->addRule($r);
+ }
+ }
+ if (in_array($rulename, $html5)) {
+ $ruleset->removeRule($rule);
+ foreach ($prefixs as $p) {
+ $clone = $this->_cloneRule($rule);
+ $clone->setRule('-' . $p . '-' . $rulename);
+ $ruleset->addRule($clone);
+ }
+ $ruleset->addRule($rule);
+ }
+ }
+
+ /**
+ *
+ * @param Sabberworm\CSS\Rule\Rule $rule
+ * @param Sabberworm\CSS\RuleSet\RuleSet $ruleset
+ */
+ protected function _fixGradients($rule, $ruleset)
+ {
+ $value = $rule->getValue();
+
+ /* @var $liste Sabberworm\CSS\Value\RuleValueList */
+ if (!($value instanceof Sabberworm\CSS\Value\RuleValueList)) {
+ $liste = new Sabberworm\CSS\Value\RuleValueList();
+ $liste->addListComponent($value);
+ } else {
+ $liste = $value;
+ }
+
+ $rule->setValue($liste);
+
+ $count = count($liste->getListComponents());
+ $gradients = array();
+
+ foreach ($liste->getListComponents() as $i => $v) {
+ if ($v instanceof Sabberworm\CSS\Value\CSSFunction) {
+ /* @var $v Sabberworm\CSS\Value\CSSFunction */
+ $fname = $v->getName();
+ if ($fname == 'linear-gradient') {
+ $gradients[$i] = new CubeIT_Util_Css_Gradient_Linear($v);
+ } else if ($fname == 'radial-gradient') {
+ //$gradients[$i] = new CubeIT_Util_Css_Gradient_Radial($v);
+ }
+ }
+ }
+
+
+ if (!count($gradients)) {
+ return;
+ }
+
+ $clones = array(
+ 'ie8' => $this->_cloneRule($rule),
+ 'ie9' => $this->_cloneRule($rule),
+ 'mozilla' => $this->_cloneRule($rule),
+ 'webkit' => $this->_cloneRule($rule),
+ 'opera' => $this->_cloneRule($rule),
+ 'w3c' => $rule,
+ );
+
+ foreach ($clones as $nav => $c) {
+ /* @var $v Sabberworm\CSS\Value\RuleValueList */
+ $v = $c->getValue()->getListComponents();
+ $l = new Sabberworm\CSS\Value\RuleValueList();
+ $components = array();
+ for ($i = 0; $i < $count; $i++) {
+ if (isset($gradients[$i])) {
+ $func = 'get' . ucfirst($nav);
+ $components[$i] = $gradients[$i]->$func();
+ } else {
+ $components[$i] = $v[$i];
+ }
+ }
+ $l->setListComponents($components);
+
+ $c->setValue($l);
+ $ruleset->addRule($c);
+ }
+ }
+
+ /**
+ *
+ * @param Sabberworm\CSS\Rule\Rule $rule
+ * @return Sabberworm\CSS\Rule\Rule
+ */
+ protected function _cloneRule($rule)
+ {
+ return CubeIT_Util_Object::cloneObject($rule);
+ }
+
+ /**
+ *
+ * @param Sabberworm\CSS\RuleSet\DeclarationBlock $ruleset
+ * @param Boolean $withRules
+ * @return Sabberworm\CSS\RuleSet\DeclarationBlock Description
+ */
+ protected function _cloneDeclarationBlock($ruleset, $withRules = true)
+ {
+ $ruleset = unserialize(serialize($ruleset));
+ if (!$withRules) {
+ foreach ($ruleset->getRulesAssoc() as $rule) {
+ $ruleset->removeRule($rule);
+ }
+ }
+ return $ruleset;
+ }
+
+ protected function _correctURL($e, $odir, $fdir)
+ {
+
+ if ($e instanceof Sabberworm\CSS\Rule\Rule) {
+ $this->_currentRule = $e;
+ $this->_correctURL($e->getValue(), $odir, $fdir);
+ } else if ($e instanceof Sabberworm\CSS\Value\ValueList) {
+ foreach ($e->getListComponents() as $c) {
+ $this->_correctURL($c, $odir, $fdir);
+ }
+ } else if ($e instanceof Sabberworm\CSS\Value\URL) {
+ /* @var $e Sabberworm\CSS\Value\URL */
+ $url = trim($e->getURL(), '"\'');
+ $absolute = $this->_isAbsolute($url);
+ $local = $this->_isLocal($url);
+
+ if ($absolute && !$local) {
+ return;
+ }
+
+ $o = explode(DIRECTORY_SEPARATOR, $odir);
+ $f = explode(DIRECTORY_SEPARATOR, $fdir);
+ $l = min(count($o), count($f));
+
+ for ($i = 0; $i < $l; $i++) {
+ if ($o[$i] != $f[$i]) {
+ break;
+ }
+ }
+
+ $o = array_slice($o, $i);
+ $f = array_slice($f, $i);
+ $backs = count($f);
+
+ if ($absolute && $local) {
+ $url = str_repeat('../', $backs) . ltrim($url, '/');
+ }
+
+ $o = array_reverse($o);
+ $u = explode('/', $url);
+
+ foreach ($o as $p) {
+ array_unshift($u, $p);
+ }
+ for ($i = 0; $i < $backs; $i++) {
+ array_unshift($u, '..');
+ }
+
+ $url = implode('/', $u);
+
+ $svg = $this->_checkSVG($url);
+
+ if (!$svg && $absolute) {
+ return;
+ }
+ $e->setURL(new Sabberworm\CSS\Value\CSSString($url));
+ }
+ }
+
+ protected function _checkSVG($url)
+ {
+ if (!stristr($url, '.svg')) {
+ return false;
+ }
+
+ $file = PUBLIC_PATH . '/css/min/' . $url;
+
+ $raster = CubeIT_Image_SVG::rasterize($file);
+
+ $url = '../..' . $raster['url'];
+
+ $rule = $this->_cloneRule($this->_currentRule);
+ $rule->setValue(new Sabberworm\CSS\Value\URL(new Sabberworm\CSS\Value\CSSString($url)));
+
+ $ruleset = $this->_cloneDeclarationBlock($this->_currentRuleset, false);
+ $ruleset->addRule($rule);
+
+ $selectors = $ruleset->getSelectors();
+ $newSelectors = array();
+ foreach ($selectors as $s) {
+ $newSelectors[] = '.no-svg ' . $s;
+ }
+ $ruleset->setSelectors($newSelectors);
+
+ $this->_currentDoc->append($ruleset);
+ return true;
+ }
+
+ protected function _isAbsolute($url)
+ {
+ $e = parse_url($url);
+ if (isset($e['scheme'])) {
+ return true;
+ }
+ if (substr($e['path'], 0, 1) == '/') {
+ return true;
+ }
+
+ return false;
+ }
+
+ protected function _isLocal($url)
+ {
+ $e = parse_url($url);
+ if (isset($e['scheme'])) {
+ return false;
+ }
+ return true;
+ }
}