社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103

全站通知:

帮助:解析函数/dowhile

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

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

dowhile

循环。只要条件wikitext的结果非空白,就会持续循环。出自扩展 Loops

与#while不同的是,循环体的内容会至少执行一次。

语法

{{#dowhile: 条件 | 代码 }}

  • 条件:表示循环继续执行的条件。只要条件wikitext的结果非空,就会持续循环
  • 代码:表示每次循环要执行的代码块,即每次都会重复解析的wikitext。

示例

以列表的格式输出0-4

{{#vardefine: i | 0 }}{{#dowhile:
 | {{#ifexpr: {{#var: i }} < 5 | true }}
 | <nowiki/>
* {{#var: i }}{{#vardefine: i | {{#expr: {{#var: i }} + 1 }} }}
}}

  • 0
  • 1
  • 2
  • 3
  • 4

至少会执行一次(如果换成while则没有输出,因为首次运行时条件就不满足):

{{#vardefine: i | 9999 }}{{#dowhile:
 | {{#ifexpr: {{#var: i }} < 1 | true }}
 | <nowiki/>
* {{#var: i }}{{#vardefine: i | {{#expr: {{#var: i }} + 1 }} }}
}}

  • 9999


底层代码

/** mediawiki-extensions-Loops-REL1_37\ExtLoops.php
 * @param Parser $parser
 * @param PPFrame $frame
 * @param array $args
 * @return string
 */
public static function pfObj_dowhile( Parser $parser, PPFrame $frame, array $args ) {
	return self::perform_while( $parser, $frame, $args, true );
}

/** mediawiki-extensions-Loops-REL1_37\ExtLoops.php
 * Generic function handling '#while' and '#dowhile' as one
 * @param Parser $parser
 * @param PPFrame $frame
 * @param array $args
 * @param bool $dowhile
 * @return string
 */
protected static function perform_while(
	Parser $parser,
	PPFrame $frame,
	array $args,
	$dowhile = false
) {
	// #(do)while: | condition | code
	// unexpanded condition
	$rawCond = isset( $args[1] ) ? $args[1] : '';
	// unexpanded loop code
	$rawCode = isset( $args[2] ) ? $args[2] : '';

	if (
		$dowhile === false
		&& trim( $frame->expand( $rawCond ) ) === ''
	) {
		// while, but condition not fullfilled from the start
		return '';
	}

	$output = '';

	do {
		// limit check:
		if ( !self::incrCounter( $parser ) ) {
			return self::msgLoopsLimit( $output );
		}
		$output .= trim( $frame->expand( $rawCode ) );

	} while ( trim( $frame->expand( $rawCond ) ) );

	return $output;
}
代码逻辑:
  • 条件检查:如果当前不是 `dowhile` 循环(即 `$dowhile` 为 `false`),并且条件为空,则直接结束(返回空字符串)。否则进入循环体。
  • 循环执行:
    • 在每次循环开始前,检查是否超过了最大循环次数限制。如果超过限制,返回错误信息。
    • 执行循环体内的代码,并将结果添加到输出字符串 $output 中。
    • 检查条件是否为真(条件wikitext解析结果是非空字符串)。如果是真,则继续下一次循环;否则,退出循环。
  • 返回结果:最终返回循环体内所有执行结果的拼接字符串 $output。

实际用例

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