コード例 #1
0
ファイル: CssMin.php プロジェクト: sasha-adm-in/project
 public function apply(array &$tokens)
 {
     if (!isset($this->configuration["BasePath"]) || !is_dir($this->configuration["BasePath"])) {
         CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Base path <code>" . ($this->configuration["BasePath"] ? $this->configuration["BasePath"] : "null") . "</code> is not a directory"));
         return 0;
     }
     for ($i = 0, $l = count($tokens); $i < $l; $i++) {
         if (get_class($tokens[$i]) === "CssAtImportToken") {
             $import = $this->configuration["BasePath"] . "/" . $tokens[$i]->Import;
             if (!is_file($import)) {
                 CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import . "</code> was not found.", (string) $tokens[$i]));
             } elseif (in_array($import, $this->imported)) {
                 CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import . "</code> was already imported.", (string) $tokens[$i]));
                 $tokens[$i] = null;
             } else {
                 $this->imported[] = $import;
                 $parser = new CssParser(file_get_contents($import));
                 $import = $parser->getTokens();
                 if (count($tokens[$i]->MediaTypes) > 0 && !(count($tokens[$i]->MediaTypes) == 1 && $tokens[$i]->MediaTypes[0] == "all")) {
                     $blocks = array();
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtImportToken") {
                             if (count($import[$ii]->MediaTypes) == 0 || count($import[$ii]->MediaTypes) == 1 && $import[$ii]->MediaTypes[0] == "all") {
                                 $import[$ii]->MediaTypes = $tokens[$i]->MediaTypes;
                             } elseif (count($import[$ii]->MediaTypes > 0)) {
                                 foreach ($import[$ii]->MediaTypes as $index => $mediaType) {
                                     if (!in_array($mediaType, $tokens[$i]->MediaTypes)) {
                                         unset($import[$ii]->MediaTypes[$index]);
                                     }
                                 }
                                 $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes);
                                 if (count($import[$ii]->MediaTypes) == 0) {
                                     $import[$ii] = null;
                                 }
                             }
                         }
                     }
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken") {
                             foreach ($import[$ii]->MediaTypes as $index => $mediaType) {
                                 if (!in_array($mediaType, $tokens[$i]->MediaTypes)) {
                                     unset($import[$ii]->MediaTypes[$index]);
                                 }
                                 $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes);
                             }
                         }
                     }
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken") {
                             if (count($import[$ii]->MediaTypes) === 0) {
                                 for ($iii = $ii; $iii < $ll; $iii++) {
                                     if (get_class($import[$iii]) === "CssAtMediaEndToken") {
                                         break;
                                     }
                                 }
                                 if (get_class($import[$iii]) === "CssAtMediaEndToken") {
                                     array_splice($import, $ii, $iii - $ii + 1, array());
                                     $ll = count($import);
                                 }
                             }
                         }
                     }
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken" && count(array_diff($tokens[$i]->MediaTypes, $import[$ii]->MediaTypes)) === 0) {
                             for ($iii = $ii; $iii < $ll; $iii++) {
                                 if (get_class($import[$iii]) == "CssAtMediaEndToken") {
                                     break;
                                 }
                             }
                             if (get_class($import[$iii]) == "CssAtMediaEndToken") {
                                 unset($import[$ii]);
                                 unset($import[$iii]);
                                 $import = array_values($import);
                                 $ll = count($import);
                             }
                         }
                     }
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         $class = get_class($import[$ii]);
                         if ($class === "CssAtImportToken" || $class === "CssAtCharsetToken") {
                             $blocks = array_merge($blocks, array_splice($import, $ii, 1, array()));
                             $ll = count($import);
                         }
                     }
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         $class = get_class($import[$ii]);
                         if ($class === "CssAtFontFaceStartToken" || $class === "CssAtMediaStartToken" || $class === "CssAtPageStartToken" || $class === "CssAtVariablesStartToken") {
                             for ($iii = $ii; $iii < $ll; $iii++) {
                                 $class = get_class($import[$iii]);
                                 if ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken") {
                                     break;
                                 }
                             }
                             $class = get_class($import[$iii]);
                             if (isset($import[$iii]) && ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken")) {
                                 $blocks = array_merge($blocks, array_splice($import, $ii, $iii - $ii + 1, array()));
                                 $ll = count($import);
                             }
                         }
                     }
                     $import = array_merge($blocks, array(new CssAtMediaStartToken($tokens[$i]->MediaTypes)), $import, array(new CssAtMediaEndToken()));
                 }
                 array_splice($tokens, $i, 1, $import);
                 $i--;
                 $l = count($tokens);
             }
         }
     }
 }
コード例 #2
0
ファイル: cssmin-v3.0.1.php プロジェクト: yarylo/cerkva.pp.ua
 /**
  * Implements {@link aCssMinifierFilter::filter()}.
  *
  * @param array $tokens Array of objects of type aCssToken
  * @return integer Count of added, changed or removed tokens; a return value large than 0 will rebuild the array
  */
 public function apply(array &$tokens)
 {
     if (!isset($this->configuration["BasePath"]) || !is_dir($this->configuration["BasePath"])) {
         CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Base path <code>" . ($this->configuration["BasePath"] ? $this->configuration["BasePath"] : "null") . "</code> is not a directory"));
         return 0;
     }
     for ($i = 0, $l = count($tokens); $i < $l; $i++) {
         if (get_class($tokens[$i]) === "CssAtImportToken") {
             $import = $this->configuration["BasePath"] . "/" . $tokens[$i]->Import;
             // Import file was not found/is not a file
             if (!is_file($import)) {
                 CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import . "</code> was not found.", (string) $tokens[$i]));
             } elseif (in_array($import, $this->imported)) {
                 CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import . "</code> was already imported.", (string) $tokens[$i]));
                 $tokens[$i] = null;
             } else {
                 $this->imported[] = $import;
                 $parser = new CssParser(file_get_contents($import));
                 $import = $parser->getTokens();
                 // The @import at-rule has media types defined requiring special handling
                 if (count($tokens[$i]->MediaTypes) > 0 && !(count($tokens[$i]->MediaTypes) == 1 && $tokens[$i]->MediaTypes[0] == "all")) {
                     $blocks = array();
                     /*
                      * Filter or set media types of @import at-rule or remove the @import at-rule if no media type is matching the parent @import at-rule
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtImportToken") {
                             // @import at-rule defines no media type or only the "all" media type; set the media types to the one defined in the parent @import at-rule
                             if (count($import[$ii]->MediaTypes) == 0 || count($import[$ii]->MediaTypes) == 1 && $import[$ii]->MediaTypes[0] == "all") {
                                 $import[$ii]->MediaTypes = $tokens[$i]->MediaTypes;
                             } elseif (count($import[$ii]->MediaTypes > 0)) {
                                 foreach ($import[$ii]->MediaTypes as $index => $mediaType) {
                                     if (!in_array($mediaType, $tokens[$i]->MediaTypes)) {
                                         unset($import[$ii]->MediaTypes[$index]);
                                     }
                                 }
                                 $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes);
                                 // If there are no media types left in the @import at-rule remove the @import at-rule
                                 if (count($import[$ii]->MediaTypes) == 0) {
                                     $import[$ii] = null;
                                 }
                             }
                         }
                     }
                     /*
                      * Remove media types of @media at-rule block not defined in the @import at-rule
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken") {
                             foreach ($import[$ii]->MediaTypes as $index => $mediaType) {
                                 if (!in_array($mediaType, $tokens[$i]->MediaTypes)) {
                                     unset($import[$ii]->MediaTypes[$index]);
                                 }
                                 $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes);
                             }
                         }
                     }
                     /*
                      * If no media types left of the @media at-rule block remove the complete block
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken") {
                             if (count($import[$ii]->MediaTypes) === 0) {
                                 for ($iii = $ii; $iii < $ll; $iii++) {
                                     if (get_class($import[$iii]) === "CssAtMediaEndToken") {
                                         break;
                                     }
                                 }
                                 if (get_class($import[$iii]) === "CssAtMediaEndToken") {
                                     array_splice($import, $ii, $iii - $ii + 1, array());
                                     $ll = count($import);
                                 }
                             }
                         }
                     }
                     /*
                      * If the media types of the @media at-rule equals the media types defined in the @import
                      * at-rule remove the CssAtMediaStartToken and CssAtMediaEndToken token
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         if (get_class($import[$ii]) === "CssAtMediaStartToken" && count(array_diff($tokens[$i]->MediaTypes, $import[$ii]->MediaTypes)) === 0) {
                             for ($iii = $ii; $iii < $ll; $iii++) {
                                 if (get_class($import[$iii]) == "CssAtMediaEndToken") {
                                     break;
                                 }
                             }
                             if (get_class($import[$iii]) == "CssAtMediaEndToken") {
                                 unset($import[$ii]);
                                 unset($import[$iii]);
                                 $import = array_values($import);
                                 $ll = count($import);
                             }
                         }
                     }
                     /**
                      * Extract CssAtImportToken and CssAtCharsetToken tokens
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         $class = get_class($import[$ii]);
                         if ($class === "CssAtImportToken" || $class === "CssAtCharsetToken") {
                             $blocks = array_merge($blocks, array_splice($import, $ii, 1, array()));
                             $ll = count($import);
                         }
                     }
                     /*
                      * Extract the @font-face, @media and @page at-rule block
                      */
                     for ($ii = 0, $ll = count($import); $ii < $ll; $ii++) {
                         $class = get_class($import[$ii]);
                         if ($class === "CssAtFontFaceStartToken" || $class === "CssAtMediaStartToken" || $class === "CssAtPageStartToken" || $class === "CssAtVariablesStartToken") {
                             for ($iii = $ii; $iii < $ll; $iii++) {
                                 $class = get_class($import[$iii]);
                                 if ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken") {
                                     break;
                                 }
                             }
                             $class = get_class($import[$iii]);
                             if (isset($import[$iii]) && ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken")) {
                                 $blocks = array_merge($blocks, array_splice($import, $ii, $iii - $ii + 1, array()));
                                 $ll = count($import);
                             }
                         }
                     }
                     // Create the import array with extracted tokens and the rulesets wrapped into a @media at-rule block
                     $import = array_merge($blocks, array(new CssAtMediaStartToken($tokens[$i]->MediaTypes)), $import, array(new CssAtMediaEndToken()));
                 }
                 // Insert the imported tokens
                 array_splice($tokens, $i, 1, $import);
                 // Modify parameters of the for-loop
                 $i--;
                 $l = count($tokens);
             }
         }
     }
 }
コード例 #3
0
ファイル: CssMinifier.php プロジェクト: aisuhua/phalcon-php
 /**
  * Minifies the CSS source.
  * 
  * @param string $source CSS source
  * @return string
  */
 public function minify($source)
 {
     // Variables
     $r = "";
     $parser = new CssParser($source);
     $tokens = $parser->getTokens();
     $filters = $this->filters;
     $filterCount = count($this->filters);
     $plugins = $this->plugins;
     $pluginCount = count($plugins);
     $pluginIndex = array();
     $pluginTriggerTokens = array();
     $globalTriggerTokens = array();
     for ($i = 0, $l = count($plugins); $i < $l; $i++) {
         $tPluginClassName = get_class($plugins[$i]);
         $pluginTriggerTokens[$i] = $plugins[$i]->getTriggerTokens();
         foreach ($pluginTriggerTokens[$i] as $v) {
             if (!in_array($v, $globalTriggerTokens)) {
                 $globalTriggerTokens[] = $v;
             }
         }
         $pluginTriggerTokens[$i] = "|" . implode("|", $pluginTriggerTokens[$i]) . "|";
         $pluginIndex[$tPluginClassName] = $i;
     }
     $globalTriggerTokens = "|" . implode("|", $globalTriggerTokens) . "|";
     /*
      * Apply filters
      */
     for ($i = 0; $i < $filterCount; $i++) {
         // Apply the filter; if the return value is larger than 0...
         if ($filters[$i]->apply($tokens) > 0) {
             // ...then filter null values and rebuild the token array
             $tokens = array_values(array_filter($tokens));
         }
     }
     $tokenCount = count($tokens);
     /*
      * Apply plugins
      */
     for ($i = 0; $i < $tokenCount; $i++) {
         $triggerToken = "|" . get_class($tokens[$i]) . "|";
         if (strpos($globalTriggerTokens, $triggerToken) !== false) {
             for ($ii = 0; $ii < $pluginCount; $ii++) {
                 if (strpos($pluginTriggerTokens[$ii], $triggerToken) !== false || $pluginTriggerTokens[$ii] === false) {
                     // Apply the plugin; if the return value is TRUE continue to the next token
                     if ($plugins[$ii]->apply($tokens[$i]) === true) {
                         continue 2;
                     }
                 }
             }
         }
     }
     // Stringify the tokens
     for ($i = 0; $i < $tokenCount; $i++) {
         $r .= (string) $tokens[$i];
     }
     $this->minified = $r;
     return $r;
 }
コード例 #4
0
ファイル: class-cssmin.php プロジェクト: xav335/sfnettoyage
 /**
  * Parse the CSS source.
  *
  * @param string $source CSS source
  * @param array $plugins Plugin configuration [optional]
  * @return array Array of aCssToken
  */
 public static function parse($source, array $plugins = null)
 {
     self::$errors = array();
     $parser = new CssParser($source, $plugins);
     return $parser->getTokens();
 }
コード例 #5
0
 public function minify($source)
 {
     $r = "";
     $parser = new CssParser($source);
     $tokens = $parser->getTokens();
     $filters = $this->filters;
     $filterCount = count($this->filters);
     $plugins = $this->plugins;
     $pluginCount = count($plugins);
     $pluginIndex = array();
     $pluginTriggerTokens = array();
     $globalTriggerTokens = array();
     for ($i = 0, $l = count($plugins); $i < $l; $i++) {
         $tPluginClassName = get_class($plugins[$i]);
         $pluginTriggerTokens[$i] = $plugins[$i]->getTriggerTokens();
         foreach ($pluginTriggerTokens[$i] as $v) {
             if (!in_array($v, $globalTriggerTokens)) {
                 $globalTriggerTokens[] = $v;
             }
         }
         $pluginTriggerTokens[$i] = "|" . implode("|", $pluginTriggerTokens[$i]) . "|";
         $pluginIndex[$tPluginClassName] = $i;
     }
     $globalTriggerTokens = "|" . implode("|", $globalTriggerTokens) . "|";
     for ($i = 0; $i < $filterCount; $i++) {
         if ($filters[$i]->apply($tokens) > 0) {
             $tokens = array_values(array_filter($tokens));
         }
     }
     $tokenCount = count($tokens);
     for ($i = 0; $i < $tokenCount; $i++) {
         $triggerToken = "|" . get_class($tokens[$i]) . "|";
         if (strpos($globalTriggerTokens, $triggerToken) !== false) {
             for ($ii = 0; $ii < $pluginCount; $ii++) {
                 if (strpos($pluginTriggerTokens[$ii], $triggerToken) !== false || $pluginTriggerTokens[$ii] === false) {
                     if ($plugins[$ii]->apply($tokens[$i]) === true) {
                         continue 2;
                     }
                 }
             }
         }
     }
     for ($i = 0; $i < $tokenCount; $i++) {
         $r .= (string) $tokens[$i];
     }
     $this->minified = $r;
     return $r;
 }