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

帮助:解析函数/loop

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

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

loop

循环函数。出自扩展 Loops

重复解析一段wikitext。需要指定循环次数和循环变量。循环变量每次加一,如果循环次数为负数,则变量每次减一。

语法

{{#loop: 变量名 | 起始值 | 循环次数 | 循环内容 }}

  • 变量名(必填):存储当前循环次数的变量名称,可通过访问
  • 起始值(必填):循环计数器初始值,接受整数值
  • 循环次数(必填):绝对值决定循环次数,正负决定递增/递减方向
  • 循环内容(必填):每次循环解析的wikitext内容

循环次数为0时不执行任何操作,负数时执行反向计数。实际循环次数取绝对值,例如"-4"同样执行4次循环。

示例

{{#loop: a | 1 | 4 | {{#var:a}} }} → 1234

{{#loop: j | 7 | -4 | {{#var:j}} }} → 7654

{{#loop: i | 2 | 4 |<nowiki/>
*{{#var:i}}
}}

  • 2
  • 3
  • 4
  • 5

底层代码

来自MediaWiki及其扩展的源代码,运行在服务端。此处仅供快速查阅,便于更充分的挖掘其“特性”。

/** mediawiki-extensions-Loops-REL1_37\ExtLoops.php
 * @param Parser $parser
 * @param PPFrame $frame
 * @param array $args
 * @return string
 */
public static function pfObj_loop( Parser $parser, PPFrame $frame, array $args ) {
	// #loop: var | start | count | code
	$varName  = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
	$startVal = isset( $args[1] ) ? (int)trim( $frame->expand( $args[1] ) ) : 0;
	$loops    = isset( $args[2] ) ? (int)trim( $frame->expand( $args[2] ) ) : 0;
	// unexpanded loop code
	$rawCode = isset( $args[3] ) ? $args[3] : '';

	if ( $loops === 0 ) {
		// no loops to perform
		return '';
	}

	$output = '';
	$endVal = $startVal + $loops;
	$i = $startVal;

	while ( $i !== $endVal ) {
		// limit check:
		if ( !self::incrCounter( $parser ) ) {
			return self::msgLoopsLimit( $output );
		}

		// set current position as variable:
		self::setVariable( $parser, $varName, (string)$i );

		$output .= trim( $frame->expand( $rawCode ) );

		// in-/decrease loop count (count can be negative):
		( $i < $endVal ) ? $i++ : $i--;
	}
	return $output;
}
代码逻辑:
  • 检查循环次数是否为0,若为0直接返回空字符串
  • 通过计数器防止无限循环
  • 每次循环前更新变量值并解析wikitext内容
  • 根据循环次数的正负决定递增/递减方向
  • 循环内容在每次迭代时动态解析,支持嵌套解析函数

实际用例

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

原神 - ys

战双帕弥什 - zspms

明日方舟 - arknights

恋与深空 - lysk

崩坏:星穹铁道 - sr

代号鸢 - yuan

赛马娘 - umamusume

第五人格 - dwrg

坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险 - gt

地下城堡2 - dxcb2

女神转生 - persona

雷索纳斯 - resonance

绝区零 - zzz

公主连结 - pcr

无期迷途 - wqmt

奇迹暖暖 - qjnn

交错战线 - crosscore

梦幻模拟战 - langrisser

偶像荣耀/idoly pride - idolypride

深空之眼 - dhmmr

克鲁赛德战记 - cq

铃兰之剑 - llzj

天地劫 - tdj

江南百景图 - jiangnan

音乐世界Cytus II - cytus2

世界弹射物语 - worldflipper

女神异闻录:夜幕魅影 - nsywl

ティンクルスターナイツ - lkl