/** * Creates and returns the next SassNode. * The tpye of SassNode depends on the content of the SassToken. * @return SassNode a SassNode of the appropriate type. Null when no more * source to parse. */ private function getNode($node) { $token = $this->getToken(); if (empty($token)) { return null; } switch (true) { case SassDirectiveNode::isa($token): return $this->parseDirective($token, $node); break; case SassCommentNode::isa($token): return new SassCommentNode($token); break; case SassVariableNode::isa($token): return new SassVariableNode($token); break; case SassPropertyNode::isa($token, $this->property_syntax): return new SassPropertyNode($token, $this->property_syntax); break; case SassMixinDefinitionNode::isa($token): if ($this->syntax === SassFile::SCSS) { throw new SassException('Mixin {which} shortcut not allowed in SCSS', array('{which}' => 'definition'), $this); } return new SassMixinDefinitionNode($token); break; case SassMixinNode::isa($token): if ($this->syntax === SassFile::SCSS) { throw new SassException('Mixin {which} shortcut not allowed in SCSS', array('{which}' => 'include'), $this); } return new SassMixinNode($token); break; default: return new SassRuleNode($token); break; } // switch }
/** * Creates and returns the next SassNode. * The tpye of SassNode depends on the content of the SassToken. * @return SassNode a SassNode of the appropriate type. Null when no more * source to parse. */ public function getNode($node) { $token = $this->getToken(); if (empty($token)) { return null; } switch (true) { case SassDirectiveNode::isa($token): return $this->parseDirective($token, $node); case SassCommentNode::isa($token): return new SassCommentNode($token); case SassVariableNode::isa($token): return new SassVariableNode($token); case SassPropertyNode::isa(array('token' => $token, 'syntax' => $this->property_syntax)): return new SassPropertyNode($token, $this->property_syntax); case SassFunctionDefinitionNode::isa($token): return new SassFunctionDefinitionNode($token); case SassMixinDefinitionNode::isa($token): if ($this->syntax === SassFile::SCSS) { if ($this->debug) { throw new SassException('Mixin definition shortcut not allowed in SCSS', $this); } return; } else { return new SassMixinDefinitionNode($token); } case SassMixinNode::isa($token): if ($this->syntax === SassFile::SCSS) { if ($this->debug) { throw new SassException('Mixin include shortcut not allowed in SCSS', $this); } return; } else { return new SassMixinNode($token); } default: return new SassRuleNode($token); break; } // switch }
/** * Parses a mixin definition * @param string line to parse * @return SassMixinDefinitionNode mixin definition node */ private function parseMixinDefinition($line) { if ($line['indentLevel'] !== 0) { throw new SassMixinDefinitionNodeException("Illegal Mixin definition, mixins can only be defined at root level\n{$line['number']}: " . (is_array($line['file']) ? join(DIRECTORY_SEPARATOR, $line['file']) : '')); } $matches = SassMixinDefinitionNode::match($line); return sizeof($matches) == 2 ? new SassMixinDefinitionNode($matches[SassMixinDefinitionNode::NAME]) : new SassMixinDefinitionNode($matches[SassMixinDefinitionNode::NAME], $matches[SassMixinDefinitionNode::ARGUMENTS]); }