为 wiki 制作更简单的解析器函数

Making a simpler parser function for a wiki

提问人:oli_vi_er 提问时间:10/27/2021 更新时间:6/29/2022 访问量:161

问:

我需要一个关于游戏的 wiki 模板(Alphabetty Wiki),该模板在给定特定级别时会给出一系列级别(例如“42”->“1-50”)

我可以使用许多 #ifexpr 制作一个,但我现在想知道是否有更简单的解决方案。 我试过 #switch 但它似乎更笨重。

我问这个只是为了更多地了解解析器函数,因为我制作的模板已经有点工作。

模板:

{{#ifexpr:{{{1|}}}<=50|1-50|<!--
-->{{#ifexpr:{{{1|}}}<=95|51-95|<!--
-->{{#ifexpr:{{{1|}}}<=140|96-140|<!--
-->{{#ifexpr:{{{1|}}}<=185|141-185|<!--
-->{{#ifexpr:{{{1|}}}<=230|186-230|<!--
-->{{#ifexpr:{{{1|}}}<=275|231-275|<!--
-->{{#ifexpr:{{{1|}}}<=320|276-320|<!--
-->{{#ifexpr:{{{1|}}}<=365|321-365|<!--
-->{{#ifexpr:{{{1|}}}<=410|366-410|<!--
-->{{#ifexpr:{{{1|}}}<=455|411-455|<!--
-->{{#ifexpr:{{{1|}}}<=500|456-500|<!--
-->{{#ifexpr:{{{1|}}}<=545|501-545|<!--
-->{{#ifexpr:{{{1|}}}<=590|546-590|<!--
-->{{#ifexpr:{{{1|}}}<=620|591-620|<!--
-->{{#ifexpr:{{{1|}}}<=650|621-650|<!--
-->{{#ifexpr:{{{1|}}}<=680|651-680|<!--
-->{{#ifexpr:{{{1|}}}<=710|681-710|<!--
-->{{#ifexpr:{{{1|}}}<=740|711-740|<!--
-->{{#ifexpr:{{{1|}}}<=770|741-770|<!--
-->{{#ifexpr:{{{1|}}}<=800|771-800|<!--
-->{{#ifexpr:{{{1|}}}<=830|801-830|<!--
-->{{#ifexpr:{{{1|}}}<=860|831-860|<!--
-->{{#ifexpr:{{{1|}}}<=890|861-890|891-920}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

如果你对wikicode的工作原理有所了解,你可以直接在wiki上进行测试(你不需要一个帐户来进行编辑,切换到“源代码编辑器”): https://alphabettysaga.fandom.com/fr/wiki/Mod%C3%A8le:Chapitre?action=edit

感谢您抽出宝贵时间接受采访。

解析 wiki mediawiki模板

评论

0赞 IRA1777 10/27/2021
取决于您在 wiki 中拥有的扩展,数组和循环扩展可能是解决方案
0赞 oli_vi_er 10/27/2021
我只是要求基本的Extension:ParserFunctions:mediawiki.org/wiki/Help:Extension:ParserFunctions
0赞 IRA1777 10/27/2021
Y'a Scribunto sur le wiki, tu peux faire un script lua

答:

2赞 Alexander Mashin 10/27/2021 #1

使用一些算术:{{{#expr:}}

<includeonly>{{#ifexpr:{{{1|}}}<=50|1-50|{{#ifexpr:{{{1|}}}<=590|<!--

range length is 45

-->{{#expr: 51 + trunc ( ( {{{1|}}} - 50 ) / 45 ) * 45 }}-{{#expr: 95 + trunc ( ( {{{1|}}} - 50 ) / 45 ) * 45 }}|{{#ifexpr:{{{1|}}} <= 890|<!--

range length is 30

-->{{#expr: 591 + trunc ( ( {{{1|}}} - 590 ) / 30 ) * 30 }}-{{#expr: 620 + trunc ( ( {{{1|}}} - 590 ) / 30 ) * 30 }}|

891-920
}} }} }}</includeonly><noinclude>
{| class="wikitable"
! Level !! Range
|-
| 5 || {{Range|5}}
|-
| 45 || {{Range|45}}
|-
| 55 || {{Range|55}}
|-
| 100 || {{Range|100}}
|-
| 585 || {{Range|585}}
|-
| 595 || {{Range|595}}
|-
| 885 || {{Range|885}}
|-
| 895 || {{Range|895}}
|}</noinclude>

评论

0赞 oli_vi_er 10/27/2021
感谢 Mashin@Alexander,这比我的嵌套列表要优雅得多。此外,我想知道 #ifexpr 是否有嵌套限制,即使我的第一次尝试似乎适用于更大的数字。
0赞 Noam 6/29/2022
确实有深度限制,默认为 40 级,包括模板和解析器函数的任何嵌套。
2赞 Noam 6/29/2022 #2

你可以通过使用具有反向逻辑的 but 来避免巨大的嵌套(除了看起来不那么好之外,也是有限的)。#switch

与其与值进行比较(不适用于范围),不如使用 将布尔值“true”与逻辑表达式进行比较。在实践中,该函数用“1”表示“true”,因此您实际上会比较:{{{1|}}}#expr#expr1

{{#switch:1
| {{#expr:{{{1|}}}<=50}} = 1-50
| {{#expr:{{{1|}}}<=95}} = 51-95
| {{#expr:{{{1|}}}<=140}} = 96-140
| {{#expr:{{{1|}}}<=185}} = 141-185
| {{#expr:{{{1|}}}<=230}} = 186-230
| {{#expr:{{{1|}}}<=275}} = 231-275
| {{#expr:{{{1|}}}<=320}} = 276-320
| {{#expr:{{{1|}}}<=365}} = 321-365
| {{#expr:{{{1|}}}<=410}} = 366-410
| {{#expr:{{{1|}}}<=455}} = 411-455
| {{#expr:{{{1|}}}<=500}} = 456-500
| {{#expr:{{{1|}}}<=545}} = 501-545
| {{#expr:{{{1|}}}<=590}} = 546-590
| {{#expr:{{{1|}}}<=620}} = 591-620
| {{#expr:{{{1|}}}<=650}} = 621-650
| {{#expr:{{{1|}}}<=680}} = 651-680
| {{#expr:{{{1|}}}<=710}} = 681-710
| {{#expr:{{{1|}}}<=740}} = 711-740
| {{#expr:{{{1|}}}<=770}} = 741-770
| {{#expr:{{{1|}}}<=800}} = 771-800
| {{#expr:{{{1|}}}<=830}} = 801-830
| {{#expr:{{{1|}}}<=860}} = 831-860
| {{#expr:{{{1|}}}<=890}} = 861-890
| #default = 891-920
}}