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(); } }
/** * 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; }