Tools 是非官方社区Wiki。社区文档正在编写中,欢迎参与。 Wiki编辑答疑群:717421103
版本250722.2
全站通知:

帮助:解析函数/listmap

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

listmap是一个解析函数。帮助:解析函数页列出了所有解析函数的说明。

listmap

列表排序、格式化输出。出自扩展 ParserPower

按照指定的格式和排序方式输出列表元素。只能按字母、数字顺序排序、支持区分大小写和升降序。

语法

{{#listmap:
 |list=
 |insep=
 |outsep=
 |token=
 |tokensep=
 |fieldsep=
 |indextoken=
 |pattern=
 |template=
 |sortmode=
 |sortoptions=
 |duplicates=
 |counttoken=
 |intro=
 |outro=
 |default=
}}

核心参数:

  • list: 列表。如item 1,item 2,item 3
  • insep: 可选,输入分隔符,默认逗号,。用于分割参数list,构建列表

输出格式控制,可选:

  • outsep: 输出分隔符,默认逗号。用作输出时列表项的分隔符。
  • intro, outro: 输出时指定前置和后置内容,列表为空时不输出。用于避免在列表前后使用if来控制前后内容。
    • counttoken: 占位符,用于在intro, outro参数中填充列表项数量
  • default: 过滤后列表如果为空时的输出。

列表项格式参数,可选:

  • token, pattern: token作为占位符,pattern是格式wikitext,每个列表项都将被代入pattern中占位符的位置输出
    • indextoken: pattern中的token将被替换为(列表项的)序号而不是值
  • tokensep, fieldsep: fieldsep是用于列表项的分隔符,此时token可指定多个占位符(默认分隔符是逗号,也可通过tokensep指定),pattern能单独针对列表项的一部分做格式控制
  • template: 通过模板处理列表项,每个列表项被作为参数1传入模板。使用参数会忽略token、tokensep和pattern
    • fieldsep: 列表项分隔符,将每个列表项分割为多个参数传入模板

排序参数,可选:

  • sortmode: 排序时机。值为以下选项之一:
    • nosort 不排序
    • presort 先排序,再格式化列表项。如果格式化不影响排序,使用此选项效率更高。
    • sort 或 postsort 先按格式化列表项,后排序
  • sortoptions: 排序方式,值为以下的一个或多个选项:
    • alpha 或 numeric: 按字母或数字排序,默认字母
    • asc 或 desc: 升序和降序排序
    • ncs 或 cs: 不区分大小写(ncs),或区分(cs),仅对alpha排序生效,默认不区分大小写
  • duplicates: 重复值处理,值为以下选项之一:
    • keep 保留重复值
    • prestrip 在格式化前移除重复值
    • strip 或 poststrip 在格式化后移除重复值。注意,此时wikitext尚未被解析,因此即使指定此选项,获得的结果仍然可能有重复项。
    • pre/poststrip 在格式化前、后均移除一次重复值(目前由于扩展本身的bug,此选项仅能在格式化前执行一次)


示例

  • {{#listmap:list=Apple,Orange,Banana|token=@|pattern=[[首页|@]]}}Apple, Orange, Banana
  • {{#listmap:list=1,10,100,1000|token=@|pattern=\{\{#ifexpr:@\g99\!aa@\!bb\}\} }} → bb, bb, aa100, aa1000
    • 其中,pattern是手动转义的条件,{{#ifexpr:@>123|aa@|bb}}
    • 获得方式:<esc>{{#ifexpr:@>123|aa@|bb}}</esc> → \{\{#ifexpr:@\g123\!aa@\!bb\}\}
    • bwiki需要手动转义(这是一个bug特性)。对于其他平台,应当能直接用esc标签包裹wikitext作为参数。
  • {{#listmap:list=1,1,10,100,1000,1000|token=@|pattern=\{\{#ifexpr:@>99\!aa@\!bb\}\}|duplicates=poststrip}} → bb, bb, aa100, aa1000
    • 结果有两个bb是正常的,因为去重是针对pattern表达式去重,list中1和10的pattern是不同的,最终pattern的展开结果相同

底层代码

请参阅: https://gitlab.com/hydrawiki/extensions/ParserPower/-/blob/master/includes/ParserPowerLists.php?ref_type=heads#L2027

实际用例

一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考