Page MenuHomePhabricator

WikifunctionsPFragmentHandler: Make extractWikifunctionCallArguments ignore named arguments
Closed, ResolvedPublicBUG REPORT

Description

Description

Parsoid doesn't yet support named arguments T390344: v3 parserfunction serialization doesn't properly support named arguments
This means that we won't be able to use renderlang and parselang yet.

In our FragmentHandler class, when we encounter named arguments, instead of ignoring them, we add them to the set of unnamed args, so with a call like this:

{{#function:Z10000|pango|linooooo|renderlang=en|parselang=es}}

The extracted arguments look like this:

array(
  'target' => 'Z10000',
  'arguments' => 
  array (
    'Z10000K1' => 'pango',
    'Z10000K2' => 'linooooo',
    'Z10000K3' => 'renderlang=en',
    'Z10000K4' => 'parselang=es',
  ),
  'parseLang' => 'en',
  'renderLang' => 'en',
)

Throwing a PHP exception:

Screenshot from 2025-04-08 21-23-48.png (354×1 px, 70 KB)

2025-04-08 19:21:45 befe9d397078 my_wiki: [81a4ade35648d235c6e75a62] /wiki/User:Admin   PHP Warning: Undefined array key 6
#0 /var/www/html/w/vendor/wikimedia/parsoid/src/NodeData/TemplateInfo.php(71): MediaWiki\Exception\MWExceptionHandler::handleError()
#1 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonStaticClassCodec.php(62): Wikimedia\Parsoid\NodeData\TemplateInfo::newFromJsonArray()
#2 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonCodec.php(408): Wikimedia\JsonCodec\JsonStaticClassCodec->newFromJsonArray()
#3 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonCodec.php(399): Wikimedia\JsonCodec\JsonCodec->newFromJsonArray()
#4 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonCodec.php(399): Wikimedia\JsonCodec\JsonCodec->newFromJsonArray()
#5 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonCodec.php(399): Wikimedia\JsonCodec\JsonCodec->newFromJsonArray()
#6 /var/www/html/w/vendor/wikimedia/json-codec/src/JsonCodec.php(117): Wikimedia\JsonCodec\JsonCodec->newFromJsonArray()
#7 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMDataUtils.php(627): Wikimedia\JsonCodec\JsonCodec->newFromJsonString()
#8 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMUtils.php(84): Wikimedia\Parsoid\Utils\DOMDataUtils::loadDataAttribs()
#9 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMUtils.php(88): Wikimedia\Parsoid\Utils\DOMUtils::visitDOM()
#10 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMUtils.php(88): Wikimedia\Parsoid\Utils\DOMUtils::visitDOM()
#11 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMUtils.php(88): Wikimedia\Parsoid\Utils\DOMUtils::visitDOM()
#12 /var/www/html/w/vendor/wikimedia/parsoid/src/Utils/DOMDataUtils.php(585): Wikimedia\Parsoid\Utils\DOMUtils::visitDOM()
#13 /var/www/html/w/vendor/wikimedia/parsoid/src/Core/DomPageBundle.php(139): Wikimedia\Parsoid\Utils\DOMDataUtils::visitAndLoadDataAttribs()
#14 /var/www/html/w/includes/OutputTransform/ContentDOMTransformStage.php(66): Wikimedia\Parsoid\Core\DomPageBundle->toDom()
#15 /var/www/html/w/includes/OutputTransform/ContentDOMTransformStage.php(33): MediaWiki\OutputTransform\ContentDOMTransformStage->parsoidTransform()
#16 /var/www/html/w/includes/OutputTransform/OutputTransformPipeline.php(80): MediaWiki\OutputTransform\ContentDOMTransformStage->transform()
#17 /var/www/html/w/includes/Output/OutputPage.php(2563): MediaWiki\OutputTransform\OutputTransformPipeline->run()
#18 /var/www/html/w/includes/Output/OutputPage.php(2646): MediaWiki\Output\OutputPage->getParserOutputText()
#19 /var/www/html/w/includes/page/Article.php(979): MediaWiki\Output\OutputPage->addParserOutput()
#20 /var/www/html/w/includes/page/Article.php(871): MediaWiki\Page\Article->doOutputFromRenderStatus()
#21 /var/www/html/w/includes/page/Article.php(552): MediaWiki\Page\Article->generateContentOutput()
#22 /var/www/html/w/includes/actions/ViewAction.php(80): MediaWiki\Page\Article->view()
#23 /var/www/html/w/includes/actions/ActionEntryPoint.php(728): MediaWiki\Actions\ViewAction->show()
#24 /var/www/html/w/includes/actions/ActionEntryPoint.php(505): MediaWiki\Actions\ActionEntryPoint->performAction()
#25 /var/www/html/w/includes/actions/ActionEntryPoint.php(143): MediaWiki\Actions\ActionEntryPoint->performRequest()
#26 /var/www/html/w/includes/MediaWikiEntryPoint.php(202): MediaWiki\Actions\ActionEntryPoint->execute()
#27 /var/www/html/w/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#28 {main}

And also rendering our function call with an error of the type "wrong number of arguments"

Expected behavior (Acceptance criteria):

  • All named arguments should be ignored by extractWikifunctionCallArguments
  • The array of arguments should only contained unnamed args, indexed by sequential ZKeys. For example, the extracted args of the example above should be:
array(
  'target' => 'Z10000',
  'arguments' => 
  array (
    'Z10000K1' => 'pango',
    'Z10000K2' => 'linooooo',
  ),
  'parseLang' => 'en',
  'renderLang' => 'en',
)

Completion checklist

Event Timeline

Note that we have a check that's meant to do this already ("Ignore any other named arguments"), but clearly it's failing. Perhaps getOrderedArgs() is giving us the arguments including the name?

I'm going to call this Essential, as it risks errors in prod if we don't do it.

gengh changed the task status from Open to In Progress.May 6 2025, 10:04 PM
DSantamaria changed the task status from In Progress to Open.May 12 2025, 3:40 PM

Change #1147024 had a related patch set uploaded (by Genoveva Galarza; author: Genoveva Galarza):

[mediawiki/extensions/WikiLambda@master] Ignore named arguments so that function calls can be executed

https://gerrit.wikimedia.org/r/1147024

gengh changed the task status from Open to In Progress.May 16 2025, 5:23 PM

Change #1147024 merged by jenkins-bot:

[mediawiki/extensions/WikiLambda@master] Ignore named arguments so that function calls can be executed

https://gerrit.wikimedia.org/r/1147024