Example #1
0
 private function processImportNode(ImportNode $node, Context $context, $importParent)
 {
     $e = null;
     try {
         $compiledNode = $node->compileForImport($context);
     } catch (Exception $e) {
         $compiledNode = false;
         if (!$e->getCurrentFile()) {
             if ($node->currentFileInfo) {
                 $e->setCurrentFile($node->currentFileInfo, $node->index);
             } else {
                 $e->setIndex($node->index);
             }
         }
         $node->css = true;
         $node->error = $e;
     }
     $inlineCSS = $node->getOption('inline');
     $isPlugin = $node->getOption('plugin');
     if ($compiledNode && (!$compiledNode->css || $inlineCSS)) {
         if ($node->getOption('multiple')) {
             $context->importMultiple = true;
         }
         for ($i = 0; $i < count($importParent->rules); ++$i) {
             if ($importParent->rules[$i] === $node) {
                 $importParent->rules[$i] = $compiledNode;
                 break;
             }
         }
         $tryAppendLessExtension = !$compiledNode->css;
         try {
             // import the file
             list($alreadyImported, $file) = $this->importer->import($compiledNode->getPath(), $tryAppendLessExtension, $compiledNode->currentFileInfo, $compiledNode->options, $compiledNode->index);
             /* @var $file ImportedFile */
             if (!$context->importMultiple) {
                 if ($alreadyImported) {
                     $compiledNode->skip = true;
                 }
             }
             if ($root = $file->getRuleset()) {
                 /* @var $root RulesetNode */
                 $compiledNode->root = $root;
                 $compiledNode->importedFilename = $file->getPath();
                 if (!$inlineCSS && !$isPlugin && ($context->importMultiple || !$alreadyImported)) {
                     $oldEnv = $this->context;
                     $this->context = $context;
                     try {
                         $this->visit($root);
                     } catch (Exception $e) {
                         $this->error = $e;
                     }
                     $this->end = $oldEnv;
                 }
             }
         } catch (ImportException $e) {
             // optional import
             if (isset($compiledNode->options['optional']) && $compiledNode->options['optional']) {
                 // optional import
             } else {
                 $this->error = $e;
             }
         } catch (Exception $e) {
             $this->error = $e;
         }
     }
     --$this->importCount;
     if ($this->isFinished) {
         $this->sequencer->tryRun();
     }
 }
Example #2
0
 /**
  * Parse a Less string from a given file.
  *
  * @throws ParserException
  *
  * @param string|ImportedFile $file The file to parse (Will be loaded via the importer)
  * @param bool $returnRuleset Indicates whether the parsed rules should be wrapped in a ruleset.
  *
  * @return mixed If $returnRuleset is true, ILess\Parser\Core, ILess\ILess\Node\RulesetNode otherwise
  */
 public function parseFile($file, $returnRuleset = false)
 {
     // save the previous information
     $previousFileInfo = $this->context->currentFileInfo;
     if (!$file instanceof ImportedFile) {
         $this->context->setCurrentFile($file);
         if ($previousFileInfo) {
             $this->context->currentFileInfo->reference = $previousFileInfo->reference;
         }
         // try to load it via importer
         list(, $file) = $this->importer->import($file, true, $this->context->currentFileInfo);
         /* @var $file ImportedFile */
         $this->context->setCurrentFile($file->getPath());
         $this->context->currentFileInfo->importedFile = $file;
         $ruleset = $file->getRuleset();
     } else {
         $this->context->setCurrentFile($file->getPath());
         if ($previousFileInfo) {
             $this->context->currentFileInfo->reference = $previousFileInfo->reference;
         }
         $this->context->currentFileInfo->importedFile = $file;
         $ruleset = $file->getRuleset();
         if (!$ruleset) {
             $file->setRuleset($ruleset = new RulesetNode([], $this->parse($file->getContent())));
         }
     }
     if ($previousFileInfo) {
         $this->context->currentFileInfo = $previousFileInfo;
     }
     if ($returnRuleset) {
         return $ruleset;
     }
     $this->rules = array_merge($this->rules, $ruleset->rules);
     return $this;
 }