public function parseFile($file) { $source = Loader::load($this->fixtures_dir . '/' . $file); $this->lexer->setSource($source); return $this->css_parser->parseStyleSheet(); //return $this->css_parser->parse($source); }
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()); } } } }
<?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();