From 719017deedba9b61667e4e8210e894bfcf6d7732 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Fri, 17 Jan 2025 12:53:58 +0100 Subject: [PATCH] wait #7250 @1 --- framework/application/configs/application.ini | 4 +- .../library/CubeIT/Util/Css/Compressor.php | 731 +++++++++--------- less/recognition.less | 13 +- 3 files changed, 387 insertions(+), 361 deletions(-) diff --git a/framework/application/configs/application.ini b/framework/application/configs/application.ini index b4f7ccd..71645b0 100644 --- a/framework/application/configs/application.ini +++ b/framework/application/configs/application.ini @@ -64,5 +64,5 @@ locales.fr = fr.bloomsburie.dev2.cubedesigners.com seo.robots = false -httpauth.username=bloomsburie -httpauth.password=training2025 \ No newline at end of file +httpauth.username = bloomsburie +httpauth.password = training2025 \ No newline at end of file diff --git a/framework/library/CubeIT/Util/Css/Compressor.php b/framework/library/CubeIT/Util/Css/Compressor.php index b54074d..bec38e2 100644 --- a/framework/library/CubeIT/Util/Css/Compressor.php +++ b/framework/library/CubeIT/Util/Css/Compressor.php @@ -1,362 +1,377 @@ _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; + } } diff --git a/less/recognition.less b/less/recognition.less index 4fccbd7..d6680b9 100644 --- a/less/recognition.less +++ b/less/recognition.less @@ -21,7 +21,7 @@ h3 { padding-top: 2em; padding-bottom: 1em; - &:nth-child(even){ + &:nth-child(even) { background-color: @grey; } @@ -40,5 +40,16 @@ h3 { } + } +} + +.title { + .dotclear { + .images { + img { + max-width: 100%; + height: auto; + } + } } } \ No newline at end of file -- 2.39.5