public function resolve($imported_files = array()) { if (empty($imported_files)) { $imported_files[] = $this->stylesheet->getHref(); } $encoding = $this->stylesheet->getCharset(); $lexer = new Lexer(); $parser = new Parser($lexer); $url_resolver = new UrlResolver($this->stylesheet, $this->base_url); $url_resolver->resolve(); foreach ($this->stylesheet->getRuleList()->getRules() as $rule) { if ($rule instanceof Rule\Import) { $url = $rule->getHref()->getUrl()->getString(); // Take care of circular imports ! if (in_array($url, $imported_files)) { continue; } else { $imported_files[] = $url; } try { $source = Loader::load($url, $encoding); } catch (StyleSheetNotFoundException $e) { // FIXME: should we remove the rule ? continue; } // Do the parsing $lexer->setSource($source); $stylesheet = $parser->parseStyleSheet(); // Remove charset rules $rule_list = $stylesheet->getRuleList(); foreach ($rule_list->getItems() as $sub_rule) { if ($sub_rule instanceof Rule\Charset) { $stylesheet->getRuleList()->remove($sub_rule); // Only one charset is allowed, so we can break; } } $rule_list->resetKeys(); // Do the recurse $resolver = new ImportResolver($stylesheet); $resolver->resolve($imported_files); // Wrap into media query if needed if ($rule->getMediaQueryList() !== null && !$rule->getMediaQueryList()->isEmpty()) { $media_query = new Rule\Media($rule->getMediaQueryList(), $rule_list); $this->stylesheet->getRuleList()->replace($rule, $media_query); } else { $this->stylesheet->getRuleList()->replace($rule, $rule_list->getItems()); } } } }
public function loadString($str) { return Loader::loadString($str); }
<?php require_once 'Benchmark/Timer.php'; require_once __DIR__ . '/../../vendor/autoload.php'; use ju1ius\Text\Source; use ju1ius\Css; $timer = new Benchmark_Timer(); $timer->start(); $source = Css\Loader::load(__DIR__ . '/../files/full/02.css'); $timer->setMarker(sprintf("Source init: %s", $source->getEncoding())); $lexer = new Css\Lexer($source); $timer->setMarker("Lexer init"); set_time_limit(10); //$token = $lexer->nextToken(); //while ($token->type !== Css\Lexer::T_EOF) { ////echo Css\Lexer::getLiteral($token) . PHP_EOL; //$token = $lexer->nextToken(); //} ////echo Css\Lexer::getLiteral($token) . PHP_EOL; //$lexer->reset(); //$timer->setMarker("Tokenization end"); $parser = new Css\Parser($lexer); $parser->setStrict(false); $stylesheet = $parser->parseStyleSheet(); $timer->setMarker("Parsing end"); //var_dump($stylesheet); printf("Memory: %s\n", memory_get_usage(true)); printf("Memory peak: %s\n", memory_get_peak_usage(true)); echo $timer->getOutput();
<?php require_once __DIR__ . '/../../vendor/autoload.php'; use ju1ius\Css; $lexer = new Css\Lexer(); $parser = new Css\Parser($lexer); $css = <<<EOS div { background: url(foo.png) top left / 12% 25% no-repeat fixed; border-radius: 1px 2px 3px / 1px 2px 3px; } EOS; $lexer->setSource(Css\Loader::loadString($css)); $stylesheet = $parser->parseStyleSheet(); $value_list = $stylesheet->getFirstRule()->getStyleDeclaration()->getAppliedProperty('background')->getValueList(); var_dump($value_list); $values = array('foo', ' ', 'bar', ' ', 'baz', '/', 'bidule', ',', 'boom', ' ', 'truc'); $delimiters = array('/' => 0, ',' => 2, ' ' => 1); //$result = reduce($values, $delimiters); //var_dump($result); function reduce($values, $delimiters) { if (count($values) === 1) { return $values[0]; } foreach ($delimiters as $delimiter => $binds) { $start = null; $indexes = array_keys($values, $delimiter, true); if ($binds === 0) { foreach ($indexes as $idx) { }