From a9044ffcabffcee9643ee695289bb47a5c1a00e0 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Wed, 24 Feb 2021 02:22:58 +0100 Subject: [PATCH 1/2] Upgrade phpmyadmin/twig-i18n-extension to 4.0 Signed-off-by: William Desportes --- composer.json | 2 +- .../classes/Command/CacheWarmupCommand.php | 5 + libraries/classes/Twig/I18n/NodeTrans.php | 156 ------------------ .../classes/Twig/I18n/TokenParserTrans.php | 74 --------- libraries/classes/Twig/I18nExtension.php | 14 +- 5 files changed, 11 insertions(+), 240 deletions(-) delete mode 100644 libraries/classes/Twig/I18n/NodeTrans.php delete mode 100644 libraries/classes/Twig/I18n/TokenParserTrans.php diff --git a/composer.json b/composer.json index be92d3ea70..e262cde0ba 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,7 @@ "phpmyadmin/motranslator": "^5.0", "phpmyadmin/shapefile": "^3.0.1", "phpmyadmin/sql-parser": "^5.0", - "phpmyadmin/twig-i18n-extension": "^3.0", + "phpmyadmin/twig-i18n-extension": "^4.0", "phpseclib/phpseclib": "^3.0", "symfony/config": "^5.2.3", "symfony/dependency-injection": "^5.2.3", diff --git a/libraries/classes/Command/CacheWarmupCommand.php b/libraries/classes/Command/CacheWarmupCommand.php index 225c317ab8..621993a2f6 100644 --- a/libraries/classes/Command/CacheWarmupCommand.php +++ b/libraries/classes/Command/CacheWarmupCommand.php @@ -10,6 +10,7 @@ use PhpMyAdmin\Routing; use PhpMyAdmin\Tests\Stubs\DbiDummy; use PhpMyAdmin\Twig\AssetExtension; use PhpMyAdmin\Twig\CoreExtension; +use PhpMyAdmin\Twig\Extensions\Node\TransNode; use PhpMyAdmin\Twig\I18nExtension; use PhpMyAdmin\Twig\MessageExtension; use PhpMyAdmin\Twig\PluginsExtension; @@ -122,6 +123,10 @@ final class CacheWarmupCommand extends Command 'auto_reload' => true, 'cache' => $tmpDir, ]); + + // Add this to know at what line the code was for getDebugInfo to work + TransNode::$enableAddDebugInfo = true; + $twig->setExtensions([ new AssetExtension(), new CoreExtension(), diff --git a/libraries/classes/Twig/I18n/NodeTrans.php b/libraries/classes/Twig/I18n/NodeTrans.php deleted file mode 100644 index 367e379ac2..0000000000 --- a/libraries/classes/Twig/I18n/NodeTrans.php +++ /dev/null @@ -1,156 +0,0 @@ -node). - * The attributes are automatically made available as array items ($this['name']). - * - * @param Node $body Body of node trans - * @param Node|null $plural Node plural - * @param AbstractExpression $count Node count - * @param Node|null $context Node context - * @param Node|null $notes Node notes - * @param int $lineno The line number - * @param string $tag The tag name associated with the Node - */ - public function __construct( - Node $body, - ?Node $plural, - ?AbstractExpression $count, - ?Node $context, - ?Node $notes, - int $lineno, - string $tag - ) { - $nodes = ['body' => $body]; - if ($count !== null) { - $nodes['count'] = $count; - } - if ($plural !== null) { - $nodes['plural'] = $plural; - } - if ($context !== null) { - $nodes['context'] = $context; - } - if ($notes !== null) { - $nodes['notes'] = $notes; - } - - Node::__construct($nodes, [], $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Compiler $compiler Node compiler - * - * @return void - */ - public function compile(Compiler $compiler) - { - $compiler->addDebugInfo($this); - - [$msg, $vars] = $this->compileString($this->getNode('body')); - - $msg1 = null; - if ($this->hasNode('plural')) { - [$msg1, $vars1] = $this->compileString($this->getNode('plural')); - - $vars = array_merge($vars, $vars1); - } - - $function = $this->getTransFunction( - $this->hasNode('plural'), - $this->hasNode('context') - ); - - 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(["\n", "\r"], ' ', $message); - $compiler->write('// l10n: ' . $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 ($var->getAttribute('name') === 'count') { - $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 . '('); - - if ($this->hasNode('context')) { - $context = trim($this->getNode('context')->getAttribute('data')); - $compiler->write('"' . $context . '", '); - } - - $compiler->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 bool $plural Return plural or singular function to use - * @param bool $hasMsgContext It has message context? - */ - protected function getTransFunction($plural, bool $hasMsgContext = false): string - { - if ($hasMsgContext) { - return $plural ? '_ngettext' : '_pgettext'; - } - - return $plural ? '_ngettext' : '_gettext'; - } -} diff --git a/libraries/classes/Twig/I18n/TokenParserTrans.php b/libraries/classes/Twig/I18n/TokenParserTrans.php deleted file mode 100644 index 94045e9fbd..0000000000 --- a/libraries/classes/Twig/I18n/TokenParserTrans.php +++ /dev/null @@ -1,74 +0,0 @@ -getLine(); - $stream = $this->parser->getStream(); - $count = null; - $plural = null; - $notes = null; - $context = null; - - if (! $stream->test(Token::BLOCK_END_TYPE)) { - $body = $this->parser->getExpressionParser()->parseExpression(); - } else { - $stream->expect(Token::BLOCK_END_TYPE); - $body = $this->parser->subparse([$this, 'decideForFork']); - $next = $stream->next()->getValue(); - - if ($next === 'plural') { - $count = $this->parser->getExpressionParser()->parseExpression(); - $stream->expect(Token::BLOCK_END_TYPE); - $plural = $this->parser->subparse([$this, 'decideForFork']); - - if ($stream->next()->getValue() === 'notes') { - $stream->expect(Token::BLOCK_END_TYPE); - $notes = $this->parser->subparse([$this, 'decideForEnd'], true); - } - } elseif ($next === 'context') { - $stream->expect(Token::BLOCK_END_TYPE); - $context = $this->parser->subparse([$this, 'decideForEnd'], true); - } elseif ($next === 'notes') { - $stream->expect(Token::BLOCK_END_TYPE); - $notes = $this->parser->subparse([$this, 'decideForEnd'], true); - } - } - - $stream->expect(Token::BLOCK_END_TYPE); - - $this->checkTransString($body, $lineno); - - return new NodeTrans($body, $plural, $count, $context, $notes, $lineno, $this->getTag()); - } - - /** - * Tests the current token for a type. - * - * @param Token $token Twig token to test - * - * @return bool - */ - public function decideForFork(Token $token) - { - return $token->test(['plural', 'context', 'notes', 'endtrans']); - } -} diff --git a/libraries/classes/Twig/I18nExtension.php b/libraries/classes/Twig/I18nExtension.php index f22d6dd235..724ef44685 100644 --- a/libraries/classes/Twig/I18nExtension.php +++ b/libraries/classes/Twig/I18nExtension.php @@ -5,20 +5,15 @@ declare(strict_types=1); namespace PhpMyAdmin\Twig; use PhpMyAdmin\Twig\Extensions\I18nExtension as TwigI18nExtension; -use PhpMyAdmin\Twig\I18n\TokenParserTrans; -use Twig\TokenParser\TokenParserInterface; +use PhpMyAdmin\Twig\Extensions\Node\TransNode; use Twig\TwigFilter; class I18nExtension extends TwigI18nExtension { - /** - * Returns the token parser instances to add to the existing list. - * - * @return TokenParserInterface[] - */ - public function getTokenParsers() + public function __construct() { - return [new TokenParserTrans()]; + TransNode::$notesLabel = '// l10n: '; + TransNode::$enableMoTranslator = true; } /** @@ -29,6 +24,7 @@ class I18nExtension extends TwigI18nExtension public function getFilters() { return [ + // This is just a performance override new TwigFilter('trans', '_gettext'), ]; } From 6617805d0d2b6786f74ed6e3e63a6c803e897c20 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Thu, 25 Feb 2021 01:51:34 +0100 Subject: [PATCH 2/2] Update baselines Signed-off-by: William Desportes --- phpstan-baseline.neon | 5 ----- psalm-baseline.xml | 9 --------- 2 files changed, 14 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 49fc4bff67..da6a572d74 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -2200,11 +2200,6 @@ parameters: count: 2 path: libraries/classes/Transformations.php - - - message: "#^Parameter \\#1 \\$node of method Twig\\\\Compiler\\:\\:subcompile\\(\\) expects Twig\\\\Node\\\\Node, Twig\\\\Node\\\\Node\\|null given\\.$#" - count: 3 - path: libraries/classes/Twig/I18n/NodeTrans.php - - message: "#^Parameter \\#1 \\$stack of function array_push expects array, array\\\\|string given\\.$#" count: 1 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 66c11ed458..84a9874e03 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -2602,15 +2602,6 @@ $row['comment'] - - - $msg1 - $msg1 - $this->hasNode('count') ? $this->getNode('count') : null - $this->hasNode('count') ? $this->getNode('count') : null - $this->hasNode('count') ? $this->getNode('count') : null - - $cls::$id