我正在使用MediaWiki。维基中的某些页面包含一个或多个大型导航块,如本页底部的那些:
这些块包含在许多页面中。现在,当保存页面时,也会更新指向其他页面的链接列表(pagelinks
表)。这些引用由“这里有什么链接”特殊页面以及可能的其他类似页面使用。
但我实际上不希望这些块中的链接计算在内。有没有办法可以影响MediaWiki在这个更新链接到其他页面的过程中排除页面的某些部分?
我已经编写了一些扩展,覆盖了特定的类并使用了一些钩子,所以我知道这些东西是如何工作的基础知识,但我找不到合适的钩子来影响这部分过程。
就任何尝试而言,我发现ParserOutput::addLink
,用于将解析后的链接存储到数组中。然后,在保存时,此数组将合并到数据库中。 addLink是从几个地方调用的,最明显的是来自Parser::replaceInternalLinks2
,来自Parser::internalParse
。
如果我理解正确,则会分别为每段文字调用internalParse
。这包括单独的包含,但也包括嵌套标签。也许我可以使用internalParse
中调用的钩子,但我还没有找到圣杯。我可以使用正确的方向来解决它,最好不要修改Parser类本身。
答案 0 :(得分:6)
解决此问题的最简单方法是不对链接使用[[wiki link]]
语法。您可以将外部链接语法与完整网址[http://like/this like this]
一起使用,并将它们包含在带有class="plainlinks"
的div或span中,使其看起来像常规内部链接。为了减轻痛苦,请为此制作一个模板:
在Template:NaviLink中,您将拥有:
<span class="plainlinks">[{{fullurle:{fullurle
}}} {{{2|{* {{NaviLink|Efteling Golf course}}
* {{NaviLink|Haunted Castle (Efteling)|Haunted Castle}}
}}}}]</span>
(对于mediawiki的疯狂模板语法而言) (有关{{1}}的豁免,请参阅https://www.mediawiki.org/wiki/Fullurl#URL_data)
在导航模板中,您将使用例如:
{{1}}
您还可以实现一个解析器函数(而不是一个钩子)来代替NaviLink模板,该函数输出所需链接的HTML,而不会将任何内容放入数据库。我不明白你为什么要这样做,但是如果你愿意,可以看一下https://www.mediawiki.org/wiki/Manual:Parser_functions。
PS:对于包含的文本位,不单独调用internalParse。模板扩展由预处理器完成,然后在生成的wikitext上运行实际的解析器。