Esempio n. 1
0
 public function test_post()
 {
     include 'CssParser.php';
     $parser = new CssParser();
     $parser->load_file('/home/travis/build/phpBB3/phpBB/ext/anavaro/postlove/styles/all/theme/default.css');
     $parser->parse();
     $this->login();
     // Test creating topic and post to test
     $post = $this->create_topic(2, 'Test Topic 1', 'This is a test topic posted by the testing framework.');
     $crawler = self::request('GET', "viewtopic.php?t={$post['topic_id']}&sid={$this->sid}");
     $post2 = $this->create_post(2, $post['topic_id'], 'Re: Test Topic 1', 'This is a test [b]post[/b] posted by the testing framework.');
     $crawler = self::request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
     //Do we see the static?
     $class = $crawler->filter('#p' . $post2['post_id'])->filter('.postlove')->filter('span')->attr('class');
     $this->assertContains('heart-red-16.png', $parser->parsed['main']['.' . $class]['background']);
     $this->assertContains('0 x', $crawler->filter('#p' . $post2['post_id'])->filter('.postlove')->text());
     //toggle like
     $url = $crawler->filter('#p' . $post2['post_id'])->filter('.postlove')->filter('a')->attr('href');
     $crw1 = self::request('GET', substr($url, 1), array(), array(), array('CONTENT_TYPE' => 'application/json'));
     //reload page and test ...
     $crawler = self::request('GET', "viewtopic.php?t={$post2['topic_id']}&sid={$this->sid}");
     $class = $crawler->filter('#p' . $post2['post_id'])->filter('.postlove')->filter('span')->attr('class');
     $this->assertContains('heart-white-16.png', $parser->parsed['main']['.' . $class]['background']);
     $this->assertContains('1 x', $crawler->filter('#p' . $post2['post_id'])->filter('.postlove')->text());
     $this->logout();
 }
Esempio n. 2
0
 public function testWhitewashingHeaders()
 {
     $parser = new PHPricot_Parser();
     $doc = $parser->parse(file_get_contents(dirname(__FILE__) . "/_files/whitewashing.html"));
     $cssHandler = new PHPricot_CssParser_EventHandler($doc);
     $cssParser = new CssParser('div.box h2', $cssHandler);
     $cssParser->parse();
     $headers = $cssHandler->getMatches();
     $this->assertEquals(10, count($headers), "Whitewashing Main Page example should have 10 h2 tags");
 }
Esempio n. 3
0
 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);
             }
         }
     }
 }
Esempio n. 4
0
 public function testAllCombo()
 {
     $selector = '*|ele1 > ele2.class1 + ns1|ele3.class2[attr=simple] ~ 
  .class2[attr2~="longer string of text."]:pseudoClass(value) 
  .class3::pseudoElement';
     $expect = array(new TestEvent(TestEvent::elementNS, 'ele1', '*'), new TestEvent(TestEvent::directDescendant), new TestEvent(TestEvent::element, 'ele2'), new TestEvent(TestEvent::elementClass, 'class1'), new TestEvent(TestEvent::adjacent), new TestEvent(TestEvent::elementNS, 'ele3', 'ns1'), new TestEvent(TestEvent::elementClass, 'class2'), new TestEvent(TestEvent::attribute, 'attr', 'simple', CssEventHandler::isExactly), new TestEvent(TestEvent::sibling), new TestEvent(TestEvent::elementClass, 'class2'), new TestEvent(TestEvent::attribute, 'attr2', 'longer string of text.', CssEventHandler::containsWithSpace), new TestEvent(TestEvent::pseudoClass, 'pseudoClass', 'value'), new TestEvent(TestEvent::anyDescendant), new TestEvent(TestEvent::elementClass, 'class3'), new TestEvent(TestEvent::pseudoElement, 'pseudoElement'));
     $handler = new TestCssEventHandler();
     $handler->expects($expect);
     $parser = new CssParser($selector, $handler);
     $parser->parse();
     //$handler->dumpStack();
     $this->assertTrue($handler->success());
     /*
     // Again, with spaces this time:
     $selector = ' *|ele1 > ele2. class1 + ns1|ele3. class2[ attr=simple] ~ .class2[attr2 ~= "longer string of text."]:pseudoClass(value) .class3::pseudoElement';    
      
     $handler = new TestCssEventHandler();
     $handler->expects($expect);
     $parser = new CssParser($selector, $handler);
     $parser->parse();
     
     $handler->dumpStack();
     $this->assertTrue($handler->success());
     */
 }
Esempio n. 5
0
 /**
  * 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);
             }
         }
     }
 }
Esempio n. 6
0
 /**
  * Generic finding method.
  *
  * This is the primary searching method used throughout QueryPath.
  *
  * @param string $filter
  *  A valid CSS 3 filter.
  * @return QueryPathCssEventHandler
  *  Returns itself.
  */
 public function find($filter)
 {
     $parser = new CssParser($filter, $this);
     $parser->parse();
     return $this;
 }
Esempio n. 7
0
 /**
  * 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();
 }
 /**
  * Filters the list of nodes with a CSS selector.
  *
  * This method only works if you have installed the CssSelector Symfony Component.
  *
  * @param string $selector A CSS selector
  *
  * @return Crawler A new instance of Crawler with the filtered list of nodes
  *
  * @throws \RuntimeException if the CssSelector Component is not available
  */
 public function filter($selector)
 {
     if (!class_exists('Symfony\\Components\\CssSelector\\Parser')) {
         // @codeCoverageIgnoreStart
         throw new \RuntimeException('Unable to filter with a CSS selector as the Symfony CssSelector is not installed (you can use filterXPath instead).');
         // @codeCoverageIgnoreEnd
     }
     return $this->filterXPath(CssParser::cssToXpath($selector));
 }
Esempio n. 9
0
 static function select($node, $query)
 {
     $p = new CssParser($node, $query);
     return $p->parse();
 }
Esempio n. 10
0
 function style()
 {
     $args = func_get_args();
     if (checkAssets()) {
         $stylusFile = CssParser::stylusFile($args[0]);
         $cssFile = CssParser::cssFile($args[0], $isALib);
         $time = 0;
         if (file_exists($stylusFile)) {
             $time = DependancesCache::lastTime($stylusFile, 'fileLastTime');
             if (!file_exists($cssFile) || $time > fileLastTime($cssFile)) {
                 (new CssParser($stylusFile))->out($cssFile);
             }
             $time -= 1363188938;
         }
         $args[0] = 'css/' . ($isALib ? 'lib/' : '') . $args[0] . '.css' . ($time ? '?' . $time : '');
     } else {
         $args[0] = 'css/' . (!file_exists(app_path() . '/../public/css/' . $args[0] . '.css') ? 'lib/' : '') . $args[0] . '.css';
     }
     return call_user_func_array(array('HTML', 'style'), $args);
 }
Esempio n. 11
0
<?php

require_once 'CssUploader.php';
require_once 'CssParser.php';
require_once 'CssReport.php';
$errorMsg = $successMsg = "";
// file upload
if (!empty($_FILES['uploadFile'])) {
    try {
        $uploader = new CssUploader();
        $parser = new CssParser(['uploadPath' => $uploader->getFilePath()]);
        $report = new CssReport(['parsedData' => $parser->getParsedData()]);
        $successMsg = "File successfully uploaded and parsed";
    } catch (Exception $ex) {
        $errorMsg = $ex->getMessage();
        // in real life i wouldn't do this!
    }
}
Esempio n. 12
0
 public function search($cssSelector)
 {
     $cssHandler = new PHPricot_CssParser_EventHandler($this->doc);
     $cssParser = new CssParser($cssSelector, $cssHandler);
     $cssParser->parse();
     return new PHPricot_Query($cssHandler->getMatches());
 }
    const anotherSelector = 11;
    const sibling = 12;
    const anyElementInNS = 13;
    const anyDescendant = 14;
    var $type = NULL;
    var $params = NULL;
    public function __construct($event_type)
    {
        $this->type = $event_type;
        $args = func_get_args();
        array_shift($args);
        $this->params = $args;
        print "Event " . $event_type;
        print_r($args);
    }
    public function eventType()
    {
        return $this->type;
    }
    public function params()
    {
        return $this->params;
    }
}
print ord('"');
#$str = 'tag.class #id :test (test) + anotherElement > yetAnother[test] more[test="ing"]';
$str = 'tag.class #id :test (test)';
print "Now testing: {$str}\n";
$c = new SimpleTestCssEventHandler();
$p = new CssParser($str, $c);
$p->parse();
Esempio n. 14
0
 /**
  * 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;
 }
 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;
 }