diff options
Diffstat (limited to 'srcs/phpmyadmin/vendor/twig')
397 files changed, 22965 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/vendor/twig/extensions/.travis.yml b/srcs/phpmyadmin/vendor/twig/extensions/.travis.yml new file mode 100644 index 0000000..88c7404 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/.travis.yml @@ -0,0 +1,34 @@ +language: php + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache/files + +env: + - DEPS=no + +before_install: + - phpenv config-rm xdebug.ini + +before_script: + - if [ "$DEPS" == "low" ]; then composer --prefer-lowest --prefer-stable update; fi; + - if [ "$DEPS" == "no" ]; then composer install; fi; + +script: | + ./vendor/bin/simple-phpunit + +matrix: + include: + - php: 5.3 + dist: precise + - php: 5.4 + - php: 5.5 + - php: 5.6 + env: DEPS=low + - php: 7.0 + - php: 7.1 + - php: 7.2 + fast_finish: true diff --git a/srcs/phpmyadmin/vendor/twig/extensions/LICENSE b/srcs/phpmyadmin/vendor/twig/extensions/LICENSE new file mode 100644 index 0000000..b420d71 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010-2017 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/srcs/phpmyadmin/vendor/twig/extensions/README.rst b/srcs/phpmyadmin/vendor/twig/extensions/README.rst new file mode 100644 index 0000000..2b4ea92 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/README.rst @@ -0,0 +1,14 @@ +Twig Extensions Repository +========================== + +This repository hosts Twig Extensions that do not belong to the core but can +be nonetheless interesting to share with other developers. + +Fork this repository, add your extension, and request a pull. + +More Information +---------------- + +Read the `documentation`_ for more information. + +.. _documentation: http://twig-extensions.readthedocs.io/ diff --git a/srcs/phpmyadmin/vendor/twig/extensions/composer.json b/srcs/phpmyadmin/vendor/twig/extensions/composer.json new file mode 100644 index 0000000..3644d8e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/composer.json @@ -0,0 +1,32 @@ +{ + "name": "twig/extensions", + "description": "Common additional features for Twig that do not directly belong in core", + "keywords": ["i18n","text"], + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "require": { + "twig/twig": "^1.27|^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.4", + "symfony/translation": "^2.7|^3.4" + }, + "suggest": { + "symfony/translation": "Allow the time_diff output to be translated" + }, + "autoload": { + "psr-0": { "Twig_Extensions_": "lib/" }, + "psr-4": { "Twig\\Extensions\\": "src/" } + }, + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Autoloader.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Autoloader.php new file mode 100644 index 0000000..9ad5a46 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Autoloader.php @@ -0,0 +1,48 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2009 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +@trigger_error('The "Twig_Extensions_Autoloader" class is deprecated since version 1.5. Use Composer instead.', E_USER_DEPRECATED); + +/** + * Autoloads Twig Extensions classes. + * + * @author Fabien Potencier <fabien.potencier@symfony-project.com> + * + * @deprecated since version 1.5, use Composer instead. + */ +class Twig_Extensions_Autoloader +{ + /** + * Registers Twig_Extensions_Autoloader as an SPL autoloader. + */ + public static function register() + { + spl_autoload_register(array(new self(), 'autoload')); + } + + /** + * Handles autoloading of classes. + * + * @param string $class a class name + * + * @return bool Returns true if the class has been loaded + */ + public static function autoload($class) + { + if (0 !== strpos($class, 'Twig_Extensions')) { + return; + } + + if (file_exists($file = __DIR__.'/../../'.str_replace('_', '/', $class).'.php')) { + require $file; + } + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Array.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Array.php new file mode 100644 index 0000000..a5eaf6d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Array.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of Twig. + * + * (c) 2009 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @author Ricard Clau <ricard.clau@gmail.com> + */ +class Twig_Extensions_Extension_Array extends Twig_Extension +{ + /** + * {@inheritdoc} + */ + public function getFilters() + { + $filters = array( + new Twig_SimpleFilter('shuffle', 'twig_shuffle_filter'), + ); + + return $filters; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'array'; + } +} + +/** + * Shuffles an array. + * + * @param array|Traversable $array An array + * + * @return array + */ +function twig_shuffle_filter($array) +{ + if ($array instanceof Traversable) { + $array = iterator_to_array($array, false); + } + + shuffle($array); + + return $array; +} + +class_alias('Twig_Extensions_Extension_Array', 'Twig\Extensions\ArrayExtension', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php new file mode 100644 index 0000000..1cdd455 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php @@ -0,0 +1,107 @@ +<?php + +/** + * This file is part of Twig. + * + * (c) 2014 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Component\Translation\IdentityTranslator; + +/** + * @author Robin van der Vleuten <robinvdvleuten@gmail.com> + */ +class Twig_Extensions_Extension_Date extends Twig_Extension +{ + public static $units = array( + 'y' => 'year', + 'm' => 'month', + 'd' => 'day', + 'h' => 'hour', + 'i' => 'minute', + 's' => 'second', + ); + + /** + * @var TranslatorInterface + */ + private $translator; + + public function __construct(TranslatorInterface $translator = null) + { + // Ignore the IdentityTranslator, otherwise the parameters won't be replaced properly + if ($translator instanceof IdentityTranslator) { + $translator = null; + } + + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function getFilters() + { + return array( + new Twig_SimpleFilter('time_diff', array($this, 'diff'), array('needs_environment' => true)), + ); + } + + /** + * Filter for converting dates to a time ago string like Facebook and Twitter has. + * + * @param Twig_Environment $env a Twig_Environment instance + * @param string|DateTime $date a string or DateTime object to convert + * @param string|DateTime $now A string or DateTime object to compare with. If none given, the current time will be used. + * + * @return string the converted time + */ + public function diff(Twig_Environment $env, $date, $now = null) + { + // Convert both dates to DateTime instances. + $date = twig_date_converter($env, $date); + $now = twig_date_converter($env, $now); + + // Get the difference between the two DateTime objects. + $diff = $date->diff($now); + + // Check for each interval if it appears in the $diff object. + foreach (self::$units as $attribute => $unit) { + $count = $diff->$attribute; + + if (0 !== $count) { + return $this->getPluralizedInterval($count, $diff->invert, $unit); + } + } + + return ''; + } + + protected function getPluralizedInterval($count, $invert, $unit) + { + if ($this->translator) { + $id = sprintf('diff.%s.%s', $invert ? 'in' : 'ago', $unit); + + return $this->translator->transChoice($id, $count, array('%count%' => $count), 'date'); + } + + if (1 !== $count) { + $unit .= 's'; + } + + return $invert ? "in $count $unit" : "$count $unit ago"; + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'date'; + } +} + +class_alias('Twig_Extensions_Extension_Date', 'Twig\Extensions\DateExtension', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/I18n.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/I18n.php new file mode 100644 index 0000000..41cb9ce --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/I18n.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class Twig_Extensions_Extension_I18n extends Twig_Extension +{ + /** + * {@inheritdoc} + */ + public function getTokenParsers() + { + return array(new Twig_Extensions_TokenParser_Trans()); + } + + /** + * {@inheritdoc} + */ + public function getFilters() + { + return array( + new Twig_SimpleFilter('trans', 'gettext'), + ); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'i18n'; + } +} + +class_alias('Twig_Extensions_Extension_I18n', 'Twig\Extensions\I18nExtension', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php new file mode 100644 index 0000000..49b0f88 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php @@ -0,0 +1,146 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class Twig_Extensions_Extension_Intl extends Twig_Extension +{ + public function __construct() + { + if (!class_exists('IntlDateFormatter')) { + throw new RuntimeException('The native PHP intl extension (http://php.net/manual/en/book.intl.php) is needed to use intl-based filters.'); + } + } + + /** + * {@inheritdoc} + */ + public function getFilters() + { + return array( + new Twig_SimpleFilter('localizeddate', 'twig_localized_date_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('localizednumber', 'twig_localized_number_filter'), + new Twig_SimpleFilter('localizedcurrency', 'twig_localized_currency_filter'), + ); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'intl'; + } +} + +function twig_localized_date_filter(Twig_Environment $env, $date, $dateFormat = 'medium', $timeFormat = 'medium', $locale = null, $timezone = null, $format = null, $calendar = 'gregorian') +{ + $date = twig_date_converter($env, $date, $timezone); + + $formatValues = array( + 'none' => IntlDateFormatter::NONE, + 'short' => IntlDateFormatter::SHORT, + 'medium' => IntlDateFormatter::MEDIUM, + 'long' => IntlDateFormatter::LONG, + 'full' => IntlDateFormatter::FULL, + ); + + if (PHP_VERSION_ID < 50500 || !class_exists('IntlTimeZone')) { + $formatter = IntlDateFormatter::create( + $locale, + $formatValues[$dateFormat], + $formatValues[$timeFormat], + $date->getTimezone()->getName(), + 'gregorian' === $calendar ? IntlDateFormatter::GREGORIAN : IntlDateFormatter::TRADITIONAL, + $format + ); + + return $formatter->format($date->getTimestamp()); + } + + $formatter = IntlDateFormatter::create( + $locale, + $formatValues[$dateFormat], + $formatValues[$timeFormat], + IntlTimeZone::createTimeZone($date->getTimezone()->getName()), + 'gregorian' === $calendar ? IntlDateFormatter::GREGORIAN : IntlDateFormatter::TRADITIONAL, + $format + ); + + return $formatter->format($date->getTimestamp()); +} + +function twig_localized_number_filter($number, $style = 'decimal', $type = 'default', $locale = null) +{ + static $typeValues = array( + 'default' => NumberFormatter::TYPE_DEFAULT, + 'int32' => NumberFormatter::TYPE_INT32, + 'int64' => NumberFormatter::TYPE_INT64, + 'double' => NumberFormatter::TYPE_DOUBLE, + 'currency' => NumberFormatter::TYPE_CURRENCY, + ); + + $formatter = twig_get_number_formatter($locale, $style); + + if (!isset($typeValues[$type])) { + throw new Twig_Error_Syntax(sprintf('The type "%s" does not exist. Known types are: "%s"', $type, implode('", "', array_keys($typeValues)))); + } + + return $formatter->format($number, $typeValues[$type]); +} + +function twig_localized_currency_filter($number, $currency = null, $locale = null) +{ + $formatter = twig_get_number_formatter($locale, 'currency'); + + return $formatter->formatCurrency($number, $currency); +} + +/** + * Gets a number formatter instance according to given locale and formatter. + * + * @param string $locale Locale in which the number would be formatted + * @param int $style Style of the formatting + * + * @return NumberFormatter A NumberFormatter instance + */ +function twig_get_number_formatter($locale, $style) +{ + static $formatter, $currentStyle; + + $locale = null !== $locale ? $locale : Locale::getDefault(); + + if ($formatter && $formatter->getLocale() === $locale && $currentStyle === $style) { + // Return same instance of NumberFormatter if parameters are the same + // to those in previous call + return $formatter; + } + + static $styleValues = array( + 'decimal' => NumberFormatter::DECIMAL, + 'currency' => NumberFormatter::CURRENCY, + 'percent' => NumberFormatter::PERCENT, + 'scientific' => NumberFormatter::SCIENTIFIC, + 'spellout' => NumberFormatter::SPELLOUT, + 'ordinal' => NumberFormatter::ORDINAL, + 'duration' => NumberFormatter::DURATION, + ); + + if (!isset($styleValues[$style])) { + throw new Twig_Error_Syntax(sprintf('The style "%s" does not exist. Known styles are: "%s"', $style, implode('", "', array_keys($styleValues)))); + } + + $currentStyle = $style; + + $formatter = NumberFormatter::create($locale, $styleValues[$style]); + + return $formatter; +} + +class_alias('Twig_Extensions_Extension_Intl', 'Twig\Extensions\IntlExtension', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php new file mode 100644 index 0000000..52d3591 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Extension/Text.php @@ -0,0 +1,99 @@ +<?php + +/** + * This file is part of Twig. + * + * (c) 2009 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @author Henrik Bjornskov <hb@peytz.dk> + */ +class Twig_Extensions_Extension_Text extends Twig_Extension +{ + /** + * {@inheritdoc} + */ + public function getFilters() + { + return array( + new Twig_SimpleFilter('truncate', 'twig_truncate_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('wordwrap', 'twig_wordwrap_filter', array('needs_environment' => true)), + ); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'Text'; + } +} + +if (function_exists('mb_get_info')) { + function twig_truncate_filter(Twig_Environment $env, $value, $length = 30, $preserve = false, $separator = '...') + { + if (mb_strlen($value, $env->getCharset()) > $length) { + if ($preserve) { + // If breakpoint is on the last word, return the value without separator. + if (false === ($breakpoint = mb_strpos($value, ' ', $length, $env->getCharset()))) { + return $value; + } + + $length = $breakpoint; + } + + return rtrim(mb_substr($value, 0, $length, $env->getCharset())).$separator; + } + + return $value; + } + + function twig_wordwrap_filter(Twig_Environment $env, $value, $length = 80, $separator = "\n", $preserve = false) + { + $sentences = array(); + + $previous = mb_regex_encoding(); + mb_regex_encoding($env->getCharset()); + + $pieces = mb_split($separator, $value); + mb_regex_encoding($previous); + + foreach ($pieces as $piece) { + while (!$preserve && mb_strlen($piece, $env->getCharset()) > $length) { + $sentences[] = mb_substr($piece, 0, $length, $env->getCharset()); + $piece = mb_substr($piece, $length, 2048, $env->getCharset()); + } + + $sentences[] = $piece; + } + + return implode($separator, $sentences); + } +} else { + function twig_truncate_filter(Twig_Environment $env, $value, $length = 30, $preserve = false, $separator = '...') + { + if (strlen($value) > $length) { + if ($preserve) { + if (false !== ($breakpoint = strpos($value, ' ', $length))) { + $length = $breakpoint; + } + } + + return rtrim(substr($value, 0, $length)).$separator; + } + + return $value; + } + + function twig_wordwrap_filter(Twig_Environment $env, $value, $length = 80, $separator = "\n", $preserve = false) + { + return wordwrap($value, $length, $separator, !$preserve); + } +} + +class_alias('Twig_Extensions_Extension_Text', 'Twig\Extensions\TextExtension', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar.php new file mode 100644 index 0000000..b6cc0a7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +abstract class Twig_Extensions_Grammar implements Twig_Extensions_GrammarInterface +{ + protected $name; + protected $parser; + + /** + * @param string $name + */ + public function __construct($name) + { + $this->name = $name; + } + + /** + * @param Twig_Parser $parser + */ + public function setParser(Twig_Parser $parser) + { + $this->parser = $parser; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Arguments.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Arguments.php new file mode 100644 index 0000000..abb9e0e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Arguments.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Arguments extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:arguments>', $this->name); + } + + public function parse(Twig_Token $token) + { + return $this->parser->getExpressionParser()->parseArguments(); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Array.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Array.php new file mode 100644 index 0000000..94d7b8c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Array.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Array extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:array>', $this->name); + } + + public function parse(Twig_Token $token) + { + return $this->parser->getExpressionParser()->parseArrayExpression(); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Body.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Body.php new file mode 100644 index 0000000..b2ac43e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Body.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Body extends Twig_Extensions_Grammar +{ + protected $end; + + public function __construct($name, $end = null) + { + parent::__construct($name); + + $this->end = null === $end ? 'end'.$name : $end; + } + + public function __toString() + { + return sprintf('<%s:body>', $this->name); + } + + public function parse(Twig_Token $token) + { + $stream = $this->parser->getStream(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return $this->parser->subparse(array($this, 'decideBlockEnd'), true); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test($this->end); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Boolean.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Boolean.php new file mode 100644 index 0000000..578567e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Boolean.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Boolean extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:boolean>', $this->name); + } + + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, array('true', 'false')); + + return new Twig_Node_Expression_Constant('true' === $token->getValue() ? true : false, $token->getLine()); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Constant.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Constant.php new file mode 100644 index 0000000..8d82b82 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Constant.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Constant extends Twig_Extensions_Grammar +{ + protected $type; + + public function __construct($name, $type = null) + { + $this->name = $name; + $this->type = null === $type ? Twig_Token::NAME_TYPE : $type; + } + + public function __toString() + { + return $this->name; + } + + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect($this->type, $this->name); + + return $this->name; + } + + public function getType() + { + return $this->type; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Expression.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Expression.php new file mode 100644 index 0000000..b73156e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Expression.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Expression extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s>', $this->name); + } + + public function parse(Twig_Token $token) + { + return $this->parser->getExpressionParser()->parseExpression(); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Hash.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Hash.php new file mode 100644 index 0000000..5ea3e69 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Hash.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Hash extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:hash>', $this->name); + } + + public function parse(Twig_Token $token) + { + return $this->parser->getExpressionParser()->parseHashExpression(); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Number.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Number.php new file mode 100644 index 0000000..68bbb62 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Number.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Number extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:number>', $this->name); + } + + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE); + + return new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Optional.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Optional.php new file mode 100644 index 0000000..0cde9bc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Optional.php @@ -0,0 +1,73 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Optional extends Twig_Extensions_Grammar +{ + protected $grammar; + + public function __construct() + { + $this->grammar = array(); + foreach (func_get_args() as $grammar) { + $this->addGrammar($grammar); + } + } + + public function __toString() + { + $repr = array(); + foreach ($this->grammar as $grammar) { + $repr[] = (string) $grammar; + } + + return sprintf('[%s]', implode(' ', $repr)); + } + + public function addGrammar(Twig_Extensions_GrammarInterface $grammar) + { + $this->grammar[] = $grammar; + } + + public function parse(Twig_Token $token) + { + // test if we have the optional element before consuming it + if ($this->grammar[0] instanceof Twig_Extensions_Grammar_Constant) { + if (!$this->parser->getStream()->test($this->grammar[0]->getType(), $this->grammar[0]->getName())) { + return array(); + } + } elseif ($this->grammar[0] instanceof Twig_Extensions_Grammar_Name) { + if (!$this->parser->getStream()->test(Twig_Token::NAME_TYPE)) { + return array(); + } + } elseif ($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) { + // if this is not a Constant or a Name, it must be the last element of the tag + + return array(); + } + + $elements = array(); + foreach ($this->grammar as $grammar) { + $grammar->setParser($this->parser); + + $element = $grammar->parse($token); + if (is_array($element)) { + $elements = array_merge($elements, $element); + } else { + $elements[$grammar->getName()] = $element; + } + } + + return $elements; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Switch.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Switch.php new file mode 100644 index 0000000..407cc20 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Switch.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Switch extends Twig_Extensions_Grammar +{ + public function __toString() + { + return sprintf('<%s:switch>', $this->name); + } + + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, $this->name); + + return new Twig_Node_Expression_Constant(true, $token->getLine()); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Tag.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Tag.php new file mode 100644 index 0000000..2506efa --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Grammar/Tag.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +class Twig_Extensions_Grammar_Tag extends Twig_Extensions_Grammar +{ + protected $grammar; + + public function __construct() + { + $this->grammar = array(); + foreach (func_get_args() as $grammar) { + $this->addGrammar($grammar); + } + } + + public function __toString() + { + $repr = array(); + foreach ($this->grammar as $grammar) { + $repr[] = (string) $grammar; + } + + return implode(' ', $repr); + } + + public function addGrammar(Twig_Extensions_GrammarInterface $grammar) + { + $this->grammar[] = $grammar; + } + + public function parse(Twig_Token $token) + { + $elements = array(); + foreach ($this->grammar as $grammar) { + $grammar->setParser($this->parser); + + $element = $grammar->parse($token); + if (is_array($element)) { + $elements = array_merge($elements, $element); + } else { + $elements[$grammar->getName()] = $element; + } + } + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return $elements; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/GrammarInterface.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/GrammarInterface.php new file mode 100644 index 0000000..b4854da --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/GrammarInterface.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @deprecated since version 1.5 + */ +interface Twig_Extensions_GrammarInterface +{ + public function setParser(Twig_Parser $parser); + + public function parse(Twig_Token $token); + + public function getName(); +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Node/Trans.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Node/Trans.php new file mode 100644 index 0000000..ad65226 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/Node/Trans.php @@ -0,0 +1,166 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Represents a trans node. + * + * @author Fabien Potencier <fabien.potencier@symfony-project.com> + */ +class Twig_Extensions_Node_Trans extends Twig_Node +{ + public function __construct(Twig_Node $body, Twig_Node $plural = null, Twig_Node_Expression $count = null, Twig_Node $notes = null, $lineno, $tag = null) + { + $nodes = array('body' => $body); + if (null !== $count) { + $nodes['count'] = $count; + } + if (null !== $plural) { + $nodes['plural'] = $plural; + } + if (null !== $notes) { + $nodes['notes'] = $notes; + } + + parent::__construct($nodes, array(), $lineno, $tag); + } + + /** + * {@inheritdoc} + */ + public function compile(Twig_Compiler $compiler) + { + $compiler->addDebugInfo($this); + + list($msg, $vars) = $this->compileString($this->getNode('body')); + + if ($this->hasNode('plural')) { + list($msg1, $vars1) = $this->compileString($this->getNode('plural')); + + $vars = array_merge($vars, $vars1); + } + + $function = $this->getTransFunction($this->hasNode('plural')); + + if ($this->hasNode('notes')) { + $message = trim($this->getNode('notes')->getAttribute('data')); + + // line breaks are not allowed cause we want a single line comment + $message = str_replace(array("\n", "\r"), ' ', $message); + $compiler->write("// notes: {$message}\n"); + } + + if ($vars) { + $compiler + ->write('echo strtr('.$function.'(') + ->subcompile($msg) + ; + + if ($this->hasNode('plural')) { + $compiler + ->raw(', ') + ->subcompile($msg1) + ->raw(', abs(') + ->subcompile($this->hasNode('count') ? $this->getNode('count') : null) + ->raw(')') + ; + } + + $compiler->raw('), array('); + + foreach ($vars as $var) { + if ('count' === $var->getAttribute('name')) { + $compiler + ->string('%count%') + ->raw(' => abs(') + ->subcompile($this->hasNode('count') ? $this->getNode('count') : null) + ->raw('), ') + ; + } else { + $compiler + ->string('%'.$var->getAttribute('name').'%') + ->raw(' => ') + ->subcompile($var) + ->raw(', ') + ; + } + } + + $compiler->raw("));\n"); + } else { + $compiler + ->write('echo '.$function.'(') + ->subcompile($msg) + ; + + if ($this->hasNode('plural')) { + $compiler + ->raw(', ') + ->subcompile($msg1) + ->raw(', abs(') + ->subcompile($this->hasNode('count') ? $this->getNode('count') : null) + ->raw(')') + ; + } + + $compiler->raw(");\n"); + } + } + + /** + * @param Twig_Node $body A Twig_Node instance + * + * @return array + */ + protected function compileString(Twig_Node $body) + { + if ($body instanceof Twig_Node_Expression_Name || $body instanceof Twig_Node_Expression_Constant || $body instanceof Twig_Node_Expression_TempName) { + return array($body, array()); + } + + $vars = array(); + if (count($body)) { + $msg = ''; + + foreach ($body as $node) { + if (get_class($node) === 'Twig_Node' && $node->getNode(0) instanceof Twig_Node_SetTemp) { + $node = $node->getNode(1); + } + + if ($node instanceof Twig_Node_Print) { + $n = $node->getNode('expr'); + while ($n instanceof Twig_Node_Expression_Filter) { + $n = $n->getNode('node'); + } + $msg .= sprintf('%%%s%%', $n->getAttribute('name')); + $vars[] = new Twig_Node_Expression_Name($n->getAttribute('name'), $n->getTemplateLine()); + } else { + $msg .= $node->getAttribute('data'); + } + } + } else { + $msg = $body->getAttribute('data'); + } + + return array(new Twig_Node(array(new Twig_Node_Expression_Constant(trim($msg), $body->getTemplateLine()))), $vars); + } + + /** + * @param bool $plural Return plural or singular function to use + * + * @return string + */ + protected function getTransFunction($plural) + { + return $plural ? 'ngettext' : 'gettext'; + } +} + +class_alias('Twig_Extensions_Node_Trans', 'Twig\Extensions\Node\TransNode', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/SimpleTokenParser.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/SimpleTokenParser.php new file mode 100644 index 0000000..76fa9d3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/SimpleTokenParser.php @@ -0,0 +1,138 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +@trigger_error('The grammar feature is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED); + +/** + * @deprecated since version 1.5 + */ +abstract class Twig_Extensions_SimpleTokenParser extends Twig_TokenParser +{ + /** + * Parses a token and returns a node. + * + * @param Twig_Token $token A Twig_Token instance + * + * @return Twig_Node A Twig_Node instance + */ + public function parse(Twig_Token $token) + { + $grammar = $this->getGrammar(); + if (!is_object($grammar)) { + $grammar = self::parseGrammar($grammar); + } + + $grammar->setParser($this->parser); + $values = $grammar->parse($token); + + return $this->getNode($values, $token->getLine()); + } + + /** + * Gets the grammar as an object or as a string. + * + * @return string|Twig_Extensions_Grammar A Twig_Extensions_Grammar instance or a string + */ + abstract protected function getGrammar(); + + /** + * Gets the nodes based on the parsed values. + * + * @param array $values An array of values + * @param int $line The parser line + */ + abstract protected function getNode(array $values, $line); + + protected function getAttribute($node, $attribute, $arguments = array(), $type = Twig_Node_Expression_GetAttr::TYPE_ANY, $line = -1) + { + return new Twig_Node_Expression_GetAttr( + $node instanceof Twig_Node ? $node : new Twig_Node_Expression_Name($node, $line), + $attribute instanceof Twig_Node ? $attribute : new Twig_Node_Expression_Constant($attribute, $line), + $arguments instanceof Twig_Node ? $arguments : new Twig_Node($arguments), + $type, + $line + ); + } + + protected function call($node, $attribute, $arguments = array(), $line = -1) + { + return $this->getAttribute($node, $attribute, $arguments, Twig_Node_Expression_GetAttr::TYPE_METHOD, $line); + } + + protected function markAsSafe(Twig_Node $node, $line = -1) + { + return new Twig_Node_Expression_Filter( + $node, + new Twig_Node_Expression_Constant('raw', $line), + new Twig_Node(), + $line + ); + } + + protected function output(Twig_Node $node, $line = -1) + { + return new Twig_Node_Print($node, $line); + } + + protected function getNodeValues(array $values) + { + $nodes = array(); + foreach ($values as $value) { + if ($value instanceof Twig_Node) { + $nodes[] = $value; + } + } + + return $nodes; + } + + public static function parseGrammar($str, $main = true) + { + static $cursor; + + if (true === $main) { + $cursor = 0; + $grammar = new Twig_Extensions_Grammar_Tag(); + } else { + $grammar = new Twig_Extensions_Grammar_Optional(); + } + + while ($cursor < strlen($str)) { + if (preg_match('/\s+/A', $str, $match, null, $cursor)) { + $cursor += strlen($match[0]); + } elseif (preg_match('/<(\w+)(?:\:(\w+))?>/A', $str, $match, null, $cursor)) { + $class = sprintf('Twig_Extensions_Grammar_%s', ucfirst(isset($match[2]) ? $match[2] : 'Expression')); + if (!class_exists($class)) { + throw new Twig_Error_Runtime(sprintf('Unable to understand "%s" in grammar (%s class does not exist)', $match[0], $class)); + } + $grammar->addGrammar(new $class($match[1])); + $cursor += strlen($match[0]); + } elseif (preg_match('/\w+/A', $str, $match, null, $cursor)) { + $grammar->addGrammar(new Twig_Extensions_Grammar_Constant($match[0])); + $cursor += strlen($match[0]); + } elseif (preg_match('/,/A', $str, $match, null, $cursor)) { + $grammar->addGrammar(new Twig_Extensions_Grammar_Constant($match[0], Twig_Token::PUNCTUATION_TYPE)); + $cursor += strlen($match[0]); + } elseif (preg_match('/\[/A', $str, $match, null, $cursor)) { + $cursor += strlen($match[0]); + $grammar->addGrammar(self::parseGrammar($str, false)); + } elseif (true !== $main && preg_match('/\]/A', $str, $match, null, $cursor)) { + $cursor += strlen($match[0]); + + return $grammar; + } else { + throw new Twig_Error_Runtime(sprintf('Unable to parse grammar "%s" near "...%s..."', $str, substr($str, $cursor, 10))); + } + } + + return $grammar; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/TokenParser/Trans.php b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/TokenParser/Trans.php new file mode 100644 index 0000000..4d4f600 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/lib/Twig/Extensions/TokenParser/Trans.php @@ -0,0 +1,88 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class Twig_Extensions_TokenParser_Trans extends Twig_TokenParser +{ + /** + * {@inheritdoc} + */ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $count = null; + $plural = null; + $notes = null; + + if (!$stream->test(Twig_Token::BLOCK_END_TYPE)) { + $body = $this->parser->getExpressionParser()->parseExpression(); + } else { + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideForFork')); + $next = $stream->next()->getValue(); + + if ('plural' === $next) { + $count = $this->parser->getExpressionParser()->parseExpression(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $plural = $this->parser->subparse(array($this, 'decideForFork')); + + if ('notes' === $stream->next()->getValue()) { + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $notes = $this->parser->subparse(array($this, 'decideForEnd'), true); + } + } elseif ('notes' === $next) { + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $notes = $this->parser->subparse(array($this, 'decideForEnd'), true); + } + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $this->checkTransString($body, $lineno); + + return new Twig_Extensions_Node_Trans($body, $plural, $count, $notes, $lineno, $this->getTag()); + } + + public function decideForFork(Twig_Token $token) + { + return $token->test(array('plural', 'notes', 'endtrans')); + } + + public function decideForEnd(Twig_Token $token) + { + return $token->test('endtrans'); + } + + /** + * {@inheritdoc} + */ + public function getTag() + { + return 'trans'; + } + + protected function checkTransString(Twig_Node $body, $lineno) + { + foreach ($body as $i => $node) { + if ( + $node instanceof Twig_Node_Text + || + ($node instanceof Twig_Node_Print && $node->getNode('expr') instanceof Twig_Node_Expression_Name) + ) { + continue; + } + + throw new Twig_Error_Syntax(sprintf('The text to be translated with "trans" can only contain references to simple variables'), $lineno); + } + } +} + +class_alias('Twig_Extensions_TokenParser_Trans', 'Twig\Extensions\TokenParser\TransTokenParser', false); diff --git a/srcs/phpmyadmin/vendor/twig/extensions/phpunit.xml.dist b/srcs/phpmyadmin/vendor/twig/extensions/phpunit.xml.dist new file mode 100644 index 0000000..4d49fa6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/phpunit.xml.dist @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<phpunit backupGlobals="false" + backupStaticAttributes="false" + colors="true" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + processIsolation="false" + stopOnFailure="false" + syntaxCheck="false" + bootstrap="vendor/autoload.php" +> + <testsuites> + <testsuite name="Twig Extensions Test Suite"> + <directory>./test/Twig/</directory> + </testsuite> + </testsuites> + + <filter> + <whitelist> + <directory suffix=".php">./lib/Twig/</directory> + </whitelist> + </filter> +</phpunit> diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/ArrayExtension.php b/srcs/phpmyadmin/vendor/twig/extensions/src/ArrayExtension.php new file mode 100644 index 0000000..22ee3ed --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/ArrayExtension.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions; + +class_exists('Twig_Extensions_Extension_Array'); + +if (\false) { + class ArrayExtension extends \Twig_Extensions_Extension_Array + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/DateExtension.php b/srcs/phpmyadmin/vendor/twig/extensions/src/DateExtension.php new file mode 100644 index 0000000..d7a002a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/DateExtension.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions; + +class_exists('Twig_Extensions_Extension_Date'); + +if (\false) { + class DateExtension extends \Twig_Extensions_Extension_Date + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/I18nExtension.php b/srcs/phpmyadmin/vendor/twig/extensions/src/I18nExtension.php new file mode 100644 index 0000000..c8e3ca9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/I18nExtension.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions; + +class_exists('Twig_Extensions_Extension_I18n'); + +if (\false) { + class I18nExtension extends \Twig_Extensions_Extension_I18n + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/IntlExtension.php b/srcs/phpmyadmin/vendor/twig/extensions/src/IntlExtension.php new file mode 100644 index 0000000..eac25c1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/IntlExtension.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions; + +class_exists('Twig_Extensions_Extension_Intl'); + +if (\false) { + class IntlExtension extends \Twig_Extensions_Extension_Intl + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/Node/TransNode.php b/srcs/phpmyadmin/vendor/twig/extensions/src/Node/TransNode.php new file mode 100644 index 0000000..c83e228 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/Node/TransNode.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions\Node; + +class_exists('Twig_Extensions_Node_Trans'); + +if (\false) { + class TransNode extends \Twig_Extensions_Node_Trans + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/TextExtension.php b/srcs/phpmyadmin/vendor/twig/extensions/src/TextExtension.php new file mode 100644 index 0000000..bc25bfe --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/TextExtension.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions; + +class_exists('Twig_Extensions_Extension_Text'); + +if (\false) { + class TextExtension extends \Twig_Extensions_Extension_Text + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/extensions/src/TokenParser/TransTokenParser.php b/srcs/phpmyadmin/vendor/twig/extensions/src/TokenParser/TransTokenParser.php new file mode 100644 index 0000000..fe1f04b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/extensions/src/TokenParser/TransTokenParser.php @@ -0,0 +1,11 @@ +<?php + +namespace Twig\Extensions\TokenParser; + +class_exists('Twig_Extensions_TokenParser_Trans'); + +if (\false) { + class TransTokenParser extends \Twig_Extensions_TokenParser_Trans + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/.editorconfig b/srcs/phpmyadmin/vendor/twig/twig/.editorconfig new file mode 100644 index 0000000..270f1d1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/.editorconfig @@ -0,0 +1,18 @@ +; top-most EditorConfig file +root = true + +; Unix-style newlines +[*] +end_of_line = LF + +[*.php] +indent_style = space +indent_size = 4 + +[*.test] +indent_style = space +indent_size = 4 + +[*.rst] +indent_style = space +indent_size = 4 diff --git a/srcs/phpmyadmin/vendor/twig/twig/.php_cs.dist b/srcs/phpmyadmin/vendor/twig/twig/.php_cs.dist new file mode 100644 index 0000000..b81882f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/.php_cs.dist @@ -0,0 +1,20 @@ +<?php + +return PhpCsFixer\Config::create() + ->setRules([ + '@Symfony' => true, + '@Symfony:risky' => true, + '@PHPUnit75Migration:risky' => true, + 'php_unit_dedicate_assert' => ['target' => '5.6'], + 'array_syntax' => ['syntax' => 'short'], + 'php_unit_fqcn_annotation' => true, + 'no_unreachable_default_argument_value' => false, + 'braces' => ['allow_single_line_closure' => true], + 'heredoc_to_nowdoc' => false, + 'ordered_imports' => true, + 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], + 'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'all'], + ]) + ->setRiskyAllowed(true) + ->setFinder(PhpCsFixer\Finder::create()->in(__DIR__)) +; diff --git a/srcs/phpmyadmin/vendor/twig/twig/.travis.yml b/srcs/phpmyadmin/vendor/twig/twig/.travis.yml new file mode 100644 index 0000000..0e8536b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/.travis.yml @@ -0,0 +1,45 @@ +language: php + +cache: + directories: + - vendor + - extra/*/vendor + - $HOME/.composer/cache/files + +env: + global: + - SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 + - SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE=1 + +before_install: + - phpenv config-rm xdebug.ini || return 0 + +install: + - travis_retry composer install + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/cssinliner-extra && travis_retry composer install) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/html-extra && travis_retry composer install) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/inky-extra && travis_retry composer install) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/intl-extra && travis_retry composer install) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/markdown-extra && travis_retry composer install) + - ([[ $TRAVIS_PHP_VERSION < 7.2 ]] || cd extra/string-extra && travis_retry composer install) + +script: + - ./vendor/bin/simple-phpunit + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/cssinliner-extra && ./vendor/bin/simple-phpunit) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/html-extra && ./vendor/bin/simple-phpunit) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/inky-extra && ./vendor/bin/simple-phpunit) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/intl-extra && ./vendor/bin/simple-phpunit) + - ([[ $TRAVIS_PHP_VERSION = 7.0 ]] || cd extra/markdown-extra && ./vendor/bin/simple-phpunit) + - ([[ $TRAVIS_PHP_VERSION < 7.2 ]] || cd extra/string-extra && ./vendor/bin/simple-phpunit) + +jobs: + fast_finish: true + include: + - php: 7.0 + - php: 7.1 + - php: 7.2 + - php: 7.3 + - php: 7.4snapshot + - stage: integration tests + php: 7.3 + script: ./drupal_test.sh diff --git a/srcs/phpmyadmin/vendor/twig/twig/CHANGELOG b/srcs/phpmyadmin/vendor/twig/twig/CHANGELOG new file mode 100644 index 0000000..660ff5d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/CHANGELOG @@ -0,0 +1,1431 @@ +* 2.12.3 (2019-12-28) + + * fixed Symfony 5.0 support for the HTML extra extension + * fixed number formatter in Intl extra extension when using a formatter prototype + +* 2.12.2 (2019-11-11) + + * added supported for exponential numbers + +* 2.12.1 (2019-10-17) + + * added the String extension in the "extra" repositories: "u" filter + +* 2.12.0 (2019-10-05) + + * added the spaceship operator ("<=>"), useful when using an arrow function in the "sort" filter + * added support for an "arrow" function on the "sort" filter + * added the CssInliner extension in the "extra" repositories: "inline_css" + filter + * added the Inky extension in the "extra" repositories: "inky_to_html" filter + * added Intl extension in the "extra" repositories: "country_name", + "currency_name", "currency_symbol", "language_name", "locale_name", + "timezone_name", "format_currency", "format_number", + "format_*_number", "format_datetime", "format_date", and "format_time" + filters, and the "country_timezones" function + * added the Markdown extension in the "extra" repositories: "markdown_to_html", + and "html_to_markdown" filters + * added the HtmlExtension extension in the "extra" repositories: "date_uri" + filter, and "html_classes" function + * optimized "block('foo') ?? 'bar'" + * fixed the empty test on Traversable instances + * fixed array_key_exists() on objects + * fixed cache when opcache is installed but disabled + * fixed using macros in arrow functions + * fixed split filter on edge case + +* 2.11.3 (2019-06-18) + + * display partial output (PHP buffer) when an error occurs in debug mode + * fixed the filter filter (allow the result to be used several times) + * fixed macro auto-import when a template contains only macros + +* 2.11.2 (2019-06-05) + + * fixed macro auto-import + +* 2.11.1 (2019-06-04) + + * added support for "Twig\Markup" instances in the "in" test (again) + * allowed string operators as variables names in assignments + * fixed support for macros defined in parent templates + +* 2.11.0 (2019-05-31) + + * added the possibility to register classes/interfaces as being safe for the escaper ("EscaperExtension::addSafeClass()") + * deprecated CoreExtension::setEscaper() and CoreExtension::getEscapers() in favor of the same methods on EscaperExtension + * macros are now auto-imported in the template they are defined (under the ``_self`` variable) + * added support for macros on "is defined" tests + * fixed macros "import" when using the same name in the parent and child templates + * fixed recursive macros + * macros imported "globally" in a template are now available in macros without re-importing them + * fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance) + * fixed a PHP fatal error when calling a macro imported in a block in a nested block + * fixed a PHP fatal error when calling a macro imported in the template in another macro + * fixed wrong error message on "import" and "from" + +* 2.10.0 (2019-05-14) + + * deprecated "if" conditions on "for" tags + * added "filter", "map", and "reduce" filters (and support for arrow functions) + * fixed partial output leak when a PHP fatal error occurs + * optimized context access on PHP 7.4 + +* 2.9.0 (2019-04-28) + + * deprecated returning "false" to remove a Node from NodeVisitorInterface::leaveNode() + * allowed Twig\NodeVisitor\NodeVisitorInterface::leaveNode() to return "null" instead of "false" (same meaning) + * deprecated the "filter" tag (use the "apply" tag instead) + * added the "apply" tag as a replacement for the "filter" tag + * allowed Twig\Loader\FilesystemLoader::findTemplate() to return "null" instead of "false" (same meaning) + * added support for "Twig\Markup" instances in the "in" test + * fixed "import" when macros are stored in a template string + * fixed Lexer when using custom options containing the # char + * added template line number to twig_get_attribute() + +* 2.8.1 (2019-04-16) + + * fixed EscaperNodeVisitor + * deprecated passing a 3rd, 4th, and 5th arguments to the Sandbox exception classes + * deprecated Node::setTemplateName() in favor of Node::setSourceContext() + +* 2.8.0 (2019-04-16) + + * added Traversable support for the length filter + * fixed some wrong location in error messages + * made exception creation faster + * made escaping on ternary expressions (?: and ??) more fine-grained + * added the possibility to give a nice name to string templates (template_from_string function) + * fixed the "with" behavior to always include the globals (for consistency with the "include" and "embed" tags) + * fixed "include" with "ignore missing" when an error loading occurs in the included template + * added support for a new whitespace trimming option ({%~ ~%}, {{~ ~}}, {#~ ~#}) + * added the "column" filter + +* 2.7.4 (2019-03-23) + + * fixed variadic support + * fixed CheckToStringNode implementation (broken when a function/filter is variadic) + +* 2.7.3 (2019-03-21) + + * fixed the spaceless filter so that it behaves like the spaceless tag + * fixed BC break on Environment::resolveTemplate() + * allowed Traversable objects to be used in the "with" tag + * allowed Traversable objects to be used in the "with" tag + * allowed Traversable objects to be used in the "with" argument of the "include" and "embed" tags + +* 2.7.2 (2019-03-12) + + * added TemplateWrapper::getTemplateName() + +* 2.7.1 (2019-03-12) + + * fixed class aliases + +* 2.7.0 (2019-03-12) + + * fixed sandbox security issue (under some circumstances, calling the + __toString() method on an object was possible even if not allowed by the + security policy) + * fixed batch filter clobbers array keys when fill parameter is used + * added preserveKeys support for the batch filter + * fixed "embed" support when used from "template_from_string" + * deprecated passing a Twig\Template to Twig\Environment::load()/Twig\Environment::resolveTemplate() + * added the possibility to pass a TemplateWrapper to Twig\Environment::load() + * marked Twig\Environment::getTemplateClass() as internal (implementation detail) + * improved the performance of the sandbox + * deprecated the spaceless tag + * added a spaceless filter + * added max value to the "random" function + * deprecated Twig\Extension\InitRuntimeInterface + * deprecated Twig\Loader\ExistsLoaderInterface + * deprecated PSR-0 classes in favor of namespaced ones + * made namespace classes the default classes (PSR-0 ones are aliases now) + * added Twig\Loader\ChainLoader::getLoaders() + * removed duplicated directory separator in FilesystemLoader + * deprecated the "base_template_class" option on Twig\Environment + * deprecated the Twig\Environment::getBaseTemplateClass() and + Twig\Environment::setBaseTemplateClass() methods + * changed internal code to use the namespaced classes as much as possible + * deprecated Twig_Parser::isReservedMacroName() + +* 2.6.2 (2019-01-14) + + * fixed regression (key exists check for non ArrayObject objects) + +* 2.6.1 (2019-01-14) + + * fixed ArrayObject access with a null value + * fixed embedded templates starting with a BOM + * fixed using a Twig_TemplateWrapper instance as an argument to extends + * fixed error location when calling an undefined block + * deprecated passing a string as a source on Twig_Error + * switched generated code to use the PHP short array notation + * fixed float representation in compiled templates + * added a second argument to the join filter (last separator configuration) + +* 2.6.0 (2018-12-16) + + * made sure twig_include returns a string + * fixed multi-byte UFT-8 in escape('html_attr') + * added the "deprecated" tag + * added support for dynamically named tests + * fixed GlobalsInterface extended class + * fixed filesystem loader throwing an exception instead of returning false + +* 2.5.0 (2018-07-13) + + * deprecated using the spaceless tag at the root level of a child template (noop anyway) + * deprecated the possibility to define a block in a non-capturing block in a child template + * added the Symfony ctype polyfill as a dependency + * fixed reporting the proper location for errors compiled in templates + * fixed the error handling for the optimized extension-based function calls + * ensured that syntax errors are triggered with the right line + * "js" filter now produces valid JSON + +* 2.4.8 (2018-04-02) + + * fixed a regression when using the "default" filter or the "defined" test on non-existing arrays + +* 2.4.7 (2018-03-20) + + * optimized runtime performance + * optimized parser performance by inlining the constant values + * fixed block names unicity + * fixed counting children of SimpleXMLElement objects + * added missing else clause to avoid infinite loops + * fixed .. (range operator) in sandbox policy + +* 2.4.6 (2018-03-03) + + * fixed a regression in the way the profiler is registered in templates + +* 2.4.5 (2018-03-02) + + * optimized the performance of calling an extension method at runtime + * optimized the performance of the dot operator for array and method calls + * added an exception when using "===" instead of "same as" + * fixed possible array to string conversion concealing actual error + * made variable names deterministic in compiled templates + * fixed length filter when passing an instance of IteratorAggregate + * fixed Environment::resolveTemplate to accept instances of TemplateWrapper + +* 2.4.4 (2017-09-27) + + * added Twig_Profiler_Profile::reset() + * fixed use TokenParser to return an empty Node + * added RuntimeExtensionInterface + * added circular reference detection when loading templates + * added support for runtime loaders in IntegrationTestCase + * fixed deprecation when using Twig_Profiler_Dumper_Html + * removed @final from Twig_Profiler_Dumper_Text + +* 2.4.3 (2017-06-07) + + * fixed namespaces introduction + +* 2.4.2 (2017-06-05) + + * fixed namespaces introduction + +* 2.4.1 (2017-06-05) + + * fixed namespaces introduction + +* 2.4.0 (2017-06-05) + + * added support for PHPUnit 6 when testing extensions + * fixed PHP 7.2 compatibility + * fixed template name generation in Twig_Environment::createTemplate() + * removed final tag on Twig_TokenParser_Include + * dropped HHVM support + * added namespaced aliases for all (non-deprecated) classes and interfaces + * marked Twig_Filter, Twig_Function, Twig_Test, Twig_Node_Module and Twig_Profiler_Profile as final via the @final annotation + +* 2.3.2 (2017-04-20) + + * fixed edge case in the method cache for Twig attributes + +* 2.3.1 (2017-04-18) + + * fixed the empty() test + +* 2.3.0 (2017-03-22) + + * fixed a race condition handling when writing cache files + * "length" filter now returns string length when applied to an object that does + not implement \Countable but provides __toString() + * "empty" test will now consider the return value of the __toString() method for + objects implement __toString() but not \Countable + * fixed JS escaping for unicode characters with higher code points + * added error message when calling `parent()` in a block that doesn't exist in the parent template + +* 2.2.0 (2017-02-26) + + * added a PSR-11 compatible runtime loader + * added `side` argument to `trim` to allow left or right trimming only. + +* 2.1.0 (2017-01-11) + + * fixed twig_get_attribute() + * added Twig_NodeCaptureInterface for nodes that capture all output + +* 2.0.0 (2017-01-05) + + * removed the C extension + * moved Twig_Environment::getAttribute() to twig_get_attribute() + * removed Twig_Environment::getLexer(), Twig_Environment::getParser(), Twig_Environment::getCompiler() + * removed Twig_Compiler::getFilename() + * added hasser support in Twig_Template::getAttribute() + * sped up the json_encode filter + * removed reserved macro names; all names can be used as macro + * removed Twig_Template::getEnvironment() + * changed _self variable to return the current template name + * made the loader a required argument of Twig_Environment constructor + * removed Twig_Environment::clearTemplateCache() + * removed Twig_Autoloader (use Composer instead) + * removed `true` as an equivalent to `html` for the auto-escaping strategy + * removed pre-1.8 autoescape tag syntax + * dropped support for PHP 5.x + * removed the ability to register a global variable after the runtime or the extensions have been initialized + * improved the performance of the filesystem loader + * removed features that were deprecated in 1.x + +* 1.42.5 (2019-XX-XX) + + * n/a + +* 1.42.4 (2019-11-11) + + * optimized "block('foo') ?? 'bar" + * added supported for exponential numbers + +* 1.42.3 (2019-08-24) + + * fixed the "split" filter when the delimiter is "0" + * fixed the "empty" test on Traversable instances + * fixed cache when opcache is installed but disabled + * fixed PHP 7.4 compatibility + * bumped the minimal PHP version to 5.5 + +* 1.42.2 (2019-06-18) + + * Display partial output (PHP buffer) when an error occurs in debug mode + +* 1.42.1 (2019-06-04) + + * added support for "Twig\Markup" instances in the "in" test (again) + * allowed string operators as variables names in assignments + +* 1.42.0 (2019-05-31) + + * fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance) + * fixed a PHP fatal error when calling a macro imported in a block in a nested block + * fixed a PHP fatal error when calling a macro imported in the template in another macro + * fixed wrong error message on "import" and "from" + +* 1.41.0 (2019-05-14) + + * fixed support for PHP 7.4 + * added "filter", "map", and "reduce" filters (and support for arrow functions) + * fixed partial output leak when a PHP fatal error occurs + * optimized context access on PHP 7.4 + +* 1.40.1 (2019-04-29) + +* fixed regression in NodeTraverser + +* 1.40.0 (2019-04-28) + + * allowed Twig\NodeVisitor\NodeVisitorInterface::leaveNode() to return "null" instead of "false" (same meaning) + * added the "apply" tag as a replacement for the "filter" tag + * allowed Twig\Loader\FilesystemLoader::findTemplate() to return "null" instead of "false" (same meaning) + * added support for "Twig\Markup" instances in the "in" test + * fixed Lexer when using custom options containing the # char + * fixed "import" when macros are stored in a template string + +* 1.39.1 (2019-04-16) + + * fixed EscaperNodeVisitor + +* 1.39.0 (2019-04-16) + + * added Traversable support for the length filter + * fixed some wrong location in error messages + * made exception creation faster + * made escaping on ternary expressions (?: and ??) more fine-grained + * added the possibility to give a nice name to string templates (template_from_string function) + * fixed the "with" behavior to always include the globals (for consistency with the "include" and "embed" tags) + * fixed "include" with "ignore missing" when an error loading occurs in the included template + * added support for a new whitespace trimming option ({%~ ~%}, {{~ ~}}, {#~ ~#}) + +* 1.38.4 (2019-03-23) + + * fixed CheckToStringNode implementation (broken when a function/filter is variadic) + +* 1.38.3 (2019-03-21) + + * fixed the spaceless filter so that it behaves like the spaceless tag + * fixed BC break on Environment::resolveTemplate() + * fixed the bundled Autoloader to also load namespaced classes + * allowed Traversable objects to be used in the "with" tag + * allowed Traversable objects to be used in the "with" argument of the "include" and "embed" tags + +* 1.38.2 (2019-03-12) + + * added TemplateWrapper::getTemplateName() + +* 1.38.1 (2019-03-12) + + * fixed class aliases + +* 1.38.0 (2019-03-12) + + * fixed sandbox security issue (under some circumstances, calling the + __toString() method on an object was possible even if not allowed by the + security policy) + * fixed batch filter clobbers array keys when fill parameter is used + * added preserveKeys support for the batch filter + * fixed "embed" support when used from "template_from_string" + * added the possibility to pass a TemplateWrapper to Twig\Environment::load() + * improved the performance of the sandbox + * added a spaceless filter + * added max value to the "random" function + * made namespace classes the default classes (PSR-0 ones are aliases now) + * removed duplicated directory separator in FilesystemLoader + * added Twig\Loader\ChainLoader::getLoaders() + * changed internal code to use the namespaced classes as much as possible + +* 1.37.1 (2019-01-14) + + * fixed regression (key exists check for non ArrayObject objects) + * fixed logic in TemplateWrapper + +* 1.37.0 (2019-01-14) + + * fixed ArrayObject access with a null value + * fixed embedded templates starting with a BOM + * fixed using a Twig_TemplateWrapper instance as an argument to extends + * switched generated code to use the PHP short array notation + * dropped PHP 5.3 support + * fixed float representation in compiled templates + * added a second argument to the join filter (last separator configuration) + +* 1.36.0 (2018-12-16) + + * made sure twig_include returns a string + * fixed multi-byte UFT-8 in escape('html_attr') + * added the "deprecated" tag + * added support for dynamically named tests + * fixed GlobalsInterface extended class + * fixed filesystem loader throwing an exception instead of returning false + +* 1.35.4 (2018-07-13) + + * ensured that syntax errors are triggered with the right line + * added the Symfony ctype polyfill as a dependency + * "js" filter now produces valid JSON + +* 1.35.3 (2018-03-20) + + * fixed block names unicity + * fixed counting children of SimpleXMLElement objects + * added missing else clause to avoid infinite loops + * fixed .. (range operator) in sandbox policy + +* 1.35.2 (2018-03-03) + + * fixed a regression in the way the profiler is registered in templates + +* 1.35.1 (2018-03-02) + + * added an exception when using "===" instead of "same as" + * fixed possible array to string conversion concealing actual error + * made variable names deterministic in compiled templates + * fixed length filter when passing an instance of IteratorAggregate + * fixed Environment::resolveTemplate to accept instances of TemplateWrapper + +* 1.35.0 (2017-09-27) + + * added Twig_Profiler_Profile::reset() + * fixed use TokenParser to return an empty Node + * added RuntimeExtensionInterface + * added circular reference detection when loading templates + +* 1.34.4 (2017-07-04) + + * added support for runtime loaders in IntegrationTestCase + * fixed deprecation when using Twig_Profiler_Dumper_Html + +* 1.34.3 (2017-06-07) + + * fixed namespaces introduction + +* 1.34.2 (2017-06-05) + + * fixed namespaces introduction + +* 1.34.1 (2017-06-05) + + * fixed namespaces introduction + +* 1.34.0 (2017-06-05) + + * added support for PHPUnit 6 when testing extensions + * fixed PHP 7.2 compatibility + * fixed template name generation in Twig_Environment::createTemplate() + * removed final tag on Twig_TokenParser_Include + * added namespaced aliases for all (non-deprecated) classes and interfaces + * dropped HHVM support + * dropped PHP 5.2 support + +* 1.33.2 (2017-04-20) + + * fixed edge case in the method cache for Twig attributes + +* 1.33.1 (2017-04-18) + + * fixed the empty() test + +* 1.33.0 (2017-03-22) + + * fixed a race condition handling when writing cache files + * "length" filter now returns string length when applied to an object that does + not implement \Countable but provides __toString() + * "empty" test will now consider the return value of the __toString() method for + objects implement __toString() but not \Countable + * fixed JS escaping for unicode characters with higher code points + +* 1.32.0 (2017-02-26) + + * fixed deprecation notice in Twig_Util_DeprecationCollector + * added a PSR-11 compatible runtime loader + * added `side` argument to `trim` to allow left or right trimming only. + +* 1.31.0 (2017-01-11) + + * added Twig_NodeCaptureInterface for nodes that capture all output + * fixed marking the environment as initialized too early + * fixed C89 compat for the C extension + * turned fatal error into exception when a previously generated cache is corrupted + * fixed offline cache warm-ups for embedded templates + +* 1.30.0 (2016-12-23) + + * added Twig_FactoryRuntimeLoader + * deprecated function/test/filter/tag overriding + * deprecated the "disable_c_ext" attribute on Twig_Node_Expression_GetAttr + +* 1.29.0 (2016-12-13) + + * fixed sandbox being left enabled if an exception is thrown while rendering + * marked some classes as being final (via @final) + * made Twig_Error report real source path when possible + * added support for {{ _self }} to provide an upgrade path from 1.x to 2.0 (replaces {{ _self.templateName }}) + * deprecated silent display of undefined blocks + * deprecated support for mbstring.func_overload != 0 + +* 1.28.2 (2016-11-23) + + * fixed precedence between getFoo() and isFoo() in Twig_Template::getAttribute() + * improved a deprecation message + +* 1.28.1 (2016-11-18) + + * fixed block() function when used with a template argument + +* 1.28.0 (2016-11-17) + + * added support for the PHP 7 null coalescing operator for the ?? Twig implementation + * exposed a way to access template data and methods in a portable way + * changed context access to use the PHP 7 null coalescing operator when available + * added the "with" tag + * added support for a custom template on the block() function + * added "is defined" support for block() and constant() + * optimized the way attributes are fetched + +* 1.27.0 (2016-10-25) + + * deprecated Twig_Parser::getEnvironment() + * deprecated Twig_Parser::addHandler() and Twig_Parser::addNodeVisitor() + * deprecated Twig_Compiler::addIndentation() + * fixed regression when registering two extensions having the same class name + * deprecated Twig_LoaderInterface::getSource() (implement Twig_SourceContextLoaderInterface instead) + * fixed the filesystem loader with relative paths + * deprecated Twig_Node::getLine() in favor of Twig_Node::getTemplateLine() + * deprecated Twig_Template::getSource() in favor of Twig_Template::getSourceContext() + * deprecated Twig_Node::getFilename() in favor of Twig_Node::getTemplateName() + * deprecated the "filename" escaping strategy (use "name" instead) + * added Twig_Source to hold information about the original template + * deprecated Twig_Error::getTemplateFile() and Twig_Error::setTemplateFile() in favor of Twig_Error::getTemplateName() and Twig_Error::setTemplateName() + * deprecated Parser::getFilename() + * fixed template paths when a template name contains a protocol like vfs:// + * improved debugging with Twig_Sandbox_SecurityError exceptions for disallowed methods and properties + +* 1.26.1 (2016-10-05) + + * removed template source code from generated template classes when debug is disabled + * fixed default implementation of Twig_Template::getDebugInfo() for better BC + * fixed regression on static calls for functions/filters/tests + +* 1.26.0 (2016-10-02) + + * added template cache invalidation based on more environment options + * added a missing deprecation notice + * fixed template paths when a template is stored in a PHAR file + * allowed filters/functions/tests implementation to use a different class than the extension they belong to + * deprecated Twig_ExtensionInterface::getName() + +* 1.25.0 (2016-09-21) + + * changed the way we store template source in template classes + * removed usage of realpath in cache keys + * fixed Twig cache sharing when used with different versions of PHP + * removed embed parent workaround for simple use cases + * deprecated the ability to store non Node instances in Node::$nodes + * deprecated Twig_Environment::getLexer(), Twig_Environment::getParser(), Twig_Environment::getCompiler() + * deprecated Twig_Compiler::getFilename() + +* 1.24.2 (2016-09-01) + + * fixed static callables + * fixed a potential PHP warning when loading the cache + * fixed a case where the autoescaping does not work as expected + +* 1.24.1 (2016-05-30) + + * fixed reserved keywords (forbids true, false, null and none keywords for variables names) + * fixed support for PHP7 (Throwable support) + * marked the following methods as being internals on Twig_Environment: + getFunctions(), getFilters(), getTests(), getFunction(), getFilter(), getTest(), + getTokenParsers(), getTags(), getNodeVisitors(), getUnaryOperators(), getBinaryOperators(), + getFunctions(), getFilters(), getGlobals(), initGlobals(), initExtensions(), and initExtension() + +* 1.24.0 (2016-01-25) + + * adding support for the ?? operator + * fixed the defined test when used on a constant, a map, or a sequence + * undeprecated _self (should only be used to get the template name, not the template instance) + * fixed parsing on PHP7 + +* 1.23.3 (2016-01-11) + + * fixed typo + +* 1.23.2 (2015-01-11) + + * added versions in deprecated messages + * made file cache tolerant for trailing (back)slashes on directory configuration + * deprecated unused Twig_Node_Expression_ExtensionReference class + +* 1.23.1 (2015-11-05) + + * fixed some exception messages which triggered PHP warnings + * fixed BC on Twig_Test_NodeTestCase + +* 1.23.0 (2015-10-29) + + * deprecated the possibility to override an extension by registering another one with the same name + * deprecated Twig_ExtensionInterface::getGlobals() (added Twig_Extension_GlobalsInterface for BC) + * deprecated Twig_ExtensionInterface::initRuntime() (added Twig_Extension_InitRuntimeInterface for BC) + * deprecated Twig_Environment::computeAlternatives() + +* 1.22.3 (2015-10-13) + + * fixed regression when using null as a cache strategy + * improved performance when checking template freshness + * fixed warnings when loaded templates do not exist + * fixed template class name generation to prevent possible collisions + * fixed logic for custom escapers to call them even on integers and null values + * changed template cache names to take into account the Twig C extension + +* 1.22.2 (2015-09-22) + + * fixed a race condition in template loading + +* 1.22.1 (2015-09-15) + + * fixed regression in template_from_string + +* 1.22.0 (2015-09-13) + + * made Twig_Test_IntegrationTestCase more flexible + * added an option to force PHP bytecode invalidation when writing a compiled template into the cache + * fixed the profiler duration for the root node + * changed template cache names to take into account enabled extensions + * deprecated Twig_Environment::clearCacheFiles(), Twig_Environment::getCacheFilename(), + Twig_Environment::writeCacheFile(), and Twig_Environment::getTemplateClassPrefix() + * added a way to override the filesystem template cache system + * added a way to get the original template source from Twig_Template + +* 1.21.2 (2015-09-09) + + * fixed variable names for the deprecation triggering code + * fixed escaping strategy detection based on filename + * added Traversable support for replace, merge, and sort + * deprecated support for character by character replacement for the "replace" filter + +* 1.21.1 (2015-08-26) + + * fixed regression when using the deprecated Twig_Test_* classes + +* 1.21.0 (2015-08-24) + + * added deprecation notices for deprecated features + * added a deprecation "framework" for filters/functions/tests and test fixtures + +* 1.20.0 (2015-08-12) + + * forbid access to the Twig environment from templates and internal parts of Twig_Template + * fixed limited RCEs when in sandbox mode + * deprecated Twig_Template::getEnvironment() + * deprecated the _self variable for usage outside of the from and import tags + * added Twig_BaseNodeVisitor to ease the compatibility of node visitors + between 1.x and 2.x + +* 1.19.0 (2015-07-31) + + * fixed wrong error message when including an undefined template in a child template + * added support for variadic filters, functions, and tests + * added support for extra positional arguments in macros + * added ignore_missing flag to the source function + * fixed batch filter with zero items + * deprecated Twig_Environment::clearTemplateCache() + * fixed sandbox disabling when using the include function + +* 1.18.2 (2015-06-06) + + * fixed template/line guessing in exceptions for nested templates + * optimized the number of inodes and the size of realpath cache when using the cache + +* 1.18.1 (2015-04-19) + + * fixed memory leaks in the C extension + * deprecated Twig_Loader_String + * fixed the slice filter when used with a SimpleXMLElement object + * fixed filesystem loader when trying to load non-files (like directories) + +* 1.18.0 (2015-01-25) + + * fixed some error messages where the line was wrong (unknown variables or argument names) + * added a new way to customize the main Module node (via empty nodes) + * added Twig_Environment::createTemplate() to create a template from a string + * added a profiler + * fixed filesystem loader cache when different file paths are used for the same template + +* 1.17.0 (2015-01-14) + + * added a 'filename' autoescaping strategy, which dynamically chooses the + autoescaping strategy for a template based on template file extension. + +* 1.16.3 (2014-12-25) + + * fixed regression for dynamic parent templates + * fixed cache management with statcache + * fixed a regression in the slice filter + +* 1.16.2 (2014-10-17) + + * fixed timezone on dates as strings + * fixed 2-words test names when a custom node class is not used + * fixed macros when using an argument named like a PHP super global (like GET or POST) + * fixed date_modify when working with DateTimeImmutable + * optimized for loops + * fixed multi-byte characters handling in the split filter + * fixed a regression in the in operator + * fixed a regression in the slice filter + +* 1.16.1 (2014-10-10) + + * improved error reporting in a sandboxed template + * fixed missing error file/line information under certain circumstances + * fixed wrong error line number in some error messages + * fixed the in operator to use strict comparisons + * sped up the slice filter + * fixed for mb function overload mb_substr acting different + * fixed the attribute() function when passing a variable for the arguments + +* 1.16.0 (2014-07-05) + + * changed url_encode to always encode according to RFC 3986 + * fixed inheritance in a 'use'-hierarchy + * removed the __toString policy check when the sandbox is disabled + * fixed recursively calling blocks in templates with inheritance + +* 1.15.1 (2014-02-13) + + * fixed the conversion of the special '0000-00-00 00:00' date + * added an error message when trying to import an undefined block from a trait + * fixed a C extension crash when accessing defined but uninitialized property. + +* 1.15.0 (2013-12-06) + + * made ignoreStrictCheck in Template::getAttribute() works with __call() methods throwing BadMethodCallException + * added min and max functions + * added the round filter + * fixed a bug that prevented the optimizers to be enabled/disabled selectively + * fixed first and last filters for UTF-8 strings + * added a source function to include the content of a template without rendering it + * fixed the C extension sandbox behavior when get or set is prepend to method name + +* 1.14.2 (2013-10-30) + + * fixed error filename/line when an error occurs in an included file + * allowed operators that contain whitespaces to have more than one whitespace + * allowed tests to be made of 1 or 2 words (like "same as" or "divisible by") + +* 1.14.1 (2013-10-15) + + * made it possible to use named operators as variables + * fixed the possibility to have a variable named 'matches' + * added support for PHP 5.5 DateTimeInterface + +* 1.14.0 (2013-10-03) + + * fixed usage of the html_attr escaping strategy to avoid double-escaping with the html strategy + * added new operators: ends with, starts with, and matches + * fixed some compatibility issues with HHVM + * added a way to add custom escaping strategies + * fixed the C extension compilation on Windows + * fixed the batch filter when using a fill argument with an exact match of elements to batch + * fixed the filesystem loader cache when a template name exists in several namespaces + * fixed template_from_string when the template includes or extends other ones + * fixed a crash of the C extension on an edge case + +* 1.13.2 (2013-08-03) + + * fixed the error line number for an error occurs in and embedded template + * fixed crashes of the C extension on some edge cases + +* 1.13.1 (2013-06-06) + + * added the possibility to ignore the filesystem constructor argument in Twig_Loader_Filesystem + * fixed Twig_Loader_Chain::exists() for a loader which implements Twig_ExistsLoaderInterface + * adjusted backtrace call to reduce memory usage when an error occurs + * added support for object instances as the second argument of the constant test + * fixed the include function when used in an assignment + +* 1.13.0 (2013-05-10) + + * fixed getting a numeric-like item on a variable ('09' for instance) + * fixed getting a boolean or float key on an array, so it is consistent with PHP's array access: + `{{ array[false] }}` behaves the same as `echo $array[false];` (equals `$array[0]`) + * made the escape filter 20% faster for happy path (escaping string for html with UTF-8) + * changed ☃ to § in tests + * enforced usage of named arguments after positional ones + +* 1.12.3 (2013-04-08) + + * fixed a security issue in the filesystem loader where it was possible to include a template one + level above the configured path + * fixed fatal error that should be an exception when adding a filter/function/test too late + * added a batch filter + * added support for encoding an array as query string in the url_encode filter + +* 1.12.2 (2013-02-09) + + * fixed the timezone used by the date filter and function when the given date contains a timezone (like 2010-01-28T15:00:00+02:00) + * fixed globals when getGlobals is called early on + * added the first and last filter + +* 1.12.1 (2013-01-15) + + * added support for object instances as the second argument of the constant function + * relaxed globals management to avoid a BC break + * added support for {{ some_string[:2] }} + +* 1.12.0 (2013-01-08) + + * added verbatim as an alias for the raw tag to avoid confusion with the raw filter + * fixed registration of tests and functions as anonymous functions + * fixed globals management + +* 1.12.0-RC1 (2012-12-29) + + * added an include function (does the same as the include tag but in a more flexible way) + * added the ability to use any PHP callable to define filters, functions, and tests + * added a syntax error when using a loop variable that is not defined + * added the ability to set default values for macro arguments + * added support for named arguments for filters, tests, and functions + * moved filters/functions/tests syntax errors to the parser + * added support for extended ternary operator syntaxes + +* 1.11.1 (2012-11-11) + + * fixed debug info line numbering (was off by 2) + * fixed escaping when calling a macro inside another one (regression introduced in 1.9.1) + * optimized variable access on PHP 5.4 + * fixed a crash of the C extension when an exception was thrown from a macro called without being imported (using _self.XXX) + +* 1.11.0 (2012-11-07) + + * fixed macro compilation when a variable name is a PHP reserved keyword + * changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone + * fixed bitwise operator precedences + * added the template_from_string function + * fixed default timezone usage for the date function + * optimized the way Twig exceptions are managed (to make them faster) + * added Twig_ExistsLoaderInterface (implementing this interface in your loader make the chain loader much faster) + +* 1.10.3 (2012-10-19) + + * fixed wrong template location in some error messages + * reverted a BC break introduced in 1.10.2 + * added a split filter + +* 1.10.2 (2012-10-15) + + * fixed macro calls on PHP 5.4 + +* 1.10.1 (2012-10-15) + + * made a speed optimization to macro calls when imported via the "import" tag + * fixed C extension compilation on Windows + * fixed a segfault in the C extension when using DateTime objects + +* 1.10.0 (2012-09-28) + + * extracted functional tests framework to make it reusable for third-party extensions + * added namespaced templates support in Twig_Loader_Filesystem + * added Twig_Loader_Filesystem::prependPath() + * fixed an error when a token parser pass a closure as a test to the subparse() method + +* 1.9.2 (2012-08-25) + + * fixed the in operator for objects that contain circular references + * fixed the C extension when accessing a public property of an object implementing the \ArrayAccess interface + +* 1.9.1 (2012-07-22) + + * optimized macro calls when auto-escaping is on + * fixed wrong parent class for Twig_Function_Node + * made Twig_Loader_Chain more explicit about problems + +* 1.9.0 (2012-07-13) + + * made the parsing independent of the template loaders + * fixed exception trace when an error occurs when rendering a child template + * added escaping strategies for CSS, URL, and HTML attributes + * fixed nested embed tag calls + * added the date_modify filter + +* 1.8.3 (2012-06-17) + + * fixed paths in the filesystem loader when passing a path that ends with a slash or a backslash + * fixed escaping when a project defines a function named html or js + * fixed chmod mode to apply the umask correctly + +* 1.8.2 (2012-05-30) + + * added the abs filter + * fixed a regression when using a number in template attributes + * fixed compiler when mbstring.func_overload is set to 2 + * fixed DateTimeZone support in date filter + +* 1.8.1 (2012-05-17) + + * fixed a regression when dealing with SimpleXMLElement instances in templates + * fixed "is_safe" value for the "dump" function when "html_errors" is not defined in php.ini + * switched to use mbstring whenever possible instead of iconv (you might need to update your encoding as mbstring and iconv encoding names sometimes differ) + +* 1.8.0 (2012-05-08) + + * enforced interface when adding tests, filters, functions, and node visitors from extensions + * fixed a side-effect of the date filter where the timezone might be changed + * simplified usage of the autoescape tag; the only (optional) argument is now the escaping strategy or false (with a BC layer) + * added a way to dynamically change the auto-escaping strategy according to the template "filename" + * changed the autoescape option to also accept a supported escaping strategy (for BC, true is equivalent to html) + * added an embed tag + +* 1.7.0 (2012-04-24) + + * fixed a PHP warning when using CIFS + * fixed template line number in some exceptions + * added an iterable test + * added an error when defining two blocks with the same name in a template + * added the preserves_safety option for filters + * fixed a PHP notice when trying to access a key on a non-object/array variable + * enhanced error reporting when the template file is an instance of SplFileInfo + * added Twig_Environment::mergeGlobals() + * added compilation checks to avoid misuses of the sandbox tag + * fixed filesystem loader freshness logic for high traffic websites + * fixed random function when charset is null + +* 1.6.5 (2012-04-11) + + * fixed a regression when a template only extends another one without defining any blocks + +* 1.6.4 (2012-04-02) + + * fixed PHP notice in Twig_Error::guessTemplateLine() introduced in 1.6.3 + * fixed performance when compiling large files + * optimized parent template creation when the template does not use dynamic inheritance + +* 1.6.3 (2012-03-22) + + * fixed usage of Z_ADDREF_P for PHP 5.2 in the C extension + * fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot + * made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate + +* 1.6.2 (2012-03-18) + + * fixed sandbox mode when used with inheritance + * added preserveKeys support for the slice filter + * fixed the date filter when a DateTime instance is passed with a specific timezone + * added a trim filter + +* 1.6.1 (2012-02-29) + + * fixed Twig C extension + * removed the creation of Twig_Markup instances when not needed + * added a way to set the default global timezone for dates + * fixed the slice filter on strings when the length is not specified + * fixed the creation of the cache directory in case of a race condition + +* 1.6.0 (2012-02-04) + + * fixed raw blocks when used with the whitespace trim option + * made a speed optimization to macro calls when imported via the "from" tag + * fixed globals, parsers, visitors, filters, tests, and functions management in Twig_Environment when a new one or new extension is added + * fixed the attribute function when passing arguments + * added slice notation support for the [] operator (syntactic sugar for the slice operator) + * added a slice filter + * added string support for the reverse filter + * fixed the empty test and the length filter for Twig_Markup instances + * added a date function to ease date comparison + * fixed unary operators precedence + * added recursive parsing support in the parser + * added string and integer handling for the random function + +* 1.5.1 (2012-01-05) + + * fixed a regression when parsing strings + +* 1.5.0 (2012-01-04) + + * added Traversable objects support for the join filter + +* 1.5.0-RC2 (2011-12-30) + + * added a way to set the default global date interval format + * fixed the date filter for DateInterval instances (setTimezone() does not exist for them) + * refactored Twig_Template::display() to ease its extension + * added a number_format filter + +* 1.5.0-RC1 (2011-12-26) + + * removed the need to quote hash keys + * allowed hash keys to be any expression + * added a do tag + * added a flush tag + * added support for dynamically named filters and functions + * added a dump function to help debugging templates + * added a nl2br filter + * added a random function + * added a way to change the default format for the date filter + * fixed the lexer when an operator ending with a letter ends a line + * added string interpolation support + * enhanced exceptions for unknown filters, functions, tests, and tags + +* 1.4.0 (2011-12-07) + + * fixed lexer when using big numbers (> PHP_INT_MAX) + * added missing preserveKeys argument to the reverse filter + * fixed macros containing filter tag calls + +* 1.4.0-RC2 (2011-11-27) + + * removed usage of Reflection in Twig_Template::getAttribute() + * added a C extension that can optionally replace Twig_Template::getAttribute() + * added negative timestamp support to the date filter + +* 1.4.0-RC1 (2011-11-20) + + * optimized variable access when using PHP 5.4 + * changed the precedence of the .. operator to be more consistent with languages that implements such a feature like Ruby + * added an Exception to Twig_Loader_Array::isFresh() method when the template does not exist to be consistent with other loaders + * added Twig_Function_Node to allow more complex functions to have their own Node class + * added Twig_Filter_Node to allow more complex filters to have their own Node class + * added Twig_Test_Node to allow more complex tests to have their own Node class + * added a better error message when a template is empty but contain a BOM + * fixed "in" operator for empty strings + * fixed the "defined" test and the "default" filter (now works with more than one call (foo.bar.foo) and for both values of the strict_variables option) + * changed the way extensions are loaded (addFilter/addFunction/addGlobal/addTest/addNodeVisitor/addTokenParser/addExtension can now be called in any order) + * added Twig_Environment::display() + * made the escape filter smarter when the encoding is not supported by PHP + * added a convert_encoding filter + * moved all node manipulations outside the compile() Node method + * made several speed optimizations + +* 1.3.0 (2011-10-08) + +no changes + +* 1.3.0-RC1 (2011-10-04) + + * added an optimization for the parent() function + * added cache reloading when auto_reload is true and an extension has been modified + * added the possibility to force the escaping of a string already marked as safe (instance of Twig_Markup) + * allowed empty templates to be used as traits + * added traits support for the "parent" function + +* 1.2.0 (2011-09-13) + +no changes + +* 1.2.0-RC1 (2011-09-10) + + * enhanced the exception when a tag remains unclosed + * added support for empty Countable objects for the "empty" test + * fixed algorithm that determines if a template using inheritance is valid (no output between block definitions) + * added better support for encoding problems when escaping a string (available as of PHP 5.4) + * added a way to ignore a missing template when using the "include" tag ({% include "foo" ignore missing %}) + * added support for an array of templates to the "include" and "extends" tags ({% include ['foo', 'bar'] %}) + * added support for bitwise operators in expressions + * added the "attribute" function to allow getting dynamic attributes on variables + * added Twig_Loader_Chain + * added Twig_Loader_Array::setTemplate() + * added an optimization for the set tag when used to capture a large chunk of static text + * changed name regex to match PHP one "[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*" (works for blocks, tags, functions, filters, and macros) + * removed the possibility to use the "extends" tag from a block + * added "if" modifier support to "for" loops + +* 1.1.2 (2011-07-30) + + * fixed json_encode filter on PHP 5.2 + * fixed regression introduced in 1.1.1 ({{ block(foo|lower) }}) + * fixed inheritance when using conditional parents + * fixed compilation of templates when the body of a child template is not empty + * fixed output when a macro throws an exception + * fixed a parsing problem when a large chunk of text is enclosed in a comment tag + * added PHPDoc for all Token parsers and Core extension functions + +* 1.1.1 (2011-07-17) + + * added a performance optimization in the Optimizer (also helps to lower the number of nested level calls) + * made some performance improvement for some edge cases + +* 1.1.0 (2011-06-28) + + * fixed json_encode filter + +* 1.1.0-RC3 (2011-06-24) + + * fixed method case-sensitivity when using the sandbox mode + * added timezone support for the date filter + * fixed possible security problems with NUL bytes + +* 1.1.0-RC2 (2011-06-16) + + * added an exception when the template passed to "use" is not a string + * made 'a.b is defined' not throw an exception if a is not defined (in strict mode) + * added {% line \d+ %} directive + +* 1.1.0-RC1 (2011-05-28) + +Flush your cache after upgrading. + + * fixed date filter when using a timestamp + * fixed the defined test for some cases + * fixed a parsing problem when a large chunk of text is enclosed in a raw tag + * added support for horizontal reuse of template blocks (see docs for more information) + * added whitespace control modifier to all tags (see docs for more information) + * added null as an alias for none (the null test is also an alias for the none test now) + * made TRUE, FALSE, NONE equivalent to their lowercase counterparts + * wrapped all compilation and runtime exceptions with Twig_Error_Runtime and added logic to guess the template name and line + * moved display() method to Twig_Template (generated templates should now use doDisplay() instead) + +* 1.0.0 (2011-03-27) + + * fixed output when using mbstring + * fixed duplicate call of methods when using the sandbox + * made the charset configurable for the escape filter + +* 1.0.0-RC2 (2011-02-21) + + * changed the way {% set %} works when capturing (the content is now marked as safe) + * added support for macro name in the endmacro tag + * make Twig_Error compatible with PHP 5.3.0 > + * fixed an infinite loop on some Windows configurations + * fixed the "length" filter for numbers + * fixed Template::getAttribute() as properties in PHP are case sensitive + * removed coupling between Twig_Node and Twig_Template + * fixed the ternary operator precedence rule + +* 1.0.0-RC1 (2011-01-09) + +Backward incompatibilities: + + * the "items" filter, which has been deprecated for quite a long time now, has been removed + * the "range" filter has been converted to a function: 0|range(10) -> range(0, 10) + * the "constant" filter has been converted to a function: {{ some_date|date('DATE_W3C'|constant) }} -> {{ some_date|date(constant('DATE_W3C')) }} + * the "cycle" filter has been converted to a function: {{ ['odd', 'even']|cycle(i) }} -> {{ cycle(['odd', 'even'], i) }} + * the "for" tag does not support "joined by" anymore + * the "autoescape" first argument is now "true"/"false" (instead of "on"/"off") + * the "parent" tag has been replaced by a "parent" function ({{ parent() }} instead of {% parent %}) + * the "display" tag has been replaced by a "block" function ({{ block('title') }} instead of {% display title %}) + * removed the grammar and simple token parser (moved to the Twig Extensions repository) + +Changes: + + * added "needs_context" option for filters and functions (the context is then passed as a first argument) + * added global variables support + * made macros return their value instead of echoing directly (fixes calling a macro in sandbox mode) + * added the "from" tag to import macros as functions + * added support for functions (a function is just syntactic sugar for a getAttribute() call) + * made macros callable when sandbox mode is enabled + * added an exception when a macro uses a reserved name + * the "default" filter now uses the "empty" test instead of just checking for null + * added the "empty" test + +* 0.9.10 (2010-12-16) + +Backward incompatibilities: + + * The Escaper extension is enabled by default, which means that all displayed + variables are now automatically escaped. You can revert to the previous + behavior by removing the extension via $env->removeExtension('escaper') + or just set the 'autoescape' option to 'false'. + * removed the "without loop" attribute for the "for" tag (not needed anymore + as the Optimizer take care of that for most cases) + * arrays and hashes have now a different syntax + * arrays keep the same syntax with square brackets: [1, 2] + * hashes now use curly braces (["a": "b"] should now be written as {"a": "b"}) + * support for "arrays with keys" and "hashes without keys" is not supported anymore ([1, "foo": "bar"] or {"foo": "bar", 1}) + * the i18n extension is now part of the Twig Extensions repository + +Changes: + + * added the merge filter + * removed 'is_escaper' option for filters (a left over from the previous version) -- you must use 'is_safe' now instead + * fixed usage of operators as method names (like is, in, and not) + * changed the order of execution for node visitors + * fixed default() filter behavior when used with strict_variables set to on + * fixed filesystem loader compatibility with PHAR files + * enhanced error messages when an unexpected token is parsed in an expression + * fixed filename not being added to syntax error messages + * added the autoescape option to enable/disable autoescaping + * removed the newline after a comment (mimics PHP behavior) + * added a syntax error exception when parent block is used on a template that does not extend another one + * made the Escaper extension enabled by default + * fixed sandbox extension when used with auto output escaping + * fixed escaper when wrapping a Twig_Node_Print (the original class must be preserved) + * added an Optimizer extension (enabled by default; optimizes "for" loops and "raw" filters) + * added priority to node visitors + +* 0.9.9 (2010-11-28) + +Backward incompatibilities: + * the self special variable has been renamed to _self + * the odd and even filters are now tests: + {{ foo|odd }} must now be written {{ foo is odd }} + * the "safe" filter has been renamed to "raw" + * in Node classes, + sub-nodes are now accessed via getNode() (instead of property access) + attributes via getAttribute() (instead of array access) + * the urlencode filter had been renamed to url_encode + * the include tag now merges the passed variables with the current context by default + (the old behavior is still possible by adding the "only" keyword) + * moved Exceptions to Twig_Error_* (Twig_SyntaxError/Twig_RuntimeError are now Twig_Error_Syntax/Twig_Error_Runtime) + * removed support for {{ 1 < i < 3 }} (use {{ i > 1 and i < 3 }} instead) + * the "in" filter has been removed ({{ a|in(b) }} should now be written {{ a in b }}) + +Changes: + * added file and line to Twig_Error_Runtime exceptions thrown from Twig_Template + * changed trans tag to accept any variable for the plural count + * fixed sandbox mode (__toString() method check was not enforced if called implicitly from complex statements) + * added the ** (power) operator + * changed the algorithm used for parsing expressions + * added the spaceless tag + * removed trim_blocks option + * added support for is*() methods for attributes (foo.bar now looks for foo->getBar() or foo->isBar()) + * changed all exceptions to extend Twig_Error + * fixed unary expressions ({{ not(1 or 0) }}) + * fixed child templates (with an extend tag) that uses one or more imports + * added support for {{ 1 not in [2, 3] }} (more readable than the current {{ not (1 in [2, 3]) }}) + * escaping has been rewritten + * the implementation of template inheritance has been rewritten + (blocks can now be called individually and still work with inheritance) + * fixed error handling for if tag when a syntax error occurs within a subparse process + * added a way to implement custom logic for resolving token parsers given a tag name + * fixed js escaper to be stricter (now uses a whilelist-based js escaper) + * added the following filers: "constant", "trans", "replace", "json_encode" + * added a "constant" test + * fixed objects with __toString() not being autoescaped + * fixed subscript expressions when calling __call() (methods now keep the case) + * added "test" feature (accessible via the "is" operator) + * removed the debug tag (should be done in an extension) + * fixed trans tag when no vars are used in plural form + * fixed race condition when writing template cache + * added the special _charset variable to reference the current charset + * added the special _context variable to reference the current context + * renamed self to _self (to avoid conflict) + * fixed Twig_Template::getAttribute() for protected properties + +* 0.9.8 (2010-06-28) + +Backward incompatibilities: + * the trans tag plural count is now attached to the plural tag: + old: `{% trans count %}...{% plural %}...{% endtrans %}` + new: `{% trans %}...{% plural count %}...{% endtrans %}` + + * added a way to translate strings coming from a variable ({% trans var %}) + * fixed trans tag when used with the Escaper extension + * fixed default cache umask + * removed Twig_Template instances from the debug tag output + * fixed objects with __isset() defined + * fixed set tag when used with a capture + * fixed type hinting for Twig_Environment::addFilter() method + +* 0.9.7 (2010-06-12) + +Backward incompatibilities: + * changed 'as' to '=' for the set tag ({% set title as "Title" %} must now be {% set title = "Title" %}) + * removed the sandboxed attribute of the include tag (use the new sandbox tag instead) + * refactored the Node system (if you have custom nodes, you will have to update them to use the new API) + + * added self as a special variable that refers to the current template (useful for importing macros from the current template) + * added Twig_Template instance support to the include tag + * added support for dynamic and conditional inheritance ({% extends some_var %} and {% extends standalone ? "minimum" : "base" %}) + * added a grammar sub-framework to ease the creation of custom tags + * fixed the for tag for large arrays (some loop variables are now only available for arrays and objects that implement the Countable interface) + * removed the Twig_Resource::resolveMissingFilter() method + * fixed the filter tag which did not apply filtering to included files + * added a bunch of unit tests + * added a bunch of phpdoc + * added a sandbox tag in the sandbox extension + * changed the date filter to support any date format supported by DateTime + * added strict_variable setting to throw an exception when an invalid variable is used in a template (disabled by default) + * added the lexer, parser, and compiler as arguments to the Twig_Environment constructor + * changed the cache option to only accepts an explicit path to a cache directory or false + * added a way to add token parsers, filters, and visitors without creating an extension + * added three interfaces: Twig_NodeInterface, Twig_TokenParserInterface, and Twig_FilterInterface + * changed the generated code to match the new coding standards + * fixed sandbox mode (__toString() method check was not enforced if called implicitly from a simple statement like {{ article }}) + * added an exception when a child template has a non-empty body (as it is always ignored when rendering) + +* 0.9.6 (2010-05-12) + + * fixed variables defined outside a loop and for which the value changes in a for loop + * fixed the test suite for PHP 5.2 and older versions of PHPUnit + * added support for __call() in expression resolution + * fixed node visiting for macros (macros are now visited by visitors as any other node) + * fixed nested block definitions with a parent call (rarely useful but nonetheless supported now) + * added the cycle filter + * fixed the Lexer when mbstring.func_overload is used with an mbstring.internal_encoding different from ASCII + * added a long-syntax for the set tag ({% set foo %}...{% endset %}) + * unit tests are now powered by PHPUnit + * added support for gettext via the `i18n` extension + * fixed twig_capitalize_string_filter() and fixed twig_length_filter() when used with UTF-8 values + * added a more useful exception if an if tag is not closed properly + * added support for escaping strategy in the autoescape tag + * fixed lexer when a template has a big chunk of text between/in a block + +* 0.9.5 (2010-01-20) + +As for any new release, don't forget to remove all cached templates after +upgrading. + +If you have defined custom filters, you MUST upgrade them for this release. To +upgrade, replace "array" with "new Twig_Filter_Function", and replace the +environment constant by the "needs_environment" option: + + // before + 'even' => array('twig_is_even_filter', false), + 'escape' => array('twig_escape_filter', true), + + // after + 'even' => new Twig_Filter_Function('twig_is_even_filter'), + 'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true)), + +If you have created NodeTransformer classes, you will need to upgrade them to +the new interface (please note that the interface is not yet considered +stable). + + * fixed list nodes that did not extend the Twig_NodeListInterface + * added the "without loop" option to the for tag (it disables the generation of the loop variable) + * refactored node transformers to node visitors + * fixed automatic-escaping for blocks + * added a way to specify variables to pass to an included template + * changed the automatic-escaping rules to be more sensible and more configurable in custom filters (the documentation lists all the rules) + * improved the filter system to allow object methods to be used as filters + * changed the Array and String loaders to actually make use of the cache mechanism + * included the default filter function definitions in the extension class files directly (Core, Escaper) + * added the // operator (like the floor() PHP function) + * added the .. operator (as a syntactic sugar for the range filter when the step is 1) + * added the in operator (as a syntactic sugar for the in filter) + * added the following filters in the Core extension: in, range + * added support for arrays (same behavior as in PHP, a mix between lists and dictionaries, arrays and hashes) + * enhanced some error messages to provide better feedback in case of parsing errors + +* 0.9.4 (2009-12-02) + +If you have custom loaders, you MUST upgrade them for this release: The +Twig_Loader base class has been removed, and the Twig_LoaderInterface has also +been changed (see the source code for more information or the documentation). + + * added support for DateTime instances for the date filter + * fixed loop.last when the array only has one item + * made it possible to insert newlines in tag and variable blocks + * fixed a bug when a literal '\n' were present in a template text + * fixed bug when the filename of a template contains */ + * refactored loaders + +* 0.9.3 (2009-11-11) + +This release is NOT backward compatible with the previous releases. + + The loaders do not take the cache and autoReload arguments anymore. Instead, + the Twig_Environment class has two new options: cache and auto_reload. + Upgrading your code means changing this kind of code: + + $loader = new Twig_Loader_Filesystem('/path/to/templates', '/path/to/compilation_cache', true); + $twig = new Twig_Environment($loader); + + to something like this: + + $loader = new Twig_Loader_Filesystem('/path/to/templates'); + $twig = new Twig_Environment($loader, array( + 'cache' => '/path/to/compilation_cache', + 'auto_reload' => true, + )); + + * deprecated the "items" filter as it is not needed anymore + * made cache and auto_reload options of Twig_Environment instead of arguments of Twig_Loader + * optimized template loading speed + * removed output when an error occurs in a template and render() is used + * made major speed improvements for loops (up to 300% on even the smallest loops) + * added properties as part of the sandbox mode + * added public properties support (obj.item can now be the item property on the obj object) + * extended set tag to support expression as value ({% set foo as 'foo' ~ 'bar' %} ) + * fixed bug when \ was used in HTML + +* 0.9.2 (2009-10-29) + + * made some speed optimizations + * changed the cache extension to .php + * added a js escaping strategy + * added support for short block tag + * changed the filter tag to allow chained filters + * made lexer more flexible as you can now change the default delimiters + * added set tag + * changed default directory permission when cache dir does not exist (more secure) + * added macro support + * changed filters first optional argument to be a Twig_Environment instance instead of a Twig_Template instance + * made Twig_Autoloader::autoload() a static method + * avoid writing template file if an error occurs + * added $ escaping when outputting raw strings + * enhanced some error messages to ease debugging + * fixed empty cache files when the template contains an error + +* 0.9.1 (2009-10-14) + + * fixed a bug in PHP 5.2.6 + * fixed numbers with one than one decimal + * added support for method calls with arguments ({{ foo.bar('a', 43) }}) + * made small speed optimizations + * made minor tweaks to allow better extensibility and flexibility + +* 0.9.0 (2009-10-12) + + * Initial release diff --git a/srcs/phpmyadmin/vendor/twig/twig/LICENSE b/srcs/phpmyadmin/vendor/twig/twig/LICENSE new file mode 100644 index 0000000..d06ced2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2009-2019 by the Twig Team. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/srcs/phpmyadmin/vendor/twig/twig/README.rst b/srcs/phpmyadmin/vendor/twig/twig/README.rst new file mode 100644 index 0000000..d896ff5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/README.rst @@ -0,0 +1,24 @@ +Twig, the flexible, fast, and secure template language for PHP +============================================================== + +Twig is a template language for PHP, released under the new BSD license (code +and documentation). + +Twig uses a syntax similar to the Django and Jinja template languages which +inspired the Twig runtime environment. + +Sponsors +-------- + +.. raw:: html + + <a href="https://blackfire.io/docs/introduction?utm_source=twig&utm_medium=github_readme&utm_campaign=logo"> + <img src="https://static.blackfire.io/assets/intemporals/logo/png/blackfire-io_secondary_horizontal_transparent.png?1" width="255px" alt="Blackfire.io"> + </a> + +More Information +---------------- + +Read the `documentation`_ for more information. + +.. _documentation: https://twig.symfony.com/documentation diff --git a/srcs/phpmyadmin/vendor/twig/twig/composer.json b/srcs/phpmyadmin/vendor/twig/twig/composer.json new file mode 100644 index 0000000..0d1c0ad --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/composer.json @@ -0,0 +1,52 @@ +{ + "name": "twig/twig", + "type": "library", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "keywords": ["templating"], + "homepage": "https://twig.symfony.com", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "require": { + "php": "^7.0", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4|^5.0", + "psr/container": "^1.0" + }, + "autoload": { + "psr-0" : { + "Twig_" : "lib/" + }, + "psr-4" : { + "Twig\\" : "src/" + } + }, + "autoload-dev": { + "psr-4" : { + "Twig\\Tests\\" : "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.12-dev" + } + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/drupal_test.sh b/srcs/phpmyadmin/vendor/twig/twig/drupal_test.sh new file mode 100755 index 0000000..75d5f02 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/drupal_test.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +set -x +set -e + +REPO=`pwd` +cd /tmp +rm -rf drupal-twig-test +composer create-project --no-interaction drupal-composer/drupal-project:8.x-dev drupal-twig-test +cd drupal-twig-test +(cd vendor/twig && rm -rf twig && ln -sf $REPO twig) +echo '$config["system.logging"]["error_level"] = "verbose";' >> web/sites/default/settings.php +composer require drupal/core:8.7.x-dev webflo/drupal-core-require-dev:8.7.x-dev "egulias/email-validator:^2.0" +php ./web/core/scripts/drupal install --no-interaction demo_umami > output +perl -p -i -e 's/^([A-Za-z]+)\: (.+)$/export DRUPAL_\1=\2/' output +source output + +wget https://get.symfony.com/cli/installer -O - | bash +export PATH="$HOME/.symfony/bin:$PATH" +symfony server:start -d --no-tls + +curl -OLsS https://get.blackfire.io/blackfire-player.phar +chmod +x blackfire-player.phar +cat > drupal-tests.bkf <<EOF +name "Drupal tests" + +scenario + name "homepage" + set name "admin" + set pass "pass" + + visit url('/') + expect status_code() == 200 + click link('Articles') + expect status_code() == 200 + click link('Dairy-free and delicious milk chocolate') + expect body() matches "/Dairy\-free milk chocolate is made in largely the same way as regular chocolate/" + expect status_code() == 200 + click link('Log in') + expect status_code() == 200 + submit button("Log in") + param name name + param pass pass + expect status_code() == 303 + follow + expect status_code() == 200 + click link('Structure') + expect status_code() == 200 +EOF +./blackfire-player.phar run drupal-tests.bkf --endpoint=`symfony var:export SYMFONY_DEFAULT_ROUTE_URL` --variable name=$DRUPAL_Username --variable pass=$DRUPAL_Password +symfony server:stop diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php new file mode 100644 index 0000000..e1191f9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\AbstractNodeVisitor; + +class_exists('Twig\NodeVisitor\AbstractNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_BaseNodeVisitor" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\AbstractNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\AbstractNodeVisitor" instead */ + class Twig_BaseNodeVisitor extends AbstractNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Filesystem.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Filesystem.php new file mode 100644 index 0000000..5c7627c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Filesystem.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Cache\FilesystemCache; + +class_exists('Twig\Cache\FilesystemCache'); + +@trigger_error(sprintf('Using the "Twig_Cache_Filesystem" class is deprecated since Twig version 2.7, use "Twig\Cache\FilesystemCache" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Cache\FilesystemCache" instead */ + class Twig_Cache_Filesystem extends FilesystemCache + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Null.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Null.php new file mode 100644 index 0000000..092a2be --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Cache/Null.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Cache\NullCache; + +class_exists('Twig\Cache\NullCache'); + +@trigger_error(sprintf('Using the "Twig_Cache_Null" class is deprecated since Twig version 2.7, use "Twig\Cache\NullCache" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Cache\NullCache" instead */ + class Twig_Cache_Null extends NullCache + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/CacheInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/CacheInterface.php new file mode 100644 index 0000000..3f5a458 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/CacheInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Cache\CacheInterface; + +class_exists('Twig\Cache\CacheInterface'); + +@trigger_error(sprintf('Using the "Twig_CacheInterface" class is deprecated since Twig version 2.7, use "Twig\Cache\CacheInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Cache\CacheInterface" instead */ + class Twig_CacheInterface extends CacheInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Compiler.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Compiler.php new file mode 100644 index 0000000..d13d2f2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Compiler.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Compiler; + +class_exists('Twig\Compiler'); + +@trigger_error(sprintf('Using the "Twig_Compiler" class is deprecated since Twig version 2.7, use "Twig\Compiler" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Compiler" instead */ + class Twig_Compiler extends Compiler + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php new file mode 100644 index 0000000..3225057 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php @@ -0,0 +1,14 @@ +<?php + +use Twig\RuntimeLoader\ContainerRuntimeLoader; + +class_exists('Twig\RuntimeLoader\ContainerRuntimeLoader'); + +@trigger_error(sprintf('Using the "Twig_ContainerRuntimeLoader" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\ContainerRuntimeLoader" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\ContainerRuntimeLoader" instead */ + class Twig_ContainerRuntimeLoader extends ContainerRuntimeLoader + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Environment.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Environment.php new file mode 100644 index 0000000..1bfb369 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Environment.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Environment; + +class_exists('Twig\Environment'); + +@trigger_error(sprintf('Using the "Twig_Environment" class is deprecated since Twig version 2.7, use "Twig\Environment" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Environment" instead */ + class Twig_Environment extends Environment + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error.php new file mode 100644 index 0000000..3f49877 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Error\Error; + +class_exists('Twig\Error\Error'); + +@trigger_error(sprintf('Using the "Twig_Error" class is deprecated since Twig version 2.7, use "Twig\Error\Error" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Error\Error" instead */ + class Twig_Error extends Error + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Loader.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Loader.php new file mode 100644 index 0000000..37522d7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Loader.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Error\LoaderError; + +class_exists('Twig\Error\LoaderError'); + +@trigger_error(sprintf('Using the "Twig_Error_Loader" class is deprecated since Twig version 2.7, use "Twig\Error\LoaderError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Error\LoaderError" instead */ + class Twig_Error_Loader extends LoaderError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Runtime.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Runtime.php new file mode 100644 index 0000000..48ba0a7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Runtime.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Error\RuntimeError; + +class_exists('Twig\Error\RuntimeError'); + +@trigger_error(sprintf('Using the "Twig_Error_Runtime" class is deprecated since Twig version 2.7, use "Twig\Error\RuntimeError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Error\RuntimeError" instead */ + class Twig_Error_Runtime extends RuntimeError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Syntax.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Syntax.php new file mode 100644 index 0000000..a70dd16 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Error/Syntax.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Error\SyntaxError; + +class_exists('Twig\Error\SyntaxError'); + +@trigger_error(sprintf('Using the "Twig_Error_Syntax" class is deprecated since Twig version 2.7, use "Twig\Error\SyntaxError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Error\SyntaxError" instead */ + class Twig_Error_Syntax extends SyntaxError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php new file mode 100644 index 0000000..d4023f5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\ExistsLoaderInterface; + +class_exists('Twig\Loader\ExistsLoaderInterface'); + +@trigger_error(sprintf('Using the "Twig_ExistsLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\ExistsLoaderInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\ExistsLoaderInterface" instead */ + class Twig_ExistsLoaderInterface extends ExistsLoaderInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExpressionParser.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExpressionParser.php new file mode 100644 index 0000000..4f4c175 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExpressionParser.php @@ -0,0 +1,14 @@ +<?php + +use Twig\ExpressionParser; + +class_exists('Twig\ExpressionParser'); + +@trigger_error(sprintf('Using the "Twig_ExpressionParser" class is deprecated since Twig version 2.7, use "Twig\ExpressionParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\ExpressionParser" instead */ + class Twig_ExpressionParser extends ExpressionParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension.php new file mode 100644 index 0000000..3d4356c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\AbstractExtension; + +class_exists('Twig\Extension\AbstractExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension" class is deprecated since Twig version 2.7, use "Twig\Extension\AbstractExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\AbstractExtension" instead */ + class Twig_Extension extends AbstractExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Core.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Core.php new file mode 100644 index 0000000..ad01942 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Core.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\CoreExtension; + +class_exists('Twig\Extension\CoreExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Core" class is deprecated since Twig version 2.7, use "Twig\Extension\CoreExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\CoreExtension" instead */ + class Twig_Extension_Core extends CoreExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Debug.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Debug.php new file mode 100644 index 0000000..deee0e4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Debug.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\DebugExtension; + +class_exists('Twig\Extension\DebugExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Debug" class is deprecated since Twig version 2.7, use "Twig\Extension\DebugExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\DebugExtension" instead */ + class Twig_Extension_Debug extends DebugExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Escaper.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Escaper.php new file mode 100644 index 0000000..f56c5c9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Escaper.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\EscaperExtension; + +class_exists('Twig\Extension\EscaperExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Escaper" class is deprecated since Twig version 2.7, use "Twig\Extension\EscaperExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\EscaperExtension" instead */ + class Twig_Extension_Escaper extends EscaperExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php new file mode 100644 index 0000000..a8d19a2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\GlobalsInterface; + +class_exists('Twig\Extension\GlobalsInterface'); + +@trigger_error(sprintf('Using the "Twig_Extension_GlobalsInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\GlobalsInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\GlobalsInterface" instead */ + class Twig_Extension_GlobalsInterface extends GlobalsInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php new file mode 100644 index 0000000..bc926d7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\InitRuntimeInterface; + +class_exists('Twig\Extension\InitRuntimeInterface'); + +@trigger_error(sprintf('Using the "Twig_Extension_InitRuntimeInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\InitRuntimeInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\InitRuntimeInterface" instead */ + class Twig_Extension_InitRuntimeInterface extends InitRuntimeInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Optimizer.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Optimizer.php new file mode 100644 index 0000000..de4fdfe --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Optimizer.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\OptimizerExtension; + +class_exists('Twig\Extension\OptimizerExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Optimizer" class is deprecated since Twig version 2.7, use "Twig\Extension\OptimizerExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\OptimizerExtension" instead */ + class Twig_Extension_Optimizer extends OptimizerExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Profiler.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Profiler.php new file mode 100644 index 0000000..22879c9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Profiler.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\ProfilerExtension; + +class_exists('Twig\Extension\ProfilerExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Profiler" class is deprecated since Twig version 2.7, use "Twig\Extension\ProfilerExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\ProfilerExtension" instead */ + class Twig_Extension_Profiler extends ProfilerExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Sandbox.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Sandbox.php new file mode 100644 index 0000000..400d175 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Sandbox.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\SandboxExtension; + +class_exists('Twig\Extension\SandboxExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Sandbox" class is deprecated since Twig version 2.7, use "Twig\Extension\SandboxExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\SandboxExtension" instead */ + class Twig_Extension_Sandbox extends SandboxExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Staging.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Staging.php new file mode 100644 index 0000000..bd200a4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/Staging.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\StagingExtension; + +class_exists('Twig\Extension\StagingExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_Staging" class is deprecated since Twig version 2.7, use "Twig\Extension\StagingExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\StagingExtension" instead */ + class Twig_Extension_Staging extends StagingExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/StringLoader.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/StringLoader.php new file mode 100644 index 0000000..f77c203 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Extension/StringLoader.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\StringLoaderExtension; + +class_exists('Twig\Extension\StringLoaderExtension'); + +@trigger_error(sprintf('Using the "Twig_Extension_StringLoader" class is deprecated since Twig version 2.7, use "Twig\Extension\StringLoaderExtension" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\StringLoaderExtension" instead */ + class Twig_Extension_StringLoader extends StringLoaderExtension + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionInterface.php new file mode 100644 index 0000000..4d5d249 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Extension\ExtensionInterface; + +class_exists('Twig\Extension\ExtensionInterface'); + +@trigger_error(sprintf('Using the "Twig_ExtensionInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\ExtensionInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Extension\ExtensionInterface" instead */ + class Twig_ExtensionInterface extends ExtensionInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionSet.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionSet.php new file mode 100644 index 0000000..6541fd6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/ExtensionSet.php @@ -0,0 +1,14 @@ +<?php + +use Twig\ExtensionSet; + +class_exists('Twig\ExtensionSet'); + +@trigger_error(sprintf('Using the "Twig_ExtensionSet" class is deprecated since Twig version 2.7, use "Twig\ExtensionSet" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\ExtensionSet" instead */ + class Twig_ExtensionSet extends ExtensionSet + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php new file mode 100644 index 0000000..dc3efaa --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php @@ -0,0 +1,14 @@ +<?php + +use Twig\RuntimeLoader\FactoryRuntimeLoader; + +class_exists('Twig\RuntimeLoader\FactoryRuntimeLoader'); + +@trigger_error(sprintf('Using the "Twig_FactoryRuntimeLoader" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\FactoryRuntimeLoader" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\FactoryRuntimeLoader" instead */ + class Twig_FactoryRuntimeLoader extends FactoryRuntimeLoader + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php new file mode 100644 index 0000000..33cfe9e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php @@ -0,0 +1,14 @@ +<?php + +use Twig\FileExtensionEscapingStrategy; + +class_exists('Twig\FileExtensionEscapingStrategy'); + +@trigger_error(sprintf('Using the "Twig_FileExtensionEscapingStrategy" class is deprecated since Twig version 2.7, use "Twig\FileExtensionEscapingStrategy" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\FileExtensionEscapingStrategy" instead */ + class Twig_FileExtensionEscapingStrategy extends FileExtensionEscapingStrategy + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Filter.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Filter.php new file mode 100644 index 0000000..52bb4d6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Filter.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TwigFilter; + +class_exists('Twig\TwigFilter'); + +@trigger_error(sprintf('Using the "Twig_Filter" class is deprecated since Twig version 2.7, use "Twig\TwigFilter" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TwigFilter" instead */ + class Twig_Filter extends TwigFilter + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Function.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Function.php new file mode 100644 index 0000000..f95b53f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Function.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TwigFunction; + +class_exists('Twig\TwigFunction'); + +@trigger_error(sprintf('Using the "Twig_Function" class is deprecated since Twig version 2.7, use "Twig\TwigFunction" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TwigFunction" instead */ + class Twig_Function extends TwigFunction + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Lexer.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Lexer.php new file mode 100644 index 0000000..421e3b2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Lexer.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Lexer; + +class_exists('Twig\Lexer'); + +@trigger_error(sprintf('Using the "Twig_Lexer" class is deprecated since Twig version 2.7, use "Twig\Lexer" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Lexer" instead */ + class Twig_Lexer extends Lexer + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Array.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Array.php new file mode 100644 index 0000000..461e394 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Array.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\ArrayLoader; + +class_exists('Twig\Loader\ArrayLoader'); + +@trigger_error(sprintf('Using the "Twig_Loader_Array" class is deprecated since Twig version 2.7, use "Twig\Loader\ArrayLoader" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\ArrayLoader" instead */ + class Twig_Loader_Array extends ArrayLoader + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Chain.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Chain.php new file mode 100644 index 0000000..948959f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Chain.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\ChainLoader; + +class_exists('Twig\Loader\ChainLoader'); + +@trigger_error(sprintf('Using the "Twig_Loader_Chain" class is deprecated since Twig version 2.7, use "Twig\Loader\ChainLoader" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\ChainLoader" instead */ + class Twig_Loader_Chain extends ChainLoader + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Filesystem.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Filesystem.php new file mode 100644 index 0000000..16d4d50 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Loader/Filesystem.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\FilesystemLoader; + +class_exists('Twig\Loader\FilesystemLoader'); + +@trigger_error(sprintf('Using the "Twig_Loader_Filesystem" class is deprecated since Twig version 2.7, use "Twig\Loader\FilesystemLoader" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\FilesystemLoader" instead */ + class Twig_Loader_Filesystem extends FilesystemLoader + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/LoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/LoaderInterface.php new file mode 100644 index 0000000..cabd69e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/LoaderInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\LoaderInterface; + +class_exists('Twig\Loader\LoaderInterface'); + +@trigger_error(sprintf('Using the "Twig_LoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\LoaderInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\LoaderInterface" instead */ + class Twig_LoaderInterface extends LoaderInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Markup.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Markup.php new file mode 100644 index 0000000..f6d8eb2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Markup.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Markup; + +class_exists('Twig\Markup'); + +@trigger_error(sprintf('Using the "Twig_Markup" class is deprecated since Twig version 2.7, use "Twig\Markup" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Markup" instead */ + class Twig_Markup extends Markup + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node.php new file mode 100644 index 0000000..8b5dc52 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Node; + +class_exists('Twig\Node\Node'); + +@trigger_error(sprintf('Using the "Twig_Node" class is deprecated since Twig version 2.7, use "Twig\Node\Node" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Node" instead */ + class Twig_Node extends Node + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/AutoEscape.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/AutoEscape.php new file mode 100644 index 0000000..34006ac --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/AutoEscape.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\AutoEscapeNode; + +class_exists('Twig\Node\AutoEscapeNode'); + +@trigger_error(sprintf('Using the "Twig_Node_AutoEscape" class is deprecated since Twig version 2.7, use "Twig\Node\AutoEscapeNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\AutoEscapeNode" instead */ + class Twig_Node_AutoEscape extends AutoEscapeNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Block.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Block.php new file mode 100644 index 0000000..51f6ff8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Block.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\BlockNode; + +class_exists('Twig\Node\BlockNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Block" class is deprecated since Twig version 2.7, use "Twig\Node\BlockNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\BlockNode" instead */ + class Twig_Node_Block extends BlockNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/BlockReference.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/BlockReference.php new file mode 100644 index 0000000..3e729a0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/BlockReference.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\BlockReferenceNode; + +class_exists('Twig\Node\BlockReferenceNode'); + +@trigger_error(sprintf('Using the "Twig_Node_BlockReference" class is deprecated since Twig version 2.7, use "Twig\Node\BlockReferenceNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\BlockReferenceNode" instead */ + class Twig_Node_BlockReference extends BlockReferenceNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Body.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Body.php new file mode 100644 index 0000000..e8e6042 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Body.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\BodyNode; + +class_exists('Twig\Node\BodyNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Body" class is deprecated since Twig version 2.7, use "Twig\Node\BodyNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\BodyNode" instead */ + class Twig_Node_Body extends BodyNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php new file mode 100644 index 0000000..efc5f1a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\CheckSecurityNode; + +class_exists('Twig\Node\CheckSecurityNode'); + +@trigger_error(sprintf('Using the "Twig_Node_CheckSecurity" class is deprecated since Twig version 2.7, use "Twig\Node\CheckSecurityNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\CheckSecurityNode" instead */ + class Twig_Node_CheckSecurity extends CheckSecurityNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Deprecated.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Deprecated.php new file mode 100644 index 0000000..70af6f2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Deprecated.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\DeprecatedNode; + +class_exists('Twig\Node\DeprecatedNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Deprecated" class is deprecated since Twig version 2.7, use "Twig\Node\DeprecatedNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\DeprecatedNode" instead */ + class Twig_Node_Deprecated extends DeprecatedNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Do.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Do.php new file mode 100644 index 0000000..70267a2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Do.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\DoNode; + +class_exists('Twig\Node\DoNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Do" class is deprecated since Twig version 2.7, use "Twig\Node\DoNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\DoNode" instead */ + class Twig_Node_Do extends DoNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Embed.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Embed.php new file mode 100644 index 0000000..0b7f205 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Embed.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\EmbedNode; + +class_exists('Twig\Node\EmbedNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Embed" class is deprecated since Twig version 2.7, use "Twig\Node\EmbedNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\EmbedNode" instead */ + class Twig_Node_Embed extends EmbedNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression.php new file mode 100644 index 0000000..2b465cc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\AbstractExpression; + +class_exists('Twig\Node\Expression\AbstractExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\AbstractExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\AbstractExpression" instead */ + class Twig_Node_Expression extends AbstractExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Array.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Array.php new file mode 100644 index 0000000..033aafa --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Array.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\ArrayExpression; + +class_exists('Twig\Node\Expression\ArrayExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Array" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ArrayExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ArrayExpression" instead */ + class Twig_Node_Expression_Array extends ArrayExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php new file mode 100644 index 0000000..e359407 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\AssignNameExpression; + +class_exists('Twig\Node\Expression\AssignNameExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_AssignName" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\AssignNameExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\AssignNameExpression" instead */ + class Twig_Node_Expression_AssignName extends AssignNameExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php new file mode 100644 index 0000000..3314d65 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\AbstractBinary; + +class_exists('Twig\Node\Expression\Binary\AbstractBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AbstractBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AbstractBinary" instead */ + class Twig_Node_Expression_Binary extends AbstractBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php new file mode 100644 index 0000000..3c683a6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\AddBinary; + +class_exists('Twig\Node\Expression\Binary\AddBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Add" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AddBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AddBinary" instead */ + class Twig_Node_Expression_Binary_Add extends AddBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php new file mode 100644 index 0000000..4c26aed --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\AndBinary; + +class_exists('Twig\Node\Expression\Binary\AndBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_And" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AndBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AndBinary" instead */ + class Twig_Node_Expression_Binary_And extends AndBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php new file mode 100644 index 0000000..ba93ed7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\BitwiseAndBinary; + +class_exists('Twig\Node\Expression\Binary\BitwiseAndBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseAnd" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseAndBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseAndBinary" instead */ + class Twig_Node_Expression_Binary_BitwiseAnd extends BitwiseAndBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php new file mode 100644 index 0000000..a87e4f5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\BitwiseOrBinary; + +class_exists('Twig\Node\Expression\Binary\BitwiseOrBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseOr" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseOrBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseOrBinary" instead */ + class Twig_Node_Expression_Binary_BitwiseOr extends BitwiseOrBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php new file mode 100644 index 0000000..ac35fde --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\BitwiseXorBinary; + +class_exists('Twig\Node\Expression\Binary\BitwiseXorBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseXor" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseXorBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseXorBinary" instead */ + class Twig_Node_Expression_Binary_BitwiseXor extends BitwiseXorBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php new file mode 100644 index 0000000..29c6997 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\ConcatBinary; + +class_exists('Twig\Node\Expression\Binary\ConcatBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Concat" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\ConcatBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\ConcatBinary" instead */ + class Twig_Node_Expression_Binary_Concat extends ConcatBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php new file mode 100644 index 0000000..1c0e884 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\DivBinary; + +class_exists('Twig\Node\Expression\Binary\DivBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Div" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\DivBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\DivBinary" instead */ + class Twig_Node_Expression_Binary_Div extends DivBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php new file mode 100644 index 0000000..0c59066 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\EndsWithBinary; + +class_exists('Twig\Node\Expression\Binary\EndsWithBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_EndsWith" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\EndsWithBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\EndsWithBinary" instead */ + class Twig_Node_Expression_Binary_EndsWith extends EndsWithBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php new file mode 100644 index 0000000..2f27be4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\EqualBinary; + +class_exists('Twig\Node\Expression\Binary\EqualBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Equal" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\EqualBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\EqualBinary" instead */ + class Twig_Node_Expression_Binary_Equal extends EqualBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php new file mode 100644 index 0000000..93590b6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\FloorDivBinary; + +class_exists('Twig\Node\Expression\Binary\FloorDivBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_FloorDiv" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\FloorDivBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\FloorDivBinary" instead */ + class Twig_Node_Expression_Binary_FloorDiv extends FloorDivBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php new file mode 100644 index 0000000..7083b1c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\GreaterBinary; + +class_exists('Twig\Node\Expression\Binary\GreaterBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Greater" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\GreaterBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\GreaterBinary" instead */ + class Twig_Node_Expression_Binary_Greater extends GreaterBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php new file mode 100644 index 0000000..6ef32b8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\GreaterEqualBinary; + +class_exists('Twig\Node\Expression\Binary\GreaterEqualBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_GreaterEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\GreaterEqualBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\GreaterEqualBinary" instead */ + class Twig_Node_Expression_Binary_GreaterEqual extends GreaterEqualBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php new file mode 100644 index 0000000..57aa165 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\InBinary; + +class_exists('Twig\Node\Expression\Binary\InBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_In" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\InBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\InBinary" instead */ + class Twig_Node_Expression_Binary_In extends InBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php new file mode 100644 index 0000000..586813b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\LessBinary; + +class_exists('Twig\Node\Expression\Binary\LessBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Less" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\LessBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\LessBinary" instead */ + class Twig_Node_Expression_Binary_Less extends LessBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php new file mode 100644 index 0000000..d335879 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\LessEqualBinary; + +class_exists('Twig\Node\Expression\Binary\LessEqualBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_LessEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\LessEqualBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\LessEqualBinary" instead */ + class Twig_Node_Expression_Binary_LessEqual extends LessEqualBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php new file mode 100644 index 0000000..4b3df02 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\MatchesBinary; + +class_exists('Twig\Node\Expression\Binary\MatchesBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Matches" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\MatchesBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\MatchesBinary" instead */ + class Twig_Node_Expression_Binary_Matches extends MatchesBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php new file mode 100644 index 0000000..9bea824 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\ModBinary; + +class_exists('Twig\Node\Expression\Binary\ModBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Mod" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\ModBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\ModBinary" instead */ + class Twig_Node_Expression_Binary_Mod extends ModBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php new file mode 100644 index 0000000..0a831ac --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\MulBinary; + +class_exists('Twig\Node\Expression\Binary\MulBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Mul" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\MulBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\MulBinary" instead */ + class Twig_Node_Expression_Binary_Mul extends MulBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php new file mode 100644 index 0000000..fcb1d3d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\NotEqualBinary; + +class_exists('Twig\Node\Expression\Binary\NotEqualBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_NotEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\NotEqualBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\NotEqualBinary" instead */ + class Twig_Node_Expression_Binary_NotEqual extends NotEqualBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php new file mode 100644 index 0000000..49a88a5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\NotInBinary; + +class_exists('Twig\Node\Expression\Binary\NotInBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_NotIn" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\NotInBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\NotInBinary" instead */ + class Twig_Node_Expression_Binary_NotIn extends NotInBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php new file mode 100644 index 0000000..a5a2805 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\OrBinary; + +class_exists('Twig\Node\Expression\Binary\OrBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Or" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\OrBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\OrBinary" instead */ + class Twig_Node_Expression_Binary_Or extends OrBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php new file mode 100644 index 0000000..5785637 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\PowerBinary; + +class_exists('Twig\Node\Expression\Binary\PowerBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Power" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\PowerBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\PowerBinary" instead */ + class Twig_Node_Expression_Binary_Power extends PowerBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php new file mode 100644 index 0000000..a416a51 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\RangeBinary; + +class_exists('Twig\Node\Expression\Binary\RangeBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Range" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\RangeBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\RangeBinary" instead */ + class Twig_Node_Expression_Binary_Range extends RangeBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php new file mode 100644 index 0000000..366c65a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\StartsWithBinary; + +class_exists('Twig\Node\Expression\Binary\StartsWithBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_StartsWith" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\StartsWithBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\StartsWithBinary" instead */ + class Twig_Node_Expression_Binary_StartsWith extends StartsWithBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php new file mode 100644 index 0000000..5bb252a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Binary\SubBinary; + +class_exists('Twig\Node\Expression\Binary\SubBinary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Sub" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\SubBinary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\SubBinary" instead */ + class Twig_Node_Expression_Binary_Sub extends SubBinary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php new file mode 100644 index 0000000..8cd2cec --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\BlockReferenceExpression; + +class_exists('Twig\Node\Expression\BlockReferenceExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_BlockReference" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\BlockReferenceExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\BlockReferenceExpression" instead */ + class Twig_Node_Expression_BlockReference extends BlockReferenceExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Call.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Call.php new file mode 100644 index 0000000..14fa474 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Call.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\CallExpression; + +class_exists('Twig\Node\Expression\CallExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Call" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\CallExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\CallExpression" instead */ + class Twig_Node_Expression_Call extends CallExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php new file mode 100644 index 0000000..896d543 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\ConditionalExpression; + +class_exists('Twig\Node\Expression\ConditionalExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Conditional" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ConditionalExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ConditionalExpression" instead */ + class Twig_Node_Expression_Conditional extends ConditionalExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php new file mode 100644 index 0000000..d9f7217 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\ConstantExpression; + +class_exists('Twig\Node\Expression\ConstantExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Constant" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ConstantExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ConstantExpression" instead */ + class Twig_Node_Expression_Constant extends ConstantExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php new file mode 100644 index 0000000..e248f88 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\FilterExpression; + +class_exists('Twig\Node\Expression\FilterExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Filter" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\FilterExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\FilterExpression" instead */ + class Twig_Node_Expression_Filter extends FilterExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php new file mode 100644 index 0000000..3e20023 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Filter\DefaultFilter; + +class_exists('Twig\Node\Expression\Filter\DefaultFilter'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Filter_Default" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Filter\DefaultFilter" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Filter\DefaultFilter" instead */ + class Twig_Node_Expression_Filter_Default extends DefaultFilter + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Function.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Function.php new file mode 100644 index 0000000..46b1062 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Function.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\FunctionExpression; + +class_exists('Twig\Node\Expression\FunctionExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Function" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\FunctionExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\FunctionExpression" instead */ + class Twig_Node_Expression_Function extends FunctionExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php new file mode 100644 index 0000000..b64da48 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\GetAttrExpression; + +class_exists('Twig\Node\Expression\GetAttrExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_GetAttr" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\GetAttrExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\GetAttrExpression" instead */ + class Twig_Node_Expression_GetAttr extends GetAttrExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php new file mode 100644 index 0000000..cc85b20 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\MethodCallExpression; + +class_exists('Twig\Node\Expression\MethodCallExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_MethodCall" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\MethodCallExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\MethodCallExpression" instead */ + class Twig_Node_Expression_MethodCall extends MethodCallExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Name.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Name.php new file mode 100644 index 0000000..a0b5bdf --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Name.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\NameExpression; + +class_exists('Twig\Node\Expression\NameExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Name" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\NameExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\NameExpression" instead */ + class Twig_Node_Expression_Name extends NameExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php new file mode 100644 index 0000000..4ac7ebe --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\NullCoalesceExpression; + +class_exists('Twig\Node\Expression\NullCoalesceExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_NullCoalesce" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\NullCoalesceExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\NullCoalesceExpression" instead */ + class Twig_Node_Expression_NullCoalesce extends NullCoalesceExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php new file mode 100644 index 0000000..3b27b65 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\ParentExpression; + +class_exists('Twig\Node\Expression\ParentExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Parent" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ParentExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ParentExpression" instead */ + class Twig_Node_Expression_Parent extends ParentExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php new file mode 100644 index 0000000..41e9d69 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\TempNameExpression; + +class_exists('Twig\Node\Expression\TempNameExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_TempName" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\TempNameExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\TempNameExpression" instead */ + class Twig_Node_Expression_TempName extends TempNameExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test.php new file mode 100644 index 0000000..8e7b253 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\TestExpression; + +class_exists('Twig\Node\Expression\TestExpression'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\TestExpression" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\TestExpression" instead */ + class Twig_Node_Expression_Test extends TestExpression + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php new file mode 100644 index 0000000..dd9b6a9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\ConstantTest; + +class_exists('Twig\Node\Expression\Test\ConstantTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Constant" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\ConstantTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\ConstantTest" instead */ + class Twig_Node_Expression_Test_Constant extends ConstantTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php new file mode 100644 index 0000000..892607d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\DefinedTest; + +class_exists('Twig\Node\Expression\Test\DefinedTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Defined" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\DefinedTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\DefinedTest" instead */ + class Twig_Node_Expression_Test_Defined extends DefinedTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php new file mode 100644 index 0000000..b624aa6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\DivisiblebyTest; + +class_exists('Twig\Node\Expression\Test\DivisiblebyTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Divisibleby" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\DivisiblebyTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\DivisiblebyTest" instead */ + class Twig_Node_Expression_Test_Divisibleby extends DivisiblebyTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php new file mode 100644 index 0000000..355ee04 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\EvenTest; + +class_exists('Twig\Node\Expression\Test\EvenTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Even" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\EvenTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\EvenTest" instead */ + class Twig_Node_Expression_Test_Even extends EvenTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php new file mode 100644 index 0000000..4a5c415 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\NullTest; + +class_exists('Twig\Node\Expression\Test\NullTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Null" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\NullTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\NullTest" instead */ + class Twig_Node_Expression_Test_Null extends NullTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php new file mode 100644 index 0000000..5791d67 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\OddTest; + +class_exists('Twig\Node\Expression\Test\OddTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Odd" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\OddTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\OddTest" instead */ + class Twig_Node_Expression_Test_Odd extends OddTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php new file mode 100644 index 0000000..67e0f0e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Test\SameasTest; + +class_exists('Twig\Node\Expression\Test\SameasTest'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Sameas" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\SameasTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\SameasTest" instead */ + class Twig_Node_Expression_Test_Sameas extends SameasTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php new file mode 100644 index 0000000..1319ea7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Unary\AbstractUnary; + +class_exists('Twig\Node\Expression\Unary\AbstractUnary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\AbstractUnary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\AbstractUnary" instead */ + class Twig_Node_Expression_Unary extends AbstractUnary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php new file mode 100644 index 0000000..11920e6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Unary\NegUnary; + +class_exists('Twig\Node\Expression\Unary\NegUnary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Neg" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\NegUnary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\NegUnary" instead */ + class Twig_Node_Expression_Unary_Neg extends NegUnary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php new file mode 100644 index 0000000..10fda17 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Unary\NotUnary; + +class_exists('Twig\Node\Expression\Unary\NotUnary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Not" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\NotUnary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\NotUnary" instead */ + class Twig_Node_Expression_Unary_Not extends NotUnary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php new file mode 100644 index 0000000..9237809 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\Expression\Unary\PosUnary; + +class_exists('Twig\Node\Expression\Unary\PosUnary'); + +@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Pos" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\PosUnary" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\PosUnary" instead */ + class Twig_Node_Expression_Unary_Pos extends PosUnary + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Flush.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Flush.php new file mode 100644 index 0000000..76031e5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Flush.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\FlushNode; + +class_exists('Twig\Node\FlushNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Flush" class is deprecated since Twig version 2.7, use "Twig\Node\FlushNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\FlushNode" instead */ + class Twig_Node_Flush extends FlushNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/For.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/For.php new file mode 100644 index 0000000..20b6d31 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/For.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\ForNode; + +class_exists('Twig\Node\ForNode'); + +@trigger_error(sprintf('Using the "Twig_Node_For" class is deprecated since Twig version 2.7, use "Twig\Node\ForNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\ForNode" instead */ + class Twig_Node_For extends ForNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/ForLoop.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/ForLoop.php new file mode 100644 index 0000000..9951144 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/ForLoop.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\ForLoopNode; + +class_exists('Twig\Node\ForLoopNode'); + +@trigger_error(sprintf('Using the "Twig_Node_ForLoop" class is deprecated since Twig version 2.7, use "Twig\Node\ForLoopNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\ForLoopNode" instead */ + class Twig_Node_ForLoop extends ForLoopNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/If.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/If.php new file mode 100644 index 0000000..879b590 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/If.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\IfNode; + +class_exists('Twig\Node\IfNode'); + +@trigger_error(sprintf('Using the "Twig_Node_If" class is deprecated since Twig version 2.7, use "Twig\Node\IfNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\IfNode" instead */ + class Twig_Node_If extends IfNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Import.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Import.php new file mode 100644 index 0000000..9640e35 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Import.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\ImportNode; + +class_exists('Twig\Node\ImportNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Import" class is deprecated since Twig version 2.7, use "Twig\Node\ImportNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\ImportNode" instead */ + class Twig_Node_Import extends ImportNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Include.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Include.php new file mode 100644 index 0000000..38b6742 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Include.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\IncludeNode; + +class_exists('Twig\Node\IncludeNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Include" class is deprecated since Twig version 2.7, use "Twig\Node\IncludeNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\IncludeNode" instead */ + class Twig_Node_Include extends IncludeNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Macro.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Macro.php new file mode 100644 index 0000000..1b0a155 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Macro.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\MacroNode; + +class_exists('Twig\Node\MacroNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Macro" class is deprecated since Twig version 2.7, use "Twig\Node\MacroNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\MacroNode" instead */ + class Twig_Node_Macro extends MacroNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Module.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Module.php new file mode 100644 index 0000000..528b52a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Module.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\ModuleNode; + +class_exists('Twig\Node\ModuleNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Module" class is deprecated since Twig version 2.7, use "Twig\Node\ModuleNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\ModuleNode" instead */ + class Twig_Node_Module extends ModuleNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Print.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Print.php new file mode 100644 index 0000000..ffb5f11 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Print.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\PrintNode; + +class_exists('Twig\Node\PrintNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Print" class is deprecated since Twig version 2.7, use "Twig\Node\PrintNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\PrintNode" instead */ + class Twig_Node_Print extends PrintNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Sandbox.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Sandbox.php new file mode 100644 index 0000000..4f38705 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Sandbox.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\SandboxNode; + +class_exists('Twig\Node\SandboxNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Sandbox" class is deprecated since Twig version 2.7, use "Twig\Node\SandboxNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\SandboxNode" instead */ + class Twig_Node_Sandbox extends SandboxNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php new file mode 100644 index 0000000..a17e305 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\SandboxedPrintNode; + +class_exists('Twig\Node\SandboxedPrintNode'); + +@trigger_error(sprintf('Using the "Twig_Node_SandboxedPrint" class is deprecated since Twig version 2.7, use "Twig\Node\SandboxedPrintNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\SandboxedPrintNode" instead */ + class Twig_Node_SandboxedPrint extends SandboxedPrintNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Set.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Set.php new file mode 100644 index 0000000..db48657 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Set.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\SetNode; + +class_exists('Twig\Node\SetNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Set" class is deprecated since Twig version 2.7, use "Twig\Node\SetNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\SetNode" instead */ + class Twig_Node_Set extends SetNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Spaceless.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Spaceless.php new file mode 100644 index 0000000..9f0fd0a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Spaceless.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\SpacelessNode; + +class_exists('Twig\Node\SpacelessNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Spaceless" class is deprecated since Twig version 2.7, use "Twig\Node\SpacelessNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\SpacelessNode" instead */ + class Twig_Node_Spaceless extends SpacelessNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Text.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Text.php new file mode 100644 index 0000000..f85ab37 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/Text.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\TextNode; + +class_exists('Twig\Node\TextNode'); + +@trigger_error(sprintf('Using the "Twig_Node_Text" class is deprecated since Twig version 2.7, use "Twig\Node\TextNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\TextNode" instead */ + class Twig_Node_Text extends TextNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/With.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/With.php new file mode 100644 index 0000000..3c6321d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Node/With.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\WithNode; + +class_exists('Twig\Node\WithNode'); + +@trigger_error(sprintf('Using the "Twig_Node_With" class is deprecated since Twig version 2.7, use "Twig\Node\WithNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\WithNode" instead */ + class Twig_Node_With extends WithNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php new file mode 100644 index 0000000..d3cfb1e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\NodeCaptureInterface; + +class_exists('Twig\Node\NodeCaptureInterface'); + +@trigger_error(sprintf('Using the "Twig_NodeCaptureInterface" class is deprecated since Twig version 2.7, use "Twig\Node\NodeCaptureInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\NodeCaptureInterface" instead */ + class Twig_NodeCaptureInterface extends NodeCaptureInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeOutputInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeOutputInterface.php new file mode 100644 index 0000000..4268e2f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeOutputInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Node\NodeOutputInterface; + +class_exists('Twig\Node\NodeOutputInterface'); + +@trigger_error(sprintf('Using the "Twig_NodeOutputInterface" class is deprecated since Twig version 2.7, use "Twig\Node\NodeOutputInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Node\NodeOutputInterface" instead */ + class Twig_NodeOutputInterface extends NodeOutputInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeTraverser.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeTraverser.php new file mode 100644 index 0000000..66d8fe8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeTraverser.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeTraverser; + +class_exists('Twig\NodeTraverser'); + +@trigger_error(sprintf('Using the "Twig_NodeTraverser" class is deprecated since Twig version 2.7, use "Twig\NodeTraverser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeTraverser" instead */ + class Twig_NodeTraverser extends NodeTraverser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php new file mode 100644 index 0000000..d1fd6c2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\EscaperNodeVisitor; + +class_exists('Twig\NodeVisitor\EscaperNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_NodeVisitor_Escaper" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\EscaperNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\EscaperNodeVisitor" instead */ + class Twig_NodeVisitor_Escaper extends EscaperNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php new file mode 100644 index 0000000..6c7b202 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\OptimizerNodeVisitor; + +class_exists('Twig\NodeVisitor\OptimizerNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_NodeVisitor_Optimizer" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\OptimizerNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\OptimizerNodeVisitor" instead */ + class Twig_NodeVisitor_Optimizer extends OptimizerNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php new file mode 100644 index 0000000..58cbd89 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\SafeAnalysisNodeVisitor; + +class_exists('Twig\NodeVisitor\SafeAnalysisNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_NodeVisitor_SafeAnalysis" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\SafeAnalysisNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\SafeAnalysisNodeVisitor" instead */ + class Twig_NodeVisitor_SafeAnalysis extends SafeAnalysisNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php new file mode 100644 index 0000000..38a0d9a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\SandboxNodeVisitor; + +class_exists('Twig\NodeVisitor\SandboxNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_NodeVisitor_Sandbox" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\SandboxNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\SandboxNodeVisitor" instead */ + class Twig_NodeVisitor_Sandbox extends SandboxNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php new file mode 100644 index 0000000..36f837f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\NodeVisitor\NodeVisitorInterface; + +class_exists('Twig\NodeVisitor\NodeVisitorInterface'); + +@trigger_error(sprintf('Using the "Twig_NodeVisitorInterface" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\NodeVisitorInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\NodeVisitorInterface" instead */ + class Twig_NodeVisitorInterface extends NodeVisitorInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Parser.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Parser.php new file mode 100644 index 0000000..a676499 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Parser.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Parser; + +class_exists('Twig\Parser'); + +@trigger_error(sprintf('Using the "Twig_Parser" class is deprecated since Twig version 2.7, use "Twig\Parser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Parser" instead */ + class Twig_Parser extends Parser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php new file mode 100644 index 0000000..484eeca --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Dumper\BaseDumper; + +class_exists('Twig\Profiler\Dumper\BaseDumper'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Base" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\BaseDumper" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\BaseDumper" instead */ + class Twig_Profiler_Dumper_Base extends BaseDumper + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php new file mode 100644 index 0000000..673d570 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Dumper\BlackfireDumper; + +class_exists('Twig\Profiler\Dumper\BlackfireDumper'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Blackfire" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\BlackfireDumper" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\BlackfireDumper" instead */ + class Twig_Profiler_Dumper_Blackfire extends BlackfireDumper + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php new file mode 100644 index 0000000..114d704 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Dumper\HtmlDumper; + +class_exists('Twig\Profiler\Dumper\HtmlDumper'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Html" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\HtmlDumper" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\HtmlDumper" instead */ + class Twig_Profiler_Dumper_Html extends HtmlDumper + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php new file mode 100644 index 0000000..907e317 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Dumper\TextDumper; + +class_exists('Twig\Profiler\Dumper\TextDumper'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Text" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\TextDumper" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\TextDumper" instead */ + class Twig_Profiler_Dumper_Text extends TextDumper + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php new file mode 100644 index 0000000..0ca0d8e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Node\EnterProfileNode; + +class_exists('Twig\Profiler\Node\EnterProfileNode'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Node_EnterProfile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Node\EnterProfileNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Node\EnterProfileNode" instead */ + class Twig_Profiler_Node_EnterProfile extends EnterProfileNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php new file mode 100644 index 0000000..c582a15 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Node\LeaveProfileNode; + +class_exists('Twig\Profiler\Node\LeaveProfileNode'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Node_LeaveProfile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Node\LeaveProfileNode" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Node\LeaveProfileNode" instead */ + class Twig_Profiler_Node_LeaveProfile extends LeaveProfileNode + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php new file mode 100644 index 0000000..897e251 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\NodeVisitor\ProfilerNodeVisitor; + +class_exists('Twig\Profiler\NodeVisitor\ProfilerNodeVisitor'); + +@trigger_error(sprintf('Using the "Twig_Profiler_NodeVisitor_Profiler" class is deprecated since Twig version 2.7, use "Twig\Profiler\NodeVisitor\ProfilerNodeVisitor" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\NodeVisitor\ProfilerNodeVisitor" instead */ + class Twig_Profiler_NodeVisitor_Profiler extends ProfilerNodeVisitor + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Profile.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Profile.php new file mode 100644 index 0000000..0d38bef --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Profiler/Profile.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Profiler\Profile; + +class_exists('Twig\Profiler\Profile'); + +@trigger_error(sprintf('Using the "Twig_Profiler_Profile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Profile" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Profiler\Profile" instead */ + class Twig_Profiler_Profile extends Profile + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php new file mode 100644 index 0000000..8edf61a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\RuntimeLoader\RuntimeLoaderInterface; + +class_exists('Twig\RuntimeLoader\RuntimeLoaderInterface'); + +@trigger_error(sprintf('Using the "Twig_RuntimeLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\RuntimeLoaderInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\RuntimeLoaderInterface" instead */ + class Twig_RuntimeLoaderInterface extends RuntimeLoaderInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php new file mode 100644 index 0000000..aa97269 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityError; + +class_exists('Twig\Sandbox\SecurityError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityError" instead */ + class Twig_Sandbox_SecurityError extends SecurityError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php new file mode 100644 index 0000000..a68cb9e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityNotAllowedFilterError; + +class_exists('Twig\Sandbox\SecurityNotAllowedFilterError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedFilterError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedFilterError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedFilterError" instead */ + class Twig_Sandbox_SecurityNotAllowedFilterError extends SecurityNotAllowedFilterError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php new file mode 100644 index 0000000..c1e851c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityNotAllowedFunctionError; + +class_exists('Twig\Sandbox\SecurityNotAllowedFunctionError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedFunctionError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedFunctionError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedFunctionError" instead */ + class Twig_Sandbox_SecurityNotAllowedFunctionError extends SecurityNotAllowedFunctionError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php new file mode 100644 index 0000000..96812ce --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityNotAllowedMethodError; + +class_exists('Twig\Sandbox\SecurityNotAllowedMethodError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedMethodError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedMethodError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedMethodError" instead */ + class Twig_Sandbox_SecurityNotAllowedMethodError extends SecurityNotAllowedMethodError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php new file mode 100644 index 0000000..c1cc32b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityNotAllowedPropertyError; + +class_exists('Twig\Sandbox\SecurityNotAllowedPropertyError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedPropertyError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedPropertyError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedPropertyError" instead */ + class Twig_Sandbox_SecurityNotAllowedPropertyError extends SecurityNotAllowedPropertyError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php new file mode 100644 index 0000000..85a1e3b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityNotAllowedTagError; + +class_exists('Twig\Sandbox\SecurityNotAllowedTagError'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedTagError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedTagError" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedTagError" instead */ + class Twig_Sandbox_SecurityNotAllowedTagError extends SecurityNotAllowedTagError + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php new file mode 100644 index 0000000..599e74b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityPolicy; + +class_exists('Twig\Sandbox\SecurityPolicy'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityPolicy" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityPolicy" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityPolicy" instead */ + class Twig_Sandbox_SecurityPolicy extends SecurityPolicy + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php new file mode 100644 index 0000000..1c961de --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Sandbox\SecurityPolicyInterface; + +class_exists('Twig\Sandbox\SecurityPolicyInterface'); + +@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityPolicyInterface" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityPolicyInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityPolicyInterface" instead */ + class Twig_Sandbox_SecurityPolicyInterface extends SecurityPolicyInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFilter.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFilter.php new file mode 100644 index 0000000..8c59f5f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFilter.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Twig\TwigFilter; + +/* + * For Twig 1.x compatibility. + */ +class_exists(TwigFilter::class); + +@trigger_error(sprintf('Using the "Twig_SimpleFilter" class is deprecated since Twig version 2.7, use "Twig\TwigFilter" instead.'), E_USER_DEPRECATED); + +if (false) { + /** @deprecated since Twig 2.7, use "Twig\TwigFilter" instead */ + final class Twig_SimpleFilter extends TwigFilter + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFunction.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFunction.php new file mode 100644 index 0000000..989a8de --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleFunction.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Twig\TwigFunction; + +/* + * For Twig 1.x compatibility. + */ +class_exists(TwigFunction::class); + +@trigger_error(sprintf('Using the "Twig_SimpleFunction" class is deprecated since Twig version 2.7, use "Twig\TwigFunction" instead.'), E_USER_DEPRECATED); + +if (false) { + /** @deprecated since Twig 2.7, use "Twig\TwigFunction" instead */ + final class Twig_SimpleFunction extends TwigFunction + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleTest.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleTest.php new file mode 100644 index 0000000..3e101b3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SimpleTest.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Twig\TwigTest; + +/* + * For Twig 1.x compatibility. + */ +class_exists(TwigTest::class); + +@trigger_error(sprintf('Using the "Twig_SimpleTest" class is deprecated since Twig version 2.7, use "Twig\TwigTest" instead.'), E_USER_DEPRECATED); + +if (false) { + /** @deprecated since Twig 2.7, use "Twig\TwigTest" instead */ + final class Twig_SimpleTest extends TwigTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Source.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Source.php new file mode 100644 index 0000000..f159668 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Source.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Source; + +class_exists('Twig\Source'); + +@trigger_error(sprintf('Using the "Twig_Source" class is deprecated since Twig version 2.7, use "Twig\Source" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Source" instead */ + class Twig_Source extends Source + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php new file mode 100644 index 0000000..e2667e2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Loader\SourceContextLoaderInterface; + +class_exists('Twig\Loader\SourceContextLoaderInterface'); + +@trigger_error(sprintf('Using the "Twig_SourceContextLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\SourceContextLoaderInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Loader\SourceContextLoaderInterface" instead */ + class Twig_SourceContextLoaderInterface extends SourceContextLoaderInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Template.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Template.php new file mode 100644 index 0000000..b736531 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Template.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Template; + +class_exists('Twig\Template'); + +@trigger_error(sprintf('Using the "Twig_Template" class is deprecated since Twig version 2.7, use "Twig\Template" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Template" instead */ + class Twig_Template extends Template + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TemplateWrapper.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TemplateWrapper.php new file mode 100644 index 0000000..42e3049 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TemplateWrapper.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TemplateWrapper; + +class_exists('Twig\TemplateWrapper'); + +@trigger_error(sprintf('Using the "Twig_TemplateWrapper" class is deprecated since Twig version 2.7, use "Twig\TemplateWrapper" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TemplateWrapper" instead */ + class Twig_TemplateWrapper extends TemplateWrapper + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test.php new file mode 100644 index 0000000..5926269 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TwigTest; + +class_exists('Twig\TwigTest'); + +@trigger_error(sprintf('Using the "Twig_Test" class is deprecated since Twig version 2.7, use "Twig\TwigTest" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TwigTest" instead */ + class Twig_Test extends TwigTest + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php new file mode 100644 index 0000000..7338ef4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Test\IntegrationTestCase; + +class_exists('Twig\Test\IntegrationTestCase'); + +@trigger_error(sprintf('Using the "Twig_Test_IntegrationTestCase" class is deprecated since Twig version 2.7, use "Twig\Test\IntegrationTestCase" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Test\IntegrationTestCase" instead */ + class Twig_Test_IntegrationTestCase extends IntegrationTestCase + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php new file mode 100644 index 0000000..86a25e9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Test\NodeTestCase; + +class_exists('Twig\Test\NodeTestCase'); + +@trigger_error(sprintf('Using the "Twig_Test_NodeTestCase" class is deprecated since Twig version 2.7, use "Twig\Test\NodeTestCase" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Test\NodeTestCase" instead */ + class Twig_Test_NodeTestCase extends NodeTestCase + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Token.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Token.php new file mode 100644 index 0000000..63fe110 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Token.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Token; + +class_exists('Twig\Token'); + +@trigger_error(sprintf('Using the "Twig_Token" class is deprecated since Twig version 2.7, use "Twig\Token" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Token" instead */ + class Twig_Token extends Token + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser.php new file mode 100644 index 0000000..bed9f1c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\AbstractTokenParser; + +class_exists('Twig\TokenParser\AbstractTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser" class is deprecated since Twig version 2.7, use "Twig\TokenParser\AbstractTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\AbstractTokenParser" instead */ + class Twig_TokenParser extends AbstractTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php new file mode 100644 index 0000000..614318e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\AutoEscapeTokenParser; + +class_exists('Twig\TokenParser\AutoEscapeTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_AutoEscape" class is deprecated since Twig version 2.7, use "Twig\TokenParser\AutoEscapeTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\AutoEscapeTokenParser" instead */ + class Twig_TokenParser_AutoEscape extends AutoEscapeTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Block.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Block.php new file mode 100644 index 0000000..6ad8367 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Block.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\BlockTokenParser; + +class_exists('Twig\TokenParser\BlockTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Block" class is deprecated since Twig version 2.7, use "Twig\TokenParser\BlockTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\BlockTokenParser" instead */ + class Twig_TokenParser_Block extends BlockTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php new file mode 100644 index 0000000..f57dd9c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\DeprecatedTokenParser; + +class_exists('Twig\TokenParser\DeprecatedTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Deprecated" class is deprecated since Twig version 2.7, use "Twig\TokenParser\DeprecatedTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\DeprecatedTokenParser" instead */ + class Twig_TokenParser_Deprecated extends DeprecatedTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Do.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Do.php new file mode 100644 index 0000000..8957924 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Do.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\DoTokenParser; + +class_exists('Twig\TokenParser\DoTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Do" class is deprecated since Twig version 2.7, use "Twig\TokenParser\DoTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\DoTokenParser" instead */ + class Twig_TokenParser_Do extends DoTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Embed.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Embed.php new file mode 100644 index 0000000..6ff9e61 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Embed.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\EmbedTokenParser; + +class_exists('Twig\TokenParser\EmbedTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Embed" class is deprecated since Twig version 2.7, use "Twig\TokenParser\EmbedTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\EmbedTokenParser" instead */ + class Twig_TokenParser_Embed extends EmbedTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Extends.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Extends.php new file mode 100644 index 0000000..a37d355 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Extends.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\ExtendsTokenParser; + +class_exists('Twig\TokenParser\ExtendsTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Extends" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ExtendsTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\ExtendsTokenParser" instead */ + class Twig_TokenParser_Extends extends ExtendsTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Filter.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Filter.php new file mode 100644 index 0000000..955170f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Filter.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\FilterTokenParser; + +class_exists('Twig\TokenParser\FilterTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Filter" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FilterTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\FilterTokenParser" instead */ + class Twig_TokenParser_Filter extends FilterTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Flush.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Flush.php new file mode 100644 index 0000000..e23e769 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Flush.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\FlushTokenParser; + +class_exists('Twig\TokenParser\FlushTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Flush" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FlushTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\FlushTokenParser" instead */ + class Twig_TokenParser_Flush extends FlushTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/For.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/For.php new file mode 100644 index 0000000..adbff03 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/For.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\ForTokenParser; + +class_exists('Twig\TokenParser\ForTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_For" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ForTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\ForTokenParser" instead */ + class Twig_TokenParser_For extends ForTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/From.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/From.php new file mode 100644 index 0000000..43c9692 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/From.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\FromTokenParser; + +class_exists('Twig\TokenParser\FromTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_From" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FromTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\FromTokenParser" instead */ + class Twig_TokenParser_From extends FromTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/If.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/If.php new file mode 100644 index 0000000..97e1f8b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/If.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\IfTokenParser; + +class_exists('Twig\TokenParser\IfTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_If" class is deprecated since Twig version 2.7, use "Twig\TokenParser\IfTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\IfTokenParser" instead */ + class Twig_TokenParser_If extends IfTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Import.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Import.php new file mode 100644 index 0000000..24a6e9d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Import.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\ImportTokenParser; + +class_exists('Twig\TokenParser\ImportTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Import" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ImportTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\ImportTokenParser" instead */ + class Twig_TokenParser_Import extends ImportTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Include.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Include.php new file mode 100644 index 0000000..8c1adb8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Include.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\IncludeTokenParser; + +class_exists('Twig\TokenParser\IncludeTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Include" class is deprecated since Twig version 2.7, use "Twig\TokenParser\IncludeTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\IncludeTokenParser" instead */ + class Twig_TokenParser_Include extends IncludeTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Macro.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Macro.php new file mode 100644 index 0000000..381b1df --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Macro.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\MacroTokenParser; + +class_exists('Twig\TokenParser\MacroTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Macro" class is deprecated since Twig version 2.7, use "Twig\TokenParser\MacroTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\MacroTokenParser" instead */ + class Twig_TokenParser_Macro extends MacroTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php new file mode 100644 index 0000000..d7d72a7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\SandboxTokenParser; + +class_exists('Twig\TokenParser\SandboxTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Sandbox" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SandboxTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\SandboxTokenParser" instead */ + class Twig_TokenParser_Sandbox extends SandboxTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Set.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Set.php new file mode 100644 index 0000000..c0bf202 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Set.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\SetTokenParser; + +class_exists('Twig\TokenParser\SetTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Set" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SetTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\SetTokenParser" instead */ + class Twig_TokenParser_Set extends SetTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php new file mode 100644 index 0000000..eef230a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\SpacelessTokenParser; + +class_exists('Twig\TokenParser\SpacelessTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Spaceless" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SpacelessTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\SpacelessTokenParser" instead */ + class Twig_TokenParser_Spaceless extends SpacelessTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Use.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Use.php new file mode 100644 index 0000000..cc764ee --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/Use.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\UseTokenParser; + +class_exists('Twig\TokenParser\UseTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_Use" class is deprecated since Twig version 2.7, use "Twig\TokenParser\UseTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\UseTokenParser" instead */ + class Twig_TokenParser_Use extends UseTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/With.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/With.php new file mode 100644 index 0000000..d5973fc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParser/With.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\WithTokenParser; + +class_exists('Twig\TokenParser\WithTokenParser'); + +@trigger_error(sprintf('Using the "Twig_TokenParser_With" class is deprecated since Twig version 2.7, use "Twig\TokenParser\WithTokenParser" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\WithTokenParser" instead */ + class Twig_TokenParser_With extends WithTokenParser + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParserInterface.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParserInterface.php new file mode 100644 index 0000000..1ed1cad --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenParserInterface.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenParser\TokenParserInterface; + +class_exists('Twig\TokenParser\TokenParserInterface'); + +@trigger_error(sprintf('Using the "Twig_TokenParserInterface" class is deprecated since Twig version 2.7, use "Twig\TokenParser\TokenParserInterface" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenParser\TokenParserInterface" instead */ + class Twig_TokenParserInterface extends TokenParserInterface + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenStream.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenStream.php new file mode 100644 index 0000000..0305fa0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/TokenStream.php @@ -0,0 +1,14 @@ +<?php + +use Twig\TokenStream; + +class_exists('Twig\TokenStream'); + +@trigger_error(sprintf('Using the "Twig_TokenStream" class is deprecated since Twig version 2.7, use "Twig\TokenStream" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\TokenStream" instead */ + class Twig_TokenStream extends TokenStream + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php new file mode 100644 index 0000000..5b3f55e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Util\DeprecationCollector; + +class_exists('Twig\Util\DeprecationCollector'); + +@trigger_error(sprintf('Using the "Twig_Util_DeprecationCollector" class is deprecated since Twig version 2.7, use "Twig\Util\DeprecationCollector" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Util\DeprecationCollector" instead */ + class Twig_Util_DeprecationCollector extends DeprecationCollector + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php new file mode 100644 index 0000000..e84b9d8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php @@ -0,0 +1,14 @@ +<?php + +use Twig\Util\TemplateDirIterator; + +class_exists('Twig\Util\TemplateDirIterator'); + +@trigger_error(sprintf('Using the "Twig_Util_TemplateDirIterator" class is deprecated since Twig version 2.7, use "Twig\Util\TemplateDirIterator" instead.'), E_USER_DEPRECATED); + +if (\false) { + /** @deprecated since Twig 2.7, use "Twig\Util\TemplateDirIterator" instead */ + class Twig_Util_TemplateDirIterator extends TemplateDirIterator + { + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Cache/CacheInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/CacheInterface.php new file mode 100644 index 0000000..1c8bb1e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/CacheInterface.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Cache; + +/** + * Interface implemented by cache classes. + * + * It is highly recommended to always store templates on the filesystem to + * benefit from the PHP opcode cache. This interface is mostly useful if you + * need to implement a custom strategy for storing templates on the filesystem. + * + * @author Andrew Tch <andrew@noop.lv> + */ +interface CacheInterface +{ + /** + * Generates a cache key for the given template class name. + * + * @param string $name The template name + * @param string $className The template class name + * + * @return string + */ + public function generateKey($name, $className); + + /** + * Writes the compiled template to cache. + * + * @param string $key The cache key + * @param string $content The template representation as a PHP class + */ + public function write($key, $content); + + /** + * Loads a template from the cache. + * + * @param string $key The cache key + */ + public function load($key); + + /** + * Returns the modification timestamp of a key. + * + * @param string $key The cache key + * + * @return int + */ + public function getTimestamp($key); +} + +class_alias('Twig\Cache\CacheInterface', 'Twig_CacheInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Cache/FilesystemCache.php b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/FilesystemCache.php new file mode 100644 index 0000000..b7c1e43 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/FilesystemCache.php @@ -0,0 +1,93 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Cache; + +/** + * Implements a cache on the filesystem. + * + * @author Andrew Tch <andrew@noop.lv> + */ +class FilesystemCache implements CacheInterface +{ + const FORCE_BYTECODE_INVALIDATION = 1; + + private $directory; + private $options; + + /** + * @param string $directory The root cache directory + * @param int $options A set of options + */ + public function __construct($directory, $options = 0) + { + $this->directory = rtrim($directory, '\/').'/'; + $this->options = $options; + } + + public function generateKey($name, $className) + { + $hash = hash('sha256', $className); + + return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php'; + } + + public function load($key) + { + if (file_exists($key)) { + @include_once $key; + } + } + + public function write($key, $content) + { + $dir = \dirname($key); + if (!is_dir($dir)) { + if (false === @mkdir($dir, 0777, true)) { + clearstatcache(true, $dir); + if (!is_dir($dir)) { + throw new \RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir)); + } + } + } elseif (!is_writable($dir)) { + throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir)); + } + + $tmpFile = tempnam($dir, basename($key)); + if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) { + @chmod($key, 0666 & ~umask()); + + if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) { + // Compile cached file into bytecode cache + if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) { + @opcache_invalidate($key, true); + } elseif (\function_exists('apc_compile_file')) { + apc_compile_file($key); + } + } + + return; + } + + throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key)); + } + + public function getTimestamp($key) + { + if (!file_exists($key)) { + return 0; + } + + return (int) @filemtime($key); + } +} + +class_alias('Twig\Cache\FilesystemCache', 'Twig_Cache_Filesystem'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Cache/NullCache.php b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/NullCache.php new file mode 100644 index 0000000..02c868c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Cache/NullCache.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Cache; + +/** + * Implements a no-cache strategy. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class NullCache implements CacheInterface +{ + public function generateKey($name, $className) + { + return ''; + } + + public function write($key, $content) + { + } + + public function load($key) + { + } + + public function getTimestamp($key) + { + return 0; + } +} + +class_alias('Twig\Cache\NullCache', 'Twig_Cache_Null'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Compiler.php b/srcs/phpmyadmin/vendor/twig/twig/src/Compiler.php new file mode 100644 index 0000000..56933e2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Compiler.php @@ -0,0 +1,245 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Node\Node; + +/** + * Compiles a node to PHP code. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Compiler +{ + private $lastLine; + private $source; + private $indentation; + private $env; + private $debugInfo = []; + private $sourceOffset; + private $sourceLine; + private $varNameSalt = 0; + + public function __construct(Environment $env) + { + $this->env = $env; + } + + /** + * Returns the environment instance related to this compiler. + * + * @return Environment + */ + public function getEnvironment() + { + return $this->env; + } + + /** + * Gets the current PHP code after compilation. + * + * @return string The PHP code + */ + public function getSource() + { + return $this->source; + } + + /** + * Compiles a node. + * + * @param int $indentation The current indentation + * + * @return $this + */ + public function compile(Node $node, $indentation = 0) + { + $this->lastLine = null; + $this->source = ''; + $this->debugInfo = []; + $this->sourceOffset = 0; + // source code starts at 1 (as we then increment it when we encounter new lines) + $this->sourceLine = 1; + $this->indentation = $indentation; + $this->varNameSalt = 0; + + $node->compile($this); + + return $this; + } + + public function subcompile(Node $node, $raw = true) + { + if (false === $raw) { + $this->source .= str_repeat(' ', $this->indentation * 4); + } + + $node->compile($this); + + return $this; + } + + /** + * Adds a raw string to the compiled code. + * + * @param string $string The string + * + * @return $this + */ + public function raw($string) + { + $this->source .= $string; + + return $this; + } + + /** + * Writes a string to the compiled code by adding indentation. + * + * @return $this + */ + public function write(...$strings) + { + foreach ($strings as $string) { + $this->source .= str_repeat(' ', $this->indentation * 4).$string; + } + + return $this; + } + + /** + * Adds a quoted string to the compiled code. + * + * @param string $value The string + * + * @return $this + */ + public function string($value) + { + $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\")); + + return $this; + } + + /** + * Returns a PHP representation of a given value. + * + * @param mixed $value The value to convert + * + * @return $this + */ + public function repr($value) + { + if (\is_int($value) || \is_float($value)) { + if (false !== $locale = setlocale(LC_NUMERIC, '0')) { + setlocale(LC_NUMERIC, 'C'); + } + + $this->raw(var_export($value, true)); + + if (false !== $locale) { + setlocale(LC_NUMERIC, $locale); + } + } elseif (null === $value) { + $this->raw('null'); + } elseif (\is_bool($value)) { + $this->raw($value ? 'true' : 'false'); + } elseif (\is_array($value)) { + $this->raw('array('); + $first = true; + foreach ($value as $key => $v) { + if (!$first) { + $this->raw(', '); + } + $first = false; + $this->repr($key); + $this->raw(' => '); + $this->repr($v); + } + $this->raw(')'); + } else { + $this->string($value); + } + + return $this; + } + + /** + * Adds debugging information. + * + * @return $this + */ + public function addDebugInfo(Node $node) + { + if ($node->getTemplateLine() != $this->lastLine) { + $this->write(sprintf("// line %d\n", $node->getTemplateLine())); + + $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset); + $this->sourceOffset = \strlen($this->source); + $this->debugInfo[$this->sourceLine] = $node->getTemplateLine(); + + $this->lastLine = $node->getTemplateLine(); + } + + return $this; + } + + public function getDebugInfo() + { + ksort($this->debugInfo); + + return $this->debugInfo; + } + + /** + * Indents the generated code. + * + * @param int $step The number of indentation to add + * + * @return $this + */ + public function indent($step = 1) + { + $this->indentation += $step; + + return $this; + } + + /** + * Outdents the generated code. + * + * @param int $step The number of indentation to remove + * + * @return $this + * + * @throws \LogicException When trying to outdent too much so the indentation would become negative + */ + public function outdent($step = 1) + { + // can't outdent by more steps than the current indentation level + if ($this->indentation < $step) { + throw new \LogicException('Unable to call outdent() as the indentation would become negative.'); + } + + $this->indentation -= $step; + + return $this; + } + + public function getVarName() + { + return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->varNameSalt++)); + } +} + +class_alias('Twig\Compiler', 'Twig_Compiler'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Environment.php b/srcs/phpmyadmin/vendor/twig/twig/src/Environment.php new file mode 100644 index 0000000..420a72f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Environment.php @@ -0,0 +1,995 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Cache\CacheInterface; +use Twig\Cache\FilesystemCache; +use Twig\Cache\NullCache; +use Twig\Error\Error; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; +use Twig\Error\SyntaxError; +use Twig\Extension\CoreExtension; +use Twig\Extension\EscaperExtension; +use Twig\Extension\ExtensionInterface; +use Twig\Extension\OptimizerExtension; +use Twig\Loader\ArrayLoader; +use Twig\Loader\ChainLoader; +use Twig\Loader\LoaderInterface; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\NodeVisitor\NodeVisitorInterface; +use Twig\RuntimeLoader\RuntimeLoaderInterface; +use Twig\TokenParser\TokenParserInterface; + +/** + * Stores the Twig configuration. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Environment +{ + const VERSION = '2.12.3'; + const VERSION_ID = 21203; + const MAJOR_VERSION = 2; + const MINOR_VERSION = 12; + const RELEASE_VERSION = 3; + const EXTRA_VERSION = ''; + + private $charset; + private $loader; + private $debug; + private $autoReload; + private $cache; + private $lexer; + private $parser; + private $compiler; + private $baseTemplateClass; + private $globals = []; + private $resolvedGlobals; + private $loadedTemplates; + private $strictVariables; + private $templateClassPrefix = '__TwigTemplate_'; + private $originalCache; + private $extensionSet; + private $runtimeLoaders = []; + private $runtimes = []; + private $optionsHash; + + /** + * Constructor. + * + * Available options: + * + * * debug: When set to true, it automatically set "auto_reload" to true as + * well (default to false). + * + * * charset: The charset used by the templates (default to UTF-8). + * + * * base_template_class: The base template class to use for generated + * templates (default to \Twig\Template). + * + * * cache: An absolute path where to store the compiled templates, + * a \Twig\Cache\CacheInterface implementation, + * or false to disable compilation cache (default). + * + * * auto_reload: Whether to reload the template if the original source changed. + * If you don't provide the auto_reload option, it will be + * determined automatically based on the debug value. + * + * * strict_variables: Whether to ignore invalid variables in templates + * (default to false). + * + * * autoescape: Whether to enable auto-escaping (default to html): + * * false: disable auto-escaping + * * html, js: set the autoescaping to one of the supported strategies + * * name: set the autoescaping strategy based on the template name extension + * * PHP callback: a PHP callback that returns an escaping strategy based on the template "name" + * + * * optimizations: A flag that indicates which optimizations to apply + * (default to -1 which means that all optimizations are enabled; + * set it to 0 to disable). + */ + public function __construct(LoaderInterface $loader, $options = []) + { + $this->setLoader($loader); + + $options = array_merge([ + 'debug' => false, + 'charset' => 'UTF-8', + 'base_template_class' => Template::class, + 'strict_variables' => false, + 'autoescape' => 'html', + 'cache' => false, + 'auto_reload' => null, + 'optimizations' => -1, + ], $options); + + $this->debug = (bool) $options['debug']; + $this->setCharset($options['charset']); + $this->baseTemplateClass = '\\'.ltrim($options['base_template_class'], '\\'); + if ('\\'.Template::class !== $this->baseTemplateClass && '\Twig_Template' !== $this->baseTemplateClass) { + @trigger_error('The "base_template_class" option on '.__CLASS__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED); + } + $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload']; + $this->strictVariables = (bool) $options['strict_variables']; + $this->setCache($options['cache']); + $this->extensionSet = new ExtensionSet(); + + $this->addExtension(new CoreExtension()); + $this->addExtension(new EscaperExtension($options['autoescape'])); + $this->addExtension(new OptimizerExtension($options['optimizations'])); + } + + /** + * Gets the base template class for compiled templates. + * + * @return string The base template class name + */ + public function getBaseTemplateClass() + { + if (1 > \func_num_args() || \func_get_arg(0)) { + @trigger_error('The '.__METHOD__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED); + } + + return $this->baseTemplateClass; + } + + /** + * Sets the base template class for compiled templates. + * + * @param string $class The base template class name + */ + public function setBaseTemplateClass($class) + { + @trigger_error('The '.__METHOD__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED); + + $this->baseTemplateClass = $class; + $this->updateOptionsHash(); + } + + /** + * Enables debugging mode. + */ + public function enableDebug() + { + $this->debug = true; + $this->updateOptionsHash(); + } + + /** + * Disables debugging mode. + */ + public function disableDebug() + { + $this->debug = false; + $this->updateOptionsHash(); + } + + /** + * Checks if debug mode is enabled. + * + * @return bool true if debug mode is enabled, false otherwise + */ + public function isDebug() + { + return $this->debug; + } + + /** + * Enables the auto_reload option. + */ + public function enableAutoReload() + { + $this->autoReload = true; + } + + /** + * Disables the auto_reload option. + */ + public function disableAutoReload() + { + $this->autoReload = false; + } + + /** + * Checks if the auto_reload option is enabled. + * + * @return bool true if auto_reload is enabled, false otherwise + */ + public function isAutoReload() + { + return $this->autoReload; + } + + /** + * Enables the strict_variables option. + */ + public function enableStrictVariables() + { + $this->strictVariables = true; + $this->updateOptionsHash(); + } + + /** + * Disables the strict_variables option. + */ + public function disableStrictVariables() + { + $this->strictVariables = false; + $this->updateOptionsHash(); + } + + /** + * Checks if the strict_variables option is enabled. + * + * @return bool true if strict_variables is enabled, false otherwise + */ + public function isStrictVariables() + { + return $this->strictVariables; + } + + /** + * Gets the current cache implementation. + * + * @param bool $original Whether to return the original cache option or the real cache instance + * + * @return CacheInterface|string|false A Twig\Cache\CacheInterface implementation, + * an absolute path to the compiled templates, + * or false to disable cache + */ + public function getCache($original = true) + { + return $original ? $this->originalCache : $this->cache; + } + + /** + * Sets the current cache implementation. + * + * @param CacheInterface|string|false $cache A Twig\Cache\CacheInterface implementation, + * an absolute path to the compiled templates, + * or false to disable cache + */ + public function setCache($cache) + { + if (\is_string($cache)) { + $this->originalCache = $cache; + $this->cache = new FilesystemCache($cache); + } elseif (false === $cache) { + $this->originalCache = $cache; + $this->cache = new NullCache(); + } elseif ($cache instanceof CacheInterface) { + $this->originalCache = $this->cache = $cache; + } else { + throw new \LogicException(sprintf('Cache can only be a string, false, or a \Twig\Cache\CacheInterface implementation.')); + } + } + + /** + * Gets the template class associated with the given string. + * + * The generated template class is based on the following parameters: + * + * * The cache key for the given template; + * * The currently enabled extensions; + * * Whether the Twig C extension is available or not; + * * PHP version; + * * Twig version; + * * Options with what environment was created. + * + * @param string $name The name for which to calculate the template class name + * @param int|null $index The index if it is an embedded template + * + * @return string The template class name + * + * @internal + */ + public function getTemplateClass($name, $index = null) + { + $key = $this->getLoader()->getCacheKey($name).$this->optionsHash; + + return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '___'.$index); + } + + /** + * Renders a template. + * + * @param string|TemplateWrapper $name The template name + * @param array $context An array of parameters to pass to the template + * + * @return string The rendered template + * + * @throws LoaderError When the template cannot be found + * @throws SyntaxError When an error occurred during compilation + * @throws RuntimeError When an error occurred during rendering + */ + public function render($name, array $context = []) + { + return $this->load($name)->render($context); + } + + /** + * Displays a template. + * + * @param string|TemplateWrapper $name The template name + * @param array $context An array of parameters to pass to the template + * + * @throws LoaderError When the template cannot be found + * @throws SyntaxError When an error occurred during compilation + * @throws RuntimeError When an error occurred during rendering + */ + public function display($name, array $context = []) + { + $this->load($name)->display($context); + } + + /** + * Loads a template. + * + * @param string|TemplateWrapper $name The template name + * + * @throws LoaderError When the template cannot be found + * @throws RuntimeError When a previously generated cache is corrupted + * @throws SyntaxError When an error occurred during compilation + * + * @return TemplateWrapper + */ + public function load($name) + { + if ($name instanceof TemplateWrapper) { + return $name; + } + + if ($name instanceof Template) { + @trigger_error('Passing a \Twig\Template instance to '.__METHOD__.' is deprecated since Twig 2.7.0, use \Twig\TemplateWrapper instead.', E_USER_DEPRECATED); + + return new TemplateWrapper($this, $name); + } + + return new TemplateWrapper($this, $this->loadTemplate($name)); + } + + /** + * Loads a template internal representation. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The template name + * @param int $index The index if it is an embedded template + * + * @return Template A template instance representing the given template name + * + * @throws LoaderError When the template cannot be found + * @throws RuntimeError When a previously generated cache is corrupted + * @throws SyntaxError When an error occurred during compilation + * + * @internal + */ + public function loadTemplate($name, $index = null) + { + return $this->loadClass($this->getTemplateClass($name), $name, $index); + } + + /** + * @internal + */ + public function loadClass($cls, $name, $index = null) + { + $mainCls = $cls; + if (null !== $index) { + $cls .= '___'.$index; + } + + if (isset($this->loadedTemplates[$cls])) { + return $this->loadedTemplates[$cls]; + } + + if (!class_exists($cls, false)) { + $key = $this->cache->generateKey($name, $mainCls); + + if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) { + $this->cache->load($key); + } + + $source = null; + if (!class_exists($cls, false)) { + $source = $this->getLoader()->getSourceContext($name); + $content = $this->compileSource($source); + $this->cache->write($key, $content); + $this->cache->load($key); + + if (!class_exists($mainCls, false)) { + /* Last line of defense if either $this->bcWriteCacheFile was used, + * $this->cache is implemented as a no-op or we have a race condition + * where the cache was cleared between the above calls to write to and load from + * the cache. + */ + eval('?>'.$content); + } + + if (!class_exists($cls, false)) { + throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache might be corrupted.', $name, $index), -1, $source); + } + } + } + + // to be removed in 3.0 + $this->extensionSet->initRuntime($this); + + return $this->loadedTemplates[$cls] = new $cls($this); + } + + /** + * Creates a template from source. + * + * This method should not be used as a generic way to load templates. + * + * @param string $template The template source + * @param string $name An optional name of the template to be used in error messages + * + * @return TemplateWrapper A template instance representing the given template name + * + * @throws LoaderError When the template cannot be found + * @throws SyntaxError When an error occurred during compilation + */ + public function createTemplate($template, string $name = null) + { + $hash = hash('sha256', $template, false); + if (null !== $name) { + $name = sprintf('%s (string template %s)', $name, $hash); + } else { + $name = sprintf('__string_template__%s', $hash); + } + + $loader = new ChainLoader([ + new ArrayLoader([$name => $template]), + $current = $this->getLoader(), + ]); + + $this->setLoader($loader); + try { + return new TemplateWrapper($this, $this->loadTemplate($name)); + } finally { + $this->setLoader($current); + } + } + + /** + * Returns true if the template is still fresh. + * + * Besides checking the loader for freshness information, + * this method also checks if the enabled extensions have + * not changed. + * + * @param string $name The template name + * @param int $time The last modification time of the cached template + * + * @return bool true if the template is fresh, false otherwise + */ + public function isTemplateFresh($name, $time) + { + return $this->extensionSet->getLastModified() <= $time && $this->getLoader()->isFresh($name, $time); + } + + /** + * Tries to load a template consecutively from an array. + * + * Similar to load() but it also accepts instances of \Twig\Template and + * \Twig\TemplateWrapper, and an array of templates where each is tried to be loaded. + * + * @param string|TemplateWrapper|array $names A template or an array of templates to try consecutively + * + * @return TemplateWrapper|Template + * + * @throws LoaderError When none of the templates can be found + * @throws SyntaxError When an error occurred during compilation + */ + public function resolveTemplate($names) + { + if (!\is_array($names)) { + $names = [$names]; + } + + foreach ($names as $name) { + if ($name instanceof Template) { + return $name; + } + if ($name instanceof TemplateWrapper) { + return $name; + } + + try { + return $this->loadTemplate($name); + } catch (LoaderError $e) { + if (1 === \count($names)) { + throw $e; + } + } + } + + throw new LoaderError(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names))); + } + + public function setLexer(Lexer $lexer) + { + $this->lexer = $lexer; + } + + /** + * Tokenizes a source code. + * + * @return TokenStream + * + * @throws SyntaxError When the code is syntactically wrong + */ + public function tokenize(Source $source) + { + if (null === $this->lexer) { + $this->lexer = new Lexer($this); + } + + return $this->lexer->tokenize($source); + } + + public function setParser(Parser $parser) + { + $this->parser = $parser; + } + + /** + * Converts a token stream to a node tree. + * + * @return ModuleNode + * + * @throws SyntaxError When the token stream is syntactically or semantically wrong + */ + public function parse(TokenStream $stream) + { + if (null === $this->parser) { + $this->parser = new Parser($this); + } + + return $this->parser->parse($stream); + } + + public function setCompiler(Compiler $compiler) + { + $this->compiler = $compiler; + } + + /** + * Compiles a node and returns the PHP code. + * + * @return string The compiled PHP source code + */ + public function compile(Node $node) + { + if (null === $this->compiler) { + $this->compiler = new Compiler($this); + } + + return $this->compiler->compile($node)->getSource(); + } + + /** + * Compiles a template source code. + * + * @return string The compiled PHP source code + * + * @throws SyntaxError When there was an error during tokenizing, parsing or compiling + */ + public function compileSource(Source $source) + { + try { + return $this->compile($this->parse($this->tokenize($source))); + } catch (Error $e) { + $e->setSourceContext($source); + throw $e; + } catch (\Exception $e) { + throw new SyntaxError(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e); + } + } + + public function setLoader(LoaderInterface $loader) + { + $this->loader = $loader; + } + + /** + * Gets the Loader instance. + * + * @return LoaderInterface + */ + public function getLoader() + { + return $this->loader; + } + + /** + * Sets the default template charset. + * + * @param string $charset The default charset + */ + public function setCharset($charset) + { + if ('UTF8' === $charset = strtoupper($charset)) { + // iconv on Windows requires "UTF-8" instead of "UTF8" + $charset = 'UTF-8'; + } + + $this->charset = $charset; + } + + /** + * Gets the default template charset. + * + * @return string The default charset + */ + public function getCharset() + { + return $this->charset; + } + + /** + * Returns true if the given extension is registered. + * + * @param string $class The extension class name + * + * @return bool Whether the extension is registered or not + */ + public function hasExtension($class) + { + return $this->extensionSet->hasExtension($class); + } + + /** + * Adds a runtime loader. + */ + public function addRuntimeLoader(RuntimeLoaderInterface $loader) + { + $this->runtimeLoaders[] = $loader; + } + + /** + * Gets an extension by class name. + * + * @param string $class The extension class name + * + * @return ExtensionInterface + */ + public function getExtension($class) + { + return $this->extensionSet->getExtension($class); + } + + /** + * Returns the runtime implementation of a Twig element (filter/function/test). + * + * @param string $class A runtime class name + * + * @return object The runtime implementation + * + * @throws RuntimeError When the template cannot be found + */ + public function getRuntime($class) + { + if (isset($this->runtimes[$class])) { + return $this->runtimes[$class]; + } + + foreach ($this->runtimeLoaders as $loader) { + if (null !== $runtime = $loader->load($class)) { + return $this->runtimes[$class] = $runtime; + } + } + + throw new RuntimeError(sprintf('Unable to load the "%s" runtime.', $class)); + } + + public function addExtension(ExtensionInterface $extension) + { + $this->extensionSet->addExtension($extension); + $this->updateOptionsHash(); + } + + /** + * Registers an array of extensions. + * + * @param array $extensions An array of extensions + */ + public function setExtensions(array $extensions) + { + $this->extensionSet->setExtensions($extensions); + $this->updateOptionsHash(); + } + + /** + * Returns all registered extensions. + * + * @return ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on) + */ + public function getExtensions() + { + return $this->extensionSet->getExtensions(); + } + + public function addTokenParser(TokenParserInterface $parser) + { + $this->extensionSet->addTokenParser($parser); + } + + /** + * Gets the registered Token Parsers. + * + * @return TokenParserInterface[] + * + * @internal + */ + public function getTokenParsers() + { + return $this->extensionSet->getTokenParsers(); + } + + /** + * Gets registered tags. + * + * @return TokenParserInterface[] + * + * @internal + */ + public function getTags() + { + $tags = []; + foreach ($this->getTokenParsers() as $parser) { + $tags[$parser->getTag()] = $parser; + } + + return $tags; + } + + public function addNodeVisitor(NodeVisitorInterface $visitor) + { + $this->extensionSet->addNodeVisitor($visitor); + } + + /** + * Gets the registered Node Visitors. + * + * @return NodeVisitorInterface[] + * + * @internal + */ + public function getNodeVisitors() + { + return $this->extensionSet->getNodeVisitors(); + } + + public function addFilter(TwigFilter $filter) + { + $this->extensionSet->addFilter($filter); + } + + /** + * Get a filter by name. + * + * Subclasses may override this method and load filters differently; + * so no list of filters is available. + * + * @param string $name The filter name + * + * @return TwigFilter|false + * + * @internal + */ + public function getFilter($name) + { + return $this->extensionSet->getFilter($name); + } + + public function registerUndefinedFilterCallback(callable $callable) + { + $this->extensionSet->registerUndefinedFilterCallback($callable); + } + + /** + * Gets the registered Filters. + * + * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback. + * + * @return TwigFilter[] + * + * @see registerUndefinedFilterCallback + * + * @internal + */ + public function getFilters() + { + return $this->extensionSet->getFilters(); + } + + public function addTest(TwigTest $test) + { + $this->extensionSet->addTest($test); + } + + /** + * Gets the registered Tests. + * + * @return TwigTest[] + * + * @internal + */ + public function getTests() + { + return $this->extensionSet->getTests(); + } + + /** + * Gets a test by name. + * + * @param string $name The test name + * + * @return TwigTest|false + * + * @internal + */ + public function getTest($name) + { + return $this->extensionSet->getTest($name); + } + + public function addFunction(TwigFunction $function) + { + $this->extensionSet->addFunction($function); + } + + /** + * Get a function by name. + * + * Subclasses may override this method and load functions differently; + * so no list of functions is available. + * + * @param string $name function name + * + * @return TwigFunction|false + * + * @internal + */ + public function getFunction($name) + { + return $this->extensionSet->getFunction($name); + } + + public function registerUndefinedFunctionCallback(callable $callable) + { + $this->extensionSet->registerUndefinedFunctionCallback($callable); + } + + /** + * Gets registered functions. + * + * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback. + * + * @return TwigFunction[] + * + * @see registerUndefinedFunctionCallback + * + * @internal + */ + public function getFunctions() + { + return $this->extensionSet->getFunctions(); + } + + /** + * Registers a Global. + * + * New globals can be added before compiling or rendering a template; + * but after, you can only update existing globals. + * + * @param string $name The global name + * @param mixed $value The global value + */ + public function addGlobal($name, $value) + { + if ($this->extensionSet->isInitialized() && !\array_key_exists($name, $this->getGlobals())) { + throw new \LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name)); + } + + if (null !== $this->resolvedGlobals) { + $this->resolvedGlobals[$name] = $value; + } else { + $this->globals[$name] = $value; + } + } + + /** + * Gets the registered Globals. + * + * @return array An array of globals + * + * @internal + */ + public function getGlobals() + { + if ($this->extensionSet->isInitialized()) { + if (null === $this->resolvedGlobals) { + $this->resolvedGlobals = array_merge($this->extensionSet->getGlobals(), $this->globals); + } + + return $this->resolvedGlobals; + } + + return array_merge($this->extensionSet->getGlobals(), $this->globals); + } + + /** + * Merges a context with the defined globals. + * + * @param array $context An array representing the context + * + * @return array The context merged with the globals + */ + public function mergeGlobals(array $context) + { + // we don't use array_merge as the context being generally + // bigger than globals, this code is faster. + foreach ($this->getGlobals() as $key => $value) { + if (!\array_key_exists($key, $context)) { + $context[$key] = $value; + } + } + + return $context; + } + + /** + * Gets the registered unary Operators. + * + * @return array An array of unary operators + * + * @internal + */ + public function getUnaryOperators() + { + return $this->extensionSet->getUnaryOperators(); + } + + /** + * Gets the registered binary Operators. + * + * @return array An array of binary operators + * + * @internal + */ + public function getBinaryOperators() + { + return $this->extensionSet->getBinaryOperators(); + } + + private function updateOptionsHash() + { + $this->optionsHash = implode(':', [ + $this->extensionSet->getSignature(), + PHP_MAJOR_VERSION, + PHP_MINOR_VERSION, + self::VERSION, + (int) $this->debug, + $this->baseTemplateClass, + (int) $this->strictVariables, + ]); + } +} + +class_alias('Twig\Environment', 'Twig_Environment'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Error/Error.php b/srcs/phpmyadmin/vendor/twig/twig/src/Error/Error.php new file mode 100644 index 0000000..a64cbcb --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Error/Error.php @@ -0,0 +1,257 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Error; + +use Twig\Source; +use Twig\Template; + +/** + * Twig base exception. + * + * This exception class and its children must only be used when + * an error occurs during the loading of a template, when a syntax error + * is detected in a template, or when rendering a template. Other + * errors must use regular PHP exception classes (like when the template + * cache directory is not writable for instance). + * + * To help debugging template issues, this class tracks the original template + * name and line where the error occurred. + * + * Whenever possible, you must set these information (original template name + * and line number) yourself by passing them to the constructor. If some or all + * these information are not available from where you throw the exception, then + * this class will guess them automatically (when the line number is set to -1 + * and/or the name is set to null). As this is a costly operation, this + * can be disabled by passing false for both the name and the line number + * when creating a new instance of this class. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Error extends \Exception +{ + private $lineno; + private $name; + private $rawMessage; + private $sourcePath; + private $sourceCode; + + /** + * Constructor. + * + * Set the line number to -1 to enable its automatic guessing. + * Set the name to null to enable its automatic guessing. + * + * @param string $message The error message + * @param int $lineno The template line where the error occurred + * @param Source|string|null $source The source context where the error occurred + * @param \Exception $previous The previous exception + */ + public function __construct(string $message, int $lineno = -1, $source = null, \Exception $previous = null) + { + parent::__construct('', 0, $previous); + + if (null === $source) { + $name = null; + } elseif (!$source instanceof Source && !$source instanceof \Twig_Source) { + @trigger_error(sprintf('Passing a string as a source to %s is deprecated since Twig 2.6.1; pass a Twig\Source instance instead.', __CLASS__), E_USER_DEPRECATED); + $name = $source; + } else { + $name = $source->getName(); + $this->sourceCode = $source->getCode(); + $this->sourcePath = $source->getPath(); + } + + $this->lineno = $lineno; + $this->name = $name; + $this->rawMessage = $message; + $this->updateRepr(); + } + + /** + * Gets the raw message. + * + * @return string The raw message + */ + public function getRawMessage() + { + return $this->rawMessage; + } + + /** + * Gets the template line where the error occurred. + * + * @return int The template line + */ + public function getTemplateLine() + { + return $this->lineno; + } + + /** + * Sets the template line where the error occurred. + * + * @param int $lineno The template line + */ + public function setTemplateLine($lineno) + { + $this->lineno = $lineno; + + $this->updateRepr(); + } + + /** + * Gets the source context of the Twig template where the error occurred. + * + * @return Source|null + */ + public function getSourceContext() + { + return $this->name ? new Source($this->sourceCode, $this->name, $this->sourcePath) : null; + } + + /** + * Sets the source context of the Twig template where the error occurred. + */ + public function setSourceContext(Source $source = null) + { + if (null === $source) { + $this->sourceCode = $this->name = $this->sourcePath = null; + } else { + $this->sourceCode = $source->getCode(); + $this->name = $source->getName(); + $this->sourcePath = $source->getPath(); + } + + $this->updateRepr(); + } + + public function guess() + { + $this->guessTemplateInfo(); + $this->updateRepr(); + } + + public function appendMessage($rawMessage) + { + $this->rawMessage .= $rawMessage; + $this->updateRepr(); + } + + private function updateRepr() + { + $this->message = $this->rawMessage; + + if ($this->sourcePath && $this->lineno > 0) { + $this->file = $this->sourcePath; + $this->line = $this->lineno; + + return; + } + + $dot = false; + if ('.' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $dot = true; + } + + $questionMark = false; + if ('?' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $questionMark = true; + } + + if ($this->name) { + if (\is_string($this->name) || (\is_object($this->name) && method_exists($this->name, '__toString'))) { + $name = sprintf('"%s"', $this->name); + } else { + $name = json_encode($this->name); + } + $this->message .= sprintf(' in %s', $name); + } + + if ($this->lineno && $this->lineno >= 0) { + $this->message .= sprintf(' at line %d', $this->lineno); + } + + if ($dot) { + $this->message .= '.'; + } + + if ($questionMark) { + $this->message .= '?'; + } + } + + private function guessTemplateInfo() + { + $template = null; + $templateClass = null; + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT); + foreach ($backtrace as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof Template && 'Twig_Template' !== \get_class($trace['object'])) { + $currentClass = \get_class($trace['object']); + $isEmbedContainer = 0 === strpos($templateClass, $currentClass); + if (null === $this->name || ($this->name == $trace['object']->getTemplateName() && !$isEmbedContainer)) { + $template = $trace['object']; + $templateClass = \get_class($trace['object']); + } + } + } + + // update template name + if (null !== $template && null === $this->name) { + $this->name = $template->getTemplateName(); + } + + // update template path if any + if (null !== $template && null === $this->sourcePath) { + $src = $template->getSourceContext(); + $this->sourceCode = $src->getCode(); + $this->sourcePath = $src->getPath(); + } + + if (null === $template || $this->lineno > -1) { + return; + } + + $r = new \ReflectionObject($template); + $file = $r->getFileName(); + + $exceptions = [$e = $this]; + while ($e = $e->getPrevious()) { + $exceptions[] = $e; + } + + while ($e = array_pop($exceptions)) { + $traces = $e->getTrace(); + array_unshift($traces, ['file' => $e->getFile(), 'line' => $e->getLine()]); + + while ($trace = array_shift($traces)) { + if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) { + continue; + } + + foreach ($template->getDebugInfo() as $codeLine => $templateLine) { + if ($codeLine <= $trace['line']) { + // update template line + $this->lineno = $templateLine; + + return; + } + } + } + } + } +} + +class_alias('Twig\Error\Error', 'Twig_Error'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Error/LoaderError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Error/LoaderError.php new file mode 100644 index 0000000..dc5a9f1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Error/LoaderError.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Error; + +/** + * Exception thrown when an error occurs during template loading. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class LoaderError extends Error +{ +} + +class_alias('Twig\Error\LoaderError', 'Twig_Error_Loader'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Error/RuntimeError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Error/RuntimeError.php new file mode 100644 index 0000000..9b3f36e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Error/RuntimeError.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Error; + +/** + * Exception thrown when an error occurs at runtime. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class RuntimeError extends Error +{ +} + +class_alias('Twig\Error\RuntimeError', 'Twig_Error_Runtime'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Error/SyntaxError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Error/SyntaxError.php new file mode 100644 index 0000000..efece92 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Error/SyntaxError.php @@ -0,0 +1,48 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Error; + +/** + * \Exception thrown when a syntax error occurs during lexing or parsing of a template. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SyntaxError extends Error +{ + /** + * Tweaks the error message to include suggestions. + * + * @param string $name The original name of the item that does not exist + * @param array $items An array of possible items + */ + public function addSuggestions($name, array $items) + { + $alternatives = []; + foreach ($items as $item) { + $lev = levenshtein($name, $item); + if ($lev <= \strlen($name) / 3 || false !== strpos($item, $name)) { + $alternatives[$item] = $lev; + } + } + + if (!$alternatives) { + return; + } + + asort($alternatives); + + $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', array_keys($alternatives)))); + } +} + +class_alias('Twig\Error\SyntaxError', 'Twig_Error_Syntax'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/ExpressionParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/ExpressionParser.php new file mode 100644 index 0000000..2c5df63 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/ExpressionParser.php @@ -0,0 +1,814 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\SyntaxError; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\ArrayExpression; +use Twig\Node\Expression\ArrowFunctionExpression; +use Twig\Node\Expression\AssignNameExpression; +use Twig\Node\Expression\Binary\ConcatBinary; +use Twig\Node\Expression\BlockReferenceExpression; +use Twig\Node\Expression\ConditionalExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\MethodCallExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\ParentExpression; +use Twig\Node\Expression\TestExpression; +use Twig\Node\Expression\Unary\NegUnary; +use Twig\Node\Expression\Unary\NotUnary; +use Twig\Node\Expression\Unary\PosUnary; +use Twig\Node\Node; + +/** + * Parses expressions. + * + * This parser implements a "Precedence climbing" algorithm. + * + * @see https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm + * @see https://en.wikipedia.org/wiki/Operator-precedence_parser + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @internal + */ +class ExpressionParser +{ + const OPERATOR_LEFT = 1; + const OPERATOR_RIGHT = 2; + + private $parser; + private $env; + private $unaryOperators; + private $binaryOperators; + + public function __construct(Parser $parser, Environment $env) + { + $this->parser = $parser; + $this->env = $env; + $this->unaryOperators = $env->getUnaryOperators(); + $this->binaryOperators = $env->getBinaryOperators(); + } + + public function parseExpression($precedence = 0, $allowArrow = false) + { + if ($allowArrow && $arrow = $this->parseArrow()) { + return $arrow; + } + + $expr = $this->getPrimary(); + $token = $this->parser->getCurrentToken(); + while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) { + $op = $this->binaryOperators[$token->getValue()]; + $this->parser->getStream()->next(); + + if ('is not' === $token->getValue()) { + $expr = $this->parseNotTestExpression($expr); + } elseif ('is' === $token->getValue()) { + $expr = $this->parseTestExpression($expr); + } elseif (isset($op['callable'])) { + $expr = $op['callable']($this->parser, $expr); + } else { + $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']); + $class = $op['class']; + $expr = new $class($expr, $expr1, $token->getLine()); + } + + $token = $this->parser->getCurrentToken(); + } + + if (0 === $precedence) { + return $this->parseConditionalExpression($expr); + } + + return $expr; + } + + /** + * @return ArrowFunctionExpression|null + */ + private function parseArrow() + { + $stream = $this->parser->getStream(); + + // short array syntax (one argument, no parentheses)? + if ($stream->look(1)->test(/* Token::ARROW_TYPE */ 12)) { + $line = $stream->getCurrent()->getLine(); + $token = $stream->expect(/* Token::NAME_TYPE */ 5); + $names = [new AssignNameExpression($token->getValue(), $token->getLine())]; + $stream->expect(/* Token::ARROW_TYPE */ 12); + + return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line); + } + + // first, determine if we are parsing an arrow function by finding => (long form) + $i = 0; + if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + return null; + } + ++$i; + while (true) { + // variable name + ++$i; + if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + ++$i; + } + if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) { + return null; + } + ++$i; + if (!$stream->look($i)->test(/* Token::ARROW_TYPE */ 12)) { + return null; + } + + // yes, let's parse it properly + $token = $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '('); + $line = $token->getLine(); + + $names = []; + while (true) { + $token = $stream->expect(/* Token::NAME_TYPE */ 5); + $names[] = new AssignNameExpression($token->getValue(), $token->getLine()); + + if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + } + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')'); + $stream->expect(/* Token::ARROW_TYPE */ 12); + + return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line); + } + + private function getPrimary(): AbstractExpression + { + $token = $this->parser->getCurrentToken(); + + if ($this->isUnary($token)) { + $operator = $this->unaryOperators[$token->getValue()]; + $this->parser->getStream()->next(); + $expr = $this->parseExpression($operator['precedence']); + $class = $operator['class']; + + return $this->parsePostfixExpression(new $class($expr, $token->getLine())); + } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + $this->parser->getStream()->next(); + $expr = $this->parseExpression(); + $this->parser->getStream()->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'An opened parenthesis is not properly closed'); + + return $this->parsePostfixExpression($expr); + } + + return $this->parsePrimaryExpression(); + } + + private function parseConditionalExpression($expr): AbstractExpression + { + while ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, '?')) { + if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) { + $expr2 = $this->parseExpression(); + if ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) { + $expr3 = $this->parseExpression(); + } else { + $expr3 = new ConstantExpression('', $this->parser->getCurrentToken()->getLine()); + } + } else { + $expr2 = $expr; + $expr3 = $this->parseExpression(); + } + + $expr = new ConditionalExpression($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine()); + } + + return $expr; + } + + private function isUnary(Token $token): bool + { + return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->unaryOperators[$token->getValue()]); + } + + private function isBinary(Token $token): bool + { + return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->binaryOperators[$token->getValue()]); + } + + public function parsePrimaryExpression() + { + $token = $this->parser->getCurrentToken(); + switch ($token->getType()) { + case /* Token::NAME_TYPE */ 5: + $this->parser->getStream()->next(); + switch ($token->getValue()) { + case 'true': + case 'TRUE': + $node = new ConstantExpression(true, $token->getLine()); + break; + + case 'false': + case 'FALSE': + $node = new ConstantExpression(false, $token->getLine()); + break; + + case 'none': + case 'NONE': + case 'null': + case 'NULL': + $node = new ConstantExpression(null, $token->getLine()); + break; + + default: + if ('(' === $this->parser->getCurrentToken()->getValue()) { + $node = $this->getFunctionNode($token->getValue(), $token->getLine()); + } else { + $node = new NameExpression($token->getValue(), $token->getLine()); + } + } + break; + + case /* Token::NUMBER_TYPE */ 6: + $this->parser->getStream()->next(); + $node = new ConstantExpression($token->getValue(), $token->getLine()); + break; + + case /* Token::STRING_TYPE */ 7: + case /* Token::INTERPOLATION_START_TYPE */ 10: + $node = $this->parseStringExpression(); + break; + + case /* Token::OPERATOR_TYPE */ 8: + if (preg_match(Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) { + // in this context, string operators are variable names + $this->parser->getStream()->next(); + $node = new NameExpression($token->getValue(), $token->getLine()); + break; + } elseif (isset($this->unaryOperators[$token->getValue()])) { + $class = $this->unaryOperators[$token->getValue()]['class']; + + $ref = new \ReflectionClass($class); + if (!(\in_array($ref->getName(), [NegUnary::class, PosUnary::class, 'Twig_Node_Expression_Unary_Neg', 'Twig_Node_Expression_Unary_Pos']) + || $ref->isSubclassOf(NegUnary::class) || $ref->isSubclassOf(PosUnary::class) + || $ref->isSubclassOf('Twig_Node_Expression_Unary_Neg') || $ref->isSubclassOf('Twig_Node_Expression_Unary_Pos')) + ) { + throw new SyntaxError(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext()); + } + + $this->parser->getStream()->next(); + $expr = $this->parsePrimaryExpression(); + + $node = new $class($expr, $token->getLine()); + break; + } + + // no break + default: + if ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '[')) { + $node = $this->parseArrayExpression(); + } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '{')) { + $node = $this->parseHashExpression(); + } elseif ($token->test(/* Token::OPERATOR_TYPE */ 8, '=') && ('==' === $this->parser->getStream()->look(-1)->getValue() || '!=' === $this->parser->getStream()->look(-1)->getValue())) { + throw new SyntaxError(sprintf('Unexpected operator of value "%s". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead.', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext()); + } else { + throw new SyntaxError(sprintf('Unexpected token "%s" of value "%s".', Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext()); + } + } + + return $this->parsePostfixExpression($node); + } + + public function parseStringExpression() + { + $stream = $this->parser->getStream(); + + $nodes = []; + // a string cannot be followed by another string in a single expression + $nextCanBeString = true; + while (true) { + if ($nextCanBeString && $token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) { + $nodes[] = new ConstantExpression($token->getValue(), $token->getLine()); + $nextCanBeString = false; + } elseif ($stream->nextIf(/* Token::INTERPOLATION_START_TYPE */ 10)) { + $nodes[] = $this->parseExpression(); + $stream->expect(/* Token::INTERPOLATION_END_TYPE */ 11); + $nextCanBeString = true; + } else { + break; + } + } + + $expr = array_shift($nodes); + foreach ($nodes as $node) { + $expr = new ConcatBinary($expr, $node, $node->getTemplateLine()); + } + + return $expr; + } + + public function parseArrayExpression() + { + $stream = $this->parser->getStream(); + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '[', 'An array element was expected'); + + $node = new ArrayExpression([], $stream->getCurrent()->getLine()); + $first = true; + while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) { + if (!$first) { + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'An array element must be followed by a comma'); + + // trailing ,? + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) { + break; + } + } + $first = false; + + $node->addElement($this->parseExpression()); + } + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']', 'An opened array is not properly closed'); + + return $node; + } + + public function parseHashExpression() + { + $stream = $this->parser->getStream(); + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '{', 'A hash element was expected'); + + $node = new ArrayExpression([], $stream->getCurrent()->getLine()); + $first = true; + while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) { + if (!$first) { + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'A hash value must be followed by a comma'); + + // trailing ,? + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) { + break; + } + } + $first = false; + + // a hash key can be: + // + // * a number -- 12 + // * a string -- 'a' + // * a name, which is equivalent to a string -- a + // * an expression, which must be enclosed in parentheses -- (1 + 2) + if (($token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) || ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) || $token = $stream->nextIf(/* Token::NUMBER_TYPE */ 6)) { + $key = new ConstantExpression($token->getValue(), $token->getLine()); + } elseif ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + $key = $this->parseExpression(); + } else { + $current = $stream->getCurrent(); + + throw new SyntaxError(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $stream->getSourceContext()); + } + + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ':', 'A hash key must be followed by a colon (:)'); + $value = $this->parseExpression(); + + $node->addElement($value, $key); + } + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '}', 'An opened hash is not properly closed'); + + return $node; + } + + public function parsePostfixExpression($node) + { + while (true) { + $token = $this->parser->getCurrentToken(); + if (/* Token::PUNCTUATION_TYPE */ 9 == $token->getType()) { + if ('.' == $token->getValue() || '[' == $token->getValue()) { + $node = $this->parseSubscriptExpression($node); + } elseif ('|' == $token->getValue()) { + $node = $this->parseFilterExpression($node); + } else { + break; + } + } else { + break; + } + } + + return $node; + } + + public function getFunctionNode($name, $line) + { + switch ($name) { + case 'parent': + $this->parseArguments(); + if (!\count($this->parser->getBlockStack())) { + throw new SyntaxError('Calling "parent" outside a block is forbidden.', $line, $this->parser->getStream()->getSourceContext()); + } + + if (!$this->parser->getParent() && !$this->parser->hasTraits()) { + throw new SyntaxError('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getStream()->getSourceContext()); + } + + return new ParentExpression($this->parser->peekBlockStack(), $line); + case 'block': + $args = $this->parseArguments(); + if (\count($args) < 1) { + throw new SyntaxError('The "block" function takes one argument (the block name).', $line, $this->parser->getStream()->getSourceContext()); + } + + return new BlockReferenceExpression($args->getNode(0), \count($args) > 1 ? $args->getNode(1) : null, $line); + case 'attribute': + $args = $this->parseArguments(); + if (\count($args) < 2) { + throw new SyntaxError('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getStream()->getSourceContext()); + } + + return new GetAttrExpression($args->getNode(0), $args->getNode(1), \count($args) > 2 ? $args->getNode(2) : null, Template::ANY_CALL, $line); + default: + if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) { + $arguments = new ArrayExpression([], $line); + foreach ($this->parseArguments() as $n) { + $arguments->addElement($n); + } + + $node = new MethodCallExpression($alias['node'], $alias['name'], $arguments, $line); + $node->setAttribute('safe', true); + + return $node; + } + + $args = $this->parseArguments(true); + $class = $this->getFunctionNodeClass($name, $line); + + return new $class($name, $args, $line); + } + } + + public function parseSubscriptExpression($node) + { + $stream = $this->parser->getStream(); + $token = $stream->next(); + $lineno = $token->getLine(); + $arguments = new ArrayExpression([], $lineno); + $type = Template::ANY_CALL; + if ('.' == $token->getValue()) { + $token = $stream->next(); + if ( + /* Token::NAME_TYPE */ 5 == $token->getType() + || + /* Token::NUMBER_TYPE */ 6 == $token->getType() + || + (/* Token::OPERATOR_TYPE */ 8 == $token->getType() && preg_match(Lexer::REGEX_NAME, $token->getValue())) + ) { + $arg = new ConstantExpression($token->getValue(), $lineno); + + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + $type = Template::METHOD_CALL; + foreach ($this->parseArguments() as $n) { + $arguments->addElement($n); + } + } + } else { + throw new SyntaxError('Expected name or number.', $lineno, $stream->getSourceContext()); + } + + if ($node instanceof NameExpression && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) { + if (!$arg instanceof ConstantExpression) { + throw new SyntaxError(sprintf('Dynamic macro names are not supported (called on "%s").', $node->getAttribute('name')), $token->getLine(), $stream->getSourceContext()); + } + + $name = $arg->getAttribute('value'); + + $node = new MethodCallExpression($node, 'macro_'.$name, $arguments, $lineno); + $node->setAttribute('safe', true); + + return $node; + } + } else { + $type = Template::ARRAY_CALL; + + // slice? + $slice = false; + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ':')) { + $slice = true; + $arg = new ConstantExpression(0, $token->getLine()); + } else { + $arg = $this->parseExpression(); + } + + if ($stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) { + $slice = true; + } + + if ($slice) { + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) { + $length = new ConstantExpression(null, $token->getLine()); + } else { + $length = $this->parseExpression(); + } + + $class = $this->getFilterNodeClass('slice', $token->getLine()); + $arguments = new Node([$arg, $length]); + $filter = new $class($node, new ConstantExpression('slice', $token->getLine()), $arguments, $token->getLine()); + + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']'); + + return $filter; + } + + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']'); + } + + return new GetAttrExpression($node, $arg, $arguments, $type, $lineno); + } + + public function parseFilterExpression($node) + { + $this->parser->getStream()->next(); + + return $this->parseFilterExpressionRaw($node); + } + + public function parseFilterExpressionRaw($node, $tag = null) + { + while (true) { + $token = $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5); + + $name = new ConstantExpression($token->getValue(), $token->getLine()); + if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + $arguments = new Node(); + } else { + $arguments = $this->parseArguments(true, false, true); + } + + $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine()); + + $node = new $class($node, $name, $arguments, $token->getLine(), $tag); + + if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '|')) { + break; + } + + $this->parser->getStream()->next(); + } + + return $node; + } + + /** + * Parses arguments. + * + * @param bool $namedArguments Whether to allow named arguments or not + * @param bool $definition Whether we are parsing arguments for a function definition + * + * @return Node + * + * @throws SyntaxError + */ + public function parseArguments($namedArguments = false, $definition = false, $allowArrow = false) + { + $args = []; + $stream = $this->parser->getStream(); + + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '(', 'A list of arguments must begin with an opening parenthesis'); + while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) { + if (!empty($args)) { + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'Arguments must be separated by a comma'); + } + + if ($definition) { + $token = $stream->expect(/* Token::NAME_TYPE */ 5, null, 'An argument must be a name'); + $value = new NameExpression($token->getValue(), $this->parser->getCurrentToken()->getLine()); + } else { + $value = $this->parseExpression(0, $allowArrow); + } + + $name = null; + if ($namedArguments && $token = $stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) { + if (!$value instanceof NameExpression) { + throw new SyntaxError(sprintf('A parameter name must be a string, "%s" given.', \get_class($value)), $token->getLine(), $stream->getSourceContext()); + } + $name = $value->getAttribute('name'); + + if ($definition) { + $value = $this->parsePrimaryExpression(); + + if (!$this->checkConstantExpression($value)) { + throw new SyntaxError(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext()); + } + } else { + $value = $this->parseExpression(0, $allowArrow); + } + } + + if ($definition) { + if (null === $name) { + $name = $value->getAttribute('name'); + $value = new ConstantExpression(null, $this->parser->getCurrentToken()->getLine()); + } + $args[$name] = $value; + } else { + if (null === $name) { + $args[] = $value; + } else { + $args[$name] = $value; + } + } + } + $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'A list of arguments must be closed by a parenthesis'); + + return new Node($args); + } + + public function parseAssignmentExpression() + { + $stream = $this->parser->getStream(); + $targets = []; + while (true) { + $token = $this->parser->getCurrentToken(); + if ($stream->test(/* Token::OPERATOR_TYPE */ 8) && preg_match(Lexer::REGEX_NAME, $token->getValue())) { + // in this context, string operators are variable names + $this->parser->getStream()->next(); + } else { + $stream->expect(/* Token::NAME_TYPE */ 5, null, 'Only variables can be assigned to'); + } + $value = $token->getValue(); + if (\in_array(strtolower($value), ['true', 'false', 'none', 'null'])) { + throw new SyntaxError(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext()); + } + $targets[] = new AssignNameExpression($value, $token->getLine()); + + if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + } + + return new Node($targets); + } + + public function parseMultitargetExpression() + { + $targets = []; + while (true) { + $targets[] = $this->parseExpression(); + if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + } + + return new Node($targets); + } + + private function parseNotTestExpression(Node $node): NotUnary + { + return new NotUnary($this->parseTestExpression($node), $this->parser->getCurrentToken()->getLine()); + } + + private function parseTestExpression(Node $node): TestExpression + { + $stream = $this->parser->getStream(); + list($name, $test) = $this->getTest($node->getTemplateLine()); + + $class = $this->getTestNodeClass($test); + $arguments = null; + if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) { + $arguments = $this->parseArguments(true); + } + + if ('defined' === $name && $node instanceof NameExpression && null !== $alias = $this->parser->getImportedSymbol('function', $node->getAttribute('name'))) { + $node = new MethodCallExpression($alias['node'], $alias['name'], new ArrayExpression([], $node->getTemplateLine()), $node->getTemplateLine()); + $node->setAttribute('safe', true); + } + + return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine()); + } + + private function getTest(int $line): array + { + $stream = $this->parser->getStream(); + $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + + if ($test = $this->env->getTest($name)) { + return [$name, $test]; + } + + if ($stream->test(/* Token::NAME_TYPE */ 5)) { + // try 2-words tests + $name = $name.' '.$this->parser->getCurrentToken()->getValue(); + + if ($test = $this->env->getTest($name)) { + $stream->next(); + + return [$name, $test]; + } + } + + $e = new SyntaxError(sprintf('Unknown "%s" test.', $name), $line, $stream->getSourceContext()); + $e->addSuggestions($name, array_keys($this->env->getTests())); + + throw $e; + } + + private function getTestNodeClass(TwigTest $test): string + { + if ($test->isDeprecated()) { + $stream = $this->parser->getStream(); + $message = sprintf('Twig Test "%s" is deprecated', $test->getName()); + + if (!\is_bool($test->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $test->getDeprecatedVersion()); + } + if ($test->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $test->getAlternative()); + } + $src = $stream->getSourceContext(); + $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $stream->getCurrent()->getLine()); + + @trigger_error($message, E_USER_DEPRECATED); + } + + return $test->getNodeClass(); + } + + private function getFunctionNodeClass(string $name, int $line): string + { + if (false === $function = $this->env->getFunction($name)) { + $e = new SyntaxError(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getStream()->getSourceContext()); + $e->addSuggestions($name, array_keys($this->env->getFunctions())); + + throw $e; + } + + if ($function->isDeprecated()) { + $message = sprintf('Twig Function "%s" is deprecated', $function->getName()); + if (!\is_bool($function->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $function->getDeprecatedVersion()); + } + if ($function->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $function->getAlternative()); + } + $src = $this->parser->getStream()->getSourceContext(); + $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line); + + @trigger_error($message, E_USER_DEPRECATED); + } + + return $function->getNodeClass(); + } + + private function getFilterNodeClass(string $name, int $line): string + { + if (false === $filter = $this->env->getFilter($name)) { + $e = new SyntaxError(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getStream()->getSourceContext()); + $e->addSuggestions($name, array_keys($this->env->getFilters())); + + throw $e; + } + + if ($filter->isDeprecated()) { + $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName()); + if (!\is_bool($filter->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $filter->getDeprecatedVersion()); + } + if ($filter->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $filter->getAlternative()); + } + $src = $this->parser->getStream()->getSourceContext(); + $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line); + + @trigger_error($message, E_USER_DEPRECATED); + } + + return $filter->getNodeClass(); + } + + // checks that the node only contains "constant" elements + private function checkConstantExpression(Node $node): bool + { + if (!($node instanceof ConstantExpression || $node instanceof ArrayExpression + || $node instanceof NegUnary || $node instanceof PosUnary + )) { + return false; + } + + foreach ($node as $n) { + if (!$this->checkConstantExpression($n)) { + return false; + } + } + + return true; + } +} + +class_alias('Twig\ExpressionParser', 'Twig_ExpressionParser'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/AbstractExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/AbstractExtension.php new file mode 100644 index 0000000..0c012b3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/AbstractExtension.php @@ -0,0 +1,47 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +abstract class AbstractExtension implements ExtensionInterface +{ + public function getTokenParsers() + { + return []; + } + + public function getNodeVisitors() + { + return []; + } + + public function getFilters() + { + return []; + } + + public function getTests() + { + return []; + } + + public function getFunctions() + { + return []; + } + + public function getOperators() + { + return []; + } +} + +class_alias('Twig\Extension\AbstractExtension', 'Twig_Extension'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/CoreExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/CoreExtension.php new file mode 100644 index 0000000..494d67b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/CoreExtension.php @@ -0,0 +1,1562 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension { +use Twig\ExpressionParser; +use Twig\Node\Expression\Binary\AddBinary; +use Twig\Node\Expression\Binary\AndBinary; +use Twig\Node\Expression\Binary\BitwiseAndBinary; +use Twig\Node\Expression\Binary\BitwiseOrBinary; +use Twig\Node\Expression\Binary\BitwiseXorBinary; +use Twig\Node\Expression\Binary\ConcatBinary; +use Twig\Node\Expression\Binary\DivBinary; +use Twig\Node\Expression\Binary\EndsWithBinary; +use Twig\Node\Expression\Binary\EqualBinary; +use Twig\Node\Expression\Binary\FloorDivBinary; +use Twig\Node\Expression\Binary\GreaterBinary; +use Twig\Node\Expression\Binary\GreaterEqualBinary; +use Twig\Node\Expression\Binary\InBinary; +use Twig\Node\Expression\Binary\LessBinary; +use Twig\Node\Expression\Binary\LessEqualBinary; +use Twig\Node\Expression\Binary\MatchesBinary; +use Twig\Node\Expression\Binary\ModBinary; +use Twig\Node\Expression\Binary\MulBinary; +use Twig\Node\Expression\Binary\NotEqualBinary; +use Twig\Node\Expression\Binary\NotInBinary; +use Twig\Node\Expression\Binary\OrBinary; +use Twig\Node\Expression\Binary\PowerBinary; +use Twig\Node\Expression\Binary\RangeBinary; +use Twig\Node\Expression\Binary\SpaceshipBinary; +use Twig\Node\Expression\Binary\StartsWithBinary; +use Twig\Node\Expression\Binary\SubBinary; +use Twig\Node\Expression\Filter\DefaultFilter; +use Twig\Node\Expression\NullCoalesceExpression; +use Twig\Node\Expression\Test\ConstantTest; +use Twig\Node\Expression\Test\DefinedTest; +use Twig\Node\Expression\Test\DivisiblebyTest; +use Twig\Node\Expression\Test\EvenTest; +use Twig\Node\Expression\Test\NullTest; +use Twig\Node\Expression\Test\OddTest; +use Twig\Node\Expression\Test\SameasTest; +use Twig\Node\Expression\Unary\NegUnary; +use Twig\Node\Expression\Unary\NotUnary; +use Twig\Node\Expression\Unary\PosUnary; +use Twig\NodeVisitor\MacroAutoImportNodeVisitor; +use Twig\TokenParser\ApplyTokenParser; +use Twig\TokenParser\BlockTokenParser; +use Twig\TokenParser\DeprecatedTokenParser; +use Twig\TokenParser\DoTokenParser; +use Twig\TokenParser\EmbedTokenParser; +use Twig\TokenParser\ExtendsTokenParser; +use Twig\TokenParser\FilterTokenParser; +use Twig\TokenParser\FlushTokenParser; +use Twig\TokenParser\ForTokenParser; +use Twig\TokenParser\FromTokenParser; +use Twig\TokenParser\IfTokenParser; +use Twig\TokenParser\ImportTokenParser; +use Twig\TokenParser\IncludeTokenParser; +use Twig\TokenParser\MacroTokenParser; +use Twig\TokenParser\SetTokenParser; +use Twig\TokenParser\SpacelessTokenParser; +use Twig\TokenParser\UseTokenParser; +use Twig\TokenParser\WithTokenParser; +use Twig\TwigFilter; +use Twig\TwigFunction; +use Twig\TwigTest; + +final class CoreExtension extends AbstractExtension +{ + private $dateFormats = ['F j, Y H:i', '%d days']; + private $numberFormat = [0, '.', ',']; + private $timezone = null; + private $escapers = []; + + /** + * Defines a new escaper to be used via the escape filter. + * + * @param string $strategy The strategy name that should be used as a strategy in the escape call + * @param callable $callable A valid PHP callable + * + * @deprecated since Twig 2.11, to be removed in 3.0; use the same method on EscaperExtension instead + */ + public function setEscaper($strategy, callable $callable) + { + @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.11; use "%s::setEscaper" instead.', __METHOD__, EscaperExtension::class), E_USER_DEPRECATED); + + $this->escapers[$strategy] = $callable; + } + + /** + * Gets all defined escapers. + * + * @return callable[] An array of escapers + * + * @deprecated since Twig 2.11, to be removed in 3.0; use the same method on EscaperExtension instead + */ + public function getEscapers(/* $triggerDeprecation = true */) + { + if (0 === \func_num_args() || func_get_arg(0)) { + @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.11; use "%s::getEscapers" instead.', __METHOD__, EscaperExtension::class), E_USER_DEPRECATED); + } + + return $this->escapers; + } + + /** + * Sets the default format to be used by the date filter. + * + * @param string $format The default date format string + * @param string $dateIntervalFormat The default date interval format string + */ + public function setDateFormat($format = null, $dateIntervalFormat = null) + { + if (null !== $format) { + $this->dateFormats[0] = $format; + } + + if (null !== $dateIntervalFormat) { + $this->dateFormats[1] = $dateIntervalFormat; + } + } + + /** + * Gets the default format to be used by the date filter. + * + * @return array The default date format string and the default date interval format string + */ + public function getDateFormat() + { + return $this->dateFormats; + } + + /** + * Sets the default timezone to be used by the date filter. + * + * @param \DateTimeZone|string $timezone The default timezone string or a \DateTimeZone object + */ + public function setTimezone($timezone) + { + $this->timezone = $timezone instanceof \DateTimeZone ? $timezone : new \DateTimeZone($timezone); + } + + /** + * Gets the default timezone to be used by the date filter. + * + * @return \DateTimeZone The default timezone currently in use + */ + public function getTimezone() + { + if (null === $this->timezone) { + $this->timezone = new \DateTimeZone(date_default_timezone_get()); + } + + return $this->timezone; + } + + /** + * Sets the default format to be used by the number_format filter. + * + * @param int $decimal the number of decimal places to use + * @param string $decimalPoint the character(s) to use for the decimal point + * @param string $thousandSep the character(s) to use for the thousands separator + */ + public function setNumberFormat($decimal, $decimalPoint, $thousandSep) + { + $this->numberFormat = [$decimal, $decimalPoint, $thousandSep]; + } + + /** + * Get the default format used by the number_format filter. + * + * @return array The arguments for number_format() + */ + public function getNumberFormat() + { + return $this->numberFormat; + } + + public function getTokenParsers() + { + return [ + new ApplyTokenParser(), + new ForTokenParser(), + new IfTokenParser(), + new ExtendsTokenParser(), + new IncludeTokenParser(), + new BlockTokenParser(), + new UseTokenParser(), + new FilterTokenParser(), + new MacroTokenParser(), + new ImportTokenParser(), + new FromTokenParser(), + new SetTokenParser(), + new SpacelessTokenParser(), + new FlushTokenParser(), + new DoTokenParser(), + new EmbedTokenParser(), + new WithTokenParser(), + new DeprecatedTokenParser(), + ]; + } + + public function getFilters() + { + return [ + // formatting filters + new TwigFilter('date', 'twig_date_format_filter', ['needs_environment' => true]), + new TwigFilter('date_modify', 'twig_date_modify_filter', ['needs_environment' => true]), + new TwigFilter('format', 'sprintf'), + new TwigFilter('replace', 'twig_replace_filter'), + new TwigFilter('number_format', 'twig_number_format_filter', ['needs_environment' => true]), + new TwigFilter('abs', 'abs'), + new TwigFilter('round', 'twig_round'), + + // encoding + new TwigFilter('url_encode', 'twig_urlencode_filter'), + new TwigFilter('json_encode', 'json_encode'), + new TwigFilter('convert_encoding', 'twig_convert_encoding'), + + // string filters + new TwigFilter('title', 'twig_title_string_filter', ['needs_environment' => true]), + new TwigFilter('capitalize', 'twig_capitalize_string_filter', ['needs_environment' => true]), + new TwigFilter('upper', 'twig_upper_filter', ['needs_environment' => true]), + new TwigFilter('lower', 'twig_lower_filter', ['needs_environment' => true]), + new TwigFilter('striptags', 'strip_tags'), + new TwigFilter('trim', 'twig_trim_filter'), + new TwigFilter('nl2br', 'nl2br', ['pre_escape' => 'html', 'is_safe' => ['html']]), + new TwigFilter('spaceless', 'twig_spaceless', ['is_safe' => ['html']]), + + // array helpers + new TwigFilter('join', 'twig_join_filter'), + new TwigFilter('split', 'twig_split_filter', ['needs_environment' => true]), + new TwigFilter('sort', 'twig_sort_filter'), + new TwigFilter('merge', 'twig_array_merge'), + new TwigFilter('batch', 'twig_array_batch'), + new TwigFilter('column', 'twig_array_column'), + new TwigFilter('filter', 'twig_array_filter'), + new TwigFilter('map', 'twig_array_map'), + new TwigFilter('reduce', 'twig_array_reduce'), + + // string/array filters + new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]), + new TwigFilter('length', 'twig_length_filter', ['needs_environment' => true]), + new TwigFilter('slice', 'twig_slice', ['needs_environment' => true]), + new TwigFilter('first', 'twig_first', ['needs_environment' => true]), + new TwigFilter('last', 'twig_last', ['needs_environment' => true]), + + // iteration and runtime + new TwigFilter('default', '_twig_default_filter', ['node_class' => DefaultFilter::class]), + new TwigFilter('keys', 'twig_get_array_keys_filter'), + ]; + } + + public function getFunctions() + { + return [ + new TwigFunction('max', 'max'), + new TwigFunction('min', 'min'), + new TwigFunction('range', 'range'), + new TwigFunction('constant', 'twig_constant'), + new TwigFunction('cycle', 'twig_cycle'), + new TwigFunction('random', 'twig_random', ['needs_environment' => true]), + new TwigFunction('date', 'twig_date_converter', ['needs_environment' => true]), + new TwigFunction('include', 'twig_include', ['needs_environment' => true, 'needs_context' => true, 'is_safe' => ['all']]), + new TwigFunction('source', 'twig_source', ['needs_environment' => true, 'is_safe' => ['all']]), + ]; + } + + public function getTests() + { + return [ + new TwigTest('even', null, ['node_class' => EvenTest::class]), + new TwigTest('odd', null, ['node_class' => OddTest::class]), + new TwigTest('defined', null, ['node_class' => DefinedTest::class]), + new TwigTest('same as', null, ['node_class' => SameasTest::class]), + new TwigTest('none', null, ['node_class' => NullTest::class]), + new TwigTest('null', null, ['node_class' => NullTest::class]), + new TwigTest('divisible by', null, ['node_class' => DivisiblebyTest::class]), + new TwigTest('constant', null, ['node_class' => ConstantTest::class]), + new TwigTest('empty', 'twig_test_empty'), + new TwigTest('iterable', 'twig_test_iterable'), + ]; + } + + public function getNodeVisitors() + { + return [new MacroAutoImportNodeVisitor()]; + } + + public function getOperators() + { + return [ + [ + 'not' => ['precedence' => 50, 'class' => NotUnary::class], + '-' => ['precedence' => 500, 'class' => NegUnary::class], + '+' => ['precedence' => 500, 'class' => PosUnary::class], + ], + [ + 'or' => ['precedence' => 10, 'class' => OrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'and' => ['precedence' => 15, 'class' => AndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'b-or' => ['precedence' => 16, 'class' => BitwiseOrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'b-xor' => ['precedence' => 17, 'class' => BitwiseXorBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'b-and' => ['precedence' => 18, 'class' => BitwiseAndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '==' => ['precedence' => 20, 'class' => EqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '!=' => ['precedence' => 20, 'class' => NotEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '<=>' => ['precedence' => 20, 'class' => SpaceshipBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '<' => ['precedence' => 20, 'class' => LessBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '>' => ['precedence' => 20, 'class' => GreaterBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '>=' => ['precedence' => 20, 'class' => GreaterEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '<=' => ['precedence' => 20, 'class' => LessEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'not in' => ['precedence' => 20, 'class' => NotInBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'in' => ['precedence' => 20, 'class' => InBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'matches' => ['precedence' => 20, 'class' => MatchesBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'starts with' => ['precedence' => 20, 'class' => StartsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'ends with' => ['precedence' => 20, 'class' => EndsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '..' => ['precedence' => 25, 'class' => RangeBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '+' => ['precedence' => 30, 'class' => AddBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '-' => ['precedence' => 30, 'class' => SubBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '~' => ['precedence' => 40, 'class' => ConcatBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '*' => ['precedence' => 60, 'class' => MulBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '/' => ['precedence' => 60, 'class' => DivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '//' => ['precedence' => 60, 'class' => FloorDivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '%' => ['precedence' => 60, 'class' => ModBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'is' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT], + 'is not' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT], + '**' => ['precedence' => 200, 'class' => PowerBinary::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT], + '??' => ['precedence' => 300, 'class' => NullCoalesceExpression::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT], + ], + ]; + } +} + +class_alias('Twig\Extension\CoreExtension', 'Twig_Extension_Core'); +} + +namespace { + use Twig\Environment; + use Twig\Error\LoaderError; + use Twig\Error\RuntimeError; + use Twig\Extension\CoreExtension; + use Twig\Extension\SandboxExtension; + use Twig\Markup; + use Twig\Source; + use Twig\Template; + + /** + * Cycles over a value. + * + * @param \ArrayAccess|array $values + * @param int $position The cycle position + * + * @return string The next value in the cycle + */ +function twig_cycle($values, $position) +{ + if (!\is_array($values) && !$values instanceof \ArrayAccess) { + return $values; + } + + return $values[$position % \count($values)]; +} + +/** + * Returns a random value depending on the supplied parameter type: + * - a random item from a \Traversable or array + * - a random character from a string + * - a random integer between 0 and the integer parameter. + * + * @param \Traversable|array|int|float|string $values The values to pick a random item from + * @param int|null $max Maximum value used when $values is an int + * + * @throws RuntimeError when $values is an empty array (does not apply to an empty string which is returned as is) + * + * @return mixed A random value from the given sequence + */ +function twig_random(Environment $env, $values = null, $max = null) +{ + if (null === $values) { + return null === $max ? mt_rand() : mt_rand(0, $max); + } + + if (\is_int($values) || \is_float($values)) { + if (null === $max) { + if ($values < 0) { + $max = 0; + $min = $values; + } else { + $max = $values; + $min = 0; + } + } else { + $min = $values; + $max = $max; + } + + return mt_rand($min, $max); + } + + if (\is_string($values)) { + if ('' === $values) { + return ''; + } + + $charset = $env->getCharset(); + + if ('UTF-8' !== $charset) { + $values = iconv($charset, 'UTF-8', $values); + } + + // unicode version of str_split() + // split at all positions, but not after the start and not before the end + $values = preg_split('/(?<!^)(?!$)/u', $values); + + if ('UTF-8' !== $charset) { + foreach ($values as $i => $value) { + $values[$i] = iconv('UTF-8', $charset, $value); + } + } + } + + if (!twig_test_iterable($values)) { + return $values; + } + + $values = twig_to_array($values); + + if (0 === \count($values)) { + throw new RuntimeError('The random function cannot pick from an empty array.'); + } + + return $values[array_rand($values, 1)]; +} + +/** + * Converts a date to the given format. + * + * {{ post.published_at|date("m/d/Y") }} + * + * @param \DateTimeInterface|\DateInterval|string $date A date + * @param string|null $format The target format, null to use the default + * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged + * + * @return string The formatted date + */ +function twig_date_format_filter(Environment $env, $date, $format = null, $timezone = null) +{ + if (null === $format) { + $formats = $env->getExtension(CoreExtension::class)->getDateFormat(); + $format = $date instanceof \DateInterval ? $formats[1] : $formats[0]; + } + + if ($date instanceof \DateInterval) { + return $date->format($format); + } + + return twig_date_converter($env, $date, $timezone)->format($format); +} + +/** + * Returns a new date object modified. + * + * {{ post.published_at|date_modify("-1day")|date("m/d/Y") }} + * + * @param \DateTimeInterface|string $date A date + * @param string $modifier A modifier string + * + * @return \DateTimeInterface + */ +function twig_date_modify_filter(Environment $env, $date, $modifier) +{ + $date = twig_date_converter($env, $date, false); + + return $date->modify($modifier); +} + +/** + * Converts an input to a \DateTime instance. + * + * {% if date(user.created_at) < date('+2days') %} + * {# do something #} + * {% endif %} + * + * @param \DateTimeInterface|string|null $date A date or null to use the current time + * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged + * + * @return \DateTimeInterface + */ +function twig_date_converter(Environment $env, $date = null, $timezone = null) +{ + // determine the timezone + if (false !== $timezone) { + if (null === $timezone) { + $timezone = $env->getExtension(CoreExtension::class)->getTimezone(); + } elseif (!$timezone instanceof \DateTimeZone) { + $timezone = new \DateTimeZone($timezone); + } + } + + // immutable dates + if ($date instanceof \DateTimeImmutable) { + return false !== $timezone ? $date->setTimezone($timezone) : $date; + } + + if ($date instanceof \DateTimeInterface) { + $date = clone $date; + if (false !== $timezone) { + $date->setTimezone($timezone); + } + + return $date; + } + + if (null === $date || 'now' === $date) { + return new \DateTime($date, false !== $timezone ? $timezone : $env->getExtension(CoreExtension::class)->getTimezone()); + } + + $asString = (string) $date; + if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) { + $date = new \DateTime('@'.$date); + } else { + $date = new \DateTime($date, $env->getExtension(CoreExtension::class)->getTimezone()); + } + + if (false !== $timezone) { + $date->setTimezone($timezone); + } + + return $date; +} + +/** + * Replaces strings within a string. + * + * @param string $str String to replace in + * @param array|\Traversable $from Replace values + * + * @return string + */ +function twig_replace_filter($str, $from) +{ + if (!twig_test_iterable($from)) { + throw new RuntimeError(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', \is_object($from) ? \get_class($from) : \gettype($from))); + } + + return strtr($str, twig_to_array($from)); +} + +/** + * Rounds a number. + * + * @param int|float $value The value to round + * @param int|float $precision The rounding precision + * @param string $method The method to use for rounding + * + * @return int|float The rounded number + */ +function twig_round($value, $precision = 0, $method = 'common') +{ + if ('common' == $method) { + return round($value, $precision); + } + + if ('ceil' != $method && 'floor' != $method) { + throw new RuntimeError('The round filter only supports the "common", "ceil", and "floor" methods.'); + } + + return $method($value * pow(10, $precision)) / pow(10, $precision); +} + +/** + * Number format filter. + * + * All of the formatting options can be left null, in that case the defaults will + * be used. Supplying any of the parameters will override the defaults set in the + * environment object. + * + * @param mixed $number A float/int/string of the number to format + * @param int $decimal the number of decimal points to display + * @param string $decimalPoint the character(s) to use for the decimal point + * @param string $thousandSep the character(s) to use for the thousands separator + * + * @return string The formatted number + */ +function twig_number_format_filter(Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null) +{ + $defaults = $env->getExtension(CoreExtension::class)->getNumberFormat(); + if (null === $decimal) { + $decimal = $defaults[0]; + } + + if (null === $decimalPoint) { + $decimalPoint = $defaults[1]; + } + + if (null === $thousandSep) { + $thousandSep = $defaults[2]; + } + + return number_format((float) $number, $decimal, $decimalPoint, $thousandSep); +} + +/** + * URL encodes (RFC 3986) a string as a path segment or an array as a query string. + * + * @param string|array $url A URL or an array of query parameters + * + * @return string The URL encoded value + */ +function twig_urlencode_filter($url) +{ + if (\is_array($url)) { + return http_build_query($url, '', '&', PHP_QUERY_RFC3986); + } + + return rawurlencode($url); +} + +/** + * Merges an array with another one. + * + * {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %} + * + * {% set items = items|merge({ 'peugeot': 'car' }) %} + * + * {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #} + * + * @param array|\Traversable $arr1 An array + * @param array|\Traversable $arr2 An array + * + * @return array The merged array + */ +function twig_array_merge($arr1, $arr2) +{ + if (!twig_test_iterable($arr1)) { + throw new RuntimeError(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($arr1))); + } + + if (!twig_test_iterable($arr2)) { + throw new RuntimeError(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as second argument.', \gettype($arr2))); + } + + return array_merge(twig_to_array($arr1), twig_to_array($arr2)); +} + +/** + * Slices a variable. + * + * @param mixed $item A variable + * @param int $start Start of the slice + * @param int $length Size of the slice + * @param bool $preserveKeys Whether to preserve key or not (when the input is an array) + * + * @return mixed The sliced variable + */ +function twig_slice(Environment $env, $item, $start, $length = null, $preserveKeys = false) +{ + if ($item instanceof \Traversable) { + while ($item instanceof \IteratorAggregate) { + $item = $item->getIterator(); + } + + if ($start >= 0 && $length >= 0 && $item instanceof \Iterator) { + try { + return iterator_to_array(new \LimitIterator($item, $start, null === $length ? -1 : $length), $preserveKeys); + } catch (\OutOfBoundsException $e) { + return []; + } + } + + $item = iterator_to_array($item, $preserveKeys); + } + + if (\is_array($item)) { + return \array_slice($item, $start, $length, $preserveKeys); + } + + $item = (string) $item; + + return (string) mb_substr($item, $start, $length, $env->getCharset()); +} + +/** + * Returns the first element of the item. + * + * @param mixed $item A variable + * + * @return mixed The first element of the item + */ +function twig_first(Environment $env, $item) +{ + $elements = twig_slice($env, $item, 0, 1, false); + + return \is_string($elements) ? $elements : current($elements); +} + +/** + * Returns the last element of the item. + * + * @param mixed $item A variable + * + * @return mixed The last element of the item + */ +function twig_last(Environment $env, $item) +{ + $elements = twig_slice($env, $item, -1, 1, false); + + return \is_string($elements) ? $elements : current($elements); +} + +/** + * Joins the values to a string. + * + * The separators between elements are empty strings per default, you can define them with the optional parameters. + * + * {{ [1, 2, 3]|join(', ', ' and ') }} + * {# returns 1, 2 and 3 #} + * + * {{ [1, 2, 3]|join('|') }} + * {# returns 1|2|3 #} + * + * {{ [1, 2, 3]|join }} + * {# returns 123 #} + * + * @param array $value An array + * @param string $glue The separator + * @param string|null $and The separator for the last pair + * + * @return string The concatenated string + */ +function twig_join_filter($value, $glue = '', $and = null) +{ + if (!twig_test_iterable($value)) { + $value = (array) $value; + } + + $value = twig_to_array($value, false); + + if (0 === \count($value)) { + return ''; + } + + if (null === $and || $and === $glue) { + return implode($glue, $value); + } + + if (1 === \count($value)) { + return $value[0]; + } + + return implode($glue, \array_slice($value, 0, -1)).$and.$value[\count($value) - 1]; +} + +/** + * Splits the string into an array. + * + * {{ "one,two,three"|split(',') }} + * {# returns [one, two, three] #} + * + * {{ "one,two,three,four,five"|split(',', 3) }} + * {# returns [one, two, "three,four,five"] #} + * + * {{ "123"|split('') }} + * {# returns [1, 2, 3] #} + * + * {{ "aabbcc"|split('', 2) }} + * {# returns [aa, bb, cc] #} + * + * @param string $value A string + * @param string $delimiter The delimiter + * @param int $limit The limit + * + * @return array The split string as an array + */ +function twig_split_filter(Environment $env, $value, $delimiter, $limit = null) +{ + if (\strlen($delimiter) > 0) { + return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit); + } + + if ($limit <= 1) { + return preg_split('/(?<!^)(?!$)/u', $value); + } + + $length = mb_strlen($value, $env->getCharset()); + if ($length < $limit) { + return [$value]; + } + + $r = []; + for ($i = 0; $i < $length; $i += $limit) { + $r[] = mb_substr($value, $i, $limit, $env->getCharset()); + } + + return $r; +} + +// The '_default' filter is used internally to avoid using the ternary operator +// which costs a lot for big contexts (before PHP 5.4). So, on average, +// a function call is cheaper. +/** + * @internal + */ +function _twig_default_filter($value, $default = '') +{ + if (twig_test_empty($value)) { + return $default; + } + + return $value; +} + +/** + * Returns the keys for the given array. + * + * It is useful when you want to iterate over the keys of an array: + * + * {% for key in array|keys %} + * {# ... #} + * {% endfor %} + * + * @param array $array An array + * + * @return array The keys + */ +function twig_get_array_keys_filter($array) +{ + if ($array instanceof \Traversable) { + while ($array instanceof \IteratorAggregate) { + $array = $array->getIterator(); + } + + if ($array instanceof \Iterator) { + $keys = []; + $array->rewind(); + while ($array->valid()) { + $keys[] = $array->key(); + $array->next(); + } + + return $keys; + } + + $keys = []; + foreach ($array as $key => $item) { + $keys[] = $key; + } + + return $keys; + } + + if (!\is_array($array)) { + return []; + } + + return array_keys($array); +} + +/** + * Reverses a variable. + * + * @param array|\Traversable|string $item An array, a \Traversable instance, or a string + * @param bool $preserveKeys Whether to preserve key or not + * + * @return mixed The reversed input + */ +function twig_reverse_filter(Environment $env, $item, $preserveKeys = false) +{ + if ($item instanceof \Traversable) { + return array_reverse(iterator_to_array($item), $preserveKeys); + } + + if (\is_array($item)) { + return array_reverse($item, $preserveKeys); + } + + $string = (string) $item; + + $charset = $env->getCharset(); + + if ('UTF-8' !== $charset) { + $item = iconv($charset, 'UTF-8', $string); + } + + preg_match_all('/./us', $item, $matches); + + $string = implode('', array_reverse($matches[0])); + + if ('UTF-8' !== $charset) { + $string = iconv('UTF-8', $charset, $string); + } + + return $string; +} + +/** + * Sorts an array. + * + * @param array|\Traversable $array + * + * @return array + */ +function twig_sort_filter($array, $arrow = null) +{ + if ($array instanceof \Traversable) { + $array = iterator_to_array($array); + } elseif (!\is_array($array)) { + throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array))); + } + + if (null !== $arrow) { + uasort($array, $arrow); + } else { + asort($array); + } + + return $array; +} + +/** + * @internal + */ +function twig_in_filter($value, $compare) +{ + if ($value instanceof Markup) { + $value = (string) $value; + } + if ($compare instanceof Markup) { + $compare = (string) $compare; + } + + if (\is_array($compare)) { + return \in_array($value, $compare, \is_object($value) || \is_resource($value)); + } elseif (\is_string($compare) && (\is_string($value) || \is_int($value) || \is_float($value))) { + return '' === $value || false !== strpos($compare, (string) $value); + } elseif ($compare instanceof \Traversable) { + if (\is_object($value) || \is_resource($value)) { + foreach ($compare as $item) { + if ($item === $value) { + return true; + } + } + } else { + foreach ($compare as $item) { + if ($item == $value) { + return true; + } + } + } + + return false; + } + + return false; +} + +/** + * Returns a trimmed string. + * + * @return string + * + * @throws RuntimeError When an invalid trimming side is used (not a string or not 'left', 'right', or 'both') + */ +function twig_trim_filter($string, $characterMask = null, $side = 'both') +{ + if (null === $characterMask) { + $characterMask = " \t\n\r\0\x0B"; + } + + switch ($side) { + case 'both': + return trim($string, $characterMask); + case 'left': + return ltrim($string, $characterMask); + case 'right': + return rtrim($string, $characterMask); + default: + throw new RuntimeError('Trimming side must be "left", "right" or "both".'); + } +} + +/** + * Removes whitespaces between HTML tags. + * + * @return string + */ +function twig_spaceless($content) +{ + return trim(preg_replace('/>\s+</', '><', $content)); +} + +function twig_convert_encoding($string, $to, $from) +{ + return iconv($from, $to, $string); +} + +/** + * Returns the length of a variable. + * + * @param mixed $thing A variable + * + * @return int The length of the value + */ +function twig_length_filter(Environment $env, $thing) +{ + if (null === $thing) { + return 0; + } + + if (is_scalar($thing)) { + return mb_strlen($thing, $env->getCharset()); + } + + if ($thing instanceof \Countable || \is_array($thing) || $thing instanceof \SimpleXMLElement) { + return \count($thing); + } + + if ($thing instanceof \Traversable) { + return iterator_count($thing); + } + + if (method_exists($thing, '__toString') && !$thing instanceof \Countable) { + return mb_strlen((string) $thing, $env->getCharset()); + } + + return 1; +} + +/** + * Converts a string to uppercase. + * + * @param string $string A string + * + * @return string The uppercased string + */ +function twig_upper_filter(Environment $env, $string) +{ + return mb_strtoupper($string, $env->getCharset()); +} + +/** + * Converts a string to lowercase. + * + * @param string $string A string + * + * @return string The lowercased string + */ +function twig_lower_filter(Environment $env, $string) +{ + return mb_strtolower($string, $env->getCharset()); +} + +/** + * Returns a titlecased string. + * + * @param string $string A string + * + * @return string The titlecased string + */ +function twig_title_string_filter(Environment $env, $string) +{ + if (null !== $charset = $env->getCharset()) { + return mb_convert_case($string, MB_CASE_TITLE, $charset); + } + + return ucwords(strtolower($string)); +} + +/** + * Returns a capitalized string. + * + * @param string $string A string + * + * @return string The capitalized string + */ +function twig_capitalize_string_filter(Environment $env, $string) +{ + $charset = $env->getCharset(); + + return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).mb_strtolower(mb_substr($string, 1, null, $charset), $charset); +} + +/** + * @internal + */ +function twig_call_macro(Template $template, string $method, array $args, int $lineno, array $context, Source $source) +{ + if (!method_exists($template, $method)) { + $parent = $template; + while ($parent = $parent->getParent($context)) { + if (method_exists($parent, $method)) { + return $parent->$method(...$args); + } + } + + throw new RuntimeError(sprintf('Macro "%s" is not defined in template "%s".', substr($method, \strlen('macro_')), $template->getTemplateName()), $lineno, $source); + } + + return $template->$method(...$args); +} + +/** + * @internal + */ +function twig_ensure_traversable($seq) +{ + if ($seq instanceof \Traversable || \is_array($seq)) { + return $seq; + } + + return []; +} + +/** + * @internal + */ +function twig_to_array($seq, $preserveKeys = true) +{ + if ($seq instanceof \Traversable) { + return iterator_to_array($seq, $preserveKeys); + } + + if (!\is_array($seq)) { + return $seq; + } + + return $preserveKeys ? $seq : array_values($seq); +} + +/** + * Checks if a variable is empty. + * + * {# evaluates to true if the foo variable is null, false, or the empty string #} + * {% if foo is empty %} + * {# ... #} + * {% endif %} + * + * @param mixed $value A variable + * + * @return bool true if the value is empty, false otherwise + */ +function twig_test_empty($value) +{ + if ($value instanceof \Countable) { + return 0 == \count($value); + } + + if ($value instanceof \Traversable) { + return !iterator_count($value); + } + + if (\is_object($value) && method_exists($value, '__toString')) { + return '' === (string) $value; + } + + return '' === $value || false === $value || null === $value || [] === $value; +} + +/** + * Checks if a variable is traversable. + * + * {# evaluates to true if the foo variable is an array or a traversable object #} + * {% if foo is iterable %} + * {# ... #} + * {% endif %} + * + * @param mixed $value A variable + * + * @return bool true if the value is traversable + */ +function twig_test_iterable($value) +{ + return $value instanceof \Traversable || \is_array($value); +} + +/** + * Renders a template. + * + * @param array $context + * @param string|array $template The template to render or an array of templates to try consecutively + * @param array $variables The variables to pass to the template + * @param bool $withContext + * @param bool $ignoreMissing Whether to ignore missing templates or not + * @param bool $sandboxed Whether to sandbox the template or not + * + * @return string The rendered template + */ +function twig_include(Environment $env, $context, $template, $variables = [], $withContext = true, $ignoreMissing = false, $sandboxed = false) +{ + $alreadySandboxed = false; + $sandbox = null; + if ($withContext) { + $variables = array_merge($context, $variables); + } + + if ($isSandboxed = $sandboxed && $env->hasExtension(SandboxExtension::class)) { + $sandbox = $env->getExtension(SandboxExtension::class); + if (!$alreadySandboxed = $sandbox->isSandboxed()) { + $sandbox->enableSandbox(); + } + } + + try { + $loaded = null; + try { + $loaded = $env->resolveTemplate($template); + } catch (LoaderError $e) { + if (!$ignoreMissing) { + throw $e; + } + } + + return $loaded ? $loaded->render($variables) : ''; + } finally { + if ($isSandboxed && !$alreadySandboxed) { + $sandbox->disableSandbox(); + } + } +} + +/** + * Returns a template content without rendering it. + * + * @param string $name The template name + * @param bool $ignoreMissing Whether to ignore missing templates or not + * + * @return string The template source + */ +function twig_source(Environment $env, $name, $ignoreMissing = false) +{ + $loader = $env->getLoader(); + try { + return $loader->getSourceContext($name)->getCode(); + } catch (LoaderError $e) { + if (!$ignoreMissing) { + throw $e; + } + } +} + +/** + * Provides the ability to get constants from instances as well as class/global constants. + * + * @param string $constant The name of the constant + * @param object|null $object The object to get the constant from + * + * @return string + */ +function twig_constant($constant, $object = null) +{ + if (null !== $object) { + $constant = \get_class($object).'::'.$constant; + } + + return \constant($constant); +} + +/** + * Checks if a constant exists. + * + * @param string $constant The name of the constant + * @param object|null $object The object to get the constant from + * + * @return bool + */ +function twig_constant_is_defined($constant, $object = null) +{ + if (null !== $object) { + $constant = \get_class($object).'::'.$constant; + } + + return \defined($constant); +} + +/** + * Batches item. + * + * @param array $items An array of items + * @param int $size The size of the batch + * @param mixed $fill A value used to fill missing items + * + * @return array + */ +function twig_array_batch($items, $size, $fill = null, $preserveKeys = true) +{ + if (!twig_test_iterable($items)) { + throw new RuntimeError(sprintf('The "batch" filter expects an array or "Traversable", got "%s".', \is_object($items) ? \get_class($items) : \gettype($items))); + } + + $size = ceil($size); + + $result = array_chunk(twig_to_array($items, $preserveKeys), $size, $preserveKeys); + + if (null !== $fill && $result) { + $last = \count($result) - 1; + if ($fillCount = $size - \count($result[$last])) { + for ($i = 0; $i < $fillCount; ++$i) { + $result[$last][] = $fill; + } + } + } + + return $result; +} + +/** + * Returns the attribute value for a given array/object. + * + * @param mixed $object The object or array from where to get the item + * @param mixed $item The item to get from the array or object + * @param array $arguments An array of arguments to pass if the item is an object method + * @param string $type The type of attribute (@see \Twig\Template constants) + * @param bool $isDefinedTest Whether this is only a defined check + * @param bool $ignoreStrictCheck Whether to ignore the strict attribute check or not + * @param int $lineno The template line where the attribute was called + * + * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true + * + * @throws RuntimeError if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false + * + * @internal + */ +function twig_get_attribute(Environment $env, Source $source, $object, $item, array $arguments = [], $type = /* Template::ANY_CALL */ 'any', $isDefinedTest = false, $ignoreStrictCheck = false, $sandboxed = false, int $lineno = -1) +{ + // array + if (/* Template::METHOD_CALL */ 'method' !== $type) { + $arrayItem = \is_bool($item) || \is_float($item) ? (int) $item : $item; + + if (((\is_array($object) || $object instanceof \ArrayObject) && (isset($object[$arrayItem]) || \array_key_exists($arrayItem, (array) $object))) + || ($object instanceof ArrayAccess && isset($object[$arrayItem])) + ) { + if ($isDefinedTest) { + return true; + } + + return $object[$arrayItem]; + } + + if (/* Template::ARRAY_CALL */ 'array' === $type || !\is_object($object)) { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$env->isStrictVariables()) { + return; + } + + if ($object instanceof ArrayAccess) { + $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, \get_class($object)); + } elseif (\is_object($object)) { + $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, \get_class($object)); + } elseif (\is_array($object)) { + if (empty($object)) { + $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem); + } else { + $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object))); + } + } elseif (/* Template::ARRAY_CALL */ 'array' === $type) { + if (null === $object) { + $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item); + } else { + $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, \gettype($object), $object); + } + } elseif (null === $object) { + $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item); + } else { + $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, \gettype($object), $object); + } + + throw new RuntimeError($message, $lineno, $source); + } + } + + if (!\is_object($object)) { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$env->isStrictVariables()) { + return; + } + + if (null === $object) { + $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item); + } elseif (\is_array($object)) { + $message = sprintf('Impossible to invoke a method ("%s") on an array.', $item); + } else { + $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, \gettype($object), $object); + } + + throw new RuntimeError($message, $lineno, $source); + } + + if ($object instanceof Template) { + throw new RuntimeError('Accessing \Twig\Template attributes is forbidden.', $lineno, $source); + } + + // object property + if (/* Template::METHOD_CALL */ 'method' !== $type) { + if (isset($object->$item) || \array_key_exists((string) $item, (array) $object)) { + if ($isDefinedTest) { + return true; + } + + if ($sandboxed) { + $env->getExtension(SandboxExtension::class)->checkPropertyAllowed($object, $item, $lineno, $source); + } + + return $object->$item; + } + } + + static $cache = []; + + $class = \get_class($object); + + // object method + // precedence: getXxx() > isXxx() > hasXxx() + if (!isset($cache[$class])) { + $methods = get_class_methods($object); + sort($methods); + $lcMethods = array_map('strtolower', $methods); + $classCache = []; + foreach ($methods as $i => $method) { + $classCache[$method] = $method; + $classCache[$lcName = $lcMethods[$i]] = $method; + + if ('g' === $lcName[0] && 0 === strpos($lcName, 'get')) { + $name = substr($method, 3); + $lcName = substr($lcName, 3); + } elseif ('i' === $lcName[0] && 0 === strpos($lcName, 'is')) { + $name = substr($method, 2); + $lcName = substr($lcName, 2); + } elseif ('h' === $lcName[0] && 0 === strpos($lcName, 'has')) { + $name = substr($method, 3); + $lcName = substr($lcName, 3); + if (\in_array('is'.$lcName, $lcMethods)) { + continue; + } + } else { + continue; + } + + // skip get() and is() methods (in which case, $name is empty) + if ($name) { + if (!isset($classCache[$name])) { + $classCache[$name] = $method; + } + + if (!isset($classCache[$lcName])) { + $classCache[$lcName] = $method; + } + } + } + $cache[$class] = $classCache; + } + + $call = false; + if (isset($cache[$class][$item])) { + $method = $cache[$class][$item]; + } elseif (isset($cache[$class][$lcItem = strtolower($item)])) { + $method = $cache[$class][$lcItem]; + } elseif (isset($cache[$class]['__call'])) { + $method = $item; + $call = true; + } else { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$env->isStrictVariables()) { + return; + } + + throw new RuntimeError(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()"/"has%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), $lineno, $source); + } + + if ($isDefinedTest) { + return true; + } + + if ($sandboxed) { + $env->getExtension(SandboxExtension::class)->checkMethodAllowed($object, $method, $lineno, $source); + } + + // Some objects throw exceptions when they have __call, and the method we try + // to call is not supported. If ignoreStrictCheck is true, we should return null. + try { + $ret = $object->$method(...$arguments); + } catch (\BadMethodCallException $e) { + if ($call && ($ignoreStrictCheck || !$env->isStrictVariables())) { + return; + } + throw $e; + } + + return $ret; +} + +/** + * Returns the values from a single column in the input array. + * + * <pre> + * {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %} + * + * {% set fruits = items|column('fruit') %} + * + * {# fruits now contains ['apple', 'orange'] #} + * </pre> + * + * @param array|Traversable $array An array + * @param mixed $name The column name + * @param mixed $index The column to use as the index/keys for the returned array + * + * @return array The array of values + */ +function twig_array_column($array, $name, $index = null): array +{ + if ($array instanceof Traversable) { + $array = iterator_to_array($array); + } elseif (!\is_array($array)) { + throw new RuntimeError(sprintf('The column filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($array))); + } + + return array_column($array, $name, $index); +} + +function twig_array_filter($array, $arrow) +{ + if (\is_array($array)) { + return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH); + } + + // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator + return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow); +} + +function twig_array_map($array, $arrow) +{ + $r = []; + foreach ($array as $k => $v) { + $r[$k] = $arrow($v, $k); + } + + return $r; +} + +function twig_array_reduce($array, $arrow, $initial = null) +{ + if (!\is_array($array)) { + $array = iterator_to_array($array); + } + + return array_reduce($array, $arrow, $initial); +} +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/DebugExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/DebugExtension.php new file mode 100644 index 0000000..2e8510d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/DebugExtension.php @@ -0,0 +1,66 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension { +use Twig\TwigFunction; + +final class DebugExtension extends AbstractExtension +{ + public function getFunctions() + { + // dump is safe if var_dump is overridden by xdebug + $isDumpOutputHtmlSafe = \extension_loaded('xdebug') + // false means that it was not set (and the default is on) or it explicitly enabled + && (false === ini_get('xdebug.overload_var_dump') || ini_get('xdebug.overload_var_dump')) + // false means that it was not set (and the default is on) or it explicitly enabled + // xdebug.overload_var_dump produces HTML only when html_errors is also enabled + && (false === ini_get('html_errors') || ini_get('html_errors')) + || 'cli' === \PHP_SAPI + ; + + return [ + new TwigFunction('dump', 'twig_var_dump', ['is_safe' => $isDumpOutputHtmlSafe ? ['html'] : [], 'needs_context' => true, 'needs_environment' => true, 'is_variadic' => true]), + ]; + } +} + +class_alias('Twig\Extension\DebugExtension', 'Twig_Extension_Debug'); +} + +namespace { +use Twig\Environment; +use Twig\Template; +use Twig\TemplateWrapper; + +function twig_var_dump(Environment $env, $context, ...$vars) +{ + if (!$env->isDebug()) { + return; + } + + ob_start(); + + if (!$vars) { + $vars = []; + foreach ($context as $key => $value) { + if (!$value instanceof Template && !$value instanceof TemplateWrapper) { + $vars[$key] = $value; + } + } + + var_dump($vars); + } else { + var_dump(...$vars); + } + + return ob_get_clean(); +} +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/EscaperExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/EscaperExtension.php new file mode 100644 index 0000000..b8dabcc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/EscaperExtension.php @@ -0,0 +1,427 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension { +use Twig\FileExtensionEscapingStrategy; +use Twig\NodeVisitor\EscaperNodeVisitor; +use Twig\TokenParser\AutoEscapeTokenParser; +use Twig\TwigFilter; + +final class EscaperExtension extends AbstractExtension +{ + private $defaultStrategy; + private $escapers = []; + + /** @internal */ + public $safeClasses = []; + + /** @internal */ + public $safeLookup = []; + + /** + * @param string|false|callable $defaultStrategy An escaping strategy + * + * @see setDefaultStrategy() + */ + public function __construct($defaultStrategy = 'html') + { + $this->setDefaultStrategy($defaultStrategy); + } + + public function getTokenParsers() + { + return [new AutoEscapeTokenParser()]; + } + + public function getNodeVisitors() + { + return [new EscaperNodeVisitor()]; + } + + public function getFilters() + { + return [ + new TwigFilter('escape', 'twig_escape_filter', ['needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe']), + new TwigFilter('e', 'twig_escape_filter', ['needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe']), + new TwigFilter('raw', 'twig_raw_filter', ['is_safe' => ['all']]), + ]; + } + + /** + * Sets the default strategy to use when not defined by the user. + * + * The strategy can be a valid PHP callback that takes the template + * name as an argument and returns the strategy to use. + * + * @param string|false|callable $defaultStrategy An escaping strategy + */ + public function setDefaultStrategy($defaultStrategy) + { + if ('name' === $defaultStrategy) { + $defaultStrategy = [FileExtensionEscapingStrategy::class, 'guess']; + } + + $this->defaultStrategy = $defaultStrategy; + } + + /** + * Gets the default strategy to use when not defined by the user. + * + * @param string $name The template name + * + * @return string|false The default strategy to use for the template + */ + public function getDefaultStrategy($name) + { + // disable string callables to avoid calling a function named html or js, + // or any other upcoming escaping strategy + if (!\is_string($this->defaultStrategy) && false !== $this->defaultStrategy) { + return \call_user_func($this->defaultStrategy, $name); + } + + return $this->defaultStrategy; + } + + /** + * Defines a new escaper to be used via the escape filter. + * + * @param string $strategy The strategy name that should be used as a strategy in the escape call + * @param callable $callable A valid PHP callable + */ + public function setEscaper($strategy, callable $callable) + { + $this->escapers[$strategy] = $callable; + } + + /** + * Gets all defined escapers. + * + * @return callable[] An array of escapers + */ + public function getEscapers() + { + return $this->escapers; + } + + public function setSafeClasses(array $safeClasses = []) + { + $this->safeClasses = []; + $this->safeLookup = []; + foreach ($safeClasses as $class => $strategies) { + $this->addSafeClass($class, $strategies); + } + } + + public function addSafeClass(string $class, array $strategies) + { + $class = ltrim($class, '\\'); + if (!isset($this->safeClasses[$class])) { + $this->safeClasses[$class] = []; + } + $this->safeClasses[$class] = array_merge($this->safeClasses[$class], $strategies); + + foreach ($strategies as $strategy) { + $this->safeLookup[$strategy][$class] = true; + } + } +} + +class_alias('Twig\Extension\EscaperExtension', 'Twig_Extension_Escaper'); +} + +namespace { +use Twig\Environment; +use Twig\Error\RuntimeError; +use Twig\Extension\CoreExtension; +use Twig\Extension\EscaperExtension; +use Twig\Markup; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Node; + +/** + * Marks a variable as being safe. + * + * @param string $string A PHP variable + * + * @return string + */ +function twig_raw_filter($string) +{ + return $string; +} + +/** + * Escapes a string. + * + * @param mixed $string The value to be escaped + * @param string $strategy The escaping strategy + * @param string $charset The charset + * @param bool $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false) + * + * @return string + */ +function twig_escape_filter(Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false) +{ + if ($autoescape && $string instanceof Markup) { + return $string; + } + + if (!\is_string($string)) { + if (\is_object($string) && method_exists($string, '__toString')) { + if ($autoescape) { + $c = \get_class($string); + $ext = $env->getExtension(EscaperExtension::class); + if (!isset($ext->safeClasses[$c])) { + $ext->safeClasses[$c] = []; + foreach (class_parents($string) + class_implements($string) as $class) { + if (isset($ext->safeClasses[$class])) { + $ext->safeClasses[$c] = array_unique(array_merge($ext->safeClasses[$c], $ext->safeClasses[$class])); + foreach ($ext->safeClasses[$class] as $s) { + $ext->safeLookup[$s][$c] = true; + } + } + } + } + if (isset($ext->safeLookup[$strategy][$c]) || isset($ext->safeLookup['all'][$c])) { + return (string) $string; + } + } + + $string = (string) $string; + } elseif (\in_array($strategy, ['html', 'js', 'css', 'html_attr', 'url'])) { + return $string; + } + } + + if ('' === $string) { + return ''; + } + + if (null === $charset) { + $charset = $env->getCharset(); + } + + switch ($strategy) { + case 'html': + // see https://secure.php.net/htmlspecialchars + + // Using a static variable to avoid initializing the array + // each time the function is called. Moving the declaration on the + // top of the function slow downs other escaping strategies. + static $htmlspecialcharsCharsets = [ + 'ISO-8859-1' => true, 'ISO8859-1' => true, + 'ISO-8859-15' => true, 'ISO8859-15' => true, + 'utf-8' => true, 'UTF-8' => true, + 'CP866' => true, 'IBM866' => true, '866' => true, + 'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true, + '1251' => true, + 'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true, + 'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true, + 'BIG5' => true, '950' => true, + 'GB2312' => true, '936' => true, + 'BIG5-HKSCS' => true, + 'SHIFT_JIS' => true, 'SJIS' => true, '932' => true, + 'EUC-JP' => true, 'EUCJP' => true, + 'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true, + ]; + + if (isset($htmlspecialcharsCharsets[$charset])) { + return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset); + } + + if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) { + // cache the lowercase variant for future iterations + $htmlspecialcharsCharsets[$charset] = true; + + return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset); + } + + $string = iconv($charset, 'UTF-8', $string); + $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + + return iconv('UTF-8', $charset, $string); + + case 'js': + // escape all non-alphanumeric characters + // into their \x or \uHHHH representations + if ('UTF-8' !== $charset) { + $string = iconv($charset, 'UTF-8', $string); + } + + if (!preg_match('//u', $string)) { + throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', function ($matches) { + $char = $matches[0]; + + /* + * A few characters have short escape sequences in JSON and JavaScript. + * Escape sequences supported only by JavaScript, not JSON, are ommitted. + * \" is also supported but omitted, because the resulting string is not HTML safe. + */ + static $shortMap = [ + '\\' => '\\\\', + '/' => '\\/', + "\x08" => '\b', + "\x0C" => '\f', + "\x0A" => '\n', + "\x0D" => '\r', + "\x09" => '\t', + ]; + + if (isset($shortMap[$char])) { + return $shortMap[$char]; + } + + // \uHHHH + $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8'); + $char = strtoupper(bin2hex($char)); + + if (4 >= \strlen($char)) { + return sprintf('\u%04s', $char); + } + + return sprintf('\u%04s\u%04s', substr($char, 0, -4), substr($char, -4)); + }, $string); + + if ('UTF-8' !== $charset) { + $string = iconv('UTF-8', $charset, $string); + } + + return $string; + + case 'css': + if ('UTF-8' !== $charset) { + $string = iconv($charset, 'UTF-8', $string); + } + + if (!preg_match('//u', $string)) { + throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', function ($matches) { + $char = $matches[0]; + + return sprintf('\\%X ', 1 === \strlen($char) ? \ord($char) : mb_ord($char, 'UTF-8')); + }, $string); + + if ('UTF-8' !== $charset) { + $string = iconv('UTF-8', $charset, $string); + } + + return $string; + + case 'html_attr': + if ('UTF-8' !== $charset) { + $string = iconv($charset, 'UTF-8', $string); + } + + if (!preg_match('//u', $string)) { + throw new RuntimeError('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', function ($matches) { + /** + * This function is adapted from code coming from Zend Framework. + * + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (https://www.zend.com) + * @license https://framework.zend.com/license/new-bsd New BSD License + */ + $chr = $matches[0]; + $ord = \ord($chr); + + /* + * The following replaces characters undefined in HTML with the + * hex entity for the Unicode replacement character. + */ + if (($ord <= 0x1f && "\t" != $chr && "\n" != $chr && "\r" != $chr) || ($ord >= 0x7f && $ord <= 0x9f)) { + return '�'; + } + + /* + * Check if the current character to escape has a name entity we should + * replace it with while grabbing the hex value of the character. + */ + if (1 === \strlen($chr)) { + /* + * While HTML supports far more named entities, the lowest common denominator + * has become HTML5's XML Serialisation which is restricted to the those named + * entities that XML supports. Using HTML entities would result in this error: + * XML Parsing Error: undefined entity + */ + static $entityMap = [ + 34 => '"', /* quotation mark */ + 38 => '&', /* ampersand */ + 60 => '<', /* less-than sign */ + 62 => '>', /* greater-than sign */ + ]; + + if (isset($entityMap[$ord])) { + return $entityMap[$ord]; + } + + return sprintf('&#x%02X;', $ord); + } + + /* + * Per OWASP recommendations, we'll use hex entities for any other + * characters where a named entity does not exist. + */ + return sprintf('&#x%04X;', mb_ord($chr, 'UTF-8')); + }, $string); + + if ('UTF-8' !== $charset) { + $string = iconv('UTF-8', $charset, $string); + } + + return $string; + + case 'url': + return rawurlencode($string); + + default: + static $escapers; + + if (null === $escapers) { + // merge the ones set on CoreExtension for BC (to be removed in 3.0) + $escapers = array_merge( + $env->getExtension(CoreExtension::class)->getEscapers(false), + $env->getExtension(EscaperExtension::class)->getEscapers() + ); + } + + if (isset($escapers[$strategy])) { + return $escapers[$strategy]($env, $string, $charset); + } + + $validStrategies = implode(', ', array_merge(['html', 'js', 'url', 'css', 'html_attr'], array_keys($escapers))); + + throw new RuntimeError(sprintf('Invalid escaping strategy "%s" (valid ones: %s).', $strategy, $validStrategies)); + } +} + +/** + * @internal + */ +function twig_escape_filter_is_safe(Node $filterArgs) +{ + foreach ($filterArgs as $arg) { + if ($arg instanceof ConstantExpression) { + return [$arg->getAttribute('value')]; + } + + return []; + } + + return ['html']; +} +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ExtensionInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ExtensionInterface.php new file mode 100644 index 0000000..a083211 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ExtensionInterface.php @@ -0,0 +1,73 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\NodeVisitor\NodeVisitorInterface; +use Twig\TokenParser\TokenParserInterface; +use Twig\TwigFilter; +use Twig\TwigFunction; +use Twig\TwigTest; + +/** + * Interface implemented by extension classes. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface ExtensionInterface +{ + /** + * Returns the token parser instances to add to the existing list. + * + * @return TokenParserInterface[] + */ + public function getTokenParsers(); + + /** + * Returns the node visitor instances to add to the existing list. + * + * @return NodeVisitorInterface[] + */ + public function getNodeVisitors(); + + /** + * Returns a list of filters to add to the existing list. + * + * @return TwigFilter[] + */ + public function getFilters(); + + /** + * Returns a list of tests to add to the existing list. + * + * @return TwigTest[] + */ + public function getTests(); + + /** + * Returns a list of functions to add to the existing list. + * + * @return TwigFunction[] + */ + public function getFunctions(); + + /** + * Returns a list of operators to add to the existing list. + * + * @return array<array> First array of unary operators, second array of binary operators + */ + public function getOperators(); +} + +class_alias('Twig\Extension\ExtensionInterface', 'Twig_ExtensionInterface'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Environment'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/GlobalsInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/GlobalsInterface.php new file mode 100644 index 0000000..4421271 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/GlobalsInterface.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +/** + * Enables usage of the deprecated Twig\Extension\AbstractExtension::getGlobals() method. + * + * Explicitly implement this interface if you really need to implement the + * deprecated getGlobals() method in your extensions. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface GlobalsInterface +{ + /** + * Returns a list of global variables to add to the existing list. + * + * @return array An array of global variables + */ + public function getGlobals(); +} + +class_alias('Twig\Extension\GlobalsInterface', 'Twig_Extension_GlobalsInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/InitRuntimeInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/InitRuntimeInterface.php new file mode 100644 index 0000000..d64d3cd --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/InitRuntimeInterface.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\Environment; + +/** + * Enables usage of the deprecated Twig\Extension\AbstractExtension::initRuntime() method. + * + * Explicitly implement this interface if you really need to implement the + * deprecated initRuntime() method in your extensions. + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @deprecated since Twig 2.7, to be removed in 3.0 + */ +interface InitRuntimeInterface +{ + /** + * Initializes the runtime environment. + * + * This is where you can load some file that contains filter functions for instance. + */ + public function initRuntime(Environment $environment); +} + +class_alias('Twig\Extension\InitRuntimeInterface', 'Twig_Extension_InitRuntimeInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/OptimizerExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/OptimizerExtension.php new file mode 100644 index 0000000..9552b35 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/OptimizerExtension.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\NodeVisitor\OptimizerNodeVisitor; + +final class OptimizerExtension extends AbstractExtension +{ + private $optimizers; + + public function __construct($optimizers = -1) + { + $this->optimizers = $optimizers; + } + + public function getNodeVisitors() + { + return [new OptimizerNodeVisitor($this->optimizers)]; + } +} + +class_alias('Twig\Extension\OptimizerExtension', 'Twig_Extension_Optimizer'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ProfilerExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ProfilerExtension.php new file mode 100644 index 0000000..ca5367c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/ProfilerExtension.php @@ -0,0 +1,48 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\Profiler\NodeVisitor\ProfilerNodeVisitor; +use Twig\Profiler\Profile; + +class ProfilerExtension extends AbstractExtension +{ + private $actives = []; + + public function __construct(Profile $profile) + { + $this->actives[] = $profile; + } + + public function enter(Profile $profile) + { + $this->actives[0]->addProfile($profile); + array_unshift($this->actives, $profile); + } + + public function leave(Profile $profile) + { + $profile->leave(); + array_shift($this->actives); + + if (1 === \count($this->actives)) { + $this->actives[0]->leave(); + } + } + + public function getNodeVisitors() + { + return [new ProfilerNodeVisitor(\get_class($this))]; + } +} + +class_alias('Twig\Extension\ProfilerExtension', 'Twig_Extension_Profiler'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php new file mode 100644 index 0000000..63bc3b1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php @@ -0,0 +1,19 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +/** + * @author Grégoire Pineau <lyrixx@lyrixx.info> + */ +interface RuntimeExtensionInterface +{ +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/SandboxExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/SandboxExtension.php new file mode 100644 index 0000000..d16e4ed --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/SandboxExtension.php @@ -0,0 +1,125 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\NodeVisitor\SandboxNodeVisitor; +use Twig\Sandbox\SecurityNotAllowedMethodError; +use Twig\Sandbox\SecurityNotAllowedPropertyError; +use Twig\Sandbox\SecurityPolicyInterface; +use Twig\Source; +use Twig\TokenParser\SandboxTokenParser; + +final class SandboxExtension extends AbstractExtension +{ + private $sandboxedGlobally; + private $sandboxed; + private $policy; + + public function __construct(SecurityPolicyInterface $policy, $sandboxed = false) + { + $this->policy = $policy; + $this->sandboxedGlobally = $sandboxed; + } + + public function getTokenParsers() + { + return [new SandboxTokenParser()]; + } + + public function getNodeVisitors() + { + return [new SandboxNodeVisitor()]; + } + + public function enableSandbox() + { + $this->sandboxed = true; + } + + public function disableSandbox() + { + $this->sandboxed = false; + } + + public function isSandboxed() + { + return $this->sandboxedGlobally || $this->sandboxed; + } + + public function isSandboxedGlobally() + { + return $this->sandboxedGlobally; + } + + public function setSecurityPolicy(SecurityPolicyInterface $policy) + { + $this->policy = $policy; + } + + public function getSecurityPolicy() + { + return $this->policy; + } + + public function checkSecurity($tags, $filters, $functions) + { + if ($this->isSandboxed()) { + $this->policy->checkSecurity($tags, $filters, $functions); + } + } + + public function checkMethodAllowed($obj, $method, int $lineno = -1, Source $source = null) + { + if ($this->isSandboxed()) { + try { + $this->policy->checkMethodAllowed($obj, $method); + } catch (SecurityNotAllowedMethodError $e) { + $e->setSourceContext($source); + $e->setTemplateLine($lineno); + + throw $e; + } + } + } + + public function checkPropertyAllowed($obj, $method, int $lineno = -1, Source $source = null) + { + if ($this->isSandboxed()) { + try { + $this->policy->checkPropertyAllowed($obj, $method); + } catch (SecurityNotAllowedPropertyError $e) { + $e->setSourceContext($source); + $e->setTemplateLine($lineno); + + throw $e; + } + } + } + + public function ensureToStringAllowed($obj, int $lineno = -1, Source $source = null) + { + if ($this->isSandboxed() && \is_object($obj) && method_exists($obj, '__toString')) { + try { + $this->policy->checkMethodAllowed($obj, '__toString'); + } catch (SecurityNotAllowedMethodError $e) { + $e->setSourceContext($source); + $e->setTemplateLine($lineno); + + throw $e; + } + } + + return $obj; + } +} + +class_alias('Twig\Extension\SandboxExtension', 'Twig_Extension_Sandbox'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StagingExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StagingExtension.php new file mode 100644 index 0000000..7c0c26c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StagingExtension.php @@ -0,0 +1,102 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension; + +use Twig\NodeVisitor\NodeVisitorInterface; +use Twig\TokenParser\TokenParserInterface; +use Twig\TwigFilter; +use Twig\TwigFunction; +use Twig\TwigTest; + +/** + * Used by \Twig\Environment as a staging area. + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @internal + */ +final class StagingExtension extends AbstractExtension +{ + private $functions = []; + private $filters = []; + private $visitors = []; + private $tokenParsers = []; + private $tests = []; + + public function addFunction(TwigFunction $function) + { + if (isset($this->functions[$function->getName()])) { + throw new \LogicException(sprintf('Function "%s" is already registered.', $function->getName())); + } + + $this->functions[$function->getName()] = $function; + } + + public function getFunctions() + { + return $this->functions; + } + + public function addFilter(TwigFilter $filter) + { + if (isset($this->filters[$filter->getName()])) { + throw new \LogicException(sprintf('Filter "%s" is already registered.', $filter->getName())); + } + + $this->filters[$filter->getName()] = $filter; + } + + public function getFilters() + { + return $this->filters; + } + + public function addNodeVisitor(NodeVisitorInterface $visitor) + { + $this->visitors[] = $visitor; + } + + public function getNodeVisitors() + { + return $this->visitors; + } + + public function addTokenParser(TokenParserInterface $parser) + { + if (isset($this->tokenParsers[$parser->getTag()])) { + throw new \LogicException(sprintf('Tag "%s" is already registered.', $parser->getTag())); + } + + $this->tokenParsers[$parser->getTag()] = $parser; + } + + public function getTokenParsers() + { + return $this->tokenParsers; + } + + public function addTest(TwigTest $test) + { + if (isset($this->tests[$test->getName()])) { + throw new \LogicException(sprintf('Test "%s" is already registered.', $test->getName())); + } + + $this->tests[$test->getName()] = $test; + } + + public function getTests() + { + return $this->tests; + } +} + +class_alias('Twig\Extension\StagingExtension', 'Twig_Extension_Staging'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StringLoaderExtension.php b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StringLoaderExtension.php new file mode 100644 index 0000000..d671862 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Extension/StringLoaderExtension.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Extension { +use Twig\TwigFunction; + +final class StringLoaderExtension extends AbstractExtension +{ + public function getFunctions() + { + return [ + new TwigFunction('template_from_string', 'twig_template_from_string', ['needs_environment' => true]), + ]; + } +} + +class_alias('Twig\Extension\StringLoaderExtension', 'Twig_Extension_StringLoader'); +} + +namespace { +use Twig\Environment; +use Twig\TemplateWrapper; + +/** + * Loads a template from a string. + * + * {{ include(template_from_string("Hello {{ name }}")) }} + * + * @param string $template A template as a string or object implementing __toString() + * @param string $name An optional name of the template to be used in error messages + * + * @return TemplateWrapper + */ +function twig_template_from_string(Environment $env, $template, string $name = null) +{ + return $env->createTemplate((string) $template, $name); +} +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/ExtensionSet.php b/srcs/phpmyadmin/vendor/twig/twig/src/ExtensionSet.php new file mode 100644 index 0000000..dc25b13 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/ExtensionSet.php @@ -0,0 +1,477 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\RuntimeError; +use Twig\Extension\ExtensionInterface; +use Twig\Extension\GlobalsInterface; +use Twig\Extension\InitRuntimeInterface; +use Twig\Extension\StagingExtension; +use Twig\NodeVisitor\NodeVisitorInterface; +use Twig\TokenParser\TokenParserInterface; + +/** + * @author Fabien Potencier <fabien@symfony.com> + * + * @internal + */ +final class ExtensionSet +{ + private $extensions; + private $initialized = false; + private $runtimeInitialized = false; + private $staging; + private $parsers; + private $visitors; + private $filters; + private $tests; + private $functions; + private $unaryOperators; + private $binaryOperators; + private $globals; + private $functionCallbacks = []; + private $filterCallbacks = []; + private $lastModified = 0; + + public function __construct() + { + $this->staging = new StagingExtension(); + } + + /** + * Initializes the runtime environment. + * + * @deprecated since Twig 2.7 + */ + public function initRuntime(Environment $env) + { + if ($this->runtimeInitialized) { + return; + } + + $this->runtimeInitialized = true; + + foreach ($this->extensions as $extension) { + if ($extension instanceof InitRuntimeInterface) { + $extension->initRuntime($env); + } + } + } + + public function hasExtension(string $class): bool + { + $class = ltrim($class, '\\'); + if (!isset($this->extensions[$class]) && class_exists($class, false)) { + // For BC/FC with namespaced aliases + $class = (new \ReflectionClass($class))->name; + } + + return isset($this->extensions[$class]); + } + + public function getExtension(string $class): ExtensionInterface + { + $class = ltrim($class, '\\'); + if (!isset($this->extensions[$class]) && class_exists($class, false)) { + // For BC/FC with namespaced aliases + $class = (new \ReflectionClass($class))->name; + } + + if (!isset($this->extensions[$class])) { + throw new RuntimeError(sprintf('The "%s" extension is not enabled.', $class)); + } + + return $this->extensions[$class]; + } + + /** + * @param ExtensionInterface[] $extensions + */ + public function setExtensions(array $extensions) + { + foreach ($extensions as $extension) { + $this->addExtension($extension); + } + } + + /** + * @return ExtensionInterface[] + */ + public function getExtensions(): array + { + return $this->extensions; + } + + public function getSignature(): string + { + return json_encode(array_keys($this->extensions)); + } + + public function isInitialized(): bool + { + return $this->initialized || $this->runtimeInitialized; + } + + public function getLastModified(): int + { + if (0 !== $this->lastModified) { + return $this->lastModified; + } + + foreach ($this->extensions as $extension) { + $r = new \ReflectionObject($extension); + if (file_exists($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModified) { + $this->lastModified = $extensionTime; + } + } + + return $this->lastModified; + } + + public function addExtension(ExtensionInterface $extension) + { + $class = \get_class($extension); + + if ($this->initialized) { + throw new \LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $class)); + } + + if (isset($this->extensions[$class])) { + throw new \LogicException(sprintf('Unable to register extension "%s" as it is already registered.', $class)); + } + + // For BC/FC with namespaced aliases + $class = (new \ReflectionClass($class))->name; + $this->extensions[$class] = $extension; + } + + public function addFunction(TwigFunction $function) + { + if ($this->initialized) { + throw new \LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $function->getName())); + } + + $this->staging->addFunction($function); + } + + /** + * @return TwigFunction[] + */ + public function getFunctions(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->functions; + } + + /** + * @return TwigFunction|false + */ + public function getFunction(string $name) + { + if (!$this->initialized) { + $this->initExtensions(); + } + + if (isset($this->functions[$name])) { + return $this->functions[$name]; + } + + foreach ($this->functions as $pattern => $function) { + $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count); + + if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) { + array_shift($matches); + $function->setArguments($matches); + + return $function; + } + } + + foreach ($this->functionCallbacks as $callback) { + if (false !== $function = $callback($name)) { + return $function; + } + } + + return false; + } + + public function registerUndefinedFunctionCallback(callable $callable) + { + $this->functionCallbacks[] = $callable; + } + + public function addFilter(TwigFilter $filter) + { + if ($this->initialized) { + throw new \LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $filter->getName())); + } + + $this->staging->addFilter($filter); + } + + /** + * @return TwigFilter[] + */ + public function getFilters(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->filters; + } + + /** + * @return TwigFilter|false + */ + public function getFilter(string $name) + { + if (!$this->initialized) { + $this->initExtensions(); + } + + if (isset($this->filters[$name])) { + return $this->filters[$name]; + } + + foreach ($this->filters as $pattern => $filter) { + $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count); + + if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) { + array_shift($matches); + $filter->setArguments($matches); + + return $filter; + } + } + + foreach ($this->filterCallbacks as $callback) { + if (false !== $filter = $callback($name)) { + return $filter; + } + } + + return false; + } + + public function registerUndefinedFilterCallback(callable $callable) + { + $this->filterCallbacks[] = $callable; + } + + public function addNodeVisitor(NodeVisitorInterface $visitor) + { + if ($this->initialized) { + throw new \LogicException('Unable to add a node visitor as extensions have already been initialized.'); + } + + $this->staging->addNodeVisitor($visitor); + } + + /** + * @return NodeVisitorInterface[] + */ + public function getNodeVisitors(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->visitors; + } + + public function addTokenParser(TokenParserInterface $parser) + { + if ($this->initialized) { + throw new \LogicException('Unable to add a token parser as extensions have already been initialized.'); + } + + $this->staging->addTokenParser($parser); + } + + /** + * @return TokenParserInterface[] + */ + public function getTokenParsers(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->parsers; + } + + public function getGlobals(): array + { + if (null !== $this->globals) { + return $this->globals; + } + + $globals = []; + foreach ($this->extensions as $extension) { + if (!$extension instanceof GlobalsInterface) { + continue; + } + + $extGlobals = $extension->getGlobals(); + if (!\is_array($extGlobals)) { + throw new \UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', \get_class($extension))); + } + + $globals = array_merge($globals, $extGlobals); + } + + if ($this->initialized) { + $this->globals = $globals; + } + + return $globals; + } + + public function addTest(TwigTest $test) + { + if ($this->initialized) { + throw new \LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $test->getName())); + } + + $this->staging->addTest($test); + } + + /** + * @return TwigTest[] + */ + public function getTests(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->tests; + } + + /** + * @return TwigTest|false + */ + public function getTest(string $name) + { + if (!$this->initialized) { + $this->initExtensions(); + } + + if (isset($this->tests[$name])) { + return $this->tests[$name]; + } + + foreach ($this->tests as $pattern => $test) { + $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count); + + if ($count) { + if (preg_match('#^'.$pattern.'$#', $name, $matches)) { + array_shift($matches); + $test->setArguments($matches); + + return $test; + } + } + } + + return false; + } + + public function getUnaryOperators(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->unaryOperators; + } + + public function getBinaryOperators(): array + { + if (!$this->initialized) { + $this->initExtensions(); + } + + return $this->binaryOperators; + } + + private function initExtensions() + { + $this->parsers = []; + $this->filters = []; + $this->functions = []; + $this->tests = []; + $this->visitors = []; + $this->unaryOperators = []; + $this->binaryOperators = []; + + foreach ($this->extensions as $extension) { + $this->initExtension($extension); + } + $this->initExtension($this->staging); + // Done at the end only, so that an exception during initialization does not mark the environment as initialized when catching the exception + $this->initialized = true; + } + + private function initExtension(ExtensionInterface $extension) + { + // filters + foreach ($extension->getFilters() as $filter) { + $this->filters[$filter->getName()] = $filter; + } + + // functions + foreach ($extension->getFunctions() as $function) { + $this->functions[$function->getName()] = $function; + } + + // tests + foreach ($extension->getTests() as $test) { + $this->tests[$test->getName()] = $test; + } + + // token parsers + foreach ($extension->getTokenParsers() as $parser) { + if (!$parser instanceof TokenParserInterface) { + throw new \LogicException('getTokenParsers() must return an array of \Twig\TokenParser\TokenParserInterface.'); + } + + $this->parsers[] = $parser; + } + + // node visitors + foreach ($extension->getNodeVisitors() as $visitor) { + $this->visitors[] = $visitor; + } + + // operators + if ($operators = $extension->getOperators()) { + if (!\is_array($operators)) { + throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array with operators, got "%s".', \get_class($extension), \is_object($operators) ? \get_class($operators) : \gettype($operators).(\is_resource($operators) ? '' : '#'.$operators))); + } + + if (2 !== \count($operators)) { + throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array of 2 elements, got %d.', \get_class($extension), \count($operators))); + } + + $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]); + $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]); + } + } +} + +class_alias('Twig\ExtensionSet', 'Twig_ExtensionSet'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/FileExtensionEscapingStrategy.php b/srcs/phpmyadmin/vendor/twig/twig/src/FileExtensionEscapingStrategy.php new file mode 100644 index 0000000..bc95f33 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/FileExtensionEscapingStrategy.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +/** + * Default autoescaping strategy based on file names. + * + * This strategy sets the HTML as the default autoescaping strategy, + * but changes it based on the template name. + * + * Note that there is no runtime performance impact as the + * default autoescaping strategy is set at compilation time. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class FileExtensionEscapingStrategy +{ + /** + * Guesses the best autoescaping strategy based on the file name. + * + * @param string $name The template name + * + * @return string|false The escaping strategy name to use or false to disable + */ + public static function guess($name) + { + if (\in_array(substr($name, -1), ['/', '\\'])) { + return 'html'; // return html for directories + } + + if ('.twig' === substr($name, -5)) { + $name = substr($name, 0, -5); + } + + $extension = pathinfo($name, PATHINFO_EXTENSION); + + switch ($extension) { + case 'js': + return 'js'; + + case 'css': + return 'css'; + + case 'txt': + return false; + + default: + return 'html'; + } + } +} + +class_alias('Twig\FileExtensionEscapingStrategy', 'Twig_FileExtensionEscapingStrategy'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Lexer.php b/srcs/phpmyadmin/vendor/twig/twig/src/Lexer.php new file mode 100644 index 0000000..45c7290 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Lexer.php @@ -0,0 +1,501 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\SyntaxError; + +/** + * Lexes a template string. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Lexer +{ + private $tokens; + private $code; + private $cursor; + private $lineno; + private $end; + private $state; + private $states; + private $brackets; + private $env; + private $source; + private $options; + private $regexes; + private $position; + private $positions; + private $currentVarBlockLine; + + const STATE_DATA = 0; + const STATE_BLOCK = 1; + const STATE_VAR = 2; + const STATE_STRING = 3; + const STATE_INTERPOLATION = 4; + + const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A'; + const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?([Ee][\+\-][0-9]+)?/A'; + const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As'; + const REGEX_DQ_STRING_DELIM = '/"/A'; + const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As'; + const PUNCTUATION = '()[]{}?:.,|'; + + public function __construct(Environment $env, array $options = []) + { + $this->env = $env; + + $this->options = array_merge([ + 'tag_comment' => ['{#', '#}'], + 'tag_block' => ['{%', '%}'], + 'tag_variable' => ['{{', '}}'], + 'whitespace_trim' => '-', + 'whitespace_line_trim' => '~', + 'whitespace_line_chars' => ' \t\0\x0B', + 'interpolation' => ['#{', '}'], + ], $options); + + // when PHP 7.3 is the min version, we will be able to remove the '#' part in preg_quote as it's part of the default + $this->regexes = [ + // }} + 'lex_var' => '{ + \s* + (?:'. + preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '#').'\s*'. // -}}\s* + '|'. + preg_quote($this->options['whitespace_line_trim'].$this->options['tag_variable'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~}}[ \t\0\x0B]* + '|'. + preg_quote($this->options['tag_variable'][1], '#'). // }} + ') + }Ax', + + // %} + 'lex_block' => '{ + \s* + (?:'. + preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*\n?'. // -%}\s*\n? + '|'. + preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]* + '|'. + preg_quote($this->options['tag_block'][1], '#').'\n?'. // %}\n? + ') + }Ax', + + // {% endverbatim %} + 'lex_raw_data' => '{'. + preg_quote($this->options['tag_block'][0], '#'). // {% + '('. + $this->options['whitespace_trim']. // - + '|'. + $this->options['whitespace_line_trim']. // ~ + ')?\s*endverbatim\s*'. + '(?:'. + preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%} + '|'. + preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]* + '|'. + preg_quote($this->options['tag_block'][1], '#'). // %} + ') + }sx', + + 'operator' => $this->getOperatorRegex(), + + // #} + 'lex_comment' => '{ + (?:'. + preg_quote($this->options['whitespace_trim']).preg_quote($this->options['tag_comment'][1], '#').'\s*\n?'. // -#}\s*\n? + '|'. + preg_quote($this->options['whitespace_line_trim'].$this->options['tag_comment'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~#}[ \t\0\x0B]* + '|'. + preg_quote($this->options['tag_comment'][1], '#').'\n?'. // #}\n? + ') + }sx', + + // verbatim %} + 'lex_block_raw' => '{ + \s*verbatim\s* + (?:'. + preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}\s* + '|'. + preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]* + '|'. + preg_quote($this->options['tag_block'][1], '#'). // %} + ') + }Asx', + + 'lex_block_line' => '{\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '#').'}As', + + // {{ or {% or {# + 'lex_tokens_start' => '{ + ('. + preg_quote($this->options['tag_variable'][0], '#'). // {{ + '|'. + preg_quote($this->options['tag_block'][0], '#'). // {% + '|'. + preg_quote($this->options['tag_comment'][0], '#'). // {# + ')('. + preg_quote($this->options['whitespace_trim'], '#'). // - + '|'. + preg_quote($this->options['whitespace_line_trim'], '#'). // ~ + ')? + }sx', + 'interpolation_start' => '{'.preg_quote($this->options['interpolation'][0], '#').'\s*}A', + 'interpolation_end' => '{\s*'.preg_quote($this->options['interpolation'][1], '#').'}A', + ]; + } + + public function tokenize(Source $source) + { + $this->source = $source; + $this->code = str_replace(["\r\n", "\r"], "\n", $source->getCode()); + $this->cursor = 0; + $this->lineno = 1; + $this->end = \strlen($this->code); + $this->tokens = []; + $this->state = self::STATE_DATA; + $this->states = []; + $this->brackets = []; + $this->position = -1; + + // find all token starts in one go + preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE); + $this->positions = $matches; + + while ($this->cursor < $this->end) { + // dispatch to the lexing functions depending + // on the current state + switch ($this->state) { + case self::STATE_DATA: + $this->lexData(); + break; + + case self::STATE_BLOCK: + $this->lexBlock(); + break; + + case self::STATE_VAR: + $this->lexVar(); + break; + + case self::STATE_STRING: + $this->lexString(); + break; + + case self::STATE_INTERPOLATION: + $this->lexInterpolation(); + break; + } + } + + $this->pushToken(/* Token::EOF_TYPE */ -1); + + if (!empty($this->brackets)) { + list($expect, $lineno) = array_pop($this->brackets); + throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source); + } + + return new TokenStream($this->tokens, $this->source); + } + + private function lexData() + { + // if no matches are left we return the rest of the template as simple text token + if ($this->position == \count($this->positions[0]) - 1) { + $this->pushToken(/* Token::TEXT_TYPE */ 0, substr($this->code, $this->cursor)); + $this->cursor = $this->end; + + return; + } + + // Find the first token after the current cursor + $position = $this->positions[0][++$this->position]; + while ($position[1] < $this->cursor) { + if ($this->position == \count($this->positions[0]) - 1) { + return; + } + $position = $this->positions[0][++$this->position]; + } + + // push the template text first + $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor); + + // trim? + if (isset($this->positions[2][$this->position][0])) { + if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) { + // whitespace_trim detected ({%-, {{- or {#-) + $text = rtrim($text); + } elseif ($this->options['whitespace_line_trim'] === $this->positions[2][$this->position][0]) { + // whitespace_line_trim detected ({%~, {{~ or {#~) + // don't trim \r and \n + $text = rtrim($text, " \t\0\x0B"); + } + } + $this->pushToken(/* Token::TEXT_TYPE */ 0, $text); + $this->moveCursor($textContent.$position[0]); + + switch ($this->positions[1][$this->position][0]) { + case $this->options['tag_comment'][0]: + $this->lexComment(); + break; + + case $this->options['tag_block'][0]: + // raw data? + if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, 0, $this->cursor)) { + $this->moveCursor($match[0]); + $this->lexRawData(); + // {% line \d+ %} + } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, 0, $this->cursor)) { + $this->moveCursor($match[0]); + $this->lineno = (int) $match[1]; + } else { + $this->pushToken(/* Token::BLOCK_START_TYPE */ 1); + $this->pushState(self::STATE_BLOCK); + $this->currentVarBlockLine = $this->lineno; + } + break; + + case $this->options['tag_variable'][0]: + $this->pushToken(/* Token::VAR_START_TYPE */ 2); + $this->pushState(self::STATE_VAR); + $this->currentVarBlockLine = $this->lineno; + break; + } + } + + private function lexBlock() + { + if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, 0, $this->cursor)) { + $this->pushToken(/* Token::BLOCK_END_TYPE */ 3); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + private function lexVar() + { + if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, 0, $this->cursor)) { + $this->pushToken(/* Token::VAR_END_TYPE */ 4); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + private function lexExpression() + { + // whitespace + if (preg_match('/\s+/A', $this->code, $match, 0, $this->cursor)) { + $this->moveCursor($match[0]); + + if ($this->cursor >= $this->end) { + throw new SyntaxError(sprintf('Unclosed "%s".', self::STATE_BLOCK === $this->state ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source); + } + } + + // arrow function + if ('=' === $this->code[$this->cursor] && '>' === $this->code[$this->cursor + 1]) { + $this->pushToken(Token::ARROW_TYPE, '=>'); + $this->moveCursor('=>'); + } + // operators + elseif (preg_match($this->regexes['operator'], $this->code, $match, 0, $this->cursor)) { + $this->pushToken(/* Token::OPERATOR_TYPE */ 8, preg_replace('/\s+/', ' ', $match[0])); + $this->moveCursor($match[0]); + } + // names + elseif (preg_match(self::REGEX_NAME, $this->code, $match, 0, $this->cursor)) { + $this->pushToken(/* Token::NAME_TYPE */ 5, $match[0]); + $this->moveCursor($match[0]); + } + // numbers + elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, 0, $this->cursor)) { + $number = (float) $match[0]; // floats + if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) { + $number = (int) $match[0]; // integers lower than the maximum + } + $this->pushToken(/* Token::NUMBER_TYPE */ 6, $number); + $this->moveCursor($match[0]); + } + // punctuation + elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) { + // opening bracket + if (false !== strpos('([{', $this->code[$this->cursor])) { + $this->brackets[] = [$this->code[$this->cursor], $this->lineno]; + } + // closing bracket + elseif (false !== strpos(')]}', $this->code[$this->cursor])) { + if (empty($this->brackets)) { + throw new SyntaxError(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->source); + } + + list($expect, $lineno) = array_pop($this->brackets); + if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) { + throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source); + } + } + + $this->pushToken(/* Token::PUNCTUATION_TYPE */ 9, $this->code[$this->cursor]); + ++$this->cursor; + } + // strings + elseif (preg_match(self::REGEX_STRING, $this->code, $match, 0, $this->cursor)) { + $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes(substr($match[0], 1, -1))); + $this->moveCursor($match[0]); + } + // opening double quoted string + elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) { + $this->brackets[] = ['"', $this->lineno]; + $this->pushState(self::STATE_STRING); + $this->moveCursor($match[0]); + } + // unlexable + else { + throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source); + } + } + + private function lexRawData() + { + if (!preg_match($this->regexes['lex_raw_data'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) { + throw new SyntaxError('Unexpected end of file: Unclosed "verbatim" block.', $this->lineno, $this->source); + } + + $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor); + $this->moveCursor($text.$match[0][0]); + + // trim? + if (isset($match[1][0])) { + if ($this->options['whitespace_trim'] === $match[1][0]) { + // whitespace_trim detected ({%-, {{- or {#-) + $text = rtrim($text); + } else { + // whitespace_line_trim detected ({%~, {{~ or {#~) + // don't trim \r and \n + $text = rtrim($text, " \t\0\x0B"); + } + } + + $this->pushToken(/* Token::TEXT_TYPE */ 0, $text); + } + + private function lexComment() + { + if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) { + throw new SyntaxError('Unclosed comment.', $this->lineno, $this->source); + } + + $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]); + } + + private function lexString() + { + if (preg_match($this->regexes['interpolation_start'], $this->code, $match, 0, $this->cursor)) { + $this->brackets[] = [$this->options['interpolation'][0], $this->lineno]; + $this->pushToken(/* Token::INTERPOLATION_START_TYPE */ 10); + $this->moveCursor($match[0]); + $this->pushState(self::STATE_INTERPOLATION); + } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, 0, $this->cursor) && \strlen($match[0]) > 0) { + $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes($match[0])); + $this->moveCursor($match[0]); + } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) { + list($expect, $lineno) = array_pop($this->brackets); + if ('"' != $this->code[$this->cursor]) { + throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source); + } + + $this->popState(); + ++$this->cursor; + } else { + // unlexable + throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source); + } + } + + private function lexInterpolation() + { + $bracket = end($this->brackets); + if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, 0, $this->cursor)) { + array_pop($this->brackets); + $this->pushToken(/* Token::INTERPOLATION_END_TYPE */ 11); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + private function pushToken($type, $value = '') + { + // do not push empty text tokens + if (/* Token::TEXT_TYPE */ 0 === $type && '' === $value) { + return; + } + + $this->tokens[] = new Token($type, $value, $this->lineno); + } + + private function moveCursor($text) + { + $this->cursor += \strlen($text); + $this->lineno += substr_count($text, "\n"); + } + + private function getOperatorRegex() + { + $operators = array_merge( + ['='], + array_keys($this->env->getUnaryOperators()), + array_keys($this->env->getBinaryOperators()) + ); + + $operators = array_combine($operators, array_map('strlen', $operators)); + arsort($operators); + + $regex = []; + foreach ($operators as $operator => $length) { + // an operator that ends with a character must be followed by + // a whitespace or a parenthesis + if (ctype_alpha($operator[$length - 1])) { + $r = preg_quote($operator, '/').'(?=[\s()])'; + } else { + $r = preg_quote($operator, '/'); + } + + // an operator with a space can be any amount of whitespaces + $r = preg_replace('/\s+/', '\s+', $r); + + $regex[] = $r; + } + + return '/'.implode('|', $regex).'/A'; + } + + private function pushState($state) + { + $this->states[] = $this->state; + $this->state = $state; + } + + private function popState() + { + if (0 === \count($this->states)) { + throw new \LogicException('Cannot pop state without a previous state.'); + } + + $this->state = array_pop($this->states); + } +} + +class_alias('Twig\Lexer', 'Twig_Lexer'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ArrayLoader.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ArrayLoader.php new file mode 100644 index 0000000..b03170b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ArrayLoader.php @@ -0,0 +1,86 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +use Twig\Error\LoaderError; +use Twig\Source; + +/** + * Loads a template from an array. + * + * When using this loader with a cache mechanism, you should know that a new cache + * key is generated each time a template content "changes" (the cache key being the + * source code of the template). If you don't want to see your cache grows out of + * control, you need to take care of clearing the old cache file by yourself. + * + * This loader should only be used for unit testing. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class ArrayLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface +{ + private $templates = []; + + /** + * @param array $templates An array of templates (keys are the names, and values are the source code) + */ + public function __construct(array $templates = []) + { + $this->templates = $templates; + } + + /** + * Adds or overrides a template. + * + * @param string $name The template name + * @param string $template The template source + */ + public function setTemplate($name, $template) + { + $this->templates[$name] = $template; + } + + public function getSourceContext($name) + { + $name = (string) $name; + if (!isset($this->templates[$name])) { + throw new LoaderError(sprintf('Template "%s" is not defined.', $name)); + } + + return new Source($this->templates[$name], $name); + } + + public function exists($name) + { + return isset($this->templates[$name]); + } + + public function getCacheKey($name) + { + if (!isset($this->templates[$name])) { + throw new LoaderError(sprintf('Template "%s" is not defined.', $name)); + } + + return $name.':'.$this->templates[$name]; + } + + public function isFresh($name, $time) + { + if (!isset($this->templates[$name])) { + throw new LoaderError(sprintf('Template "%s" is not defined.', $name)); + } + + return true; + } +} + +class_alias('Twig\Loader\ArrayLoader', 'Twig_Loader_Array'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ChainLoader.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ChainLoader.php new file mode 100644 index 0000000..edb9df8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ChainLoader.php @@ -0,0 +1,120 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +use Twig\Error\LoaderError; + +/** + * Loads templates from other loaders. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class ChainLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface +{ + private $hasSourceCache = []; + private $loaders = []; + + /** + * @param LoaderInterface[] $loaders + */ + public function __construct(array $loaders = []) + { + foreach ($loaders as $loader) { + $this->addLoader($loader); + } + } + + public function addLoader(LoaderInterface $loader) + { + $this->loaders[] = $loader; + $this->hasSourceCache = []; + } + + /** + * @return LoaderInterface[] + */ + public function getLoaders() + { + return $this->loaders; + } + + public function getSourceContext($name) + { + $exceptions = []; + foreach ($this->loaders as $loader) { + if (!$loader->exists($name)) { + continue; + } + + try { + return $loader->getSourceContext($name); + } catch (LoaderError $e) { + $exceptions[] = $e->getMessage(); + } + } + + throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } + + public function exists($name) + { + if (isset($this->hasSourceCache[$name])) { + return $this->hasSourceCache[$name]; + } + + foreach ($this->loaders as $loader) { + if ($loader->exists($name)) { + return $this->hasSourceCache[$name] = true; + } + } + + return $this->hasSourceCache[$name] = false; + } + + public function getCacheKey($name) + { + $exceptions = []; + foreach ($this->loaders as $loader) { + if (!$loader->exists($name)) { + continue; + } + + try { + return $loader->getCacheKey($name); + } catch (LoaderError $e) { + $exceptions[] = \get_class($loader).': '.$e->getMessage(); + } + } + + throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } + + public function isFresh($name, $time) + { + $exceptions = []; + foreach ($this->loaders as $loader) { + if (!$loader->exists($name)) { + continue; + } + + try { + return $loader->isFresh($name, $time); + } catch (LoaderError $e) { + $exceptions[] = \get_class($loader).': '.$e->getMessage(); + } + } + + throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } +} + +class_alias('Twig\Loader\ChainLoader', 'Twig_Loader_Chain'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php new file mode 100644 index 0000000..aab8bd8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +/** + * Empty interface for Twig 1.x compatibility. + * + * @deprecated since Twig 2.7, to be removed in 3.0 + */ +interface ExistsLoaderInterface extends LoaderInterface +{ +} + +class_alias('Twig\Loader\ExistsLoaderInterface', 'Twig_ExistsLoaderInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/FilesystemLoader.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/FilesystemLoader.php new file mode 100644 index 0000000..0971e09 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/FilesystemLoader.php @@ -0,0 +1,308 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +use Twig\Error\LoaderError; +use Twig\Source; + +/** + * Loads template from the filesystem. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface +{ + /** Identifier of the main namespace. */ + const MAIN_NAMESPACE = '__main__'; + + protected $paths = []; + protected $cache = []; + protected $errorCache = []; + + private $rootPath; + + /** + * @param string|array $paths A path or an array of paths where to look for templates + * @param string|null $rootPath The root path common to all relative paths (null for getcwd()) + */ + public function __construct($paths = [], string $rootPath = null) + { + $this->rootPath = (null === $rootPath ? getcwd() : $rootPath).\DIRECTORY_SEPARATOR; + if (false !== $realPath = realpath($rootPath)) { + $this->rootPath = $realPath.\DIRECTORY_SEPARATOR; + } + + if ($paths) { + $this->setPaths($paths); + } + } + + /** + * Returns the paths to the templates. + * + * @param string $namespace A path namespace + * + * @return array The array of paths where to look for templates + */ + public function getPaths($namespace = self::MAIN_NAMESPACE) + { + return isset($this->paths[$namespace]) ? $this->paths[$namespace] : []; + } + + /** + * Returns the path namespaces. + * + * The main namespace is always defined. + * + * @return array The array of defined namespaces + */ + public function getNamespaces() + { + return array_keys($this->paths); + } + + /** + * Sets the paths where templates are stored. + * + * @param string|array $paths A path or an array of paths where to look for templates + * @param string $namespace A path namespace + */ + public function setPaths($paths, $namespace = self::MAIN_NAMESPACE) + { + if (!\is_array($paths)) { + $paths = [$paths]; + } + + $this->paths[$namespace] = []; + foreach ($paths as $path) { + $this->addPath($path, $namespace); + } + } + + /** + * Adds a path where templates are stored. + * + * @param string $path A path where to look for templates + * @param string $namespace A path namespace + * + * @throws LoaderError + */ + public function addPath($path, $namespace = self::MAIN_NAMESPACE) + { + // invalidate the cache + $this->cache = $this->errorCache = []; + + $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path; + if (!is_dir($checkPath)) { + throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath)); + } + + $this->paths[$namespace][] = rtrim($path, '/\\'); + } + + /** + * Prepends a path where templates are stored. + * + * @param string $path A path where to look for templates + * @param string $namespace A path namespace + * + * @throws LoaderError + */ + public function prependPath($path, $namespace = self::MAIN_NAMESPACE) + { + // invalidate the cache + $this->cache = $this->errorCache = []; + + $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path; + if (!is_dir($checkPath)) { + throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath)); + } + + $path = rtrim($path, '/\\'); + + if (!isset($this->paths[$namespace])) { + $this->paths[$namespace][] = $path; + } else { + array_unshift($this->paths[$namespace], $path); + } + } + + public function getSourceContext($name) + { + if (null === ($path = $this->findTemplate($name)) || false === $path) { + return new Source('', $name, ''); + } + + return new Source(file_get_contents($path), $name, $path); + } + + public function getCacheKey($name) + { + if (null === ($path = $this->findTemplate($name)) || false === $path) { + return ''; + } + $len = \strlen($this->rootPath); + if (0 === strncmp($this->rootPath, $path, $len)) { + return substr($path, $len); + } + + return $path; + } + + public function exists($name) + { + $name = $this->normalizeName($name); + + if (isset($this->cache[$name])) { + return true; + } + + return null !== ($path = $this->findTemplate($name, false)) && false !== $path; + } + + public function isFresh($name, $time) + { + // false support to be removed in 3.0 + if (null === ($path = $this->findTemplate($name)) || false === $path) { + return false; + } + + return filemtime($path) < $time; + } + + /** + * Checks if the template can be found. + * + * In Twig 3.0, findTemplate must return a string or null (returning false won't work anymore). + * + * @param string $name The template name + * @param bool $throw Whether to throw an exception when an error occurs + * + * @return string|false|null The template name or false/null + */ + protected function findTemplate($name, $throw = true) + { + $name = $this->normalizeName($name); + + if (isset($this->cache[$name])) { + return $this->cache[$name]; + } + + if (isset($this->errorCache[$name])) { + if (!$throw) { + return false; + } + + throw new LoaderError($this->errorCache[$name]); + } + + try { + $this->validateName($name); + + list($namespace, $shortname) = $this->parseName($name); + } catch (LoaderError $e) { + if (!$throw) { + return false; + } + + throw $e; + } + + if (!isset($this->paths[$namespace])) { + $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace); + + if (!$throw) { + return false; + } + + throw new LoaderError($this->errorCache[$name]); + } + + foreach ($this->paths[$namespace] as $path) { + if (!$this->isAbsolutePath($path)) { + $path = $this->rootPath.$path; + } + + if (is_file($path.'/'.$shortname)) { + if (false !== $realpath = realpath($path.'/'.$shortname)) { + return $this->cache[$name] = $realpath; + } + + return $this->cache[$name] = $path.'/'.$shortname; + } + } + + $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace])); + + if (!$throw) { + return false; + } + + throw new LoaderError($this->errorCache[$name]); + } + + private function normalizeName($name) + { + return preg_replace('#/{2,}#', '/', str_replace('\\', '/', $name)); + } + + private function parseName($name, $default = self::MAIN_NAMESPACE) + { + if (isset($name[0]) && '@' == $name[0]) { + if (false === $pos = strpos($name, '/')) { + throw new LoaderError(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name)); + } + + $namespace = substr($name, 1, $pos - 1); + $shortname = substr($name, $pos + 1); + + return [$namespace, $shortname]; + } + + return [$default, $name]; + } + + private function validateName($name) + { + if (false !== strpos($name, "\0")) { + throw new LoaderError('A template name cannot contain NUL bytes.'); + } + + $name = ltrim($name, '/'); + $parts = explode('/', $name); + $level = 0; + foreach ($parts as $part) { + if ('..' === $part) { + --$level; + } elseif ('.' !== $part) { + ++$level; + } + + if ($level < 0) { + throw new LoaderError(sprintf('Looks like you try to load a template outside configured directories (%s).', $name)); + } + } + } + + private function isAbsolutePath($file) + { + return strspn($file, '/\\', 0, 1) + || (\strlen($file) > 3 && ctype_alpha($file[0]) + && ':' === $file[1] + && strspn($file, '/\\', 2, 1) + ) + || null !== parse_url($file, PHP_URL_SCHEME) + ; + } +} + +class_alias('Twig\Loader\FilesystemLoader', 'Twig_Loader_Filesystem'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/LoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/LoaderInterface.php new file mode 100644 index 0000000..5ccd2c7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/LoaderInterface.php @@ -0,0 +1,69 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +use Twig\Error\LoaderError; +use Twig\Source; + +/** + * Interface all loaders must implement. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface LoaderInterface +{ + /** + * Returns the source context for a given template logical name. + * + * @param string $name The template logical name + * + * @return Source + * + * @throws LoaderError When $name is not found + */ + public function getSourceContext($name); + + /** + * Gets the cache key to use for the cache for a given template name. + * + * @param string $name The name of the template to load + * + * @return string The cache key + * + * @throws LoaderError When $name is not found + */ + public function getCacheKey($name); + + /** + * Returns true if the template is still fresh. + * + * @param string $name The template name + * @param int $time Timestamp of the last modification time of the + * cached template + * + * @return bool true if the template is fresh, false otherwise + * + * @throws LoaderError When $name is not found + */ + public function isFresh($name, $time); + + /** + * Check if we have the source code of a template, given its name. + * + * @param string $name The name of the template to check if we can load + * + * @return bool If the template source code is handled by this loader or not + */ + public function exists($name); +} + +class_alias('Twig\Loader\LoaderInterface', 'Twig_LoaderInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php new file mode 100644 index 0000000..4fdb17e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Loader; + +/** + * Empty interface for Twig 1.x compatibility. + */ +interface SourceContextLoaderInterface extends LoaderInterface +{ +} + +class_alias('Twig\Loader\SourceContextLoaderInterface', 'Twig_SourceContextLoaderInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Markup.php b/srcs/phpmyadmin/vendor/twig/twig/src/Markup.php new file mode 100644 index 0000000..43c890b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Markup.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +/** + * Marks a content as safe. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Markup implements \Countable, \JsonSerializable +{ + private $content; + private $charset; + + public function __construct($content, $charset) + { + $this->content = (string) $content; + $this->charset = $charset; + } + + public function __toString() + { + return $this->content; + } + + public function count() + { + return mb_strlen($this->content, $this->charset); + } + + public function jsonSerialize() + { + return $this->content; + } +} + +class_alias('Twig\Markup', 'Twig_Markup'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/AutoEscapeNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/AutoEscapeNode.php new file mode 100644 index 0000000..0bd5ae1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/AutoEscapeNode.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents an autoescape node. + * + * The value is the escaping strategy (can be html, js, ...) + * + * The true value is equivalent to html. + * + * If autoescaping is disabled, then the value is false. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class AutoEscapeNode extends Node +{ + public function __construct($value, Node $body, int $lineno, string $tag = 'autoescape') + { + parent::__construct(['body' => $body], ['value' => $value], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->subcompile($this->getNode('body')); + } +} + +class_alias('Twig\Node\AutoEscapeNode', 'Twig_Node_AutoEscape'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockNode.php new file mode 100644 index 0000000..4da6e6f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockNode.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a block node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class BlockNode extends Node +{ + public function __construct(string $name, Node $body, int $lineno, string $tag = null) + { + parent::__construct(['body' => $body], ['name' => $name], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf("public function block_%s(\$context, array \$blocks = [])\n", $this->getAttribute('name')), "{\n") + ->indent() + ->write("\$macros = \$this->macros;\n") + ; + + $compiler + ->subcompile($this->getNode('body')) + ->outdent() + ->write("}\n\n") + ; + } +} + +class_alias('Twig\Node\BlockNode', 'Twig_Node_Block'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockReferenceNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockReferenceNode.php new file mode 100644 index 0000000..c46d8b3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BlockReferenceNode.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a block call node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class BlockReferenceNode extends Node implements NodeOutputInterface +{ + public function __construct(string $name, int $lineno, string $tag = null) + { + parent::__construct([], ['name' => $name], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name'))) + ; + } +} + +class_alias('Twig\Node\BlockReferenceNode', 'Twig_Node_BlockReference'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/BodyNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BodyNode.php new file mode 100644 index 0000000..5290be5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/BodyNode.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +/** + * Represents a body node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class BodyNode extends Node +{ +} + +class_alias('Twig\Node\BodyNode', 'Twig_Node_Body'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckSecurityNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckSecurityNode.php new file mode 100644 index 0000000..59857ca --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckSecurityNode.php @@ -0,0 +1,85 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +class CheckSecurityNode extends Node +{ + private $usedFilters; + private $usedTags; + private $usedFunctions; + + public function __construct(array $usedFilters, array $usedTags, array $usedFunctions) + { + $this->usedFilters = $usedFilters; + $this->usedTags = $usedTags; + $this->usedFunctions = $usedFunctions; + + parent::__construct(); + } + + public function compile(Compiler $compiler) + { + $tags = $filters = $functions = []; + foreach (['tags', 'filters', 'functions'] as $type) { + foreach ($this->{'used'.ucfirst($type)} as $name => $node) { + if ($node instanceof Node) { + ${$type}[$name] = $node->getTemplateLine(); + } else { + ${$type}[$node] = null; + } + } + } + + $compiler + ->write("\$this->sandbox = \$this->env->getExtension('\Twig\Extension\SandboxExtension');\n") + ->write('$tags = ')->repr(array_filter($tags))->raw(";\n") + ->write('$filters = ')->repr(array_filter($filters))->raw(";\n") + ->write('$functions = ')->repr(array_filter($functions))->raw(";\n\n") + ->write("try {\n") + ->indent() + ->write("\$this->sandbox->checkSecurity(\n") + ->indent() + ->write(!$tags ? "[],\n" : "['".implode("', '", array_keys($tags))."'],\n") + ->write(!$filters ? "[],\n" : "['".implode("', '", array_keys($filters))."'],\n") + ->write(!$functions ? "[]\n" : "['".implode("', '", array_keys($functions))."']\n") + ->outdent() + ->write(");\n") + ->outdent() + ->write("} catch (SecurityError \$e) {\n") + ->indent() + ->write("\$e->setSourceContext(\$this->source);\n\n") + ->write("if (\$e instanceof SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n") + ->outdent() + ->write("} elseif (\$e instanceof SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n") + ->outdent() + ->write("} elseif (\$e instanceof SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n") + ->outdent() + ->write("}\n\n") + ->write("throw \$e;\n") + ->outdent() + ->write("}\n\n") + ; + } +} + +class_alias('Twig\Node\CheckSecurityNode', 'Twig_Node_CheckSecurity'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckToStringNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckToStringNode.php new file mode 100644 index 0000000..02b42fc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/CheckToStringNode.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; + +/** + * Checks if casting an expression to __toString() is allowed by the sandbox. + * + * For instance, when there is a simple Print statement, like {{ article }}, + * and if the sandbox is enabled, we need to check that the __toString() + * method is allowed if 'article' is an object. The same goes for {{ article|upper }} + * or {{ random(article) }} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class CheckToStringNode extends AbstractExpression +{ + public function __construct(AbstractExpression $expr) + { + parent::__construct(['expr' => $expr], [], $expr->getTemplateLine(), $expr->getNodeTag()); + } + + public function compile(Compiler $compiler) + { + $expr = $this->getNode('expr'); + $compiler + ->raw('$this->sandbox->ensureToStringAllowed(') + ->subcompile($expr) + ->raw(', ') + ->repr($expr->getTemplateLine()) + ->raw(', $this->source)') + ; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/DeprecatedNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/DeprecatedNode.php new file mode 100644 index 0000000..accd768 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/DeprecatedNode.php @@ -0,0 +1,55 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\ConstantExpression; + +/** + * Represents a deprecated node. + * + * @author Yonel Ceruto <yonelceruto@gmail.com> + */ +class DeprecatedNode extends Node +{ + public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + { + parent::__construct(['expr' => $expr], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->addDebugInfo($this); + + $expr = $this->getNode('expr'); + + if ($expr instanceof ConstantExpression) { + $compiler->write('@trigger_error(') + ->subcompile($expr); + } else { + $varName = $compiler->getVarName(); + $compiler->write(sprintf('$%s = ', $varName)) + ->subcompile($expr) + ->raw(";\n") + ->write(sprintf('@trigger_error($%s', $varName)); + } + + $compiler + ->raw('.') + ->string(sprintf(' ("%s" at line %d).', $this->getTemplateName(), $this->getTemplateLine())) + ->raw(", E_USER_DEPRECATED);\n") + ; + } +} + +class_alias('Twig\Node\DeprecatedNode', 'Twig_Node_Deprecated'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/DoNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/DoNode.php new file mode 100644 index 0000000..d74804c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/DoNode.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; + +/** + * Represents a do node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class DoNode extends Node +{ + public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + { + parent::__construct(['expr' => $expr], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('') + ->subcompile($this->getNode('expr')) + ->raw(";\n") + ; + } +} + +class_alias('Twig\Node\DoNode', 'Twig_Node_Do'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/EmbedNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/EmbedNode.php new file mode 100644 index 0000000..4a1ef6f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/EmbedNode.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\ConstantExpression; + +/** + * Represents an embed node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class EmbedNode extends IncludeNode +{ + // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module) + public function __construct(string $name, int $index, AbstractExpression $variables = null, bool $only = false, bool $ignoreMissing = false, int $lineno, string $tag = null) + { + parent::__construct(new ConstantExpression('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag); + + $this->setAttribute('name', $name); + $this->setAttribute('index', $index); + } + + protected function addGetTemplate(Compiler $compiler) + { + $compiler + ->write('$this->loadTemplate(') + ->string($this->getAttribute('name')) + ->raw(', ') + ->repr($this->getTemplateName()) + ->raw(', ') + ->repr($this->getTemplateLine()) + ->raw(', ') + ->string($this->getAttribute('index')) + ->raw(')') + ; + } +} + +class_alias('Twig\Node\EmbedNode', 'Twig_Node_Embed'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AbstractExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AbstractExpression.php new file mode 100644 index 0000000..a352892 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AbstractExpression.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Node\Node; + +/** + * Abstract class for all nodes that represents an expression. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +abstract class AbstractExpression extends Node +{ +} + +class_alias('Twig\Node\Expression\AbstractExpression', 'Twig_Node_Expression'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrayExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrayExpression.php new file mode 100644 index 0000000..917675d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrayExpression.php @@ -0,0 +1,88 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class ArrayExpression extends AbstractExpression +{ + private $index; + + public function __construct(array $elements, int $lineno) + { + parent::__construct($elements, [], $lineno); + + $this->index = -1; + foreach ($this->getKeyValuePairs() as $pair) { + if ($pair['key'] instanceof ConstantExpression && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) { + $this->index = $pair['key']->getAttribute('value'); + } + } + } + + public function getKeyValuePairs() + { + $pairs = []; + + foreach (array_chunk($this->nodes, 2) as $pair) { + $pairs[] = [ + 'key' => $pair[0], + 'value' => $pair[1], + ]; + } + + return $pairs; + } + + public function hasElement(AbstractExpression $key) + { + foreach ($this->getKeyValuePairs() as $pair) { + // we compare the string representation of the keys + // to avoid comparing the line numbers which are not relevant here. + if ((string) $key === (string) $pair['key']) { + return true; + } + } + + return false; + } + + public function addElement(AbstractExpression $value, AbstractExpression $key = null) + { + if (null === $key) { + $key = new ConstantExpression(++$this->index, $value->getTemplateLine()); + } + + array_push($this->nodes, $key, $value); + } + + public function compile(Compiler $compiler) + { + $compiler->raw('['); + $first = true; + foreach ($this->getKeyValuePairs() as $pair) { + if (!$first) { + $compiler->raw(', '); + } + $first = false; + + $compiler + ->subcompile($pair['key']) + ->raw(' => ') + ->subcompile($pair['value']) + ; + } + $compiler->raw(']'); + } +} + +class_alias('Twig\Node\Expression\ArrayExpression', 'Twig_Node_Expression_Array'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php new file mode 100644 index 0000000..b5b720e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php @@ -0,0 +1,64 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +/** + * Represents an arrow function. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ArrowFunctionExpression extends AbstractExpression +{ + public function __construct(AbstractExpression $expr, Node $names, $lineno, $tag = null) + { + parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->raw('function (') + ; + foreach ($this->getNode('names') as $i => $name) { + if ($i) { + $compiler->raw(', '); + } + + $compiler + ->raw('$__') + ->raw($name->getAttribute('name')) + ->raw('__') + ; + } + $compiler + ->raw(') use ($context, $macros) { ') + ; + foreach ($this->getNode('names') as $name) { + $compiler + ->raw('$context["') + ->raw($name->getAttribute('name')) + ->raw('"] = $__') + ->raw($name->getAttribute('name')) + ->raw('__; ') + ; + } + $compiler + ->raw('return ') + ->subcompile($this->getNode('expr')) + ->raw('; }') + ; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php new file mode 100644 index 0000000..62c4ac0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php @@ -0,0 +1,29 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class AssignNameExpression extends NameExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('$context[') + ->string($this->getAttribute('name')) + ->raw(']') + ; + } +} + +class_alias('Twig\Node\Expression\AssignNameExpression', 'Twig_Node_Expression_AssignName'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php new file mode 100644 index 0000000..67c388a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Node; + +abstract class AbstractBinary extends AbstractExpression +{ + public function __construct(Node $left, Node $right, int $lineno) + { + parent::__construct(['left' => $left, 'right' => $right], [], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('left')) + ->raw(' ') + ; + $this->operator($compiler); + $compiler + ->raw(' ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + abstract public function operator(Compiler $compiler); +} + +class_alias('Twig\Node\Expression\Binary\AbstractBinary', 'Twig_Node_Expression_Binary'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php new file mode 100644 index 0000000..f7719a1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class AddBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('+'); + } +} + +class_alias('Twig\Node\Expression\Binary\AddBinary', 'Twig_Node_Expression_Binary_Add'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php new file mode 100644 index 0000000..484597d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class AndBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('&&'); + } +} + +class_alias('Twig\Node\Expression\Binary\AndBinary', 'Twig_Node_Expression_Binary_And'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php new file mode 100644 index 0000000..cf28691 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class BitwiseAndBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('&'); + } +} + +class_alias('Twig\Node\Expression\Binary\BitwiseAndBinary', 'Twig_Node_Expression_Binary_BitwiseAnd'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php new file mode 100644 index 0000000..7d5d260 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class BitwiseOrBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('|'); + } +} + +class_alias('Twig\Node\Expression\Binary\BitwiseOrBinary', 'Twig_Node_Expression_Binary_BitwiseOr'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php new file mode 100644 index 0000000..7291987 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class BitwiseXorBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('^'); + } +} + +class_alias('Twig\Node\Expression\Binary\BitwiseXorBinary', 'Twig_Node_Expression_Binary_BitwiseXor'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php new file mode 100644 index 0000000..f6e5938 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class ConcatBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('.'); + } +} + +class_alias('Twig\Node\Expression\Binary\ConcatBinary', 'Twig_Node_Expression_Binary_Concat'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php new file mode 100644 index 0000000..ebfcc75 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class DivBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('/'); + } +} + +class_alias('Twig\Node\Expression\Binary\DivBinary', 'Twig_Node_Expression_Binary_Div'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php new file mode 100644 index 0000000..41a0065 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class EndsWithBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $left = $compiler->getVarName(); + $right = $compiler->getVarName(); + $compiler + ->raw(sprintf('(is_string($%s = ', $left)) + ->subcompile($this->getNode('left')) + ->raw(sprintf(') && is_string($%s = ', $right)) + ->subcompile($this->getNode('right')) + ->raw(sprintf(') && (\'\' === $%2$s || $%2$s === substr($%1$s, -strlen($%2$s))))', $left, $right)) + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw(''); + } +} + +class_alias('Twig\Node\Expression\Binary\EndsWithBinary', 'Twig_Node_Expression_Binary_EndsWith'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php new file mode 100644 index 0000000..84904c3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class EqualBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('=='); + } +} + +class_alias('Twig\Node\Expression\Binary\EqualBinary', 'Twig_Node_Expression_Binary_Equal'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php new file mode 100644 index 0000000..4dd5e3d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class FloorDivBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $compiler->raw('(int) floor('); + parent::compile($compiler); + $compiler->raw(')'); + } + + public function operator(Compiler $compiler) + { + return $compiler->raw('/'); + } +} + +class_alias('Twig\Node\Expression\Binary\FloorDivBinary', 'Twig_Node_Expression_Binary_FloorDiv'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php new file mode 100644 index 0000000..be73001 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class GreaterBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('>'); + } +} + +class_alias('Twig\Node\Expression\Binary\GreaterBinary', 'Twig_Node_Expression_Binary_Greater'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php new file mode 100644 index 0000000..5c2ae72 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class GreaterEqualBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('>='); + } +} + +class_alias('Twig\Node\Expression\Binary\GreaterEqualBinary', 'Twig_Node_Expression_Binary_GreaterEqual'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php new file mode 100644 index 0000000..f00b230 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class InBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('twig_in_filter(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw('in'); + } +} + +class_alias('Twig\Node\Expression\Binary\InBinary', 'Twig_Node_Expression_Binary_In'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php new file mode 100644 index 0000000..2b202da --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class LessBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('<'); + } +} + +class_alias('Twig\Node\Expression\Binary\LessBinary', 'Twig_Node_Expression_Binary_Less'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php new file mode 100644 index 0000000..4fffafe --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class LessEqualBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('<='); + } +} + +class_alias('Twig\Node\Expression\Binary\LessEqualBinary', 'Twig_Node_Expression_Binary_LessEqual'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php new file mode 100644 index 0000000..ae810b2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class MatchesBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('preg_match(') + ->subcompile($this->getNode('right')) + ->raw(', ') + ->subcompile($this->getNode('left')) + ->raw(')') + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw(''); + } +} + +class_alias('Twig\Node\Expression\Binary\MatchesBinary', 'Twig_Node_Expression_Binary_Matches'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php new file mode 100644 index 0000000..e6a2b36 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class ModBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('%'); + } +} + +class_alias('Twig\Node\Expression\Binary\ModBinary', 'Twig_Node_Expression_Binary_Mod'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php new file mode 100644 index 0000000..cd65f5d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class MulBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('*'); + } +} + +class_alias('Twig\Node\Expression\Binary\MulBinary', 'Twig_Node_Expression_Binary_Mul'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php new file mode 100644 index 0000000..df5c6a2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class NotEqualBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('!='); + } +} + +class_alias('Twig\Node\Expression\Binary\NotEqualBinary', 'Twig_Node_Expression_Binary_NotEqual'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php new file mode 100644 index 0000000..ed2034e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class NotInBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('!twig_in_filter(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw('not in'); + } +} + +class_alias('Twig\Node\Expression\Binary\NotInBinary', 'Twig_Node_Expression_Binary_NotIn'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php new file mode 100644 index 0000000..8f9da43 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class OrBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('||'); + } +} + +class_alias('Twig\Node\Expression\Binary\OrBinary', 'Twig_Node_Expression_Binary_Or'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php new file mode 100644 index 0000000..32d0214 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class PowerBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('**'); + } +} + +class_alias('Twig\Node\Expression\Binary\PowerBinary', 'Twig_Node_Expression_Binary_Power'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php new file mode 100644 index 0000000..e9c0cdf --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class RangeBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('range(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw('..'); + } +} + +class_alias('Twig\Node\Expression\Binary\RangeBinary', 'Twig_Node_Expression_Binary_Range'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php new file mode 100644 index 0000000..5245e40 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class SpaceshipBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('<=>'); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php new file mode 100644 index 0000000..1fe59fb --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class StartsWithBinary extends AbstractBinary +{ + public function compile(Compiler $compiler) + { + $left = $compiler->getVarName(); + $right = $compiler->getVarName(); + $compiler + ->raw(sprintf('(is_string($%s = ', $left)) + ->subcompile($this->getNode('left')) + ->raw(sprintf(') && is_string($%s = ', $right)) + ->subcompile($this->getNode('right')) + ->raw(sprintf(') && (\'\' === $%2$s || 0 === strpos($%1$s, $%2$s)))', $left, $right)) + ; + } + + public function operator(Compiler $compiler) + { + return $compiler->raw(''); + } +} + +class_alias('Twig\Node\Expression\Binary\StartsWithBinary', 'Twig_Node_Expression_Binary_StartsWith'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php new file mode 100644 index 0000000..2546975 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Binary; + +use Twig\Compiler; + +class SubBinary extends AbstractBinary +{ + public function operator(Compiler $compiler) + { + return $compiler->raw('-'); + } +} + +class_alias('Twig\Node\Expression\Binary\SubBinary', 'Twig_Node_Expression_Binary_Sub'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php new file mode 100644 index 0000000..c68989a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php @@ -0,0 +1,88 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +/** + * Represents a block call node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class BlockReferenceExpression extends AbstractExpression +{ + public function __construct(Node $name, Node $template = null, int $lineno, string $tag = null) + { + $nodes = ['name' => $name]; + if (null !== $template) { + $nodes['template'] = $template; + } + + parent::__construct($nodes, ['is_defined_test' => false, 'output' => false], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + if ($this->getAttribute('is_defined_test')) { + $this->compileTemplateCall($compiler, 'hasBlock'); + } else { + if ($this->getAttribute('output')) { + $compiler->addDebugInfo($this); + + $this + ->compileTemplateCall($compiler, 'displayBlock') + ->raw(";\n"); + } else { + $this->compileTemplateCall($compiler, 'renderBlock'); + } + } + } + + private function compileTemplateCall(Compiler $compiler, string $method): Compiler + { + if (!$this->hasNode('template')) { + $compiler->write('$this'); + } else { + $compiler + ->write('$this->loadTemplate(') + ->subcompile($this->getNode('template')) + ->raw(', ') + ->repr($this->getTemplateName()) + ->raw(', ') + ->repr($this->getTemplateLine()) + ->raw(')') + ; + } + + $compiler->raw(sprintf('->%s', $method)); + + return $this->compileBlockArguments($compiler); + } + + private function compileBlockArguments(Compiler $compiler): Compiler + { + $compiler + ->raw('(') + ->subcompile($this->getNode('name')) + ->raw(', $context'); + + if (!$this->hasNode('template')) { + $compiler->raw(', $blocks'); + } + + return $compiler->raw(')'); + } +} + +class_alias('Twig\Node\Expression\BlockReferenceExpression', 'Twig_Node_Expression_BlockReference'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/CallExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/CallExpression.php new file mode 100644 index 0000000..4ecd2c1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/CallExpression.php @@ -0,0 +1,313 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Error\SyntaxError; +use Twig\Extension\ExtensionInterface; +use Twig\Node\Node; + +abstract class CallExpression extends AbstractExpression +{ + private $reflector; + + protected function compileCallable(Compiler $compiler) + { + $callable = $this->getAttribute('callable'); + + $closingParenthesis = false; + $isArray = false; + if (\is_string($callable) && false === strpos($callable, '::')) { + $compiler->raw($callable); + } else { + list($r, $callable) = $this->reflectCallable($callable); + if ($r instanceof \ReflectionMethod && \is_string($callable[0])) { + if ($r->isStatic()) { + $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1])); + } else { + $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1])); + } + } elseif ($r instanceof \ReflectionMethod && $callable[0] instanceof ExtensionInterface) { + // For BC/FC with namespaced aliases + $class = (new \ReflectionClass(\get_class($callable[0])))->name; + if (!$compiler->getEnvironment()->hasExtension($class)) { + // Compile a non-optimized call to trigger a \Twig\Error\RuntimeError, which cannot be a compile-time error + $compiler->raw(sprintf('$this->env->getExtension(\'%s\')', $class)); + } else { + $compiler->raw(sprintf('$this->extensions[\'%s\']', ltrim($class, '\\'))); + } + + $compiler->raw(sprintf('->%s', $callable[1])); + } else { + $closingParenthesis = true; + $isArray = true; + $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), ', ucfirst($this->getAttribute('type')), $this->getAttribute('name'))); + } + } + + $this->compileArguments($compiler, $isArray); + + if ($closingParenthesis) { + $compiler->raw(')'); + } + } + + protected function compileArguments(Compiler $compiler, $isArray = false) + { + $compiler->raw($isArray ? '[' : '('); + + $first = true; + + if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) { + $compiler->raw('$this->env'); + $first = false; + } + + if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->raw('$context'); + $first = false; + } + + if ($this->hasAttribute('arguments')) { + foreach ($this->getAttribute('arguments') as $argument) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->string($argument); + $first = false; + } + } + + if ($this->hasNode('node')) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->subcompile($this->getNode('node')); + $first = false; + } + + if ($this->hasNode('arguments')) { + $callable = $this->getAttribute('callable'); + $arguments = $this->getArguments($callable, $this->getNode('arguments')); + foreach ($arguments as $node) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->subcompile($node); + $first = false; + } + } + + $compiler->raw($isArray ? ']' : ')'); + } + + protected function getArguments($callable = null, $arguments) + { + $callType = $this->getAttribute('type'); + $callName = $this->getAttribute('name'); + + $parameters = []; + $named = false; + foreach ($arguments as $name => $node) { + if (!\is_int($name)) { + $named = true; + $name = $this->normalizeName($name); + } elseif ($named) { + throw new SyntaxError(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName), $this->getTemplateLine(), $this->getSourceContext()); + } + + $parameters[$name] = $node; + } + + $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic'); + if (!$named && !$isVariadic) { + return $parameters; + } + + if (!$callable) { + if ($named) { + $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName); + } else { + $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName); + } + + throw new \LogicException($message); + } + + list($callableParameters, $isPhpVariadic) = $this->getCallableParameters($callable, $isVariadic); + $arguments = []; + $names = []; + $missingArguments = []; + $optionalArguments = []; + $pos = 0; + foreach ($callableParameters as $callableParameter) { + $names[] = $name = $this->normalizeName($callableParameter->name); + + if (\array_key_exists($name, $parameters)) { + if (\array_key_exists($pos, $parameters)) { + throw new SyntaxError(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext()); + } + + if (\count($missingArguments)) { + throw new SyntaxError(sprintf( + 'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".', + $name, $callType, $callName, implode(', ', $names), \count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments) + ), $this->getTemplateLine(), $this->getSourceContext()); + } + + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $parameters[$name]; + unset($parameters[$name]); + $optionalArguments = []; + } elseif (\array_key_exists($pos, $parameters)) { + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $parameters[$pos]; + unset($parameters[$pos]); + $optionalArguments = []; + ++$pos; + } elseif ($callableParameter->isDefaultValueAvailable()) { + $optionalArguments[] = new ConstantExpression($callableParameter->getDefaultValue(), -1); + } elseif ($callableParameter->isOptional()) { + if (empty($parameters)) { + break; + } else { + $missingArguments[] = $name; + } + } else { + throw new SyntaxError(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext()); + } + } + + if ($isVariadic) { + $arbitraryArguments = $isPhpVariadic ? new VariadicExpression([], -1) : new ArrayExpression([], -1); + foreach ($parameters as $key => $value) { + if (\is_int($key)) { + $arbitraryArguments->addElement($value); + } else { + $arbitraryArguments->addElement($value, new ConstantExpression($key, -1)); + } + unset($parameters[$key]); + } + + if ($arbitraryArguments->count()) { + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $arbitraryArguments; + } + } + + if (!empty($parameters)) { + $unknownParameter = null; + foreach ($parameters as $parameter) { + if ($parameter instanceof Node) { + $unknownParameter = $parameter; + break; + } + } + + throw new SyntaxError( + sprintf( + 'Unknown argument%s "%s" for %s "%s(%s)".', + \count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names) + ), + $unknownParameter ? $unknownParameter->getTemplateLine() : $this->getTemplateLine(), + $unknownParameter ? $unknownParameter->getSourceContext() : $this->getSourceContext() + ); + } + + return $arguments; + } + + protected function normalizeName($name) + { + return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], $name)); + } + + private function getCallableParameters($callable, bool $isVariadic): array + { + list($r) = $this->reflectCallable($callable); + if (null === $r) { + return [[], false]; + } + + $parameters = $r->getParameters(); + if ($this->hasNode('node')) { + array_shift($parameters); + } + if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) { + array_shift($parameters); + } + if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) { + array_shift($parameters); + } + if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) { + foreach ($this->getAttribute('arguments') as $argument) { + array_shift($parameters); + } + } + $isPhpVariadic = false; + if ($isVariadic) { + $argument = end($parameters); + if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) { + array_pop($parameters); + } elseif ($argument && $argument->isVariadic()) { + array_pop($parameters); + $isPhpVariadic = true; + } else { + $callableName = $r->name; + if ($r instanceof \ReflectionMethod) { + $callableName = $r->getDeclaringClass()->name.'::'.$callableName; + } + + throw new \LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = []".', $callableName, $this->getAttribute('type'), $this->getAttribute('name'))); + } + } + + return [$parameters, $isPhpVariadic]; + } + + private function reflectCallable($callable) + { + if (null !== $this->reflector) { + return $this->reflector; + } + + if (\is_array($callable)) { + if (!method_exists($callable[0], $callable[1])) { + // __call() + return [null, []]; + } + $r = new \ReflectionMethod($callable[0], $callable[1]); + } elseif (\is_object($callable) && !$callable instanceof \Closure) { + $r = new \ReflectionObject($callable); + $r = $r->getMethod('__invoke'); + $callable = [$callable, '__invoke']; + } elseif (\is_string($callable) && false !== $pos = strpos($callable, '::')) { + $class = substr($callable, 0, $pos); + $method = substr($callable, $pos + 2); + if (!method_exists($class, $method)) { + // __staticCall() + return [null, []]; + } + $r = new \ReflectionMethod($callable); + $callable = [$class, $method]; + } else { + $r = new \ReflectionFunction($callable); + } + + return $this->reflector = [$r, $callable]; + } +} + +class_alias('Twig\Node\Expression\CallExpression', 'Twig_Node_Expression_Call'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php new file mode 100644 index 0000000..8c367d3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class ConditionalExpression extends AbstractExpression +{ + public function __construct(AbstractExpression $expr1, AbstractExpression $expr2, AbstractExpression $expr3, int $lineno) + { + parent::__construct(['expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3], [], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler + ->raw('((') + ->subcompile($this->getNode('expr1')) + ->raw(') ? (') + ->subcompile($this->getNode('expr2')) + ->raw(') : (') + ->subcompile($this->getNode('expr3')) + ->raw('))') + ; + } +} + +class_alias('Twig\Node\Expression\ConditionalExpression', 'Twig_Node_Expression_Conditional'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConstantExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConstantExpression.php new file mode 100644 index 0000000..46e0ac3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ConstantExpression.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class ConstantExpression extends AbstractExpression +{ + public function __construct($value, int $lineno) + { + parent::__construct([], ['value' => $value], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler->repr($this->getAttribute('value')); + } +} + +class_alias('Twig\Node\Expression\ConstantExpression', 'Twig_Node_Expression_Constant'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php new file mode 100644 index 0000000..0dacae8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Filter; + +use Twig\Compiler; +use Twig\Node\Expression\ConditionalExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\Test\DefinedTest; +use Twig\Node\Node; + +/** + * Returns the value or the default value when it is undefined or empty. + * + * {{ var.foo|default('foo item on var is not defined') }} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class DefaultFilter extends FilterExpression +{ + public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null) + { + $default = new FilterExpression($node, new ConstantExpression('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine()); + + if ('default' === $filterName->getAttribute('value') && ($node instanceof NameExpression || $node instanceof GetAttrExpression)) { + $test = new DefinedTest(clone $node, 'defined', new Node(), $node->getTemplateLine()); + $false = \count($arguments) ? $arguments->getNode(0) : new ConstantExpression('', $node->getTemplateLine()); + + $node = new ConditionalExpression($test, $default, $false, $node->getTemplateLine()); + } else { + $node = $default; + } + + parent::__construct($node, $filterName, $arguments, $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->subcompile($this->getNode('node')); + } +} + +class_alias('Twig\Node\Expression\Filter\DefaultFilter', 'Twig_Node_Expression_Filter_Default'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FilterExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FilterExpression.php new file mode 100644 index 0000000..41b0734 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FilterExpression.php @@ -0,0 +1,42 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +class FilterExpression extends CallExpression +{ + public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null) + { + parent::__construct(['node' => $node, 'filter' => $filterName, 'arguments' => $arguments], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $name = $this->getNode('filter')->getAttribute('value'); + $filter = $compiler->getEnvironment()->getFilter($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'filter'); + $this->setAttribute('needs_environment', $filter->needsEnvironment()); + $this->setAttribute('needs_context', $filter->needsContext()); + $this->setAttribute('arguments', $filter->getArguments()); + $this->setAttribute('callable', $filter->getCallable()); + $this->setAttribute('is_variadic', $filter->isVariadic()); + + $this->compileCallable($compiler); + } +} + +class_alias('Twig\Node\Expression\FilterExpression', 'Twig_Node_Expression_Filter'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FunctionExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FunctionExpression.php new file mode 100644 index 0000000..429dbb9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/FunctionExpression.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +class FunctionExpression extends CallExpression +{ + public function __construct(string $name, Node $arguments, int $lineno) + { + parent::__construct(['arguments' => $arguments], ['name' => $name, 'is_defined_test' => false], $lineno); + } + + public function compile(Compiler $compiler) + { + $name = $this->getAttribute('name'); + $function = $compiler->getEnvironment()->getFunction($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'function'); + $this->setAttribute('needs_environment', $function->needsEnvironment()); + $this->setAttribute('needs_context', $function->needsContext()); + $this->setAttribute('arguments', $function->getArguments()); + $callable = $function->getCallable(); + if ('constant' === $name && $this->getAttribute('is_defined_test')) { + $callable = 'twig_constant_is_defined'; + } + $this->setAttribute('callable', $callable); + $this->setAttribute('is_variadic', $function->isVariadic()); + + $this->compileCallable($compiler); + } +} + +class_alias('Twig\Node\Expression\FunctionExpression', 'Twig_Node_Expression_Function'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php new file mode 100644 index 0000000..7b06617 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php @@ -0,0 +1,89 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Extension\SandboxExtension; +use Twig\Template; + +class GetAttrExpression extends AbstractExpression +{ + public function __construct(AbstractExpression $node, AbstractExpression $attribute, AbstractExpression $arguments = null, string $type, int $lineno) + { + $nodes = ['node' => $node, 'attribute' => $attribute]; + if (null !== $arguments) { + $nodes['arguments'] = $arguments; + } + + parent::__construct($nodes, ['type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'optimizable' => true], $lineno); + } + + public function compile(Compiler $compiler) + { + $env = $compiler->getEnvironment(); + + // optimize array calls + if ( + $this->getAttribute('optimizable') + && (!$env->isStrictVariables() || $this->getAttribute('ignore_strict_check')) + && !$this->getAttribute('is_defined_test') + && Template::ARRAY_CALL === $this->getAttribute('type') + ) { + $var = '$'.$compiler->getVarName(); + $compiler + ->raw('(('.$var.' = ') + ->subcompile($this->getNode('node')) + ->raw(') && is_array(') + ->raw($var) + ->raw(') || ') + ->raw($var) + ->raw(' instanceof ArrayAccess ? (') + ->raw($var) + ->raw('[') + ->subcompile($this->getNode('attribute')) + ->raw('] ?? null) : null)') + ; + + return; + } + + $compiler->raw('twig_get_attribute($this->env, $this->source, '); + + if ($this->getAttribute('ignore_strict_check')) { + $this->getNode('node')->setAttribute('ignore_strict_check', true); + } + + $compiler + ->subcompile($this->getNode('node')) + ->raw(', ') + ->subcompile($this->getNode('attribute')) + ; + + if ($this->hasNode('arguments')) { + $compiler->raw(', ')->subcompile($this->getNode('arguments')); + } else { + $compiler->raw(', []'); + } + + $compiler->raw(', ') + ->repr($this->getAttribute('type')) + ->raw(', ')->repr($this->getAttribute('is_defined_test')) + ->raw(', ')->repr($this->getAttribute('ignore_strict_check')) + ->raw(', ')->repr($env->hasExtension(SandboxExtension::class)) + ->raw(', ')->repr($this->getNode('node')->getTemplateLine()) + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\GetAttrExpression', 'Twig_Node_Expression_GetAttr'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/InlinePrint.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/InlinePrint.php new file mode 100644 index 0000000..469e736 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/InlinePrint.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +/** + * @internal + */ +final class InlinePrint extends AbstractExpression +{ + public function __construct(Node $node, $lineno) + { + parent::__construct(['node' => $node], [], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler + ->raw('print (') + ->subcompile($this->getNode('node')) + ->raw(')') + ; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php new file mode 100644 index 0000000..d5287f8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php @@ -0,0 +1,64 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class MethodCallExpression extends AbstractExpression +{ + public function __construct(AbstractExpression $node, string $method, ArrayExpression $arguments, int $lineno) + { + parent::__construct(['node' => $node, 'arguments' => $arguments], ['method' => $method, 'safe' => false, 'is_defined_test' => false], $lineno); + + if ($node instanceof NameExpression) { + $node->setAttribute('always_defined', true); + } + } + + public function compile(Compiler $compiler) + { + if ($this->getAttribute('is_defined_test')) { + $compiler + ->raw('method_exists($macros[') + ->repr($this->getNode('node')->getAttribute('name')) + ->raw('], ') + ->repr($this->getAttribute('method')) + ->raw(')') + ; + + return; + } + + $compiler + ->raw('twig_call_macro($macros[') + ->repr($this->getNode('node')->getAttribute('name')) + ->raw('], ') + ->repr($this->getAttribute('method')) + ->raw(', [') + ; + $first = true; + foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) { + if (!$first) { + $compiler->raw(', '); + } + $first = false; + + $compiler->subcompile($pair['value']); + } + $compiler + ->raw('], ') + ->repr($this->getTemplateLine()) + ->raw(', $context, $this->getSourceContext())'); + } +} + +class_alias('Twig\Node\Expression\MethodCallExpression', 'Twig_Node_Expression_MethodCall'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NameExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NameExpression.php new file mode 100644 index 0000000..ff7a046 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NameExpression.php @@ -0,0 +1,99 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class NameExpression extends AbstractExpression +{ + private $specialVars = [ + '_self' => '$this->getTemplateName()', + '_context' => '$context', + '_charset' => '$this->env->getCharset()', + ]; + + public function __construct(string $name, int $lineno) + { + parent::__construct([], ['name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false], $lineno); + } + + public function compile(Compiler $compiler) + { + $name = $this->getAttribute('name'); + + $compiler->addDebugInfo($this); + + if ($this->getAttribute('is_defined_test')) { + if ($this->isSpecial()) { + $compiler->repr(true); + } elseif (\PHP_VERSION_ID >= 700400) { + $compiler + ->raw('array_key_exists(') + ->string($name) + ->raw(', $context)') + ; + } else { + $compiler + ->raw('(isset($context[') + ->string($name) + ->raw(']) || array_key_exists(') + ->string($name) + ->raw(', $context))') + ; + } + } elseif ($this->isSpecial()) { + $compiler->raw($this->specialVars[$name]); + } elseif ($this->getAttribute('always_defined')) { + $compiler + ->raw('$context[') + ->string($name) + ->raw(']') + ; + } else { + if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) { + $compiler + ->raw('($context[') + ->string($name) + ->raw('] ?? null)') + ; + } else { + $compiler + ->raw('(isset($context[') + ->string($name) + ->raw(']) || array_key_exists(') + ->string($name) + ->raw(', $context) ? $context[') + ->string($name) + ->raw('] : (function () { throw new RuntimeError(\'Variable ') + ->string($name) + ->raw(' does not exist.\', ') + ->repr($this->lineno) + ->raw(', $this->source); })()') + ->raw(')') + ; + } + } + } + + public function isSpecial() + { + return isset($this->specialVars[$this->getAttribute('name')]); + } + + public function isSimple() + { + return !$this->isSpecial() && !$this->getAttribute('is_defined_test'); + } +} + +class_alias('Twig\Node\Expression\NameExpression', 'Twig_Node_Expression_Name'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php new file mode 100644 index 0000000..de03ff2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Expression\Binary\AndBinary; +use Twig\Node\Expression\Test\DefinedTest; +use Twig\Node\Expression\Test\NullTest; +use Twig\Node\Expression\Unary\NotUnary; +use Twig\Node\Node; + +class NullCoalesceExpression extends ConditionalExpression +{ + public function __construct(Node $left, Node $right, int $lineno) + { + $test = new DefinedTest(clone $left, 'defined', new Node(), $left->getTemplateLine()); + // for "block()", we don't need the null test as the return value is always a string + if (!$left instanceof BlockReferenceExpression) { + $test = new AndBinary( + $test, + new NotUnary(new NullTest($left, 'null', new Node(), $left->getTemplateLine()), $left->getTemplateLine()), + $left->getTemplateLine() + ); + } + + parent::__construct($test, $left, $right, $lineno); + } + + public function compile(Compiler $compiler) + { + /* + * This optimizes only one case. PHP 7 also supports more complex expressions + * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works, + * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced + * cases might be implemented as an optimizer node visitor, but has not been done + * as benefits are probably not worth the added complexity. + */ + if ($this->getNode('expr2') instanceof NameExpression) { + $this->getNode('expr2')->setAttribute('always_defined', true); + $compiler + ->raw('((') + ->subcompile($this->getNode('expr2')) + ->raw(') ?? (') + ->subcompile($this->getNode('expr3')) + ->raw('))') + ; + } else { + parent::compile($compiler); + } + } +} + +class_alias('Twig\Node\Expression\NullCoalesceExpression', 'Twig_Node_Expression_NullCoalesce'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ParentExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ParentExpression.php new file mode 100644 index 0000000..294ab39 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/ParentExpression.php @@ -0,0 +1,48 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +/** + * Represents a parent node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ParentExpression extends AbstractExpression +{ + public function __construct(string $name, int $lineno, string $tag = null) + { + parent::__construct([], ['output' => false, 'name' => $name], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + if ($this->getAttribute('output')) { + $compiler + ->addDebugInfo($this) + ->write('$this->displayParentBlock(') + ->string($this->getAttribute('name')) + ->raw(", \$context, \$blocks);\n") + ; + } else { + $compiler + ->raw('$this->renderParentBlock(') + ->string($this->getAttribute('name')) + ->raw(', $context, $blocks)') + ; + } + } +} + +class_alias('Twig\Node\Expression\ParentExpression', 'Twig_Node_Expression_Parent'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TempNameExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TempNameExpression.php new file mode 100644 index 0000000..e7a1a89 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TempNameExpression.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class TempNameExpression extends AbstractExpression +{ + public function __construct(string $name, int $lineno) + { + parent::__construct([], ['name' => $name], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler + ->raw('$_') + ->raw($this->getAttribute('name')) + ->raw('_') + ; + } +} + +class_alias('Twig\Node\Expression\TempNameExpression', 'Twig_Node_Expression_TempName'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php new file mode 100644 index 0000000..78353a8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks if a variable is the exact same value as a constant. + * + * {% if post.status is constant('Post::PUBLISHED') %} + * the status attribute is exactly the same as Post::PUBLISHED + * {% endif %} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ConstantTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' === constant(') + ; + + if ($this->getNode('arguments')->hasNode(1)) { + $compiler + ->raw('get_class(') + ->subcompile($this->getNode('arguments')->getNode(1)) + ->raw(')."::".') + ; + } + + $compiler + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw('))') + ; + } +} + +class_alias('Twig\Node\Expression\Test\ConstantTest', 'Twig_Node_Expression_Test_Constant'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php new file mode 100644 index 0000000..7a89840 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php @@ -0,0 +1,76 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Error\SyntaxError; +use Twig\Node\Expression\ArrayExpression; +use Twig\Node\Expression\BlockReferenceExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\FunctionExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\MethodCallExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\TestExpression; +use Twig\Node\Node; + +/** + * Checks if a variable is defined in the current context. + * + * {# defined works with variable names and variable attributes #} + * {% if foo is defined %} + * {# ... #} + * {% endif %} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class DefinedTest extends TestExpression +{ + public function __construct(Node $node, string $name, Node $arguments = null, int $lineno) + { + if ($node instanceof NameExpression) { + $node->setAttribute('is_defined_test', true); + } elseif ($node instanceof GetAttrExpression) { + $node->setAttribute('is_defined_test', true); + $this->changeIgnoreStrictCheck($node); + } elseif ($node instanceof BlockReferenceExpression) { + $node->setAttribute('is_defined_test', true); + } elseif ($node instanceof FunctionExpression && 'constant' === $node->getAttribute('name')) { + $node->setAttribute('is_defined_test', true); + } elseif ($node instanceof ConstantExpression || $node instanceof ArrayExpression) { + $node = new ConstantExpression(true, $node->getTemplateLine()); + } elseif ($node instanceof MethodCallExpression) { + $node->setAttribute('is_defined_test', true); + } else { + throw new SyntaxError('The "defined" test only works with simple variables.', $lineno); + } + + parent::__construct($node, $name, $arguments, $lineno); + } + + private function changeIgnoreStrictCheck(GetAttrExpression $node) + { + $node->setAttribute('optimizable', false); + $node->setAttribute('ignore_strict_check', true); + + if ($node->getNode('node') instanceof GetAttrExpression) { + $this->changeIgnoreStrictCheck($node->getNode('node')); + } + } + + public function compile(Compiler $compiler) + { + $compiler->subcompile($this->getNode('node')); + } +} + +class_alias('Twig\Node\Expression\Test\DefinedTest', 'Twig_Node_Expression_Test_Defined'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php new file mode 100644 index 0000000..05c8ad8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks if a variable is divisible by a number. + * + * {% if loop.index is divisible by(3) %} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class DivisiblebyTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(0 == ') + ->subcompile($this->getNode('node')) + ->raw(' % ') + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\Test\DivisiblebyTest', 'Twig_Node_Expression_Test_Divisibleby'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php new file mode 100644 index 0000000..3b955d2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks if a number is even. + * + * {{ var is even }} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class EvenTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' % 2 == 0') + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\Test\EvenTest', 'Twig_Node_Expression_Test_Even'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/NullTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/NullTest.php new file mode 100644 index 0000000..24d3997 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/NullTest.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks that a variable is null. + * + * {{ var is none }} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class NullTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(null === ') + ->subcompile($this->getNode('node')) + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\Test\NullTest', 'Twig_Node_Expression_Test_Null'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/OddTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/OddTest.php new file mode 100644 index 0000000..2dc693a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/OddTest.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks if a number is odd. + * + * {{ var is odd }} + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class OddTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' % 2 == 1') + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\Test\OddTest', 'Twig_Node_Expression_Test_Odd'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php new file mode 100644 index 0000000..75f2b82 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Test; + +use Twig\Compiler; +use Twig\Node\Expression\TestExpression; + +/** + * Checks if a variable is the same as another one (=== in PHP). + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SameasTest extends TestExpression +{ + public function compile(Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' === ') + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw(')') + ; + } +} + +class_alias('Twig\Node\Expression\Test\SameasTest', 'Twig_Node_Expression_Test_Sameas'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TestExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TestExpression.php new file mode 100644 index 0000000..50aab05 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/TestExpression.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; +use Twig\Node\Node; + +class TestExpression extends CallExpression +{ + public function __construct(Node $node, string $name, Node $arguments = null, int $lineno) + { + $nodes = ['node' => $node]; + if (null !== $arguments) { + $nodes['arguments'] = $arguments; + } + + parent::__construct($nodes, ['name' => $name], $lineno); + } + + public function compile(Compiler $compiler) + { + $name = $this->getAttribute('name'); + $test = $compiler->getEnvironment()->getTest($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'test'); + $this->setAttribute('arguments', $test->getArguments()); + $this->setAttribute('callable', $test->getCallable()); + $this->setAttribute('is_variadic', $test->isVariadic()); + + $this->compileCallable($compiler); + } +} + +class_alias('Twig\Node\Expression\TestExpression', 'Twig_Node_Expression_Test'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php new file mode 100644 index 0000000..4896280 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Unary; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Node; + +abstract class AbstractUnary extends AbstractExpression +{ + public function __construct(Node $node, int $lineno) + { + parent::__construct(['node' => $node], [], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler->raw(' '); + $this->operator($compiler); + $compiler->subcompile($this->getNode('node')); + } + + abstract public function operator(Compiler $compiler); +} + +class_alias('Twig\Node\Expression\Unary\AbstractUnary', 'Twig_Node_Expression_Unary'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php new file mode 100644 index 0000000..dfb6f54 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Unary; + +use Twig\Compiler; + +class NegUnary extends AbstractUnary +{ + public function operator(Compiler $compiler) + { + $compiler->raw('-'); + } +} + +class_alias('Twig\Node\Expression\Unary\NegUnary', 'Twig_Node_Expression_Unary_Neg'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php new file mode 100644 index 0000000..7bdde96 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Unary; + +use Twig\Compiler; + +class NotUnary extends AbstractUnary +{ + public function operator(Compiler $compiler) + { + $compiler->raw('!'); + } +} + +class_alias('Twig\Node\Expression\Unary\NotUnary', 'Twig_Node_Expression_Unary_Not'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php new file mode 100644 index 0000000..52d5d0c --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression\Unary; + +use Twig\Compiler; + +class PosUnary extends AbstractUnary +{ + public function operator(Compiler $compiler) + { + $compiler->raw('+'); + } +} + +class_alias('Twig\Node\Expression\Unary\PosUnary', 'Twig_Node_Expression_Unary_Pos'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/VariadicExpression.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/VariadicExpression.php new file mode 100644 index 0000000..3351e1a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Expression/VariadicExpression.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node\Expression; + +use Twig\Compiler; + +class VariadicExpression extends ArrayExpression +{ + public function compile(Compiler $compiler) + { + $compiler->raw('...'); + + parent::compile($compiler); + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/FlushNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/FlushNode.php new file mode 100644 index 0000000..b88f340 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/FlushNode.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a flush node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class FlushNode extends Node +{ + public function __construct(int $lineno, string $tag) + { + parent::__construct([], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("flush();\n") + ; + } +} + +class_alias('Twig\Node\FlushNode', 'Twig_Node_Flush'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForLoopNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForLoopNode.php new file mode 100644 index 0000000..42aedd7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForLoopNode.php @@ -0,0 +1,56 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Internal node used by the for node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ForLoopNode extends Node +{ + public function __construct(int $lineno, string $tag = null) + { + parent::__construct([], ['with_loop' => false, 'ifexpr' => false, 'else' => false], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + if ($this->getAttribute('else')) { + $compiler->write("\$context['_iterated'] = true;\n"); + } + + if ($this->getAttribute('with_loop')) { + $compiler + ->write("++\$context['loop']['index0'];\n") + ->write("++\$context['loop']['index'];\n") + ->write("\$context['loop']['first'] = false;\n") + ; + + if (!$this->getAttribute('ifexpr')) { + $compiler + ->write("if (isset(\$context['loop']['length'])) {\n") + ->indent() + ->write("--\$context['loop']['revindex0'];\n") + ->write("--\$context['loop']['revindex'];\n") + ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n") + ->outdent() + ->write("}\n") + ; + } + } + } +} + +class_alias('Twig\Node\ForLoopNode', 'Twig_Node_ForLoop'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForNode.php new file mode 100644 index 0000000..54afe93 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ForNode.php @@ -0,0 +1,119 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\AssignNameExpression; + +/** + * Represents a for node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ForNode extends Node +{ + private $loop; + + public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, AbstractExpression $ifexpr = null, Node $body, Node $else = null, int $lineno, string $tag = null) + { + $body = new Node([$body, $this->loop = new ForLoopNode($lineno, $tag)]); + + if (null !== $ifexpr) { + $body = new IfNode(new Node([$ifexpr, $body]), null, $lineno, $tag); + } + + $nodes = ['key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body]; + if (null !== $else) { + $nodes['else'] = $else; + } + + parent::__construct($nodes, ['with_loop' => true, 'ifexpr' => null !== $ifexpr], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("\$context['_parent'] = \$context;\n") + ->write("\$context['_seq'] = twig_ensure_traversable(") + ->subcompile($this->getNode('seq')) + ->raw(");\n") + ; + + if ($this->hasNode('else')) { + $compiler->write("\$context['_iterated'] = false;\n"); + } + + if ($this->getAttribute('with_loop')) { + $compiler + ->write("\$context['loop'] = [\n") + ->write(" 'parent' => \$context['_parent'],\n") + ->write(" 'index0' => 0,\n") + ->write(" 'index' => 1,\n") + ->write(" 'first' => true,\n") + ->write("];\n") + ; + + if (!$this->getAttribute('ifexpr')) { + $compiler + ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof \Countable)) {\n") + ->indent() + ->write("\$length = count(\$context['_seq']);\n") + ->write("\$context['loop']['revindex0'] = \$length - 1;\n") + ->write("\$context['loop']['revindex'] = \$length;\n") + ->write("\$context['loop']['length'] = \$length;\n") + ->write("\$context['loop']['last'] = 1 === \$length;\n") + ->outdent() + ->write("}\n") + ; + } + } + + $this->loop->setAttribute('else', $this->hasNode('else')); + $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop')); + $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr')); + + $compiler + ->write("foreach (\$context['_seq'] as ") + ->subcompile($this->getNode('key_target')) + ->raw(' => ') + ->subcompile($this->getNode('value_target')) + ->raw(") {\n") + ->indent() + ->subcompile($this->getNode('body')) + ->outdent() + ->write("}\n") + ; + + if ($this->hasNode('else')) { + $compiler + ->write("if (!\$context['_iterated']) {\n") + ->indent() + ->subcompile($this->getNode('else')) + ->outdent() + ->write("}\n") + ; + } + + $compiler->write("\$_parent = \$context['_parent'];\n"); + + // remove some "private" loop variables (needed for nested loops) + $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n"); + + // keep the values set in the inner context for variables defined in the outer context + $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n"); + } +} + +class_alias('Twig\Node\ForNode', 'Twig_Node_For'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/IfNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/IfNode.php new file mode 100644 index 0000000..814a6f3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/IfNode.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents an if node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class IfNode extends Node +{ + public function __construct(Node $tests, Node $else = null, int $lineno, string $tag = null) + { + $nodes = ['tests' => $tests]; + if (null !== $else) { + $nodes['else'] = $else; + } + + parent::__construct($nodes, [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->addDebugInfo($this); + for ($i = 0, $count = \count($this->getNode('tests')); $i < $count; $i += 2) { + if ($i > 0) { + $compiler + ->outdent() + ->write('} elseif (') + ; + } else { + $compiler + ->write('if (') + ; + } + + $compiler + ->subcompile($this->getNode('tests')->getNode($i)) + ->raw(") {\n") + ->indent() + ->subcompile($this->getNode('tests')->getNode($i + 1)) + ; + } + + if ($this->hasNode('else')) { + $compiler + ->outdent() + ->write("} else {\n") + ->indent() + ->subcompile($this->getNode('else')) + ; + } + + $compiler + ->outdent() + ->write("}\n"); + } +} + +class_alias('Twig\Node\IfNode', 'Twig_Node_If'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/ImportNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ImportNode.php new file mode 100644 index 0000000..b661f43 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ImportNode.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\NameExpression; + +/** + * Represents an import node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ImportNode extends Node +{ + public function __construct(AbstractExpression $expr, AbstractExpression $var, int $lineno, string $tag = null, bool $global = true) + { + parent::__construct(['expr' => $expr, 'var' => $var], ['global' => $global], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('$macros[') + ->repr($this->getNode('var')->getAttribute('name')) + ->raw('] = ') + ; + + if ($this->getAttribute('global')) { + $compiler + ->raw('$this->macros[') + ->repr($this->getNode('var')->getAttribute('name')) + ->raw('] = ') + ; + } + + if ($this->getNode('expr') instanceof NameExpression && '_self' === $this->getNode('expr')->getAttribute('name')) { + $compiler->raw('$this'); + } else { + $compiler + ->raw('$this->loadTemplate(') + ->subcompile($this->getNode('expr')) + ->raw(', ') + ->repr($this->getTemplateName()) + ->raw(', ') + ->repr($this->getTemplateLine()) + ->raw(')->unwrap()') + ; + } + + $compiler->raw(";\n"); + } +} + +class_alias('Twig\Node\ImportNode', 'Twig_Node_Import'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/IncludeNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/IncludeNode.php new file mode 100644 index 0000000..d453030 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/IncludeNode.php @@ -0,0 +1,108 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; + +/** + * Represents an include node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class IncludeNode extends Node implements NodeOutputInterface +{ + public function __construct(AbstractExpression $expr, AbstractExpression $variables = null, bool $only = false, bool $ignoreMissing = false, int $lineno, string $tag = null) + { + $nodes = ['expr' => $expr]; + if (null !== $variables) { + $nodes['variables'] = $variables; + } + + parent::__construct($nodes, ['only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->addDebugInfo($this); + + if ($this->getAttribute('ignore_missing')) { + $template = $compiler->getVarName(); + + $compiler + ->write(sprintf("$%s = null;\n", $template)) + ->write("try {\n") + ->indent() + ->write(sprintf('$%s = ', $template)) + ; + + $this->addGetTemplate($compiler); + + $compiler + ->raw(";\n") + ->outdent() + ->write("} catch (LoaderError \$e) {\n") + ->indent() + ->write("// ignore missing template\n") + ->outdent() + ->write("}\n") + ->write(sprintf("if ($%s) {\n", $template)) + ->indent() + ->write(sprintf('$%s->display(', $template)) + ; + $this->addTemplateArguments($compiler); + $compiler + ->raw(");\n") + ->outdent() + ->write("}\n") + ; + } else { + $this->addGetTemplate($compiler); + $compiler->raw('->display('); + $this->addTemplateArguments($compiler); + $compiler->raw(");\n"); + } + } + + protected function addGetTemplate(Compiler $compiler) + { + $compiler + ->write('$this->loadTemplate(') + ->subcompile($this->getNode('expr')) + ->raw(', ') + ->repr($this->getTemplateName()) + ->raw(', ') + ->repr($this->getTemplateLine()) + ->raw(')') + ; + } + + protected function addTemplateArguments(Compiler $compiler) + { + if (!$this->hasNode('variables')) { + $compiler->raw(false === $this->getAttribute('only') ? '$context' : '[]'); + } elseif (false === $this->getAttribute('only')) { + $compiler + ->raw('twig_array_merge($context, ') + ->subcompile($this->getNode('variables')) + ->raw(')') + ; + } else { + $compiler->raw('twig_to_array('); + $compiler->subcompile($this->getNode('variables')); + $compiler->raw(')'); + } + } +} + +class_alias('Twig\Node\IncludeNode', 'Twig_Node_Include'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/MacroNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/MacroNode.php new file mode 100644 index 0000000..a133720 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/MacroNode.php @@ -0,0 +1,115 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Error\SyntaxError; + +/** + * Represents a macro node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class MacroNode extends Node +{ + const VARARGS_NAME = 'varargs'; + + public function __construct(string $name, Node $body, Node $arguments, int $lineno, string $tag = null) + { + foreach ($arguments as $argumentName => $argument) { + if (self::VARARGS_NAME === $argumentName) { + throw new SyntaxError(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getTemplateLine(), $argument->getSourceContext()); + } + } + + parent::__construct(['body' => $body, 'arguments' => $arguments], ['name' => $name], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf('public function macro_%s(', $this->getAttribute('name'))) + ; + + $count = \count($this->getNode('arguments')); + $pos = 0; + foreach ($this->getNode('arguments') as $name => $default) { + $compiler + ->raw('$__'.$name.'__ = ') + ->subcompile($default) + ; + + if (++$pos < $count) { + $compiler->raw(', '); + } + } + + if ($count) { + $compiler->raw(', '); + } + + $compiler + ->raw('...$__varargs__') + ->raw(")\n") + ->write("{\n") + ->indent() + ->write("\$macros = \$this->macros;\n") + ->write("\$context = \$this->env->mergeGlobals([\n") + ->indent() + ; + + foreach ($this->getNode('arguments') as $name => $default) { + $compiler + ->write('') + ->string($name) + ->raw(' => $__'.$name.'__') + ->raw(",\n") + ; + } + + $compiler + ->write('') + ->string(self::VARARGS_NAME) + ->raw(' => ') + ; + + $compiler + ->raw("\$__varargs__,\n") + ->outdent() + ->write("]);\n\n") + ->write("\$blocks = [];\n\n") + ; + if ($compiler->getEnvironment()->isDebug()) { + $compiler->write("ob_start();\n"); + } else { + $compiler->write("ob_start(function () { return ''; });\n"); + } + $compiler + ->write("try {\n") + ->indent() + ->subcompile($this->getNode('body')) + ->raw("\n") + ->write("return ('' === \$tmp = ob_get_contents()) ? '' : new Markup(\$tmp, \$this->env->getCharset());\n") + ->outdent() + ->write("} finally {\n") + ->indent() + ->write("ob_end_clean();\n") + ->outdent() + ->write("}\n") + ->outdent() + ->write("}\n\n") + ; + } +} + +class_alias('Twig\Node\MacroNode', 'Twig_Node_Macro'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/ModuleNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ModuleNode.php new file mode 100644 index 0000000..b23a342 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/ModuleNode.php @@ -0,0 +1,472 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Source; + +/** + * Represents a module node. + * + * Consider this class as being final. If you need to customize the behavior of + * the generated class, consider adding nodes to the following nodes: display_start, + * display_end, constructor_start, constructor_end, and class_end. + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @final since Twig 2.4.0 + */ +class ModuleNode extends Node +{ + public function __construct(Node $body, AbstractExpression $parent = null, Node $blocks, Node $macros, Node $traits, $embeddedTemplates, Source $source) + { + if (__CLASS__ !== \get_class($this)) { + @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED); + } + + $nodes = [ + 'body' => $body, + 'blocks' => $blocks, + 'macros' => $macros, + 'traits' => $traits, + 'display_start' => new Node(), + 'display_end' => new Node(), + 'constructor_start' => new Node(), + 'constructor_end' => new Node(), + 'class_end' => new Node(), + ]; + if (null !== $parent) { + $nodes['parent'] = $parent; + } + + // embedded templates are set as attributes so that they are only visited once by the visitors + parent::__construct($nodes, [ + 'index' => null, + 'embedded_templates' => $embeddedTemplates, + ], 1); + + // populate the template name of all node children + $this->setSourceContext($source); + } + + public function setIndex($index) + { + $this->setAttribute('index', $index); + } + + public function compile(Compiler $compiler) + { + $this->compileTemplate($compiler); + + foreach ($this->getAttribute('embedded_templates') as $template) { + $compiler->subcompile($template); + } + } + + protected function compileTemplate(Compiler $compiler) + { + if (!$this->getAttribute('index')) { + $compiler->write('<?php'); + } + + $this->compileClassHeader($compiler); + + $this->compileConstructor($compiler); + + $this->compileGetParent($compiler); + + $this->compileDisplay($compiler); + + $compiler->subcompile($this->getNode('blocks')); + + $this->compileMacros($compiler); + + $this->compileGetTemplateName($compiler); + + $this->compileIsTraitable($compiler); + + $this->compileDebugInfo($compiler); + + $this->compileGetSourceContext($compiler); + + $this->compileClassFooter($compiler); + } + + protected function compileGetParent(Compiler $compiler) + { + if (!$this->hasNode('parent')) { + return; + } + $parent = $this->getNode('parent'); + + $compiler + ->write("protected function doGetParent(array \$context)\n", "{\n") + ->indent() + ->addDebugInfo($parent) + ->write('return ') + ; + + if ($parent instanceof ConstantExpression) { + $compiler->subcompile($parent); + } else { + $compiler + ->raw('$this->loadTemplate(') + ->subcompile($parent) + ->raw(', ') + ->repr($this->getSourceContext()->getName()) + ->raw(', ') + ->repr($parent->getTemplateLine()) + ->raw(')') + ; + } + + $compiler + ->raw(";\n") + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileClassHeader(Compiler $compiler) + { + $compiler + ->write("\n\n") + ; + if (!$this->getAttribute('index')) { + $compiler + ->write("use Twig\Environment;\n") + ->write("use Twig\Error\LoaderError;\n") + ->write("use Twig\Error\RuntimeError;\n") + ->write("use Twig\Extension\SandboxExtension;\n") + ->write("use Twig\Markup;\n") + ->write("use Twig\Sandbox\SecurityError;\n") + ->write("use Twig\Sandbox\SecurityNotAllowedTagError;\n") + ->write("use Twig\Sandbox\SecurityNotAllowedFilterError;\n") + ->write("use Twig\Sandbox\SecurityNotAllowedFunctionError;\n") + ->write("use Twig\Source;\n") + ->write("use Twig\Template;\n\n") + ; + } + $compiler + // if the template name contains */, add a blank to avoid a PHP parse error + ->write('/* '.str_replace('*/', '* /', $this->getSourceContext()->getName())." */\n") + ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getSourceContext()->getName(), $this->getAttribute('index'))) + ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass(false))) + ->write("{\n") + ->indent() + ->write("private \$source;\n") + ->write("private \$macros = [];\n\n") + ; + } + + protected function compileConstructor(Compiler $compiler) + { + $compiler + ->write("public function __construct(Environment \$env)\n", "{\n") + ->indent() + ->subcompile($this->getNode('constructor_start')) + ->write("parent::__construct(\$env);\n\n") + ->write("\$this->source = \$this->getSourceContext();\n\n") + ; + + // parent + if (!$this->hasNode('parent')) { + $compiler->write("\$this->parent = false;\n\n"); + } + + $countTraits = \count($this->getNode('traits')); + if ($countTraits) { + // traits + foreach ($this->getNode('traits') as $i => $trait) { + $node = $trait->getNode('template'); + + $compiler + ->addDebugInfo($node) + ->write(sprintf('$_trait_%s = $this->loadTemplate(', $i)) + ->subcompile($node) + ->raw(', ') + ->repr($node->getTemplateName()) + ->raw(', ') + ->repr($node->getTemplateLine()) + ->raw(");\n") + ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i)) + ->indent() + ->write("throw new RuntimeError('Template \"'.") + ->subcompile($trait->getNode('template')) + ->raw(".'\" cannot be used as a trait.', ") + ->repr($node->getTemplateLine()) + ->raw(", \$this->source);\n") + ->outdent() + ->write("}\n") + ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i)) + ; + + foreach ($trait->getNode('targets') as $key => $value) { + $compiler + ->write(sprintf('if (!isset($_trait_%s_blocks[', $i)) + ->string($key) + ->raw("])) {\n") + ->indent() + ->write("throw new RuntimeError('Block ") + ->string($key) + ->raw(' is not defined in trait ') + ->subcompile($trait->getNode('template')) + ->raw(".', ") + ->repr($node->getTemplateLine()) + ->raw(", \$this->source);\n") + ->outdent() + ->write("}\n\n") + + ->write(sprintf('$_trait_%s_blocks[', $i)) + ->subcompile($value) + ->raw(sprintf('] = $_trait_%s_blocks[', $i)) + ->string($key) + ->raw(sprintf(']; unset($_trait_%s_blocks[', $i)) + ->string($key) + ->raw("]);\n\n") + ; + } + } + + if ($countTraits > 1) { + $compiler + ->write("\$this->traits = array_merge(\n") + ->indent() + ; + + for ($i = 0; $i < $countTraits; ++$i) { + $compiler + ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i)) + ; + } + + $compiler + ->outdent() + ->write(");\n\n") + ; + } else { + $compiler + ->write("\$this->traits = \$_trait_0_blocks;\n\n") + ; + } + + $compiler + ->write("\$this->blocks = array_merge(\n") + ->indent() + ->write("\$this->traits,\n") + ->write("[\n") + ; + } else { + $compiler + ->write("\$this->blocks = [\n") + ; + } + + // blocks + $compiler + ->indent() + ; + + foreach ($this->getNode('blocks') as $name => $node) { + $compiler + ->write(sprintf("'%s' => [\$this, 'block_%s'],\n", $name, $name)) + ; + } + + if ($countTraits) { + $compiler + ->outdent() + ->write("]\n") + ->outdent() + ->write(");\n") + ; + } else { + $compiler + ->outdent() + ->write("];\n") + ; + } + + $compiler + ->subcompile($this->getNode('constructor_end')) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileDisplay(Compiler $compiler) + { + $compiler + ->write("protected function doDisplay(array \$context, array \$blocks = [])\n", "{\n") + ->indent() + ->write("\$macros = \$this->macros;\n") + ->subcompile($this->getNode('display_start')) + ->subcompile($this->getNode('body')) + ; + + if ($this->hasNode('parent')) { + $parent = $this->getNode('parent'); + + $compiler->addDebugInfo($parent); + if ($parent instanceof ConstantExpression) { + $compiler + ->write('$this->parent = $this->loadTemplate(') + ->subcompile($parent) + ->raw(', ') + ->repr($this->getSourceContext()->getName()) + ->raw(', ') + ->repr($parent->getTemplateLine()) + ->raw(");\n") + ; + $compiler->write('$this->parent'); + } else { + $compiler->write('$this->getParent($context)'); + } + $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n"); + } + + $compiler + ->subcompile($this->getNode('display_end')) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileClassFooter(Compiler $compiler) + { + $compiler + ->subcompile($this->getNode('class_end')) + ->outdent() + ->write("}\n") + ; + } + + protected function compileMacros(Compiler $compiler) + { + $compiler->subcompile($this->getNode('macros')); + } + + protected function compileGetTemplateName(Compiler $compiler) + { + $compiler + ->write("public function getTemplateName()\n", "{\n") + ->indent() + ->write('return ') + ->repr($this->getSourceContext()->getName()) + ->raw(";\n") + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileIsTraitable(Compiler $compiler) + { + // A template can be used as a trait if: + // * it has no parent + // * it has no macros + // * it has no body + // + // Put another way, a template can be used as a trait if it + // only contains blocks and use statements. + $traitable = !$this->hasNode('parent') && 0 === \count($this->getNode('macros')); + if ($traitable) { + if ($this->getNode('body') instanceof BodyNode) { + $nodes = $this->getNode('body')->getNode(0); + } else { + $nodes = $this->getNode('body'); + } + + if (!\count($nodes)) { + $nodes = new Node([$nodes]); + } + + foreach ($nodes as $node) { + if (!\count($node)) { + continue; + } + + if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) { + continue; + } + + if ($node instanceof BlockReferenceNode) { + continue; + } + + $traitable = false; + break; + } + } + + if ($traitable) { + return; + } + + $compiler + ->write("public function isTraitable()\n", "{\n") + ->indent() + ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false')) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileDebugInfo(Compiler $compiler) + { + $compiler + ->write("public function getDebugInfo()\n", "{\n") + ->indent() + ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true)))) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileGetSourceContext(Compiler $compiler) + { + $compiler + ->write("public function getSourceContext()\n", "{\n") + ->indent() + ->write('return new Source(') + ->string($compiler->getEnvironment()->isDebug() ? $this->getSourceContext()->getCode() : '') + ->raw(', ') + ->string($this->getSourceContext()->getName()) + ->raw(', ') + ->string($this->getSourceContext()->getPath()) + ->raw(");\n") + ->outdent() + ->write("}\n") + ; + } + + protected function compileLoadTemplate(Compiler $compiler, $node, $var) + { + if ($node instanceof ConstantExpression) { + $compiler + ->write(sprintf('%s = $this->loadTemplate(', $var)) + ->subcompile($node) + ->raw(', ') + ->repr($node->getTemplateName()) + ->raw(', ') + ->repr($node->getTemplateLine()) + ->raw(");\n") + ; + } else { + throw new \LogicException('Trait templates can only be constant nodes.'); + } + } +} + +class_alias('Twig\Node\ModuleNode', 'Twig_Node_Module'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/Node.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Node.php new file mode 100644 index 0000000..909a687 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/Node.php @@ -0,0 +1,211 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Source; + +/** + * Represents a node in the AST. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Node implements \Countable, \IteratorAggregate +{ + protected $nodes; + protected $attributes; + protected $lineno; + protected $tag; + + private $name; + private $sourceContext; + + /** + * @param array $nodes An array of named nodes + * @param array $attributes An array of attributes (should not be nodes) + * @param int $lineno The line number + * @param string $tag The tag name associated with the Node + */ + public function __construct(array $nodes = [], array $attributes = [], int $lineno = 0, string $tag = null) + { + foreach ($nodes as $name => $node) { + if (!$node instanceof self) { + throw new \InvalidArgumentException(sprintf('Using "%s" for the value of node "%s" of "%s" is not supported. You must pass a \Twig\Node\Node instance.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this))); + } + } + $this->nodes = $nodes; + $this->attributes = $attributes; + $this->lineno = $lineno; + $this->tag = $tag; + } + + public function __toString() + { + $attributes = []; + foreach ($this->attributes as $name => $value) { + $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true))); + } + + $repr = [\get_class($this).'('.implode(', ', $attributes)]; + + if (\count($this->nodes)) { + foreach ($this->nodes as $name => $node) { + $len = \strlen($name) + 4; + $noderepr = []; + foreach (explode("\n", (string) $node) as $line) { + $noderepr[] = str_repeat(' ', $len).$line; + } + + $repr[] = sprintf(' %s: %s', $name, ltrim(implode("\n", $noderepr))); + } + + $repr[] = ')'; + } else { + $repr[0] .= ')'; + } + + return implode("\n", $repr); + } + + public function compile(Compiler $compiler) + { + foreach ($this->nodes as $node) { + $node->compile($compiler); + } + } + + public function getTemplateLine() + { + return $this->lineno; + } + + public function getNodeTag() + { + return $this->tag; + } + + /** + * @return bool + */ + public function hasAttribute($name) + { + return \array_key_exists($name, $this->attributes); + } + + /** + * @return mixed + */ + public function getAttribute($name) + { + if (!\array_key_exists($name, $this->attributes)) { + throw new \LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, \get_class($this))); + } + + return $this->attributes[$name]; + } + + /** + * @param string $name + * @param mixed $value + */ + public function setAttribute($name, $value) + { + $this->attributes[$name] = $value; + } + + public function removeAttribute($name) + { + unset($this->attributes[$name]); + } + + /** + * @return bool + */ + public function hasNode($name) + { + return isset($this->nodes[$name]); + } + + /** + * @return Node + */ + public function getNode($name) + { + if (!isset($this->nodes[$name])) { + throw new \LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, \get_class($this))); + } + + return $this->nodes[$name]; + } + + public function setNode($name, self $node) + { + $this->nodes[$name] = $node; + } + + public function removeNode($name) + { + unset($this->nodes[$name]); + } + + public function count() + { + return \count($this->nodes); + } + + public function getIterator() + { + return new \ArrayIterator($this->nodes); + } + + /** + * @deprecated since 2.8 (to be removed in 3.0) + */ + public function setTemplateName($name/*, $triggerDeprecation = true */) + { + $triggerDeprecation = 2 > \func_num_args() || \func_get_arg(1); + if ($triggerDeprecation) { + @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use setSourceContext() instead.', E_USER_DEPRECATED); + } + + $this->name = $name; + foreach ($this->nodes as $node) { + $node->setTemplateName($name, $triggerDeprecation); + } + } + + public function getTemplateName() + { + return $this->sourceContext ? $this->sourceContext->getName() : null; + } + + public function setSourceContext(Source $source) + { + $this->sourceContext = $source; + foreach ($this->nodes as $node) { + $node->setSourceContext($source); + } + + $this->setTemplateName($source->getName(), false); + } + + public function getSourceContext() + { + return $this->sourceContext; + } +} + +class_alias('Twig\Node\Node', 'Twig_Node'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Compiler'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeCaptureInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeCaptureInterface.php new file mode 100644 index 0000000..474003f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeCaptureInterface.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +/** + * Represents a node that captures any nested displayable nodes. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface NodeCaptureInterface +{ +} + +class_alias('Twig\Node\NodeCaptureInterface', 'Twig_NodeCaptureInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeOutputInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeOutputInterface.php new file mode 100644 index 0000000..8b046ee --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/NodeOutputInterface.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +/** + * Represents a displayable node in the AST. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface NodeOutputInterface +{ +} + +class_alias('Twig\Node\NodeOutputInterface', 'Twig_NodeOutputInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/PrintNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/PrintNode.php new file mode 100644 index 0000000..fcc086a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/PrintNode.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\AbstractExpression; + +/** + * Represents a node that outputs an expression. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class PrintNode extends Node implements NodeOutputInterface +{ + public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + { + parent::__construct(['expr' => $expr], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo ') + ->subcompile($this->getNode('expr')) + ->raw(";\n") + ; + } +} + +class_alias('Twig\Node\PrintNode', 'Twig_Node_Print'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxNode.php new file mode 100644 index 0000000..fe59313 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxNode.php @@ -0,0 +1,47 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a sandbox node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SandboxNode extends Node +{ + public function __construct(Node $body, int $lineno, string $tag = null) + { + parent::__construct(['body' => $body], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("if (!\$alreadySandboxed = \$this->sandbox->isSandboxed()) {\n") + ->indent() + ->write("\$this->sandbox->enableSandbox();\n") + ->outdent() + ->write("}\n") + ->subcompile($this->getNode('body')) + ->write("if (!\$alreadySandboxed) {\n") + ->indent() + ->write("\$this->sandbox->disableSandbox();\n") + ->outdent() + ->write("}\n") + ; + } +} + +class_alias('Twig\Node\SandboxNode', 'Twig_Node_Sandbox'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxedPrintNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxedPrintNode.php new file mode 100644 index 0000000..54e92e6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SandboxedPrintNode.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\ConstantExpression; + +/** + * Adds a check for the __toString() method when the variable is an object and the sandbox is activated. + * + * When there is a simple Print statement, like {{ article }}, + * and if the sandbox is enabled, we need to check that the __toString() + * method is allowed if 'article' is an object. + * + * Not used anymore, to be deprecated in 2.x and removed in 3.0 + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SandboxedPrintNode extends PrintNode +{ + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo ') + ; + $expr = $this->getNode('expr'); + if ($expr instanceof ConstantExpression) { + $compiler + ->subcompile($expr) + ->raw(";\n") + ; + } else { + $compiler + ->write('$this->extensions[SandboxExtension::class]->ensureToStringAllowed(') + ->subcompile($expr) + ->raw(', ') + ->repr($expr->getTemplateLine()) + ->raw(", \$this->source);\n") + ; + } + } +} + +class_alias('Twig\Node\SandboxedPrintNode', 'Twig_Node_SandboxedPrint'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/SetNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SetNode.php new file mode 100644 index 0000000..3cf4615 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SetNode.php @@ -0,0 +1,107 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; +use Twig\Node\Expression\ConstantExpression; + +/** + * Represents a set node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SetNode extends Node implements NodeCaptureInterface +{ + public function __construct(bool $capture, Node $names, Node $values, int $lineno, string $tag = null) + { + parent::__construct(['names' => $names, 'values' => $values], ['capture' => $capture, 'safe' => false], $lineno, $tag); + + /* + * Optimizes the node when capture is used for a large block of text. + * + * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig\Markup("foo"); + */ + if ($this->getAttribute('capture')) { + $this->setAttribute('safe', true); + + $values = $this->getNode('values'); + if ($values instanceof TextNode) { + $this->setNode('values', new ConstantExpression($values->getAttribute('data'), $values->getTemplateLine())); + $this->setAttribute('capture', false); + } + } + } + + public function compile(Compiler $compiler) + { + $compiler->addDebugInfo($this); + + if (\count($this->getNode('names')) > 1) { + $compiler->write('list('); + foreach ($this->getNode('names') as $idx => $node) { + if ($idx) { + $compiler->raw(', '); + } + + $compiler->subcompile($node); + } + $compiler->raw(')'); + } else { + if ($this->getAttribute('capture')) { + if ($compiler->getEnvironment()->isDebug()) { + $compiler->write("ob_start();\n"); + } else { + $compiler->write("ob_start(function () { return ''; });\n"); + } + $compiler + ->subcompile($this->getNode('values')) + ; + } + + $compiler->subcompile($this->getNode('names'), false); + + if ($this->getAttribute('capture')) { + $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Markup(\$tmp, \$this->env->getCharset())"); + } + } + + if (!$this->getAttribute('capture')) { + $compiler->raw(' = '); + + if (\count($this->getNode('names')) > 1) { + $compiler->write('['); + foreach ($this->getNode('values') as $idx => $value) { + if ($idx) { + $compiler->raw(', '); + } + + $compiler->subcompile($value); + } + $compiler->raw(']'); + } else { + if ($this->getAttribute('safe')) { + $compiler + ->raw("('' === \$tmp = ") + ->subcompile($this->getNode('values')) + ->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset())") + ; + } else { + $compiler->subcompile($this->getNode('values')); + } + } + } + + $compiler->raw(";\n"); + } +} + +class_alias('Twig\Node\SetNode', 'Twig_Node_Set'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/SpacelessNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SpacelessNode.php new file mode 100644 index 0000000..8fc4a2d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/SpacelessNode.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a spaceless node. + * + * It removes spaces between HTML tags. + * + * @deprecated since Twig 2.7, to be removed in 3.0 + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SpacelessNode extends Node implements NodeOutputInterface +{ + public function __construct(Node $body, int $lineno, string $tag = 'spaceless') + { + parent::__construct(['body' => $body], [], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ; + if ($compiler->getEnvironment()->isDebug()) { + $compiler->write("ob_start();\n"); + } else { + $compiler->write("ob_start(function () { return ''; });\n"); + } + $compiler + ->subcompile($this->getNode('body')) + ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n") + ; + } +} + +class_alias('Twig\Node\SpacelessNode', 'Twig_Node_Spaceless'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/TextNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/TextNode.php new file mode 100644 index 0000000..85640a5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/TextNode.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a text node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class TextNode extends Node implements NodeOutputInterface +{ + public function __construct(string $data, int $lineno) + { + parent::__construct([], ['data' => $data], $lineno); + } + + public function compile(Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo ') + ->string($this->getAttribute('data')) + ->raw(";\n") + ; + } +} + +class_alias('Twig\Node\TextNode', 'Twig_Node_Text'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Node/WithNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Node/WithNode.php new file mode 100644 index 0000000..74d1ea0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Node/WithNode.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Node; + +use Twig\Compiler; + +/** + * Represents a nested "with" scope. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class WithNode extends Node +{ + public function __construct(Node $body, Node $variables = null, bool $only = false, int $lineno, string $tag = null) + { + $nodes = ['body' => $body]; + if (null !== $variables) { + $nodes['variables'] = $variables; + } + + parent::__construct($nodes, ['only' => $only], $lineno, $tag); + } + + public function compile(Compiler $compiler) + { + $compiler->addDebugInfo($this); + + if ($this->hasNode('variables')) { + $node = $this->getNode('variables'); + $varsName = $compiler->getVarName(); + $compiler + ->write(sprintf('$%s = ', $varsName)) + ->subcompile($node) + ->raw(";\n") + ->write(sprintf("if (!twig_test_iterable(\$%s)) {\n", $varsName)) + ->indent() + ->write("throw new RuntimeError('Variables passed to the \"with\" tag must be a hash.', ") + ->repr($node->getTemplateLine()) + ->raw(", \$this->getSourceContext());\n") + ->outdent() + ->write("}\n") + ->write(sprintf("\$%s = twig_to_array(\$%s);\n", $varsName, $varsName)) + ; + + if ($this->getAttribute('only')) { + $compiler->write("\$context = ['_parent' => \$context];\n"); + } else { + $compiler->write("\$context['_parent'] = \$context;\n"); + } + + $compiler->write(sprintf("\$context = \$this->env->mergeGlobals(array_merge(\$context, \$%s));\n", $varsName)); + } else { + $compiler->write("\$context['_parent'] = \$context;\n"); + } + + $compiler + ->subcompile($this->getNode('body')) + ->write("\$context = \$context['_parent'];\n") + ; + } +} + +class_alias('Twig\Node\WithNode', 'Twig_Node_With'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeTraverser.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeTraverser.php new file mode 100644 index 0000000..625b049 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeTraverser.php @@ -0,0 +1,85 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Node\Node; +use Twig\NodeVisitor\NodeVisitorInterface; + +/** + * A node traverser. + * + * It visits all nodes and their children and calls the given visitor for each. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class NodeTraverser +{ + private $env; + private $visitors = []; + + /** + * @param NodeVisitorInterface[] $visitors + */ + public function __construct(Environment $env, array $visitors = []) + { + $this->env = $env; + foreach ($visitors as $visitor) { + $this->addVisitor($visitor); + } + } + + public function addVisitor(NodeVisitorInterface $visitor) + { + $this->visitors[$visitor->getPriority()][] = $visitor; + } + + /** + * Traverses a node and calls the registered visitors. + */ + public function traverse(Node $node): Node + { + ksort($this->visitors); + foreach ($this->visitors as $visitors) { + foreach ($visitors as $visitor) { + $node = $this->traverseForVisitor($visitor, $node); + } + } + + return $node; + } + + /** + * @return Node|null + */ + private function traverseForVisitor(NodeVisitorInterface $visitor, Node $node) + { + $node = $visitor->enterNode($node, $this->env); + + foreach ($node as $k => $n) { + if (false !== ($m = $this->traverseForVisitor($visitor, $n)) && null !== $m) { + if ($m !== $n) { + $node->setNode($k, $m); + } + } else { + if (false === $m) { + @trigger_error('Returning "false" to remove a Node from NodeVisitorInterface::leaveNode() is deprecated since Twig version 2.9; return "null" instead.', E_USER_DEPRECATED); + } + + $node->removeNode($k); + } + } + + return $visitor->leaveNode($node, $this->env); + } +} + +class_alias('Twig\NodeTraverser', 'Twig_NodeTraverser'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php new file mode 100644 index 0000000..9c6cb12 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\Node; + +/** + * Used to make node visitors compatible with Twig 1.x and 2.x. + * + * To be removed in Twig 3.1. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +abstract class AbstractNodeVisitor implements NodeVisitorInterface +{ + final public function enterNode(Node $node, Environment $env) + { + return $this->doEnterNode($node, $env); + } + + final public function leaveNode(Node $node, Environment $env) + { + return $this->doLeaveNode($node, $env); + } + + /** + * Called before child nodes are visited. + * + * @return Node The modified node + */ + abstract protected function doEnterNode(Node $node, Environment $env); + + /** + * Called after child nodes are visited. + * + * @return Node|null The modified node or null if the node must be removed + */ + abstract protected function doLeaveNode(Node $node, Environment $env); +} + +class_alias('Twig\NodeVisitor\AbstractNodeVisitor', 'Twig_BaseNodeVisitor'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php new file mode 100644 index 0000000..bfbfdc9 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php @@ -0,0 +1,208 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Extension\EscaperExtension; +use Twig\Node\AutoEscapeNode; +use Twig\Node\BlockNode; +use Twig\Node\BlockReferenceNode; +use Twig\Node\DoNode; +use Twig\Node\Expression\ConditionalExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Expression\InlinePrint; +use Twig\Node\ImportNode; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\Node\PrintNode; +use Twig\NodeTraverser; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class EscaperNodeVisitor extends AbstractNodeVisitor +{ + private $statusStack = []; + private $blocks = []; + private $safeAnalysis; + private $traverser; + private $defaultStrategy = false; + private $safeVars = []; + + public function __construct() + { + $this->safeAnalysis = new SafeAnalysisNodeVisitor(); + } + + protected function doEnterNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + if ($env->hasExtension(EscaperExtension::class) && $defaultStrategy = $env->getExtension(EscaperExtension::class)->getDefaultStrategy($node->getTemplateName())) { + $this->defaultStrategy = $defaultStrategy; + } + $this->safeVars = []; + $this->blocks = []; + } elseif ($node instanceof AutoEscapeNode) { + $this->statusStack[] = $node->getAttribute('value'); + } elseif ($node instanceof BlockNode) { + $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env); + } elseif ($node instanceof ImportNode) { + $this->safeVars[] = $node->getNode('var')->getAttribute('name'); + } + + return $node; + } + + protected function doLeaveNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $this->defaultStrategy = false; + $this->safeVars = []; + $this->blocks = []; + } elseif ($node instanceof FilterExpression) { + return $this->preEscapeFilterNode($node, $env); + } elseif ($node instanceof PrintNode && false !== $type = $this->needEscaping($env)) { + $expression = $node->getNode('expr'); + if ($expression instanceof ConditionalExpression && $this->shouldUnwrapConditional($expression, $env, $type)) { + return new DoNode($this->unwrapConditional($expression, $env, $type), $expression->getTemplateLine()); + } + + return $this->escapePrintNode($node, $env, $type); + } + + if ($node instanceof AutoEscapeNode || $node instanceof BlockNode) { + array_pop($this->statusStack); + } elseif ($node instanceof BlockReferenceNode) { + $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env); + } + + return $node; + } + + private function shouldUnwrapConditional(ConditionalExpression $expression, Environment $env, $type) + { + $expr2Safe = $this->isSafeFor($type, $expression->getNode('expr2'), $env); + $expr3Safe = $this->isSafeFor($type, $expression->getNode('expr3'), $env); + + return $expr2Safe !== $expr3Safe; + } + + private function unwrapConditional(ConditionalExpression $expression, Environment $env, $type) + { + // convert "echo a ? b : c" to "a ? echo b : echo c" recursively + $expr2 = $expression->getNode('expr2'); + if ($expr2 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr2, $env, $type)) { + $expr2 = $this->unwrapConditional($expr2, $env, $type); + } else { + $expr2 = $this->escapeInlinePrintNode(new InlinePrint($expr2, $expr2->getTemplateLine()), $env, $type); + } + $expr3 = $expression->getNode('expr3'); + if ($expr3 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr3, $env, $type)) { + $expr3 = $this->unwrapConditional($expr3, $env, $type); + } else { + $expr3 = $this->escapeInlinePrintNode(new InlinePrint($expr3, $expr3->getTemplateLine()), $env, $type); + } + + return new ConditionalExpression($expression->getNode('expr1'), $expr2, $expr3, $expression->getTemplateLine()); + } + + private function escapeInlinePrintNode(InlinePrint $node, Environment $env, $type) + { + $expression = $node->getNode('node'); + + if ($this->isSafeFor($type, $expression, $env)) { + return $node; + } + + return new InlinePrint($this->getEscaperFilter($type, $expression), $node->getTemplateLine()); + } + + private function escapePrintNode(PrintNode $node, Environment $env, $type) + { + if (false === $type) { + return $node; + } + + $expression = $node->getNode('expr'); + + if ($this->isSafeFor($type, $expression, $env)) { + return $node; + } + + $class = \get_class($node); + + return new $class($this->getEscaperFilter($type, $expression), $node->getTemplateLine()); + } + + private function preEscapeFilterNode(FilterExpression $filter, Environment $env) + { + $name = $filter->getNode('filter')->getAttribute('value'); + + $type = $env->getFilter($name)->getPreEscape(); + if (null === $type) { + return $filter; + } + + $node = $filter->getNode('node'); + if ($this->isSafeFor($type, $node, $env)) { + return $filter; + } + + $filter->setNode('node', $this->getEscaperFilter($type, $node)); + + return $filter; + } + + private function isSafeFor($type, Node $expression, $env) + { + $safe = $this->safeAnalysis->getSafe($expression); + + if (null === $safe) { + if (null === $this->traverser) { + $this->traverser = new NodeTraverser($env, [$this->safeAnalysis]); + } + + $this->safeAnalysis->setSafeVars($this->safeVars); + + $this->traverser->traverse($expression); + $safe = $this->safeAnalysis->getSafe($expression); + } + + return \in_array($type, $safe) || \in_array('all', $safe); + } + + private function needEscaping(Environment $env) + { + if (\count($this->statusStack)) { + return $this->statusStack[\count($this->statusStack) - 1]; + } + + return $this->defaultStrategy ? $this->defaultStrategy : false; + } + + private function getEscaperFilter(string $type, Node $node): FilterExpression + { + $line = $node->getTemplateLine(); + $name = new ConstantExpression('escape', $line); + $args = new Node([new ConstantExpression((string) $type, $line), new ConstantExpression(null, $line), new ConstantExpression(true, $line)]); + + return new FilterExpression($node, $name, $args, $line); + } + + public function getPriority() + { + return 0; + } +} + +class_alias('Twig\NodeVisitor\EscaperNodeVisitor', 'Twig_NodeVisitor_Escaper'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php new file mode 100644 index 0000000..f41d463 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\Expression\AssignNameExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\MethodCallExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\ImportNode; +use Twig\Node\ModuleNode; +use Twig\Node\Node; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class MacroAutoImportNodeVisitor implements NodeVisitorInterface +{ + private $inAModule = false; + private $hasMacroCalls = false; + + public function enterNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $this->inAModule = true; + $this->hasMacroCalls = false; + } + + return $node; + } + + public function leaveNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $this->inAModule = false; + if ($this->hasMacroCalls) { + $node->getNode('constructor_end')->setNode('_auto_macro_import', new ImportNode(new NameExpression('_self', 0), new AssignNameExpression('_self', 0), 0, 'import', true)); + } + } elseif ($this->inAModule) { + if ( + $node instanceof GetAttrExpression && + $node->getNode('node') instanceof NameExpression && + '_self' === $node->getNode('node')->getAttribute('name') && + $node->getNode('attribute') instanceof ConstantExpression + ) { + $this->hasMacroCalls = true; + + $name = $node->getNode('attribute')->getAttribute('value'); + $node = new MethodCallExpression($node->getNode('node'), 'macro_'.$name, $node->getNode('arguments'), $node->getTemplateLine()); + $node->setAttribute('safe', true); + } + } + + return $node; + } + + public function getPriority() + { + // we must be ran before auto-escaping + return -10; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php new file mode 100644 index 0000000..e0ffae2 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\Node; + +/** + * Interface for node visitor classes. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface NodeVisitorInterface +{ + /** + * Called before child nodes are visited. + * + * @return Node The modified node + */ + public function enterNode(Node $node, Environment $env); + + /** + * Called after child nodes are visited. + * + * @return Node|null The modified node or null if the node must be removed + */ + public function leaveNode(Node $node, Environment $env); + + /** + * Returns the priority for this visitor. + * + * Priority should be between -10 and 10 (0 is the default). + * + * @return int The priority level + */ + public function getPriority(); +} + +class_alias('Twig\NodeVisitor\NodeVisitorInterface', 'Twig_NodeVisitorInterface'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Environment'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php new file mode 100644 index 0000000..9f7cae4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php @@ -0,0 +1,219 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\BlockReferenceNode; +use Twig\Node\Expression\BlockReferenceExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Expression\FunctionExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\ParentExpression; +use Twig\Node\ForNode; +use Twig\Node\IncludeNode; +use Twig\Node\Node; +use Twig\Node\PrintNode; + +/** + * Tries to optimize the AST. + * + * This visitor is always the last registered one. + * + * You can configure which optimizations you want to activate via the + * optimizer mode. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class OptimizerNodeVisitor extends AbstractNodeVisitor +{ + const OPTIMIZE_ALL = -1; + const OPTIMIZE_NONE = 0; + const OPTIMIZE_FOR = 2; + const OPTIMIZE_RAW_FILTER = 4; + // obsolete, does not do anything + const OPTIMIZE_VAR_ACCESS = 8; + + private $loops = []; + private $loopsTargets = []; + private $optimizers; + + /** + * @param int $optimizers The optimizer mode + */ + public function __construct(int $optimizers = -1) + { + if (!\is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) { + throw new \InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers)); + } + + $this->optimizers = $optimizers; + } + + protected function doEnterNode(Node $node, Environment $env) + { + if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) { + $this->enterOptimizeFor($node, $env); + } + + return $node; + } + + protected function doLeaveNode(Node $node, Environment $env) + { + if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) { + $this->leaveOptimizeFor($node, $env); + } + + if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) { + $node = $this->optimizeRawFilter($node, $env); + } + + $node = $this->optimizePrintNode($node, $env); + + return $node; + } + + /** + * Optimizes print nodes. + * + * It replaces: + * + * * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()" + */ + private function optimizePrintNode(Node $node, Environment $env): Node + { + if (!$node instanceof PrintNode) { + return $node; + } + + $exprNode = $node->getNode('expr'); + if ( + $exprNode instanceof BlockReferenceExpression || + $exprNode instanceof ParentExpression + ) { + $exprNode->setAttribute('output', true); + + return $exprNode; + } + + return $node; + } + + /** + * Removes "raw" filters. + */ + private function optimizeRawFilter(Node $node, Environment $env): Node + { + if ($node instanceof FilterExpression && 'raw' == $node->getNode('filter')->getAttribute('value')) { + return $node->getNode('node'); + } + + return $node; + } + + /** + * Optimizes "for" tag by removing the "loop" variable creation whenever possible. + */ + private function enterOptimizeFor(Node $node, Environment $env) + { + if ($node instanceof ForNode) { + // disable the loop variable by default + $node->setAttribute('with_loop', false); + array_unshift($this->loops, $node); + array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name')); + array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name')); + } elseif (!$this->loops) { + // we are outside a loop + return; + } + + // when do we need to add the loop variable back? + + // the loop variable is referenced for the current loop + elseif ($node instanceof NameExpression && 'loop' === $node->getAttribute('name')) { + $node->setAttribute('always_defined', true); + $this->addLoopToCurrent(); + } + + // optimize access to loop targets + elseif ($node instanceof NameExpression && \in_array($node->getAttribute('name'), $this->loopsTargets)) { + $node->setAttribute('always_defined', true); + } + + // block reference + elseif ($node instanceof BlockReferenceNode || $node instanceof BlockReferenceExpression) { + $this->addLoopToCurrent(); + } + + // include without the only attribute + elseif ($node instanceof IncludeNode && !$node->getAttribute('only')) { + $this->addLoopToAll(); + } + + // include function without the with_context=false parameter + elseif ($node instanceof FunctionExpression + && 'include' === $node->getAttribute('name') + && (!$node->getNode('arguments')->hasNode('with_context') + || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value') + ) + ) { + $this->addLoopToAll(); + } + + // the loop variable is referenced via an attribute + elseif ($node instanceof GetAttrExpression + && (!$node->getNode('attribute') instanceof ConstantExpression + || 'parent' === $node->getNode('attribute')->getAttribute('value') + ) + && (true === $this->loops[0]->getAttribute('with_loop') + || ($node->getNode('node') instanceof NameExpression + && 'loop' === $node->getNode('node')->getAttribute('name') + ) + ) + ) { + $this->addLoopToAll(); + } + } + + /** + * Optimizes "for" tag by removing the "loop" variable creation whenever possible. + */ + private function leaveOptimizeFor(Node $node, Environment $env) + { + if ($node instanceof ForNode) { + array_shift($this->loops); + array_shift($this->loopsTargets); + array_shift($this->loopsTargets); + } + } + + private function addLoopToCurrent() + { + $this->loops[0]->setAttribute('with_loop', true); + } + + private function addLoopToAll() + { + foreach ($this->loops as $loop) { + $loop->setAttribute('with_loop', true); + } + } + + public function getPriority() + { + return 255; + } +} + +class_alias('Twig\NodeVisitor\OptimizerNodeVisitor', 'Twig_NodeVisitor_Optimizer'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php new file mode 100644 index 0000000..02a2af4 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php @@ -0,0 +1,160 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\Expression\BlockReferenceExpression; +use Twig\Node\Expression\ConditionalExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Expression\FunctionExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\MethodCallExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\ParentExpression; +use Twig\Node\Node; + +final class SafeAnalysisNodeVisitor extends AbstractNodeVisitor +{ + private $data = []; + private $safeVars = []; + + public function setSafeVars($safeVars) + { + $this->safeVars = $safeVars; + } + + public function getSafe(Node $node) + { + $hash = spl_object_hash($node); + if (!isset($this->data[$hash])) { + return; + } + + foreach ($this->data[$hash] as $bucket) { + if ($bucket['key'] !== $node) { + continue; + } + + if (\in_array('html_attr', $bucket['value'])) { + $bucket['value'][] = 'html'; + } + + return $bucket['value']; + } + } + + private function setSafe(Node $node, array $safe) + { + $hash = spl_object_hash($node); + if (isset($this->data[$hash])) { + foreach ($this->data[$hash] as &$bucket) { + if ($bucket['key'] === $node) { + $bucket['value'] = $safe; + + return; + } + } + } + $this->data[$hash][] = [ + 'key' => $node, + 'value' => $safe, + ]; + } + + protected function doEnterNode(Node $node, Environment $env) + { + return $node; + } + + protected function doLeaveNode(Node $node, Environment $env) + { + if ($node instanceof ConstantExpression) { + // constants are marked safe for all + $this->setSafe($node, ['all']); + } elseif ($node instanceof BlockReferenceExpression) { + // blocks are safe by definition + $this->setSafe($node, ['all']); + } elseif ($node instanceof ParentExpression) { + // parent block is safe by definition + $this->setSafe($node, ['all']); + } elseif ($node instanceof ConditionalExpression) { + // intersect safeness of both operands + $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3'))); + $this->setSafe($node, $safe); + } elseif ($node instanceof FilterExpression) { + // filter expression is safe when the filter is safe + $name = $node->getNode('filter')->getAttribute('value'); + $args = $node->getNode('arguments'); + if (false !== $filter = $env->getFilter($name)) { + $safe = $filter->getSafe($args); + if (null === $safe) { + $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety()); + } + $this->setSafe($node, $safe); + } else { + $this->setSafe($node, []); + } + } elseif ($node instanceof FunctionExpression) { + // function expression is safe when the function is safe + $name = $node->getAttribute('name'); + $args = $node->getNode('arguments'); + $function = $env->getFunction($name); + if (false !== $function) { + $this->setSafe($node, $function->getSafe($args)); + } else { + $this->setSafe($node, []); + } + } elseif ($node instanceof MethodCallExpression) { + if ($node->getAttribute('safe')) { + $this->setSafe($node, ['all']); + } else { + $this->setSafe($node, []); + } + } elseif ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression) { + $name = $node->getNode('node')->getAttribute('name'); + if (\in_array($name, $this->safeVars)) { + $this->setSafe($node, ['all']); + } else { + $this->setSafe($node, []); + } + } else { + $this->setSafe($node, []); + } + + return $node; + } + + private function intersectSafe(array $a = null, array $b = null): array + { + if (null === $a || null === $b) { + return []; + } + + if (\in_array('all', $a)) { + return $b; + } + + if (\in_array('all', $b)) { + return $a; + } + + return array_intersect($a, $b); + } + + public function getPriority() + { + return 0; + } +} + +class_alias('Twig\NodeVisitor\SafeAnalysisNodeVisitor', 'Twig_NodeVisitor_SafeAnalysis'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php new file mode 100644 index 0000000..3e8d0bc --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php @@ -0,0 +1,135 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\NodeVisitor; + +use Twig\Environment; +use Twig\Node\CheckSecurityNode; +use Twig\Node\CheckToStringNode; +use Twig\Node\Expression\Binary\ConcatBinary; +use Twig\Node\Expression\Binary\RangeBinary; +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Expression\FunctionExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\Node\PrintNode; +use Twig\Node\SetNode; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class SandboxNodeVisitor extends AbstractNodeVisitor +{ + private $inAModule = false; + private $tags; + private $filters; + private $functions; + + private $needsToStringWrap = false; + + protected function doEnterNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $this->inAModule = true; + $this->tags = []; + $this->filters = []; + $this->functions = []; + + return $node; + } elseif ($this->inAModule) { + // look for tags + if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) { + $this->tags[$node->getNodeTag()] = $node; + } + + // look for filters + if ($node instanceof FilterExpression && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) { + $this->filters[$node->getNode('filter')->getAttribute('value')] = $node; + } + + // look for functions + if ($node instanceof FunctionExpression && !isset($this->functions[$node->getAttribute('name')])) { + $this->functions[$node->getAttribute('name')] = $node; + } + + // the .. operator is equivalent to the range() function + if ($node instanceof RangeBinary && !isset($this->functions['range'])) { + $this->functions['range'] = $node; + } + + if ($node instanceof PrintNode) { + $this->needsToStringWrap = true; + $this->wrapNode($node, 'expr'); + } + + if ($node instanceof SetNode && !$node->getAttribute('capture')) { + $this->needsToStringWrap = true; + } + + // wrap outer nodes that can implicitly call __toString() + if ($this->needsToStringWrap) { + if ($node instanceof ConcatBinary) { + $this->wrapNode($node, 'left'); + $this->wrapNode($node, 'right'); + } + if ($node instanceof FilterExpression) { + $this->wrapNode($node, 'node'); + $this->wrapArrayNode($node, 'arguments'); + } + if ($node instanceof FunctionExpression) { + $this->wrapArrayNode($node, 'arguments'); + } + } + } + + return $node; + } + + protected function doLeaveNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $this->inAModule = false; + + $node->getNode('constructor_end')->setNode('_security_check', new Node([new CheckSecurityNode($this->filters, $this->tags, $this->functions), $node->getNode('display_start')])); + } elseif ($this->inAModule) { + if ($node instanceof PrintNode || $node instanceof SetNode) { + $this->needsToStringWrap = false; + } + } + + return $node; + } + + private function wrapNode(Node $node, string $name) + { + $expr = $node->getNode($name); + if ($expr instanceof NameExpression || $expr instanceof GetAttrExpression) { + $node->setNode($name, new CheckToStringNode($expr)); + } + } + + private function wrapArrayNode(Node $node, string $name) + { + $args = $node->getNode($name); + foreach ($args as $name => $_) { + $this->wrapNode($args, $name); + } + } + + public function getPriority() + { + return 0; + } +} + +class_alias('Twig\NodeVisitor\SandboxNodeVisitor', 'Twig_NodeVisitor_Sandbox'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Parser.php b/srcs/phpmyadmin/vendor/twig/twig/src/Parser.php new file mode 100644 index 0000000..8a937e3 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Parser.php @@ -0,0 +1,394 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\SyntaxError; +use Twig\Node\BlockNode; +use Twig\Node\BlockReferenceNode; +use Twig\Node\BodyNode; +use Twig\Node\Expression\AbstractExpression; +use Twig\Node\MacroNode; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\Node\NodeCaptureInterface; +use Twig\Node\NodeOutputInterface; +use Twig\Node\PrintNode; +use Twig\Node\SpacelessNode; +use Twig\Node\TextNode; +use Twig\TokenParser\TokenParserInterface; + +/** + * Default parser implementation. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class Parser +{ + private $stack = []; + private $stream; + private $parent; + private $handlers; + private $visitors; + private $expressionParser; + private $blocks; + private $blockStack; + private $macros; + private $env; + private $importedSymbols; + private $traits; + private $embeddedTemplates = []; + private $varNameSalt = 0; + + public function __construct(Environment $env) + { + $this->env = $env; + } + + public function getVarName() + { + return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->stream->getSourceContext()->getCode().$this->varNameSalt++)); + } + + public function parse(TokenStream $stream, $test = null, $dropNeedle = false) + { + $vars = get_object_vars($this); + unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames']); + $this->stack[] = $vars; + + // tag handlers + if (null === $this->handlers) { + $this->handlers = []; + foreach ($this->env->getTokenParsers() as $handler) { + $handler->setParser($this); + + $this->handlers[$handler->getTag()] = $handler; + } + } + + // node visitors + if (null === $this->visitors) { + $this->visitors = $this->env->getNodeVisitors(); + } + + if (null === $this->expressionParser) { + $this->expressionParser = new ExpressionParser($this, $this->env); + } + + $this->stream = $stream; + $this->parent = null; + $this->blocks = []; + $this->macros = []; + $this->traits = []; + $this->blockStack = []; + $this->importedSymbols = [[]]; + $this->embeddedTemplates = []; + $this->varNameSalt = 0; + + try { + $body = $this->subparse($test, $dropNeedle); + + if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) { + $body = new Node(); + } + } catch (SyntaxError $e) { + if (!$e->getSourceContext()) { + $e->setSourceContext($this->stream->getSourceContext()); + } + + if (!$e->getTemplateLine()) { + $e->setTemplateLine($this->stream->getCurrent()->getLine()); + } + + throw $e; + } + + $node = new ModuleNode(new BodyNode([$body]), $this->parent, new Node($this->blocks), new Node($this->macros), new Node($this->traits), $this->embeddedTemplates, $stream->getSourceContext()); + + $traverser = new NodeTraverser($this->env, $this->visitors); + + $node = $traverser->traverse($node); + + // restore previous stack so previous parse() call can resume working + foreach (array_pop($this->stack) as $key => $val) { + $this->$key = $val; + } + + return $node; + } + + public function subparse($test, $dropNeedle = false) + { + $lineno = $this->getCurrentToken()->getLine(); + $rv = []; + while (!$this->stream->isEOF()) { + switch ($this->getCurrentToken()->getType()) { + case /* Token::TEXT_TYPE */ 0: + $token = $this->stream->next(); + $rv[] = new TextNode($token->getValue(), $token->getLine()); + break; + + case /* Token::VAR_START_TYPE */ 2: + $token = $this->stream->next(); + $expr = $this->expressionParser->parseExpression(); + $this->stream->expect(/* Token::VAR_END_TYPE */ 4); + $rv[] = new PrintNode($expr, $token->getLine()); + break; + + case /* Token::BLOCK_START_TYPE */ 1: + $this->stream->next(); + $token = $this->getCurrentToken(); + + if (/* Token::NAME_TYPE */ 5 !== $token->getType()) { + throw new SyntaxError('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext()); + } + + if (null !== $test && $test($token)) { + if ($dropNeedle) { + $this->stream->next(); + } + + if (1 === \count($rv)) { + return $rv[0]; + } + + return new Node($rv, [], $lineno); + } + + if (!isset($this->handlers[$token->getValue()])) { + if (null !== $test) { + $e = new SyntaxError(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream->getSourceContext()); + + if (\is_array($test) && isset($test[0]) && $test[0] instanceof TokenParserInterface) { + $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno)); + } + } else { + $e = new SyntaxError(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream->getSourceContext()); + $e->addSuggestions($token->getValue(), array_keys($this->env->getTags())); + } + + throw $e; + } + + $this->stream->next(); + + $subparser = $this->handlers[$token->getValue()]; + $node = $subparser->parse($token); + if (null !== $node) { + $rv[] = $node; + } + break; + + default: + throw new SyntaxError('Lexer or parser ended up in unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext()); + } + } + + if (1 === \count($rv)) { + return $rv[0]; + } + + return new Node($rv, [], $lineno); + } + + public function getBlockStack() + { + return $this->blockStack; + } + + public function peekBlockStack() + { + return isset($this->blockStack[\count($this->blockStack) - 1]) ? $this->blockStack[\count($this->blockStack) - 1] : null; + } + + public function popBlockStack() + { + array_pop($this->blockStack); + } + + public function pushBlockStack($name) + { + $this->blockStack[] = $name; + } + + public function hasBlock($name) + { + return isset($this->blocks[$name]); + } + + public function getBlock($name) + { + return $this->blocks[$name]; + } + + public function setBlock($name, BlockNode $value) + { + $this->blocks[$name] = new BodyNode([$value], [], $value->getTemplateLine()); + } + + public function hasMacro($name) + { + return isset($this->macros[$name]); + } + + public function setMacro($name, MacroNode $node) + { + $this->macros[$name] = $node; + } + + /** + * @deprecated since Twig 2.7 as there are no reserved macro names anymore, will be removed in 3.0. + */ + public function isReservedMacroName($name) + { + @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.7 and will be removed in 3.0.', __METHOD__), E_USER_DEPRECATED); + + return false; + } + + public function addTrait($trait) + { + $this->traits[] = $trait; + } + + public function hasTraits() + { + return \count($this->traits) > 0; + } + + public function embedTemplate(ModuleNode $template) + { + $template->setIndex(mt_rand()); + + $this->embeddedTemplates[] = $template; + } + + public function addImportedSymbol($type, $alias, $name = null, AbstractExpression $node = null) + { + $this->importedSymbols[0][$type][$alias] = ['name' => $name, 'node' => $node]; + } + + public function getImportedSymbol($type, $alias) + { + // if the symbol does not exist in the current scope (0), try in the main/global scope (last index) + return $this->importedSymbols[0][$type][$alias] ?? ($this->importedSymbols[\count($this->importedSymbols) - 1][$type][$alias] ?? null); + } + + public function isMainScope() + { + return 1 === \count($this->importedSymbols); + } + + public function pushLocalScope() + { + array_unshift($this->importedSymbols, []); + } + + public function popLocalScope() + { + array_shift($this->importedSymbols); + } + + /** + * @return ExpressionParser + */ + public function getExpressionParser() + { + return $this->expressionParser; + } + + public function getParent() + { + return $this->parent; + } + + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * @return TokenStream + */ + public function getStream() + { + return $this->stream; + } + + /** + * @return Token + */ + public function getCurrentToken() + { + return $this->stream->getCurrent(); + } + + private function filterBodyNodes(Node $node, bool $nested = false) + { + // check that the body does not contain non-empty output nodes + if ( + ($node instanceof TextNode && !ctype_space($node->getAttribute('data'))) + || + // the "&& !$node instanceof SpacelessNode" part of the condition must be removed in 3.0 + (!$node instanceof TextNode && !$node instanceof BlockReferenceNode && ($node instanceof NodeOutputInterface && !$node instanceof SpacelessNode)) + ) { + if (false !== strpos((string) $node, \chr(0xEF).\chr(0xBB).\chr(0xBF))) { + $t = substr($node->getAttribute('data'), 3); + if ('' === $t || ctype_space($t)) { + // bypass empty nodes starting with a BOM + return; + } + } + + throw new SyntaxError('A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext()); + } + + // bypass nodes that "capture" the output + if ($node instanceof NodeCaptureInterface) { + // a "block" tag in such a node will serve as a block definition AND be displayed in place as well + return $node; + } + + // to be removed completely in Twig 3.0 + if (!$nested && $node instanceof SpacelessNode) { + @trigger_error(sprintf('Using the spaceless tag at the root level of a child template in "%s" at line %d is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.', $this->stream->getSourceContext()->getName(), $node->getTemplateLine()), E_USER_DEPRECATED); + } + + // "block" tags that are not captured (see above) are only used for defining + // the content of the block. In such a case, nesting it does not work as + // expected as the definition is not part of the default template code flow. + if ($nested && ($node instanceof BlockReferenceNode || $node instanceof \Twig_Node_BlockReference)) { + //throw new SyntaxError('A block definition cannot be nested under non-capturing nodes.', $node->getTemplateLine(), $this->stream->getSourceContext()); + @trigger_error(sprintf('Nesting a block definition under a non-capturing node in "%s" at line %d is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.', $this->stream->getSourceContext()->getName(), $node->getTemplateLine()), E_USER_DEPRECATED); + + return; + } + + // the "&& !$node instanceof SpacelessNode" part of the condition must be removed in 3.0 + if ($node instanceof NodeOutputInterface && !$node instanceof SpacelessNode) { + return; + } + + // here, $nested means "being at the root level of a child template" + // we need to discard the wrapping "Twig_Node" for the "body" node + $nested = $nested || ('Twig_Node' !== \get_class($node) && Node::class !== \get_class($node)); + foreach ($node as $k => $n) { + if (null !== $n && null === $this->filterBodyNodes($n, $nested)) { + $node->removeNode($k); + } + } + + return $node; + } +} + +class_alias('Twig\Parser', 'Twig_Parser'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php new file mode 100644 index 0000000..1631987 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Dumper; + +use Twig\Profiler\Profile; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +abstract class BaseDumper +{ + private $root; + + public function dump(Profile $profile) + { + return $this->dumpProfile($profile); + } + + abstract protected function formatTemplate(Profile $profile, $prefix); + + abstract protected function formatNonTemplate(Profile $profile, $prefix); + + abstract protected function formatTime(Profile $profile, $percent); + + private function dumpProfile(Profile $profile, $prefix = '', $sibling = false): string + { + if ($profile->isRoot()) { + $this->root = $profile->getDuration(); + $start = $profile->getName(); + } else { + if ($profile->isTemplate()) { + $start = $this->formatTemplate($profile, $prefix); + } else { + $start = $this->formatNonTemplate($profile, $prefix); + } + $prefix .= $sibling ? '│ ' : ' '; + } + + $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0; + + if ($profile->getDuration() * 1000 < 1) { + $str = $start."\n"; + } else { + $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent)); + } + + $nCount = \count($profile->getProfiles()); + foreach ($profile as $i => $p) { + $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount); + } + + return $str; + } +} + +class_alias('Twig\Profiler\Dumper\BaseDumper', 'Twig_Profiler_Dumper_Base'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php new file mode 100644 index 0000000..f333429 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Dumper; + +use Twig\Profiler\Profile; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class BlackfireDumper +{ + public function dump(Profile $profile) + { + $data = []; + $this->dumpProfile('main()', $profile, $data); + $this->dumpChildren('main()', $profile, $data); + + $start = sprintf('%f', microtime(true)); + $str = <<<EOF +file-format: BlackfireProbe +cost-dimensions: wt mu pmu +request-start: {$start} + + +EOF; + + foreach ($data as $name => $values) { + $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n"; + } + + return $str; + } + + private function dumpChildren(string $parent, Profile $profile, &$data) + { + foreach ($profile as $p) { + if ($p->isTemplate()) { + $name = $p->getTemplate(); + } else { + $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName()); + } + $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data); + $this->dumpChildren($name, $p, $data); + } + } + + private function dumpProfile(string $edge, Profile $profile, &$data) + { + if (isset($data[$edge])) { + ++$data[$edge]['ct']; + $data[$edge]['wt'] += floor($profile->getDuration() * 1000000); + $data[$edge]['mu'] += $profile->getMemoryUsage(); + $data[$edge]['pmu'] += $profile->getPeakMemoryUsage(); + } else { + $data[$edge] = [ + 'ct' => 1, + 'wt' => floor($profile->getDuration() * 1000000), + 'mu' => $profile->getMemoryUsage(), + 'pmu' => $profile->getPeakMemoryUsage(), + ]; + } + } +} + +class_alias('Twig\Profiler\Dumper\BlackfireDumper', 'Twig_Profiler_Dumper_Blackfire'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php new file mode 100644 index 0000000..5be5abe --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Dumper; + +use Twig\Profiler\Profile; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class HtmlDumper extends BaseDumper +{ + private static $colors = [ + 'block' => '#dfd', + 'macro' => '#ddf', + 'template' => '#ffd', + 'big' => '#d44', + ]; + + public function dump(Profile $profile) + { + return '<pre>'.parent::dump($profile).'</pre>'; + } + + protected function formatTemplate(Profile $profile, $prefix) + { + return sprintf('%s└ <span style="background-color: %s">%s</span>', $prefix, self::$colors['template'], $profile->getTemplate()); + } + + protected function formatNonTemplate(Profile $profile, $prefix) + { + return sprintf('%s└ %s::%s(<span style="background-color: %s">%s</span>)', $prefix, $profile->getTemplate(), $profile->getType(), isset(self::$colors[$profile->getType()]) ? self::$colors[$profile->getType()] : 'auto', $profile->getName()); + } + + protected function formatTime(Profile $profile, $percent) + { + return sprintf('<span style="color: %s">%.2fms/%.0f%%</span>', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent); + } +} + +class_alias('Twig\Profiler\Dumper\HtmlDumper', 'Twig_Profiler_Dumper_Html'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php new file mode 100644 index 0000000..395ef9d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Dumper; + +use Twig\Profiler\Profile; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class TextDumper extends BaseDumper +{ + protected function formatTemplate(Profile $profile, $prefix) + { + return sprintf('%s└ %s', $prefix, $profile->getTemplate()); + } + + protected function formatNonTemplate(Profile $profile, $prefix) + { + return sprintf('%s└ %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName()); + } + + protected function formatTime(Profile $profile, $percent) + { + return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent); + } +} + +class_alias('Twig\Profiler\Dumper\TextDumper', 'Twig_Profiler_Dumper_Text'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php new file mode 100644 index 0000000..91de5ff --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Node; + +use Twig\Compiler; +use Twig\Node\Node; + +/** + * Represents a profile enter node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class EnterProfileNode extends Node +{ + public function __construct(string $extensionName, string $type, string $name, string $varName) + { + parent::__construct([], ['extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName]); + } + + public function compile(Compiler $compiler) + { + $compiler + ->write(sprintf('$%s = $this->extensions[', $this->getAttribute('var_name'))) + ->repr($this->getAttribute('extension_name')) + ->raw("];\n") + ->write(sprintf('$%s->enter($%s = new \Twig\Profiler\Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof')) + ->repr($this->getAttribute('type')) + ->raw(', ') + ->repr($this->getAttribute('name')) + ->raw("));\n\n") + ; + } +} + +class_alias('Twig\Profiler\Node\EnterProfileNode', 'Twig_Profiler_Node_EnterProfile'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php new file mode 100644 index 0000000..7fbf435 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\Node; + +use Twig\Compiler; +use Twig\Node\Node; + +/** + * Represents a profile leave node. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class LeaveProfileNode extends Node +{ + public function __construct(string $varName) + { + parent::__construct([], ['var_name' => $varName]); + } + + public function compile(Compiler $compiler) + { + $compiler + ->write("\n") + ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof')) + ; + } +} + +class_alias('Twig\Profiler\Node\LeaveProfileNode', 'Twig_Profiler_Node_LeaveProfile'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php new file mode 100644 index 0000000..f19f6b7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php @@ -0,0 +1,78 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler\NodeVisitor; + +use Twig\Environment; +use Twig\Node\BlockNode; +use Twig\Node\BodyNode; +use Twig\Node\MacroNode; +use Twig\Node\ModuleNode; +use Twig\Node\Node; +use Twig\NodeVisitor\AbstractNodeVisitor; +use Twig\Profiler\Node\EnterProfileNode; +use Twig\Profiler\Node\LeaveProfileNode; +use Twig\Profiler\Profile; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class ProfilerNodeVisitor extends AbstractNodeVisitor +{ + private $extensionName; + + public function __construct(string $extensionName) + { + $this->extensionName = $extensionName; + } + + protected function doEnterNode(Node $node, Environment $env) + { + return $node; + } + + protected function doLeaveNode(Node $node, Environment $env) + { + if ($node instanceof ModuleNode) { + $varName = $this->getVarName(); + $node->setNode('display_start', new Node([new EnterProfileNode($this->extensionName, Profile::TEMPLATE, $node->getTemplateName(), $varName), $node->getNode('display_start')])); + $node->setNode('display_end', new Node([new LeaveProfileNode($varName), $node->getNode('display_end')])); + } elseif ($node instanceof BlockNode) { + $varName = $this->getVarName(); + $node->setNode('body', new BodyNode([ + new EnterProfileNode($this->extensionName, Profile::BLOCK, $node->getAttribute('name'), $varName), + $node->getNode('body'), + new LeaveProfileNode($varName), + ])); + } elseif ($node instanceof MacroNode) { + $varName = $this->getVarName(); + $node->setNode('body', new BodyNode([ + new EnterProfileNode($this->extensionName, Profile::MACRO, $node->getAttribute('name'), $varName), + $node->getNode('body'), + new LeaveProfileNode($varName), + ])); + } + + return $node; + } + + private function getVarName(): string + { + return sprintf('__internal_%s', hash('sha256', $this->extensionName)); + } + + public function getPriority() + { + return 0; + } +} + +class_alias('Twig\Profiler\NodeVisitor\ProfilerNodeVisitor', 'Twig_Profiler_NodeVisitor_Profiler'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Profile.php b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Profile.php new file mode 100644 index 0000000..e9726d6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Profiler/Profile.php @@ -0,0 +1,192 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Profiler; + +/** + * @author Fabien Potencier <fabien@symfony.com> + * + * @final since Twig 2.4.0 + */ +class Profile implements \IteratorAggregate, \Serializable +{ + const ROOT = 'ROOT'; + const BLOCK = 'block'; + const TEMPLATE = 'template'; + const MACRO = 'macro'; + + private $template; + private $name; + private $type; + private $starts = []; + private $ends = []; + private $profiles = []; + + public function __construct(string $template = 'main', string $type = self::ROOT, string $name = 'main') + { + if (__CLASS__ !== \get_class($this)) { + @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED); + } + + $this->template = $template; + $this->type = $type; + $this->name = 0 === strpos($name, '__internal_') ? 'INTERNAL' : $name; + $this->enter(); + } + + public function getTemplate() + { + return $this->template; + } + + public function getType() + { + return $this->type; + } + + public function getName() + { + return $this->name; + } + + public function isRoot() + { + return self::ROOT === $this->type; + } + + public function isTemplate() + { + return self::TEMPLATE === $this->type; + } + + public function isBlock() + { + return self::BLOCK === $this->type; + } + + public function isMacro() + { + return self::MACRO === $this->type; + } + + public function getProfiles() + { + return $this->profiles; + } + + public function addProfile(self $profile) + { + $this->profiles[] = $profile; + } + + /** + * Returns the duration in microseconds. + * + * @return float + */ + public function getDuration() + { + if ($this->isRoot() && $this->profiles) { + // for the root node with children, duration is the sum of all child durations + $duration = 0; + foreach ($this->profiles as $profile) { + $duration += $profile->getDuration(); + } + + return $duration; + } + + return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0; + } + + /** + * Returns the memory usage in bytes. + * + * @return int + */ + public function getMemoryUsage() + { + return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0; + } + + /** + * Returns the peak memory usage in bytes. + * + * @return int + */ + public function getPeakMemoryUsage() + { + return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0; + } + + /** + * Starts the profiling. + */ + public function enter() + { + $this->starts = [ + 'wt' => microtime(true), + 'mu' => memory_get_usage(), + 'pmu' => memory_get_peak_usage(), + ]; + } + + /** + * Stops the profiling. + */ + public function leave() + { + $this->ends = [ + 'wt' => microtime(true), + 'mu' => memory_get_usage(), + 'pmu' => memory_get_peak_usage(), + ]; + } + + public function reset() + { + $this->starts = $this->ends = $this->profiles = []; + $this->enter(); + } + + public function getIterator() + { + return new \ArrayIterator($this->profiles); + } + + public function serialize() + { + return serialize($this->__serialize()); + } + + public function unserialize($data) + { + $this->__unserialize(unserialize($data)); + } + + /** + * @internal + */ + public function __serialize() + { + return [$this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles]; + } + + /** + * @internal + */ + public function __unserialize(array $data) + { + list($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles) = $data; + } +} + +class_alias('Twig\Profiler\Profile', 'Twig_Profiler_Profile'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php new file mode 100644 index 0000000..04a6602 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\RuntimeLoader; + +use Psr\Container\ContainerInterface; + +/** + * Lazily loads Twig runtime implementations from a PSR-11 container. + * + * Note that the runtime services MUST use their class names as identifiers. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Robin Chalas <robin.chalas@gmail.com> + */ +class ContainerRuntimeLoader implements RuntimeLoaderInterface +{ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + public function load($class) + { + if ($this->container->has($class)) { + return $this->container->get($class); + } + } +} + +class_alias('Twig\RuntimeLoader\ContainerRuntimeLoader', 'Twig_ContainerRuntimeLoader'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php new file mode 100644 index 0000000..e4676f7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\RuntimeLoader; + +/** + * Lazy loads the runtime implementations for a Twig element. + * + * @author Robin Chalas <robin.chalas@gmail.com> + */ +class FactoryRuntimeLoader implements RuntimeLoaderInterface +{ + private $map; + + /** + * @param array $map An array where keys are class names and values factory callables + */ + public function __construct(array $map = []) + { + $this->map = $map; + } + + public function load($class) + { + if (isset($this->map[$class])) { + $runtimeFactory = $this->map[$class]; + + return $runtimeFactory(); + } + } +} + +class_alias('Twig\RuntimeLoader\FactoryRuntimeLoader', 'Twig_FactoryRuntimeLoader'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php new file mode 100644 index 0000000..4eb5ad8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\RuntimeLoader; + +/** + * Creates runtime implementations for Twig elements (filters/functions/tests). + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface RuntimeLoaderInterface +{ + /** + * Creates the runtime implementation of a Twig element (filter/function/test). + * + * @param string $class A runtime class + * + * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class + */ + public function load($class); +} + +class_alias('Twig\RuntimeLoader\RuntimeLoaderInterface', 'Twig_RuntimeLoaderInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityError.php new file mode 100644 index 0000000..5f96d46 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityError.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +use Twig\Error\Error; + +/** + * Exception thrown when a security error occurs at runtime. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class SecurityError extends Error +{ +} + +class_alias('Twig\Sandbox\SecurityError', 'Twig_Sandbox_SecurityError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php new file mode 100644 index 0000000..767ec5b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Exception thrown when a not allowed filter is used in a template. + * + * @author Martin Hasoň <martin.hason@gmail.com> + * + * @final + */ +class SecurityNotAllowedFilterError extends SecurityError +{ + private $filterName; + + public function __construct(string $message, string $functionName, int $lineno = -1, string $filename = null, \Exception $previous = null) + { + if (-1 !== $lineno) { + @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $filename) { + @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $previous) { + @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + parent::__construct($message, $lineno, $filename, $previous); + $this->filterName = $functionName; + } + + public function getFilterName() + { + return $this->filterName; + } +} + +class_alias('Twig\Sandbox\SecurityNotAllowedFilterError', 'Twig_Sandbox_SecurityNotAllowedFilterError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php new file mode 100644 index 0000000..5a30139 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Exception thrown when a not allowed function is used in a template. + * + * @author Martin Hasoň <martin.hason@gmail.com> + * + * @final + */ +class SecurityNotAllowedFunctionError extends SecurityError +{ + private $functionName; + + public function __construct(string $message, string $functionName, int $lineno = -1, string $filename = null, \Exception $previous = null) + { + if (-1 !== $lineno) { + @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $filename) { + @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $previous) { + @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + parent::__construct($message, $lineno, $filename, $previous); + $this->functionName = $functionName; + } + + public function getFunctionName() + { + return $this->functionName; + } +} + +class_alias('Twig\Sandbox\SecurityNotAllowedFunctionError', 'Twig_Sandbox_SecurityNotAllowedFunctionError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php new file mode 100644 index 0000000..c8103ea --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Exception thrown when a not allowed class method is used in a template. + * + * @author Kit Burton-Senior <mail@kitbs.com> + * + * @final + */ +class SecurityNotAllowedMethodError extends SecurityError +{ + private $className; + private $methodName; + + public function __construct(string $message, string $className, string $methodName, int $lineno = -1, string $filename = null, \Exception $previous = null) + { + if (-1 !== $lineno) { + @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $filename) { + @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $previous) { + @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + parent::__construct($message, $lineno, $filename, $previous); + $this->className = $className; + $this->methodName = $methodName; + } + + public function getClassName() + { + return $this->className; + } + + public function getMethodName() + { + return $this->methodName; + } +} + +class_alias('Twig\Sandbox\SecurityNotAllowedMethodError', 'Twig_Sandbox_SecurityNotAllowedMethodError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php new file mode 100644 index 0000000..d148f08 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Exception thrown when a not allowed class property is used in a template. + * + * @author Kit Burton-Senior <mail@kitbs.com> + * + * @final + */ +class SecurityNotAllowedPropertyError extends SecurityError +{ + private $className; + private $propertyName; + + public function __construct(string $message, string $className, string $propertyName, int $lineno = -1, string $filename = null, \Exception $previous = null) + { + if (-1 !== $lineno) { + @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $filename) { + @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $previous) { + @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + parent::__construct($message, $lineno, $filename, $previous); + $this->className = $className; + $this->propertyName = $propertyName; + } + + public function getClassName() + { + return $this->className; + } + + public function getPropertyName() + { + return $this->propertyName; + } +} + +class_alias('Twig\Sandbox\SecurityNotAllowedPropertyError', 'Twig_Sandbox_SecurityNotAllowedPropertyError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php new file mode 100644 index 0000000..25f6361 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Exception thrown when a not allowed tag is used in a template. + * + * @author Martin Hasoň <martin.hason@gmail.com> + * + * @final + */ +class SecurityNotAllowedTagError extends SecurityError +{ + private $tagName; + + public function __construct(string $message, string $tagName, int $lineno = -1, string $filename = null, \Exception $previous = null) + { + if (-1 !== $lineno) { + @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $filename) { + @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + if (null !== $previous) { + @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED); + } + parent::__construct($message, $lineno, $filename, $previous); + $this->tagName = $tagName; + } + + public function getTagName() + { + return $this->tagName; + } +} + +class_alias('Twig\Sandbox\SecurityNotAllowedTagError', 'Twig_Sandbox_SecurityNotAllowedTagError'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicy.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicy.php new file mode 100644 index 0000000..01fecf8 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicy.php @@ -0,0 +1,128 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +use Twig\Markup; +use Twig\Template; + +/** + * Represents a security policy which need to be enforced when sandbox mode is enabled. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class SecurityPolicy implements SecurityPolicyInterface +{ + private $allowedTags; + private $allowedFilters; + private $allowedMethods; + private $allowedProperties; + private $allowedFunctions; + + public function __construct(array $allowedTags = [], array $allowedFilters = [], array $allowedMethods = [], array $allowedProperties = [], array $allowedFunctions = []) + { + $this->allowedTags = $allowedTags; + $this->allowedFilters = $allowedFilters; + $this->setAllowedMethods($allowedMethods); + $this->allowedProperties = $allowedProperties; + $this->allowedFunctions = $allowedFunctions; + } + + public function setAllowedTags(array $tags) + { + $this->allowedTags = $tags; + } + + public function setAllowedFilters(array $filters) + { + $this->allowedFilters = $filters; + } + + public function setAllowedMethods(array $methods) + { + $this->allowedMethods = []; + foreach ($methods as $class => $m) { + $this->allowedMethods[$class] = array_map('strtolower', \is_array($m) ? $m : [$m]); + } + } + + public function setAllowedProperties(array $properties) + { + $this->allowedProperties = $properties; + } + + public function setAllowedFunctions(array $functions) + { + $this->allowedFunctions = $functions; + } + + public function checkSecurity($tags, $filters, $functions) + { + foreach ($tags as $tag) { + if (!\in_array($tag, $this->allowedTags)) { + throw new SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag); + } + } + + foreach ($filters as $filter) { + if (!\in_array($filter, $this->allowedFilters)) { + throw new SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter); + } + } + + foreach ($functions as $function) { + if (!\in_array($function, $this->allowedFunctions)) { + throw new SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function); + } + } + } + + public function checkMethodAllowed($obj, $method) + { + if ($obj instanceof Template || $obj instanceof Markup) { + return; + } + + $allowed = false; + $method = strtolower($method); + foreach ($this->allowedMethods as $class => $methods) { + if ($obj instanceof $class) { + $allowed = \in_array($method, $methods); + + break; + } + } + + if (!$allowed) { + $class = \get_class($obj); + throw new SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method); + } + } + + public function checkPropertyAllowed($obj, $property) + { + $allowed = false; + foreach ($this->allowedProperties as $class => $properties) { + if ($obj instanceof $class) { + $allowed = \in_array($property, \is_array($properties) ? $properties : [$properties]); + + break; + } + } + + if (!$allowed) { + $class = \get_class($obj); + throw new SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property); + } + } +} + +class_alias('Twig\Sandbox\SecurityPolicy', 'Twig_Sandbox_SecurityPolicy'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php new file mode 100644 index 0000000..8b2ab4a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Sandbox; + +/** + * Interface that all security policy classes must implements. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface SecurityPolicyInterface +{ + /** + * @throws SecurityError + */ + public function checkSecurity($tags, $filters, $functions); + + /** + * @throws SecurityNotAllowedMethodError + */ + public function checkMethodAllowed($obj, $method); + + /** + * @throws SecurityNotAllowedPropertyError + */ + public function checkPropertyAllowed($obj, $method); +} + +class_alias('Twig\Sandbox\SecurityPolicyInterface', 'Twig_Sandbox_SecurityPolicyInterface'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Source.php b/srcs/phpmyadmin/vendor/twig/twig/src/Source.php new file mode 100644 index 0000000..a728778 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Source.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +/** + * Holds information about a non-compiled Twig template. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class Source +{ + private $code; + private $name; + private $path; + + /** + * @param string $code The template source code + * @param string $name The template logical name + * @param string $path The filesystem path of the template if any + */ + public function __construct(string $code, string $name, string $path = '') + { + $this->code = $code; + $this->name = $name; + $this->path = $path; + } + + public function getCode(): string + { + return $this->code; + } + + public function getName() + { + return $this->name; + } + + public function getPath(): string + { + return $this->path; + } +} + +class_alias('Twig\Source', 'Twig_Source'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Template.php b/srcs/phpmyadmin/vendor/twig/twig/src/Template.php new file mode 100644 index 0000000..0f09e19 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Template.php @@ -0,0 +1,437 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\Error; +use Twig\Error\LoaderError; +use Twig\Error\RuntimeError; + +/** + * Default base class for compiled templates. + * + * This class is an implementation detail of how template compilation currently + * works, which might change. It should never be used directly. Use $twig->load() + * instead, which returns an instance of \Twig\TemplateWrapper. + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @internal + */ +abstract class Template +{ + const ANY_CALL = 'any'; + const ARRAY_CALL = 'array'; + const METHOD_CALL = 'method'; + + protected $parent; + protected $parents = []; + protected $env; + protected $blocks = []; + protected $traits = []; + protected $extensions = []; + protected $sandbox; + + public function __construct(Environment $env) + { + $this->env = $env; + $this->extensions = $env->getExtensions(); + } + + /** + * @internal this method will be removed in 3.0 and is only used internally to provide an upgrade path from 1.x to 2.0 + */ + public function __toString() + { + return $this->getTemplateName(); + } + + /** + * Returns the template name. + * + * @return string The template name + */ + abstract public function getTemplateName(); + + /** + * Returns debug information about the template. + * + * @return array Debug information + */ + abstract public function getDebugInfo(); + + /** + * Returns information about the original template source code. + * + * @return Source + */ + public function getSourceContext() + { + return new Source('', $this->getTemplateName()); + } + + /** + * Returns the parent template. + * + * This method is for internal use only and should never be called + * directly. + * + * @param array $context + * + * @return Template|TemplateWrapper|false The parent template or false if there is no parent + */ + public function getParent(array $context) + { + if (null !== $this->parent) { + return $this->parent; + } + + try { + $parent = $this->doGetParent($context); + + if (false === $parent) { + return false; + } + + if ($parent instanceof self || $parent instanceof TemplateWrapper) { + return $this->parents[$parent->getSourceContext()->getName()] = $parent; + } + + if (!isset($this->parents[$parent])) { + $this->parents[$parent] = $this->loadTemplate($parent); + } + } catch (LoaderError $e) { + $e->setSourceContext(null); + $e->guess(); + + throw $e; + } + + return $this->parents[$parent]; + } + + protected function doGetParent(array $context) + { + return false; + } + + public function isTraitable() + { + return true; + } + + /** + * Displays a parent block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to display from the parent + * @param array $context The context + * @param array $blocks The current set of blocks + */ + public function displayParentBlock($name, array $context, array $blocks = []) + { + if (isset($this->traits[$name])) { + $this->traits[$name][0]->displayBlock($name, $context, $blocks, false); + } elseif (false !== $parent = $this->getParent($context)) { + $parent->displayBlock($name, $context, $blocks, false); + } else { + throw new RuntimeError(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext()); + } + } + + /** + * Displays a block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to display + * @param array $context The context + * @param array $blocks The current set of blocks + * @param bool $useBlocks Whether to use the current set of blocks + */ + public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, self $templateContext = null) + { + if ($useBlocks && isset($blocks[$name])) { + $template = $blocks[$name][0]; + $block = $blocks[$name][1]; + } elseif (isset($this->blocks[$name])) { + $template = $this->blocks[$name][0]; + $block = $this->blocks[$name][1]; + } else { + $template = null; + $block = null; + } + + // avoid RCEs when sandbox is enabled + if (null !== $template && !$template instanceof self) { + throw new \LogicException('A block must be a method on a \Twig\Template instance.'); + } + + if (null !== $template) { + try { + $template->$block($context, $blocks); + } catch (Error $e) { + if (!$e->getSourceContext()) { + $e->setSourceContext($template->getSourceContext()); + } + + // this is mostly useful for \Twig\Error\LoaderError exceptions + // see \Twig\Error\LoaderError + if (-1 === $e->getTemplateLine()) { + $e->guess(); + } + + throw $e; + } catch (\Exception $e) { + $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e); + $e->guess(); + + throw $e; + } + } elseif (false !== $parent = $this->getParent($context)) { + $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this); + } elseif (isset($blocks[$name])) { + throw new RuntimeError(sprintf('Block "%s" should not call parent() in "%s" as the block does not exist in the parent template "%s".', $name, $blocks[$name][0]->getTemplateName(), $this->getTemplateName()), -1, $blocks[$name][0]->getSourceContext()); + } else { + throw new RuntimeError(sprintf('Block "%s" on template "%s" does not exist.', $name, $this->getTemplateName()), -1, ($templateContext ?? $this)->getSourceContext()); + } + } + + /** + * Renders a parent block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to render from the parent + * @param array $context The context + * @param array $blocks The current set of blocks + * + * @return string The rendered block + */ + public function renderParentBlock($name, array $context, array $blocks = []) + { + if ($this->env->isDebug()) { + ob_start(); + } else { + ob_start(function () { return ''; }); + } + $this->displayParentBlock($name, $context, $blocks); + + return ob_get_clean(); + } + + /** + * Renders a block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to render + * @param array $context The context + * @param array $blocks The current set of blocks + * @param bool $useBlocks Whether to use the current set of blocks + * + * @return string The rendered block + */ + public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true) + { + if ($this->env->isDebug()) { + ob_start(); + } else { + ob_start(function () { return ''; }); + } + $this->displayBlock($name, $context, $blocks, $useBlocks); + + return ob_get_clean(); + } + + /** + * Returns whether a block exists or not in the current context of the template. + * + * This method checks blocks defined in the current template + * or defined in "used" traits or defined in parent templates. + * + * @param string $name The block name + * @param array $context The context + * @param array $blocks The current set of blocks + * + * @return bool true if the block exists, false otherwise + */ + public function hasBlock($name, array $context, array $blocks = []) + { + if (isset($blocks[$name])) { + return $blocks[$name][0] instanceof self; + } + + if (isset($this->blocks[$name])) { + return true; + } + + if (false !== $parent = $this->getParent($context)) { + return $parent->hasBlock($name, $context); + } + + return false; + } + + /** + * Returns all block names in the current context of the template. + * + * This method checks blocks defined in the current template + * or defined in "used" traits or defined in parent templates. + * + * @param array $context The context + * @param array $blocks The current set of blocks + * + * @return array An array of block names + */ + public function getBlockNames(array $context, array $blocks = []) + { + $names = array_merge(array_keys($blocks), array_keys($this->blocks)); + + if (false !== $parent = $this->getParent($context)) { + $names = array_merge($names, $parent->getBlockNames($context)); + } + + return array_unique($names); + } + + /** + * @return Template|TemplateWrapper + */ + protected function loadTemplate($template, $templateName = null, $line = null, $index = null) + { + try { + if (\is_array($template)) { + return $this->env->resolveTemplate($template); + } + + if ($template instanceof self || $template instanceof TemplateWrapper) { + return $template; + } + + if ($template === $this->getTemplateName()) { + $class = \get_class($this); + if (false !== $pos = strrpos($class, '___', -1)) { + $class = substr($class, 0, $pos); + } + + return $this->env->loadClass($class, $template, $index); + } + + return $this->env->loadTemplate($template, $index); + } catch (Error $e) { + if (!$e->getSourceContext()) { + $e->setSourceContext($templateName ? new Source('', $templateName) : $this->getSourceContext()); + } + + if ($e->getTemplateLine() > 0) { + throw $e; + } + + if (!$line) { + $e->guess(); + } else { + $e->setTemplateLine($line); + } + + throw $e; + } + } + + /** + * @internal + * + * @return Template + */ + protected function unwrap() + { + return $this; + } + + /** + * Returns all blocks. + * + * This method is for internal use only and should never be called + * directly. + * + * @return array An array of blocks + */ + public function getBlocks() + { + return $this->blocks; + } + + public function display(array $context, array $blocks = []) + { + $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks)); + } + + public function render(array $context) + { + $level = ob_get_level(); + if ($this->env->isDebug()) { + ob_start(); + } else { + ob_start(function () { return ''; }); + } + try { + $this->display($context); + } catch (\Throwable $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + + throw $e; + } + + return ob_get_clean(); + } + + protected function displayWithErrorHandling(array $context, array $blocks = []) + { + try { + $this->doDisplay($context, $blocks); + } catch (Error $e) { + if (!$e->getSourceContext()) { + $e->setSourceContext($this->getSourceContext()); + } + + // this is mostly useful for \Twig\Error\LoaderError exceptions + // see \Twig\Error\LoaderError + if (-1 === $e->getTemplateLine()) { + $e->guess(); + } + + throw $e; + } catch (\Exception $e) { + $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e); + $e->guess(); + + throw $e; + } + } + + /** + * Auto-generated method to display the template with the given context. + * + * @param array $context An array of parameters to pass to the template + * @param array $blocks An array of blocks to pass to the template + */ + abstract protected function doDisplay(array $context, array $blocks = []); +} + +class_alias('Twig\Template', 'Twig_Template'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TemplateWrapper.php b/srcs/phpmyadmin/vendor/twig/twig/src/TemplateWrapper.php new file mode 100644 index 0000000..8b44815 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TemplateWrapper.php @@ -0,0 +1,145 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +/** + * Exposes a template to userland. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class TemplateWrapper +{ + private $env; + private $template; + + /** + * This method is for internal use only and should never be called + * directly (use Twig\Environment::load() instead). + * + * @internal + */ + public function __construct(Environment $env, Template $template) + { + $this->env = $env; + $this->template = $template; + } + + /** + * Renders the template. + * + * @param array $context An array of parameters to pass to the template + */ + public function render(array $context = []): string + { + // using func_get_args() allows to not expose the blocks argument + // as it should only be used by internal code + return $this->template->render($context, \func_get_args()[1] ?? []); + } + + /** + * Displays the template. + * + * @param array $context An array of parameters to pass to the template + */ + public function display(array $context = []) + { + // using func_get_args() allows to not expose the blocks argument + // as it should only be used by internal code + $this->template->display($context, \func_get_args()[1] ?? []); + } + + /** + * Checks if a block is defined. + * + * @param string $name The block name + * @param array $context An array of parameters to pass to the template + */ + public function hasBlock(string $name, array $context = []): bool + { + return $this->template->hasBlock($name, $context); + } + + /** + * Returns defined block names in the template. + * + * @param array $context An array of parameters to pass to the template + * + * @return string[] An array of defined template block names + */ + public function getBlockNames(array $context = []): array + { + return $this->template->getBlockNames($context); + } + + /** + * Renders a template block. + * + * @param string $name The block name to render + * @param array $context An array of parameters to pass to the template + * + * @return string The rendered block + */ + public function renderBlock(string $name, array $context = []): string + { + $context = $this->env->mergeGlobals($context); + $level = ob_get_level(); + if ($this->env->isDebug()) { + ob_start(); + } else { + ob_start(function () { return ''; }); + } + try { + $this->template->displayBlock($name, $context); + } catch (\Throwable $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + + throw $e; + } + + return ob_get_clean(); + } + + /** + * Displays a template block. + * + * @param string $name The block name to render + * @param array $context An array of parameters to pass to the template + */ + public function displayBlock(string $name, array $context = []) + { + $this->template->displayBlock($name, $this->env->mergeGlobals($context)); + } + + public function getSourceContext(): Source + { + return $this->template->getSourceContext(); + } + + public function getTemplateName(): string + { + return $this->template->getTemplateName(); + } + + /** + * @internal + * + * @return Template + */ + public function unwrap() + { + return $this->template; + } +} + +class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Test/IntegrationTestCase.php b/srcs/phpmyadmin/vendor/twig/twig/src/Test/IntegrationTestCase.php new file mode 100644 index 0000000..d9c3290 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Test/IntegrationTestCase.php @@ -0,0 +1,267 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Test; + +use PHPUnit\Framework\TestCase; +use Twig\Environment; +use Twig\Error\Error; +use Twig\Extension\ExtensionInterface; +use Twig\Loader\ArrayLoader; +use Twig\RuntimeLoader\RuntimeLoaderInterface; +use Twig\TwigFilter; +use Twig\TwigFunction; +use Twig\TwigTest; + +/** + * Integration test helper. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Karma Dordrak <drak@zikula.org> + */ +abstract class IntegrationTestCase extends TestCase +{ + /** + * @return string + */ + abstract protected function getFixturesDir(); + + /** + * @return RuntimeLoaderInterface[] + */ + protected function getRuntimeLoaders() + { + return []; + } + + /** + * @return ExtensionInterface[] + */ + protected function getExtensions() + { + return []; + } + + /** + * @return TwigFilter[] + */ + protected function getTwigFilters() + { + return []; + } + + /** + * @return TwigFunction[] + */ + protected function getTwigFunctions() + { + return []; + } + + /** + * @return TwigTest[] + */ + protected function getTwigTests() + { + return []; + } + + /** + * @dataProvider getTests + */ + public function testIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '') + { + $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation); + } + + /** + * @dataProvider getLegacyTests + * @group legacy + */ + public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '') + { + $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation); + } + + public function getTests($name, $legacyTests = false) + { + $fixturesDir = realpath($this->getFixturesDir()); + $tests = []; + + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if (!preg_match('/\.test$/', $file)) { + continue; + } + + if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) { + continue; + } + + $test = file_get_contents($file->getRealpath()); + + if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) { + $message = $match[1]; + $condition = $match[2]; + $deprecation = $match[3]; + $templates = self::parseTemplates($match[4]); + $exception = $match[6]; + $outputs = [[null, $match[5], null, '']]; + } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) { + $message = $match[1]; + $condition = $match[2]; + $deprecation = $match[3]; + $templates = self::parseTemplates($match[4]); + $exception = false; + preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER); + } else { + throw new \InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file))); + } + + $tests[] = [str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs, $deprecation]; + } + + if ($legacyTests && empty($tests)) { + // add a dummy test to avoid a PHPUnit message + return [['not', '-', '', [], '', []]]; + } + + return $tests; + } + + public function getLegacyTests() + { + return $this->getTests('testLegacyIntegration', true); + } + + protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '') + { + if (!$outputs) { + $this->markTestSkipped('no tests to run'); + } + + if ($condition) { + eval('$ret = '.$condition.';'); + if (!$ret) { + $this->markTestSkipped($condition); + } + } + + $loader = new ArrayLoader($templates); + + foreach ($outputs as $i => $match) { + $config = array_merge([ + 'cache' => false, + 'strict_variables' => true, + ], $match[2] ? eval($match[2].';') : []); + $twig = new Environment($loader, $config); + $twig->addGlobal('global', 'global'); + foreach ($this->getRuntimeLoaders() as $runtimeLoader) { + $twig->addRuntimeLoader($runtimeLoader); + } + + foreach ($this->getExtensions() as $extension) { + $twig->addExtension($extension); + } + + foreach ($this->getTwigFilters() as $filter) { + $twig->addFilter($filter); + } + + foreach ($this->getTwigTests() as $test) { + $twig->addTest($test); + } + + foreach ($this->getTwigFunctions() as $function) { + $twig->addFunction($function); + } + + // avoid using the same PHP class name for different cases + $p = new \ReflectionProperty($twig, 'templateClassPrefix'); + $p->setAccessible(true); + $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_'); + + $deprecations = []; + try { + $prevHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$deprecations, &$prevHandler) { + if (E_USER_DEPRECATED === $type) { + $deprecations[] = $msg; + + return true; + } + + return $prevHandler ? $prevHandler($type, $msg, $file, $line, $context) : false; + }); + + $template = $twig->load('index.twig'); + } catch (\Exception $e) { + if (false !== $exception) { + $message = $e->getMessage(); + $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $message))); + $last = substr($message, \strlen($message) - 1); + $this->assertTrue('.' === $last || '?' === $last, 'Exception message must end with a dot or a question mark.'); + + return; + } + + throw new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e); + } finally { + restore_error_handler(); + } + + $this->assertSame($deprecation, implode("\n", $deprecations)); + + try { + $output = trim($template->render(eval($match[1].';')), "\n "); + } catch (\Exception $e) { + if (false !== $exception) { + $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $e->getMessage()))); + + return; + } + + $e = new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e); + + $output = trim(sprintf('%s: %s', \get_class($e), $e->getMessage())); + } + + if (false !== $exception) { + list($class) = explode(':', $exception); + $constraintClass = class_exists('PHPUnit\Framework\Constraint\Exception') ? 'PHPUnit\Framework\Constraint\Exception' : 'PHPUnit_Framework_Constraint_Exception'; + $this->assertThat(null, new $constraintClass($class)); + } + + $expected = trim($match[3], "\n "); + + if ($expected !== $output) { + printf("Compiled templates that failed on case %d:\n", $i + 1); + + foreach (array_keys($templates) as $name) { + echo "Template: $name\n"; + echo $twig->compile($twig->parse($twig->tokenize($twig->getLoader()->getSourceContext($name)))); + } + } + $this->assertEquals($expected, $output, $message.' (in '.$file.')'); + } + } + + protected static function parseTemplates($test) + { + $templates = []; + preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2]; + } + + return $templates; + } +} + +class_alias('Twig\Test\IntegrationTestCase', 'Twig_Test_IntegrationTestCase'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Test/NodeTestCase.php b/srcs/phpmyadmin/vendor/twig/twig/src/Test/NodeTestCase.php new file mode 100644 index 0000000..368ceb1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Test/NodeTestCase.php @@ -0,0 +1,67 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Test; + +use PHPUnit\Framework\TestCase; +use Twig\Compiler; +use Twig\Environment; +use Twig\Loader\ArrayLoader; +use Twig\Node\Node; + +abstract class NodeTestCase extends TestCase +{ + abstract public function getTests(); + + /** + * @dataProvider getTests + */ + public function testCompile($node, $source, $environment = null, $isPattern = false) + { + $this->assertNodeCompilation($source, $node, $environment, $isPattern); + } + + public function assertNodeCompilation($source, Node $node, Environment $environment = null, $isPattern = false) + { + $compiler = $this->getCompiler($environment); + $compiler->compile($node); + + if ($isPattern) { + $this->assertStringMatchesFormat($source, trim($compiler->getSource())); + } else { + $this->assertEquals($source, trim($compiler->getSource())); + } + } + + protected function getCompiler(Environment $environment = null) + { + return new Compiler(null === $environment ? $this->getEnvironment() : $environment); + } + + protected function getEnvironment() + { + return new Environment(new ArrayLoader([])); + } + + protected function getVariableGetter($name, $line = false) + { + $line = $line > 0 ? "// line {$line}\n" : ''; + + return sprintf('%s($context["%s"] ?? null)', $line, $name); + } + + protected function getAttributeGetter() + { + return 'twig_get_attribute($this->env, $this->source, '; + } +} + +class_alias('Twig\Test\NodeTestCase', 'Twig_Test_NodeTestCase'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Token.php b/srcs/phpmyadmin/vendor/twig/twig/src/Token.php new file mode 100644 index 0000000..262fa48 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Token.php @@ -0,0 +1,213 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +/** + * Represents a Token. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class Token +{ + private $value; + private $type; + private $lineno; + + const EOF_TYPE = -1; + const TEXT_TYPE = 0; + const BLOCK_START_TYPE = 1; + const VAR_START_TYPE = 2; + const BLOCK_END_TYPE = 3; + const VAR_END_TYPE = 4; + const NAME_TYPE = 5; + const NUMBER_TYPE = 6; + const STRING_TYPE = 7; + const OPERATOR_TYPE = 8; + const PUNCTUATION_TYPE = 9; + const INTERPOLATION_START_TYPE = 10; + const INTERPOLATION_END_TYPE = 11; + const ARROW_TYPE = 12; + + /** + * @param int $type The type of the token + * @param string $value The token value + * @param int $lineno The line position in the source + */ + public function __construct($type, $value, $lineno) + { + $this->type = $type; + $this->value = $value; + $this->lineno = $lineno; + } + + public function __toString() + { + return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value); + } + + /** + * Tests the current token for a type and/or a value. + * + * Parameters may be: + * * just type + * * type and value (or array of possible values) + * * just value (or array of possible values) (NAME_TYPE is used as type) + * + * @param array|string|int $type The type to test + * @param array|string|null $values The token value + * + * @return bool + */ + public function test($type, $values = null) + { + if (null === $values && !\is_int($type)) { + $values = $type; + $type = self::NAME_TYPE; + } + + return ($this->type === $type) && ( + null === $values || + (\is_array($values) && \in_array($this->value, $values)) || + $this->value == $values + ); + } + + /** + * @return int + */ + public function getLine() + { + return $this->lineno; + } + + /** + * @return int + */ + public function getType() + { + return $this->type; + } + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the constant representation (internal) of a given type. + * + * @param int $type The type as an integer + * @param bool $short Whether to return a short representation or not + * + * @return string The string representation + */ + public static function typeToString($type, $short = false) + { + switch ($type) { + case self::EOF_TYPE: + $name = 'EOF_TYPE'; + break; + case self::TEXT_TYPE: + $name = 'TEXT_TYPE'; + break; + case self::BLOCK_START_TYPE: + $name = 'BLOCK_START_TYPE'; + break; + case self::VAR_START_TYPE: + $name = 'VAR_START_TYPE'; + break; + case self::BLOCK_END_TYPE: + $name = 'BLOCK_END_TYPE'; + break; + case self::VAR_END_TYPE: + $name = 'VAR_END_TYPE'; + break; + case self::NAME_TYPE: + $name = 'NAME_TYPE'; + break; + case self::NUMBER_TYPE: + $name = 'NUMBER_TYPE'; + break; + case self::STRING_TYPE: + $name = 'STRING_TYPE'; + break; + case self::OPERATOR_TYPE: + $name = 'OPERATOR_TYPE'; + break; + case self::PUNCTUATION_TYPE: + $name = 'PUNCTUATION_TYPE'; + break; + case self::INTERPOLATION_START_TYPE: + $name = 'INTERPOLATION_START_TYPE'; + break; + case self::INTERPOLATION_END_TYPE: + $name = 'INTERPOLATION_END_TYPE'; + break; + case self::ARROW_TYPE: + $name = 'ARROW_TYPE'; + break; + default: + throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type)); + } + + return $short ? $name : 'Twig\Token::'.$name; + } + + /** + * Returns the English representation of a given type. + * + * @param int $type The type as an integer + * + * @return string The string representation + */ + public static function typeToEnglish($type) + { + switch ($type) { + case self::EOF_TYPE: + return 'end of template'; + case self::TEXT_TYPE: + return 'text'; + case self::BLOCK_START_TYPE: + return 'begin of statement block'; + case self::VAR_START_TYPE: + return 'begin of print statement'; + case self::BLOCK_END_TYPE: + return 'end of statement block'; + case self::VAR_END_TYPE: + return 'end of print statement'; + case self::NAME_TYPE: + return 'name'; + case self::NUMBER_TYPE: + return 'number'; + case self::STRING_TYPE: + return 'string'; + case self::OPERATOR_TYPE: + return 'operator'; + case self::PUNCTUATION_TYPE: + return 'punctuation'; + case self::INTERPOLATION_START_TYPE: + return 'begin of string interpolation'; + case self::INTERPOLATION_END_TYPE: + return 'end of string interpolation'; + case self::ARROW_TYPE: + return 'arrow function'; + default: + throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type)); + } + } +} + +class_alias('Twig\Token', 'Twig_Token'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php new file mode 100644 index 0000000..2c2f90b --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Parser; + +/** + * Base class for all token parsers. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +abstract class AbstractTokenParser implements TokenParserInterface +{ + /** + * @var Parser + */ + protected $parser; + + public function setParser(Parser $parser) + { + $this->parser = $parser; + } +} + +class_alias('Twig\TokenParser\AbstractTokenParser', 'Twig_TokenParser'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php new file mode 100644 index 0000000..879879a --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\Expression\TempNameExpression; +use Twig\Node\Node; +use Twig\Node\PrintNode; +use Twig\Node\SetNode; +use Twig\Token; + +/** + * Applies filters on a section of a template. + * + * {% apply upper %} + * This text becomes uppercase + * {% endapplys %} + */ +final class ApplyTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $name = $this->parser->getVarName(); + + $ref = new TempNameExpression($name, $lineno); + $ref->setAttribute('always_defined', true); + + $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag()); + + $this->parser->getStream()->expect(Token::BLOCK_END_TYPE); + $body = $this->parser->subparse([$this, 'decideApplyEnd'], true); + $this->parser->getStream()->expect(Token::BLOCK_END_TYPE); + + return new Node([ + new SetNode(true, $ref, $body, $lineno, $this->getTag()), + new PrintNode($filter, $lineno, $this->getTag()), + ]); + } + + public function decideApplyEnd(Token $token) + { + return $token->test('endapply'); + } + + public function getTag() + { + return 'apply'; + } +} diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php new file mode 100644 index 0000000..10fdb81 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\AutoEscapeNode; +use Twig\Node\Expression\ConstantExpression; +use Twig\Token; + +/** + * Marks a section of a template to be escaped or not. + */ +final class AutoEscapeTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + + if ($stream->test(/* Token::BLOCK_END_TYPE */ 3)) { + $value = 'html'; + } else { + $expr = $this->parser->getExpressionParser()->parseExpression(); + if (!$expr instanceof ConstantExpression) { + throw new SyntaxError('An escaping strategy must be a string or false.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + $value = $expr->getAttribute('value'); + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideBlockEnd'], true); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new AutoEscapeNode($value, $body, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endautoescape'); + } + + public function getTag() + { + return 'autoescape'; + } +} + +class_alias('Twig\TokenParser\AutoEscapeTokenParser', 'Twig_TokenParser_AutoEscape'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/BlockTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/BlockTokenParser.php new file mode 100644 index 0000000..449a2c0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/BlockTokenParser.php @@ -0,0 +1,78 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\BlockNode; +use Twig\Node\BlockReferenceNode; +use Twig\Node\Node; +use Twig\Node\PrintNode; +use Twig\Token; + +/** + * Marks a section of a template as being reusable. + * + * {% block head %} + * <link rel="stylesheet" href="style.css" /> + * <title>{% block title %}{% endblock %} - My Webpage</title> + * {% endblock %} + */ +final class BlockTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + if ($this->parser->hasBlock($name)) { + throw new SyntaxError(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getTemplateLine()), $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + $this->parser->setBlock($name, $block = new BlockNode($name, new Node([]), $lineno)); + $this->parser->pushLocalScope(); + $this->parser->pushBlockStack($name); + + if ($stream->nextIf(/* Token::BLOCK_END_TYPE */ 3)) { + $body = $this->parser->subparse([$this, 'decideBlockEnd'], true); + if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) { + $value = $token->getValue(); + + if ($value != $name) { + throw new SyntaxError(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + } + } else { + $body = new Node([ + new PrintNode($this->parser->getExpressionParser()->parseExpression(), $lineno), + ]); + } + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $block->setNode('body', $body); + $this->parser->popBlockStack(); + $this->parser->popLocalScope(); + + return new BlockReferenceNode($name, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endblock'); + } + + public function getTag() + { + return 'block'; + } +} + +class_alias('Twig\TokenParser\BlockTokenParser', 'Twig_TokenParser_Block'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php new file mode 100644 index 0000000..6575cff --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\DeprecatedNode; +use Twig\Token; + +/** + * Deprecates a section of a template. + * + * {% deprecated 'The "base.twig" template is deprecated, use "layout.twig" instead.' %} + * {% extends 'layout.html.twig' %} + * + * @author Yonel Ceruto <yonelceruto@gmail.com> + * + * @final + */ +class DeprecatedTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $expr = $this->parser->getExpressionParser()->parseExpression(); + + $this->parser->getStream()->expect(Token::BLOCK_END_TYPE); + + return new DeprecatedNode($expr, $token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'deprecated'; + } +} + +class_alias('Twig\TokenParser\DeprecatedTokenParser', 'Twig_TokenParser_Deprecated'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DoTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DoTokenParser.php new file mode 100644 index 0000000..e5a07d6 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/DoTokenParser.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\DoNode; +use Twig\Token; + +/** + * Evaluates an expression, discarding the returned value. + */ +final class DoTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $expr = $this->parser->getExpressionParser()->parseExpression(); + + $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new DoNode($expr, $token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'do'; + } +} + +class_alias('Twig\TokenParser\DoTokenParser', 'Twig_TokenParser_Do'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php new file mode 100644 index 0000000..83a545e --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\EmbedNode; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Token; + +/** + * Embeds a template. + */ +final class EmbedTokenParser extends IncludeTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + + $parent = $this->parser->getExpressionParser()->parseExpression(); + + list($variables, $only, $ignoreMissing) = $this->parseArguments(); + + $parentToken = $fakeParentToken = new Token(/* Token::STRING_TYPE */ 7, '__parent__', $token->getLine()); + if ($parent instanceof ConstantExpression) { + $parentToken = new Token(/* Token::STRING_TYPE */ 7, $parent->getAttribute('value'), $token->getLine()); + } elseif ($parent instanceof NameExpression) { + $parentToken = new Token(/* Token::NAME_TYPE */ 5, $parent->getAttribute('name'), $token->getLine()); + } + + // inject a fake parent to make the parent() function work + $stream->injectTokens([ + new Token(/* Token::BLOCK_START_TYPE */ 1, '', $token->getLine()), + new Token(/* Token::NAME_TYPE */ 5, 'extends', $token->getLine()), + $parentToken, + new Token(/* Token::BLOCK_END_TYPE */ 3, '', $token->getLine()), + ]); + + $module = $this->parser->parse($stream, [$this, 'decideBlockEnd'], true); + + // override the parent with the correct one + if ($fakeParentToken === $parentToken) { + $module->setNode('parent', $parent); + } + + $this->parser->embedTemplate($module); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new EmbedNode($module->getTemplateName(), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endembed'); + } + + public function getTag() + { + return 'embed'; + } +} + +class_alias('Twig\TokenParser\EmbedTokenParser', 'Twig_TokenParser_Embed'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php new file mode 100644 index 0000000..a44980f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\Node; +use Twig\Token; + +/** + * Extends a template by another one. + * + * {% extends "base.html" %} + */ +final class ExtendsTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + + if ($this->parser->peekBlockStack()) { + throw new SyntaxError('Cannot use "extend" in a block.', $token->getLine(), $stream->getSourceContext()); + } elseif (!$this->parser->isMainScope()) { + throw new SyntaxError('Cannot use "extend" in a macro.', $token->getLine(), $stream->getSourceContext()); + } + + if (null !== $this->parser->getParent()) { + throw new SyntaxError('Multiple extends tags are forbidden.', $token->getLine(), $stream->getSourceContext()); + } + $this->parser->setParent($this->parser->getExpressionParser()->parseExpression()); + + $stream->expect(Token::BLOCK_END_TYPE); + + return new Node(); + } + + public function getTag() + { + return 'extends'; + } +} + +class_alias('Twig\TokenParser\ExtendsTokenParser', 'Twig_TokenParser_Extends'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FilterTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FilterTokenParser.php new file mode 100644 index 0000000..e57fc90 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FilterTokenParser.php @@ -0,0 +1,64 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\BlockNode; +use Twig\Node\Expression\BlockReferenceExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\PrintNode; +use Twig\Token; + +/** + * Filters a section of a template by applying filters. + * + * {% filter upper %} + * This text becomes uppercase + * {% endfilter %} + * + * @deprecated since Twig 2.9, to be removed in 3.0 (use the "apply" tag instead) + */ +final class FilterTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + $lineno = $token->getLine(); + + @trigger_error(sprintf('The "filter" tag in "%s" at line %d is deprecated since Twig 2.9, use the "apply" tag instead.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED); + + $name = $this->parser->getVarName(); + $ref = new BlockReferenceExpression(new ConstantExpression($name, $lineno), null, $lineno, $this->getTag()); + + $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag()); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $body = $this->parser->subparse([$this, 'decideBlockEnd'], true); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $block = new BlockNode($name, $body, $lineno); + $this->parser->setBlock($name, $block); + + return new PrintNode($filter, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endfilter'); + } + + public function getTag() + { + return 'filter'; + } +} + +class_alias('Twig\TokenParser\FilterTokenParser', 'Twig_TokenParser_Filter'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FlushTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FlushTokenParser.php new file mode 100644 index 0000000..70f4339 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FlushTokenParser.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\FlushNode; +use Twig\Token; + +/** + * Flushes the output to the client. + * + * @see flush() + */ +final class FlushTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new FlushNode($token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'flush'; + } +} + +class_alias('Twig\TokenParser\FlushTokenParser', 'Twig_TokenParser_Flush'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ForTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ForTokenParser.php new file mode 100644 index 0000000..34430f0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ForTokenParser.php @@ -0,0 +1,137 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\Expression\AssignNameExpression; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\GetAttrExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Node\ForNode; +use Twig\Node\Node; +use Twig\Token; +use Twig\TokenStream; + +/** + * Loops over each item of a sequence. + * + * <ul> + * {% for user in users %} + * <li>{{ user.username|e }}</li> + * {% endfor %} + * </ul> + */ +final class ForTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $targets = $this->parser->getExpressionParser()->parseAssignmentExpression(); + $stream->expect(/* Token::OPERATOR_TYPE */ 8, 'in'); + $seq = $this->parser->getExpressionParser()->parseExpression(); + + $ifexpr = null; + if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'if')) { + @trigger_error(sprintf('Using an "if" condition on "for" tag in "%s" at line %d is deprecated since Twig 2.10.0, use a "filter" filter or an "if" condition inside the "for" body instead (if your condition depends on a variable updated inside the loop).', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED); + + $ifexpr = $this->parser->getExpressionParser()->parseExpression(); + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideForFork']); + if ('else' == $stream->next()->getValue()) { + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $else = $this->parser->subparse([$this, 'decideForEnd'], true); + } else { + $else = null; + } + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + if (\count($targets) > 1) { + $keyTarget = $targets->getNode(0); + $keyTarget = new AssignNameExpression($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine()); + $valueTarget = $targets->getNode(1); + $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine()); + } else { + $keyTarget = new AssignNameExpression('_key', $lineno); + $valueTarget = $targets->getNode(0); + $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine()); + } + + if ($ifexpr) { + $this->checkLoopUsageCondition($stream, $ifexpr); + $this->checkLoopUsageBody($stream, $body); + } + + return new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag()); + } + + public function decideForFork(Token $token) + { + return $token->test(['else', 'endfor']); + } + + public function decideForEnd(Token $token) + { + return $token->test('endfor'); + } + + // the loop variable cannot be used in the condition + private function checkLoopUsageCondition(TokenStream $stream, Node $node) + { + if ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression && 'loop' == $node->getNode('node')->getAttribute('name')) { + throw new SyntaxError('The "loop" variable cannot be used in a looping condition.', $node->getTemplateLine(), $stream->getSourceContext()); + } + + foreach ($node as $n) { + if (!$n) { + continue; + } + + $this->checkLoopUsageCondition($stream, $n); + } + } + + // check usage of non-defined loop-items + // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include) + private function checkLoopUsageBody(TokenStream $stream, Node $node) + { + if ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression && 'loop' == $node->getNode('node')->getAttribute('name')) { + $attribute = $node->getNode('attribute'); + if ($attribute instanceof ConstantExpression && \in_array($attribute->getAttribute('value'), ['length', 'revindex0', 'revindex', 'last'])) { + throw new SyntaxError(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getTemplateLine(), $stream->getSourceContext()); + } + } + + // should check for parent.loop.XXX usage + if ($node instanceof ForNode) { + return; + } + + foreach ($node as $n) { + if (!$n) { + continue; + } + + $this->checkLoopUsageBody($stream, $n); + } + } + + public function getTag() + { + return 'for'; + } +} + +class_alias('Twig\TokenParser\ForTokenParser', 'Twig_TokenParser_For'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FromTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FromTokenParser.php new file mode 100644 index 0000000..dd49f2f --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/FromTokenParser.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\Expression\AssignNameExpression; +use Twig\Node\ImportNode; +use Twig\Token; + +/** + * Imports macros. + * + * {% from 'forms.html' import forms %} + */ +final class FromTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $macro = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + $stream->expect(/* Token::NAME_TYPE */ 5, 'import'); + + $targets = []; + do { + $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + + $alias = $name; + if ($stream->nextIf('as')) { + $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + } + + $targets[$name] = $alias; + + if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + } while (true); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $var = new AssignNameExpression($this->parser->getVarName(), $token->getLine()); + $node = new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope()); + + foreach ($targets as $name => $alias) { + $this->parser->addImportedSymbol('function', $alias, 'macro_'.$name, $var); + } + + return $node; + } + + public function getTag() + { + return 'from'; + } +} + +class_alias('Twig\TokenParser\FromTokenParser', 'Twig_TokenParser_From'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IfTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IfTokenParser.php new file mode 100644 index 0000000..8ad99f0 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IfTokenParser.php @@ -0,0 +1,89 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\IfNode; +use Twig\Node\Node; +use Twig\Token; + +/** + * Tests a condition. + * + * {% if users %} + * <ul> + * {% for user in users %} + * <li>{{ user.username|e }}</li> + * {% endfor %} + * </ul> + * {% endif %} + */ +final class IfTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $expr = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideIfFork']); + $tests = [$expr, $body]; + $else = null; + + $end = false; + while (!$end) { + switch ($stream->next()->getValue()) { + case 'else': + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $else = $this->parser->subparse([$this, 'decideIfEnd']); + break; + + case 'elseif': + $expr = $this->parser->getExpressionParser()->parseExpression(); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideIfFork']); + $tests[] = $expr; + $tests[] = $body; + break; + + case 'endif': + $end = true; + break; + + default: + throw new SyntaxError(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new IfNode(new Node($tests), $else, $lineno, $this->getTag()); + } + + public function decideIfFork(Token $token) + { + return $token->test(['elseif', 'else', 'endif']); + } + + public function decideIfEnd(Token $token) + { + return $token->test(['endif']); + } + + public function getTag() + { + return 'if'; + } +} + +class_alias('Twig\TokenParser\IfTokenParser', 'Twig_TokenParser_If'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ImportTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ImportTokenParser.php new file mode 100644 index 0000000..b5674c1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/ImportTokenParser.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\Expression\AssignNameExpression; +use Twig\Node\ImportNode; +use Twig\Token; + +/** + * Imports macros. + * + * {% import 'forms.html' as forms %} + */ +final class ImportTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $macro = $this->parser->getExpressionParser()->parseExpression(); + $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5, 'as'); + $var = new AssignNameExpression($this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5)->getValue(), $token->getLine()); + $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3); + + $this->parser->addImportedSymbol('template', $var->getAttribute('name')); + + return new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope()); + } + + public function getTag() + { + return 'import'; + } +} + +class_alias('Twig\TokenParser\ImportTokenParser', 'Twig_TokenParser_Import'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php new file mode 100644 index 0000000..e1e95da --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php @@ -0,0 +1,68 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\IncludeNode; +use Twig\Token; + +/** + * Includes a template. + * + * {% include 'header.html' %} + * Body + * {% include 'footer.html' %} + */ +class IncludeTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $expr = $this->parser->getExpressionParser()->parseExpression(); + + list($variables, $only, $ignoreMissing) = $this->parseArguments(); + + return new IncludeNode($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag()); + } + + protected function parseArguments() + { + $stream = $this->parser->getStream(); + + $ignoreMissing = false; + if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'ignore')) { + $stream->expect(/* Token::NAME_TYPE */ 5, 'missing'); + + $ignoreMissing = true; + } + + $variables = null; + if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'with')) { + $variables = $this->parser->getExpressionParser()->parseExpression(); + } + + $only = false; + if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'only')) { + $only = true; + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return [$variables, $only, $ignoreMissing]; + } + + public function getTag() + { + return 'include'; + } +} + +class_alias('Twig\TokenParser\IncludeTokenParser', 'Twig_TokenParser_Include'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/MacroTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/MacroTokenParser.php new file mode 100644 index 0000000..d267387 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/MacroTokenParser.php @@ -0,0 +1,66 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\BodyNode; +use Twig\Node\MacroNode; +use Twig\Node\Node; +use Twig\Token; + +/** + * Defines a macro. + * + * {% macro input(name, value, type, size) %} + * <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" /> + * {% endmacro %} + */ +final class MacroTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + + $arguments = $this->parser->getExpressionParser()->parseArguments(true, true); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $this->parser->pushLocalScope(); + $body = $this->parser->subparse([$this, 'decideBlockEnd'], true); + if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) { + $value = $token->getValue(); + + if ($value != $name) { + throw new SyntaxError(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + } + $this->parser->popLocalScope(); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $this->parser->setMacro($name, new MacroNode($name, new BodyNode([$body]), $arguments, $lineno, $this->getTag())); + + return new Node(); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endmacro'); + } + + public function getTag() + { + return 'macro'; + } +} + +class_alias('Twig\TokenParser\MacroTokenParser', 'Twig_TokenParser_Macro'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php new file mode 100644 index 0000000..1f57987 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\IncludeNode; +use Twig\Node\SandboxNode; +use Twig\Node\TextNode; +use Twig\Token; + +/** + * Marks a section of a template as untrusted code that must be evaluated in the sandbox mode. + * + * {% sandbox %} + * {% include 'user.html' %} + * {% endsandbox %} + * + * @see https://twig.symfony.com/doc/api.html#sandbox-extension for details + */ +final class SandboxTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideBlockEnd'], true); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + // in a sandbox tag, only include tags are allowed + if (!$body instanceof IncludeNode) { + foreach ($body as $node) { + if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) { + continue; + } + + if (!$node instanceof IncludeNode) { + throw new SyntaxError('Only "include" tags are allowed within a "sandbox" section.', $node->getTemplateLine(), $stream->getSourceContext()); + } + } + } + + return new SandboxNode($body, $token->getLine(), $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endsandbox'); + } + + public function getTag() + { + return 'sandbox'; + } +} + +class_alias('Twig\TokenParser\SandboxTokenParser', 'Twig_TokenParser_Sandbox'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SetTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SetTokenParser.php new file mode 100644 index 0000000..82fee26 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SetTokenParser.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\SetNode; +use Twig\Token; + +/** + * Defines a variable. + * + * {% set foo = 'foo' %} + * {% set foo = [1, 2] %} + * {% set foo = {'foo': 'bar'} %} + * {% set foo = 'foo' ~ 'bar' %} + * {% set foo, bar = 'foo', 'bar' %} + * {% set foo %}Some content{% endset %} + */ +final class SetTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $names = $this->parser->getExpressionParser()->parseAssignmentExpression(); + + $capture = false; + if ($stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) { + $values = $this->parser->getExpressionParser()->parseMultitargetExpression(); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + if (\count($names) !== \count($values)) { + throw new SyntaxError('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + } else { + $capture = true; + + if (\count($names) > 1) { + throw new SyntaxError('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $values = $this->parser->subparse([$this, 'decideBlockEnd'], true); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + } + + return new SetNode($capture, $names, $values, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Token $token) + { + return $token->test('endset'); + } + + public function getTag() + { + return 'set'; + } +} + +class_alias('Twig\TokenParser\SetTokenParser', 'Twig_TokenParser_Set'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php new file mode 100644 index 0000000..b58624d --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php @@ -0,0 +1,56 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\SpacelessNode; +use Twig\Token; + +/** + * Remove whitespaces between HTML tags. + * + * {% spaceless %} + * <div> + * <strong>foo</strong> + * </div> + * {% endspaceless %} + * {# output will be <div><strong>foo</strong></div> #} + * + * @deprecated since Twig 2.7, to be removed in 3.0 (use the "spaceless" filter with the "apply" tag instead) + */ +final class SpacelessTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + $lineno = $token->getLine(); + + @trigger_error(sprintf('The spaceless tag in "%s" at line %d is deprecated since Twig 2.7, use the "spaceless" filter with the "apply" tag instead.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + $body = $this->parser->subparse([$this, 'decideSpacelessEnd'], true); + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new SpacelessNode($body, $lineno, $this->getTag()); + } + + public function decideSpacelessEnd(Token $token) + { + return $token->test('endspaceless'); + } + + public function getTag() + { + return 'spaceless'; + } +} + +class_alias('Twig\TokenParser\SpacelessTokenParser', 'Twig_TokenParser_Spaceless'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/TokenParserInterface.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/TokenParserInterface.php new file mode 100644 index 0000000..6f34106 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/TokenParserInterface.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\Node; +use Twig\Parser; +use Twig\Token; + +/** + * Interface implemented by token parsers. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface TokenParserInterface +{ + /** + * Sets the parser associated with this token parser. + */ + public function setParser(Parser $parser); + + /** + * Parses a token and returns a node. + * + * @return Node + * + * @throws SyntaxError + */ + public function parse(Token $token); + + /** + * Gets the tag name associated with this token parser. + * + * @return string The tag name + */ + public function getTag(); +} + +class_alias('Twig\TokenParser\TokenParserInterface', 'Twig_TokenParserInterface'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Token'); +class_exists('Twig\Parser'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/UseTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/UseTokenParser.php new file mode 100644 index 0000000..266efe5 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/UseTokenParser.php @@ -0,0 +1,73 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Error\SyntaxError; +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Node; +use Twig\Token; + +/** + * Imports blocks defined in another template into the current template. + * + * {% extends "base.html" %} + * + * {% use "blocks.html" %} + * + * {% block title %}{% endblock %} + * {% block content %}{% endblock %} + * + * @see https://twig.symfony.com/doc/templates.html#horizontal-reuse for details. + */ +final class UseTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $template = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + + if (!$template instanceof ConstantExpression) { + throw new SyntaxError('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); + } + + $targets = []; + if ($stream->nextIf('with')) { + do { + $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + + $alias = $name; + if ($stream->nextIf('as')) { + $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue(); + } + + $targets[$name] = new ConstantExpression($alias, -1); + + if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) { + break; + } + } while (true); + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $this->parser->addTrait(new Node(['template' => $template, 'targets' => new Node($targets)])); + + return new Node(); + } + + public function getTag() + { + return 'use'; + } +} + +class_alias('Twig\TokenParser\UseTokenParser', 'Twig_TokenParser_Use'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/WithTokenParser.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/WithTokenParser.php new file mode 100644 index 0000000..c184fd7 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenParser/WithTokenParser.php @@ -0,0 +1,55 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\TokenParser; + +use Twig\Node\WithNode; +use Twig\Token; + +/** + * Creates a nested scope. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class WithTokenParser extends AbstractTokenParser +{ + public function parse(Token $token) + { + $stream = $this->parser->getStream(); + + $variables = null; + $only = false; + if (!$stream->test(/* Token::BLOCK_END_TYPE */ 3)) { + $variables = $this->parser->getExpressionParser()->parseExpression(); + $only = (bool) $stream->nextIf(/* Token::NAME_TYPE */ 5, 'only'); + } + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + $body = $this->parser->subparse([$this, 'decideWithEnd'], true); + + $stream->expect(/* Token::BLOCK_END_TYPE */ 3); + + return new WithNode($body, $variables, $only, $token->getLine(), $this->getTag()); + } + + public function decideWithEnd(Token $token) + { + return $token->test('endwith'); + } + + public function getTag() + { + return 'with'; + } +} + +class_alias('Twig\TokenParser\WithTokenParser', 'Twig_TokenParser_With'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TokenStream.php b/srcs/phpmyadmin/vendor/twig/twig/src/TokenStream.php new file mode 100644 index 0000000..3fb9e86 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TokenStream.php @@ -0,0 +1,134 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * (c) Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Error\SyntaxError; + +/** + * Represents a token stream. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +final class TokenStream +{ + private $tokens; + private $current = 0; + private $source; + + public function __construct(array $tokens, Source $source = null) + { + $this->tokens = $tokens; + $this->source = $source ?: new Source('', ''); + } + + public function __toString() + { + return implode("\n", $this->tokens); + } + + public function injectTokens(array $tokens) + { + $this->tokens = array_merge(\array_slice($this->tokens, 0, $this->current), $tokens, \array_slice($this->tokens, $this->current)); + } + + /** + * Sets the pointer to the next token and returns the old one. + */ + public function next(): Token + { + if (!isset($this->tokens[++$this->current])) { + throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source); + } + + return $this->tokens[$this->current - 1]; + } + + /** + * Tests a token, sets the pointer to the next one and returns it or throws a syntax error. + * + * @return Token|null The next token if the condition is true, null otherwise + */ + public function nextIf($primary, $secondary = null) + { + if ($this->tokens[$this->current]->test($primary, $secondary)) { + return $this->next(); + } + } + + /** + * Tests a token and returns it or throws a syntax error. + */ + public function expect($type, $value = null, string $message = null): Token + { + $token = $this->tokens[$this->current]; + if (!$token->test($type, $value)) { + $line = $token->getLine(); + throw new SyntaxError(sprintf('%sUnexpected token "%s"%s ("%s" expected%s).', + $message ? $message.'. ' : '', + Token::typeToEnglish($token->getType()), + $token->getValue() ? sprintf(' of value "%s"', $token->getValue()) : '', + Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''), + $line, + $this->source + ); + } + $this->next(); + + return $token; + } + + /** + * Looks at the next token. + */ + public function look(int $number = 1): Token + { + if (!isset($this->tokens[$this->current + $number])) { + throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source); + } + + return $this->tokens[$this->current + $number]; + } + + /** + * Tests the current token. + */ + public function test($primary, $secondary = null): bool + { + return $this->tokens[$this->current]->test($primary, $secondary); + } + + /** + * Checks if end of stream was reached. + */ + public function isEOF(): bool + { + return /* Token::EOF_TYPE */ -1 === $this->tokens[$this->current]->getType(); + } + + public function getCurrent(): Token + { + return $this->tokens[$this->current]; + } + + /** + * Gets the source associated with this stream. + * + * @internal + */ + public function getSourceContext(): Source + { + return $this->source; + } +} + +class_alias('Twig\TokenStream', 'Twig_TokenStream'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TwigFilter.php b/srcs/phpmyadmin/vendor/twig/twig/src/TwigFilter.php new file mode 100644 index 0000000..9e7b838 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TwigFilter.php @@ -0,0 +1,150 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Node\Expression\FilterExpression; +use Twig\Node\Node; + +/** + * Represents a template filter. + * + * @final since Twig 2.4.0 + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @see https://twig.symfony.com/doc/templates.html#filters + */ +class TwigFilter +{ + private $name; + private $callable; + private $options; + private $arguments = []; + + /** + * Creates a template filter. + * + * @param string $name Name of this filter + * @param callable|null $callable A callable implementing the filter. If null, you need to overwrite the "node_class" option to customize compilation. + * @param array $options Options array + */ + public function __construct(string $name, $callable = null, array $options = []) + { + if (__CLASS__ !== \get_class($this)) { + @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED); + } + + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge([ + 'needs_environment' => false, + 'needs_context' => false, + 'is_variadic' => false, + 'is_safe' => null, + 'is_safe_callback' => null, + 'pre_escape' => null, + 'preserves_safety' => null, + 'node_class' => FilterExpression::class, + 'deprecated' => false, + 'alternative' => null, + ], $options); + } + + public function getName() + { + return $this->name; + } + + /** + * Returns the callable to execute for this filter. + * + * @return callable|null + */ + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Node $filterArgs) + { + if (null !== $this->options['is_safe']) { + return $this->options['is_safe']; + } + + if (null !== $this->options['is_safe_callback']) { + return $this->options['is_safe_callback']($filterArgs); + } + } + + public function getPreservesSafety() + { + return $this->options['preserves_safety']; + } + + public function getPreEscape() + { + return $this->options['pre_escape']; + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} + +// For Twig 1.x compatibility +class_alias('Twig\TwigFilter', 'Twig_SimpleFilter', false); + +class_alias('Twig\TwigFilter', 'Twig_Filter'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Node\Node'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TwigFunction.php b/srcs/phpmyadmin/vendor/twig/twig/src/TwigFunction.php new file mode 100644 index 0000000..c5779af --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TwigFunction.php @@ -0,0 +1,140 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Node\Expression\FunctionExpression; +use Twig\Node\Node; + +/** + * Represents a template function. + * + * @final + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @see https://twig.symfony.com/doc/templates.html#functions + */ +class TwigFunction +{ + private $name; + private $callable; + private $options; + private $arguments = []; + + /** + * Creates a template function. + * + * @param string $name Name of this function + * @param callable|null $callable A callable implementing the function. If null, you need to overwrite the "node_class" option to customize compilation. + * @param array $options Options array + */ + public function __construct(string $name, $callable = null, array $options = []) + { + if (__CLASS__ !== \get_class($this)) { + @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED); + } + + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge([ + 'needs_environment' => false, + 'needs_context' => false, + 'is_variadic' => false, + 'is_safe' => null, + 'is_safe_callback' => null, + 'node_class' => FunctionExpression::class, + 'deprecated' => false, + 'alternative' => null, + ], $options); + } + + public function getName() + { + return $this->name; + } + + /** + * Returns the callable to execute for this function. + * + * @return callable|null + */ + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Node $functionArgs) + { + if (null !== $this->options['is_safe']) { + return $this->options['is_safe']; + } + + if (null !== $this->options['is_safe_callback']) { + return $this->options['is_safe_callback']($functionArgs); + } + + return []; + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} + +// For Twig 1.x compatibility +class_alias('Twig\TwigFunction', 'Twig_SimpleFunction', false); + +class_alias('Twig\TwigFunction', 'Twig_Function'); + +// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name. +class_exists('Twig\Node\Node'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/TwigTest.php b/srcs/phpmyadmin/vendor/twig/twig/src/TwigTest.php new file mode 100644 index 0000000..e15da41 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/TwigTest.php @@ -0,0 +1,109 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig; + +use Twig\Node\Expression\TestExpression; + +/** + * Represents a template test. + * + * @final since Twig 2.4.0 + * + * @author Fabien Potencier <fabien@symfony.com> + * + * @see https://twig.symfony.com/doc/templates.html#test-operator + */ +class TwigTest +{ + private $name; + private $callable; + private $options; + private $arguments = []; + + /** + * Creates a template test. + * + * @param string $name Name of this test + * @param callable|null $callable A callable implementing the test. If null, you need to overwrite the "node_class" option to customize compilation. + * @param array $options Options array + */ + public function __construct(string $name, $callable = null, array $options = []) + { + if (__CLASS__ !== \get_class($this)) { + @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED); + } + + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge([ + 'is_variadic' => false, + 'node_class' => TestExpression::class, + 'deprecated' => false, + 'alternative' => null, + ], $options); + } + + public function getName() + { + return $this->name; + } + + /** + * Returns the callable to execute for this test. + * + * @return callable|null + */ + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} + +// For Twig 1.x compatibility +class_alias('Twig\TwigTest', 'Twig_SimpleTest', false); + +class_alias('Twig\TwigTest', 'Twig_Test'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Util/DeprecationCollector.php b/srcs/phpmyadmin/vendor/twig/twig/src/Util/DeprecationCollector.php new file mode 100644 index 0000000..d373698 --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Util/DeprecationCollector.php @@ -0,0 +1,79 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Util; + +use Twig\Environment; +use Twig\Error\SyntaxError; +use Twig\Source; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +final class DeprecationCollector +{ + private $twig; + + public function __construct(Environment $twig) + { + $this->twig = $twig; + } + + /** + * Returns deprecations for templates contained in a directory. + * + * @param string $dir A directory where templates are stored + * @param string $ext Limit the loaded templates by extension + * + * @return array An array of deprecations + */ + public function collectDir($dir, $ext = '.twig') + { + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY + ), '{'.preg_quote($ext).'$}' + ); + + return $this->collect(new TemplateDirIterator($iterator)); + } + + /** + * Returns deprecations for passed templates. + * + * @param \Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template) + * + * @return array An array of deprecations + */ + public function collect(\Traversable $iterator) + { + $deprecations = []; + set_error_handler(function ($type, $msg) use (&$deprecations) { + if (E_USER_DEPRECATED === $type) { + $deprecations[] = $msg; + } + }); + + foreach ($iterator as $name => $contents) { + try { + $this->twig->parse($this->twig->tokenize(new Source($contents, $name))); + } catch (SyntaxError $e) { + // ignore templates containing syntax errors + } + } + + restore_error_handler(); + + return $deprecations; + } +} + +class_alias('Twig\Util\DeprecationCollector', 'Twig_Util_DeprecationCollector'); diff --git a/srcs/phpmyadmin/vendor/twig/twig/src/Util/TemplateDirIterator.php b/srcs/phpmyadmin/vendor/twig/twig/src/Util/TemplateDirIterator.php new file mode 100644 index 0000000..1ab0dac --- /dev/null +++ b/srcs/phpmyadmin/vendor/twig/twig/src/Util/TemplateDirIterator.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Twig\Util; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +class TemplateDirIterator extends \IteratorIterator +{ + public function current() + { + return file_get_contents(parent::current()); + } + + public function key() + { + return (string) parent::key(); + } +} + +class_alias('Twig\Util\TemplateDirIterator', 'Twig_Util_TemplateDirIterator'); |
