/** * Lex an expression into SassScript tokens. * @param string $string expression to lex * @param SassContext $context the context in which the expression is lexed * @return array tokens */ public function lex($string, $context) { // if it's already lexed, just return it as-is if (is_object($string)) { return array($string); } if (is_array($string)) { return $string; } $tokens = array(); // whilst the string is not empty, split it into it's tokens. while ($string !== false) { if (($match = $this->isWhitespace($string)) !== false) { $tokens[] = null; } elseif (($match = SassScriptFunction::isa($string)) !== false) { preg_match(SassScriptFunction::MATCH_FUNC, $match, $matches); $args = array(); foreach (SassScriptFunction::extractArgs($matches[SassScriptFunction::ARGS], false, $context) as $key => $expression) { $args[$key] = $this->parser->evaluate($expression, $context); } $tokens[] = new SassScriptFunction($matches[SassScriptFunction::NAME], $args); } elseif (($match = SassBoolean::isa($string)) !== false) { $tokens[] = new SassBoolean($match); } elseif (($match = SassColour::isa($string)) !== false) { $tokens[] = new SassColour($match); } elseif (($match = SassNumber::isa($string)) !== false) { $tokens[] = new SassNumber($match); } elseif (($match = SassString::isa($string)) !== false) { $stringed = new SassString($match); if (strlen($stringed->quote) == 0 && SassList::isa($string) !== false && !preg_match("/^\\-\\w+\\-\\w+\$/", $stringed->value)) { $tokens[] = new SassList($string); } else { $tokens[] = $stringed; } } elseif ($string == '()') { $match = $string; $tokens[] = new SassList($match); } elseif (($match = SassScriptOperation::isa($string)) !== false) { $tokens[] = new SassScriptOperation($match); } elseif (($match = SassScriptVariable::isa($string)) !== false) { $tokens[] = new SassScriptVariable($match); } else { $_string = $string; $match = ''; while (strlen($_string) && !$this->isWhitespace($_string)) { foreach (SassScriptOperation::$inStrOperators as $operator) { if (substr($_string, 0, strlen($operator)) == $operator) { break 2; } } $match .= $_string[0]; $_string = substr($_string, 1); } $tokens[] = new SassString($match); } $string = substr($string, strlen($match)); } return $tokens; }
/** * SassMixinDefinitionNode constructor. * @param object source token * @return SassMixinNode */ public function __construct($token) { parent::__construct($token); preg_match(self::MATCH, $token->source, $matches); $this->name = $matches[self::NAME]; if (isset($matches[self::ARGS])) { $this->args = SassScriptFunction::extractArgs($matches[self::ARGS]); } }
/** * SassMixinDefinitionNode constructor. * @param object source token * @return SassMixinDefinitionNode */ public function __construct($token) { preg_match(self::MATCH, $token->source, $matches); parent::__construct($token); if (empty($matches)) { throw new SassMixinDefinitionNodeException('Invalid Mixin', $this); } $this->name = $matches[self::NAME]; if (isset($matches[self::ARGUMENTS])) { $this->args = SassScriptFunction::extractArgs($matches[self::ARGUMENTS], true, new SassContext()); } }
/** * SassMixinDefinitionNode constructor. * @param object source token * @return SassMixinNode */ public function __construct($token) { parent::__construct($token); preg_match(self::MATCH, $token->source, $matches); if (!isset($matches[self::NAME])) { throw new SassMixinNodeException('Invalid mixin invocation: ($token->source)', $this); } $this->name = $matches[self::NAME]; if (isset($matches[self::ARGS]) && strlen($matches[self::ARGS])) { $this->args = SassScriptFunction::extractArgs($matches[self::ARGS], false); } }
/** * SassMixinDefinitionNode constructor. * @param object source token * @return SassMixinDefinitionNode */ public function __construct($token) { // if ($token->level > 1) { // throw new SassMixinDefinitionNodeException('Mixins can only be defined at root level. Token was set at level ' . $token->level, $token); // } preg_match(self::MATCH, $token->source, $matches); parent::__construct($token); if (empty($matches)) { throw new SassMixinDefinitionNodeException('Invalid Mixin', $this); } $this->name = $matches[self::NAME]; if (isset($matches[self::ARGUMENTS])) { $this->args = SassScriptFunction::extractArgs($matches[self::ARGUMENTS]); } }
/** * Parse this node. * Set passed arguments and any optional arguments not passed to their * defaults, then render the children of the mixin definition. * @param SassContext the context in which this node is parsed * @return array the parsed node */ public function parse($pcontext) { $mixin = $pcontext->getMixin($this->name); $context = new SassContext($pcontext); $context->content = $this->children; $argc = count($this->args); $count = 0; $args = SassScriptFunction::extractArgs($this->args, false, $context); list($arguments) = SassScriptFunction::fill_parameters($mixin->args, $args, $context, $this); $context->setVariables($arguments); $children = array(); foreach ($mixin->children as $child) { $child->parent = $this; $children = array_merge($children, $child->parse($context)); } // $context->merge(); return $children; }
/** * Lex an expression into SassScript tokens. * @param string expression to lex * @param SassContext the context in which the expression is lexed * @return array tokens */ public function lex($string, $context) { $tokens = array(); while ($string !== false) { if (($match = $this->isWhitespace($string)) !== false) { $tokens[] = null; } elseif (($match = SassScriptFunction::isa($string)) !== false) { preg_match(SassScriptFunction::MATCH_FUNC, $match, $matches); $args = array(); foreach (SassScriptFunction::extractArgs($matches[SassScriptFunction::ARGS]) as $expression) { $args[] = $this->parser->evaluate($expression, $context); } $tokens[] = new SassScriptFunction($matches[SassScriptFunction::NAME], $args); } elseif (($match = SassString::isa($string)) !== false) { $tokens[] = new SassString($match); } elseif (($match = SassBoolean::isa($string)) !== false) { $tokens[] = new SassBoolean($match); } elseif (($match = SassColour::isa($string)) !== false) { $tokens[] = new SassColour($match); } elseif (($match = SassNumber::isa($string)) !== false) { $tokens[] = new SassNumber($match); } elseif (($match = SassScriptOperation::isa($string)) !== false) { $tokens[] = new SassScriptOperation($match); } elseif (($match = SassScriptVariable::isa($string)) !== false) { $tokens[] = new SassScriptVariable($match); } else { $_string = $string; $match = ''; while (strlen($_string) && !$this->isWhitespace($_string)) { foreach (SassScriptOperation::$inStrOperators as $operator) { if (substr($_string, 0, strlen($operator)) == $operator) { break 2; } } $match .= $_string[0]; $_string = substr($_string, 1); } $tokens[] = new SassString($match); } $string = substr($string, strlen($match)); } return $tokens; }