MediaWiki:如何以编程方式更新链接状态

MediaWiki:如何以编程方式更新链接状态,mediawiki,mediawiki-api,mediawiki-extensions,Mediawiki,Mediawiki Api,Mediawiki Extensions,我的扩展在页面上呈现附加链接(即在页面文本中添加一些(在htmlpagelinkrenderendhook中)) 有关示例,请参见中的小箭头。箭头由我的扩展自动添加(抱歉,在撰写本文时,源代码尚未发布) 问题是我添加的链接的红/蓝(“新”)状态没有更新 请解释如何使维基百科与常规的[…]MediaWiki链接一起更新我的链接的颜色 我目前的解决方法是运行php维护/update.php。这是一个非常糟糕的解决办法。如何做得更好?通常,您会使用LinkRenderer来创建链接,并使用LinkBa

我的扩展在页面上呈现附加链接(即在页面文本中添加一些
(在
htmlpagelinkrenderend
hook中))

有关示例,请参见中的小箭头。箭头由我的扩展自动添加(抱歉,在撰写本文时,源代码尚未发布)

问题是我添加的链接的红/蓝(“新”)状态没有更新

请解释如何使维基百科与常规的
[…]
MediaWiki链接一起更新我的链接的颜色


我目前的解决方法是运行
php维护/update.php
。这是一个非常糟糕的解决办法。如何做得更好?

通常,您会使用
LinkRenderer
来创建链接,并使用
LinkBatch
来提高页面存在性检查的效率(您不希望每个链接都有单独的SQL查询)。在
htmlagelinkrenderrend
中,您不能真正做到这一点,因为您只能逐个了解链接


解析器处理这个问题的方式是,它用占位符替换链接并将它们收集到一个列表中,然后在解析基本完成后,它会立即查找所有链接,然后用呈现的链接切换占位符。你可能会陷入两者之间发生的某些事情(例如,
parservaterparse
),从解析器中获取链接列表,并使用它们构建自己的链接列表。

在Wikitech-l邮件列表的宝贵帮助下,我找到了一个解决方案

解决方案是使用ParserAvertidy钩子

public static function onParserAfterTidy( &$parser, &$text ) {
            # ...

            $parserOutput = $parser->getOutput();

            foreach($parserOutput->getLinks() as ...) {
                    # ...

                    $parserOutput->addLink( Title::newFromDBkey(...) );
            }
}

嗯,有这样的
parser/LinkHolderArray.php
但是你的解决方案解决了我的主要问题吗:如何让MediaWiki引擎知道我添加的链接,这样它就可以根据需要重新呈现我的页面,在红/蓝链接之间切换?为什么引擎必须知道你的链接?如果您担心它们不会出现在
特别版:WhatLinksHere
等中,您可以在一个与
LinksUpdate
相关的钩子中解决。似乎
LinksUpdate
的作用与我的需要相反:它更新保存文档中的链接,而我需要更新到保存文档的链接。怎样?!否,
LinksUpdate
更新指向已保存文档的链接(例如,创建链接文章时,红色链接可能变为蓝色)。