/** * @param mixed $value * @return BaseToken * @throws ParserException */ public static function createFromPHPType($value) { switch ($type = gettype($value)) { case 'string': $current = new TokenString($value); break; case 'integer': $current = new TokenInteger($value); break; case 'boolean': $current = new TokenBool($value); break; case 'NULL': $current = new TokenNull($value); break; case 'double': $current = new TokenFloat($value); break; case 'array': $params = new TokenCollection(); foreach ($value as $item) { $params->attach(static::createFromPHPType($item)); } $current = new TokenArray($params); break; default: throw new ParserException('Unsupported PHP type: "%s"', $type); } return $current; }
/** * @param TokenCollection $parameters * @return TokenInteger * @throws \Exception */ public function call(TokenCollection $parameters) { if ($parameters->count() < 1) { $value = -1; } else { $value = strpos($this->token->getValue(), $parameters->current()->getValue()); if ($value === \false) { $value = -1; } } return new TokenInteger($value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenString */ public function call(TokenCollection $parameters) { if ($parameters->count() < 1) { $offset = 0; } else { $offset = (int) $parameters->current()->getValue(); } $tokenValue = $this->token->getValue(); if (!isset($tokenValue[$offset])) { $char = ''; } else { $char = $tokenValue[$offset]; } return new TokenString($char, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return Tokens\TokenString * @throws ParserException */ public function call(TokenCollection $parameters) { if (!$this->token instanceof Tokens\TokenArray) { throw new ParserException(sprintf('%s.join is not a function at position %d on line %d', $this->token->getValue(), $this->token->getPosition(), $this->token->getLine())); } if ($firstParam = $parameters->current()) { $glue = $firstParam->getValue(); } else { $glue = ','; } $array = $this->token->getValue(); if ($array instanceof TokenCollection) { $array = $array->toArray(); } return new Tokens\TokenString(implode($glue, $array), $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenString * @throws \Exception */ public function call(TokenCollection $parameters) { $parameters->rewind(); $numParams = $parameters->count(); $isRegExpr = \false; if ($numParams < 1) { $search = ''; } else { $search = $parameters->current()->getValue(); $isRegExpr = $parameters->current() instanceof TokenRegex; } if ($numParams < 2) { $replace = 'undefined'; } else { $parameters->next(); $replace = $parameters->current()->getValue(); } if ($isRegExpr) { list($expression, $modifiers) = $this->splitRegex($search); $modifiers = str_replace('g', '', $modifiers, $count); $limit = $count > 0 ? -1 : 1; $value = preg_replace($expression . $modifiers, $replace, $this->token->getValue(), $limit); } else { $value = str_replace($search, $replace, $this->token->getValue()); } return new TokenString($value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return Tokens\TokenArray */ public function call(TokenCollection $parameters) { $separator = $parameters->current(); if (!$separator || !is_string($separator->getValue())) { $newValue = [$this->token->getValue()]; } else { $params = [$separator->getValue(), $this->token->getValue()]; if ($parameters->count() >= 2) { $parameters->next(); $params[] = (int) $parameters->current()->getValue(); } if ($separator instanceof Tokens\TokenRegex) { $func = 'preg_split'; } else { $func = 'explode'; } $newValue = call_user_func_array($func, $params); } return new Tokens\TokenArray($newValue, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenBool * @throws ParserException */ public function call(TokenCollection $parameters) { if (!$this->token instanceof TokenRegex) { throw new ParserException(sprintf('undefined is not a function at position %d on line %d', $this->token->getPosition(), $this->token->getLine())); } if ($parameters->count() < 1) { $bool = \false; } else { // Remove "g" modifier as is does not exist in PHP // It's also irrelevant in .test() but allowed in JS here $pattern = preg_replace_callback('~/[igm]{0,3}$~', function (array $modifiers) { return str_replace('g', '', $modifiers[0]); }, $this->token->getValue()); $subject = $parameters->current()->getValue(); while ($subject instanceof TokenCollection) { $subject = current($subject->toArray()); } $bool = (bool) preg_match($pattern, (string) $subject); } return new TokenBool($bool, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenString */ public function call(TokenCollection $parameters) { $parameters->rewind(); $params = []; if ($parameters->count() < 1) { $params[] = 0; } else { $params[] = (int) $parameters->current()->getValue(); } if ($parameters->count() >= 2) { $parameters->next(); $params[] = (int) $parameters->current()->getValue(); } $value = call_user_func_array('substr', array_merge([$this->token->getValue()], $params)); return new TokenString((string) $value, $this->token->getOffset(), $this->token->getStack()); }
/** * @param TokenCollection $parameters * @return TokenFloat */ public function call(TokenCollection $parameters) { $parameters->rewind(); return new TokenFloat((double) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack()); }
/** * @since 0.3.4 * @param string $stopAt * @return AST\TokenCollection * @throws ParserException */ protected function getCommaSeparatedValues($stopAt = ')') { $commaExpected = \false; $items = new AST\TokenCollection(); do { $this->ast->next(); if (!($current = $this->ast->current())) { throw new ParserException(sprintf('Unexpected end of string. Expected "%s"', $stopAt)); } if ($current->getGroup() === Constants::GROUP_VALUE) { if ($commaExpected) { throw new ParserException(sprintf('Unexpected value at position %d on line %d', $current->getPosition(), $current->getLine())); } $commaExpected = \true; $items->attach($current); } elseif ($current instanceof Tokens\TokenComma) { if (!$commaExpected) { throw new ParserException(sprintf('Unexpected token "," at position %d on line %d', $current->getPosition(), $current->getLine())); } $commaExpected = \false; } elseif ($current->getValue() === $stopAt) { break; } elseif (!$this->isIgnoredToken($current)) { throw new ParserException(sprintf('Unexpected token "%s" at position %d on line %d', $current->getOriginalValue(), $current->getPosition(), $current->getLine())); } } while ($this->ast->valid()); if (!$commaExpected && $items->count() > 0) { throw new ParserException(sprintf('Unexpected token "," at position %d on line %d', $current->getPosition(), $current->getLine())); } $items->rewind(); return $items; }
/** * @param TokenCollection $parameters * @return TokenInteger */ public function call(TokenCollection $parameters) { return new TokenInteger((int) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack()); }