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

帮助:解析函数/arraymaptemplate

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
arraymaptemplate 悬浮框🟢稳定可用
分割字符串,用指定模板逐一渲染输出
{{#arraymaptemplate: 字符串 | 模板名 | 分隔符 | 输出分隔符 }}
扩展:Page Forms
字符串
模板
相关函数
相关资源

arraymaptemplate

分割字符串,用指定模板逐一输出。出自扩展 Page Forms

比如把字符串 托奇、环理、辰纱 按顿号切分,并用模板 ListLine 渲染每个名字,最终生成带项目符号的列表。片段会作为参数 {{{1}}} 传入模板。

当元素需要复杂格式(多行结构、带条件判断、包含链接/图标/样式等)时,优先使用本函数,将"格式化逻辑"下放到模板中处理,避免在 #arraymap 中堆叠复杂 wikitext 造成"嵌套地狱"。

语法

{{#arraymaptemplate: 字符串 | 模板名 | 分隔符 | 输出分隔符 }}

参数

字符串
要拆分的原始文本
模板名
用于渲染每个片段的模板,片段作为 {{{1}}}(即参数 1)传入模板
分隔符
用来切分字符串(非正则表达式)
留空时改为"逐字符切分"
输出分隔符
连接各次模板输出的文本
默认值:, (英文逗号+空格)
支持 \n 表示换行

效果

  • 输出:按"输出分隔符"连接所有模板渲染结果
  • 效果:字符串拆分后,每个非空片段都会被传入指定模板进行展开,空片段会被跳过

示例

假设有“模板:Demo”,内容为 {{{1}}}

代码 输出 显示效果
{{#arraymaptemplate:托奇、环理、辰纱|Demo|、|\n\n}}
托奇

环理

辰纱

托奇

环理

辰纱

{{#arraymaptemplate:a;b;c|Demo|;|, }}
a,b,c
a,b,c
{{#arraymaptemplate:红蓝绿|Demo||<br>}}
红<br>蓝<br>绿



绿

使用场景

本函数行为类似 #arraymap,但把格式化逻辑封装到模板中。主要优势在于:

场景 1:复杂渲染逻辑

当需要对每个元素进行多行、带条件的复杂格式化时,使用模板比直接在 #arraymap 中编写 wikitext 更清晰:

{{#arraymaptemplate:角色A、角色B、角色C|角色信息卡片|、|\n}}

其中模板"角色信息卡片"可包含:查询 SMW 属性、显示头像、添加链接、应用 CSS 样式等复杂逻辑。

场景 2:逻辑复用

同一个渲染模板可在多处调用,便于统一维护:

<!-- 页面 A -->
{{#arraymaptemplate:物品1,物品2|物品图标|,}}

<!-- 页面 B -->  
{{#arraymaptemplate:物品3,物品4|物品图标|,}}

修改"物品图标"模板即可统一更新所有使用处的显示效果。

场景 3:避免嵌套地狱

对比以下两种写法:

使用 #arraymap(嵌套复杂):

{{#arraymap:A,B,C|,|@@@|<div class="card">[[{{{@@@}}}|{{#show:{{{@@@}}}|?显示名}}]]... 省略十行card布局HTML ...</div>}}

使用 #arraymaptemplate(逻辑清晰):

{{#arraymaptemplate:A,B,C|卡片模板|,}}

底层代码

/** mediawiki-extensions-PageForms-REL1_37 includes\parserfunctions\PF_ArrayMapTemplate.php
 * '#arraymaptemplate' is called as:
 *
 * {{#arraymaptemplate:value|template|delimiter|new_delimiter}}
 *
 * This function makes the same template call for every section of a
 * delimited string; each such section, as dictated by the 'delimiter'
 * value, is passed as a first parameter to the template specified.
 * Finally, the transformed strings are joined together using the
 * 'new_delimiter' string. Both 'delimiter' and 'new_delimiter'
 * default to commas.
 *
 * Example: to take a semicolon-delimited list, and call a template
 * named 'Beautify' on each element in the list, you could call the
 * following:
 *
 * {{#arraymaptemplate:blue;red;yellow|Beautify|;|;}}
 */

class PFArrayMapTemplate {
	public static function run( Parser $parser, $frame, $args ) {
		// Set variables.
		$value = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
		$template = isset( $args[1] ) ? trim( $frame->expand( $args[1] ) ) : '';
		$delimiter = isset( $args[2] ) ? trim( $frame->expand( $args[2] ) ) : ',';
		$new_delimiter = isset( $args[3] ) ? trim( $frame->expand( $args[3] ) ) : ', ';
		// Unstrip some.
		if ( method_exists( $parser, 'getStripState' ) ) {
			// MW 1.35+
			$delimiter = $parser->getStripState()->unstripNoWiki( $delimiter );
		} else {
			$delimiter = $parser->mStripState->unstripNoWiki( $delimiter );
		}
		// let '\n' represent newlines
		$delimiter = str_replace( '\n', "\n", $delimiter );
		$new_delimiter = str_replace( '\n', "\n", $new_delimiter );

		if ( $delimiter == '' ) {
			$values_array = preg_split( '/(.)/u', $value, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
		} else {
			$values_array = explode( $delimiter, $value );
		}

		$results_array = [];
		foreach ( $values_array as $old_value ) {
			$old_value = trim( $old_value );
			if ( $old_value == '' ) {
				continue;
			}
			$bracketed_value = $frame->virtualBracketedImplode( '{{', '|', '}}',
				$template, '1=' . $old_value );
			// Special handling if preprocessor class is set to
			// 'Preprocessor_Hash'.
			if ( $bracketed_value instanceof PPNode_Hash_Array ) {
				$bracketed_value = $bracketed_value->value;
			}
			$results_array[] = $parser->replaceVariables(
				implode( '', $bracketed_value ), $frame );
		}
		return implode( $new_delimiter, $results_array );
	}
}

处理流程

  1. 参数解析:提取字符串、模板名、分隔符和输出分隔符(默认值分别为空字符串、空字符串、逗号、逗号+空格)
  2. 分隔符处理:对分隔符执行 unstripNoWiki 反转义;将 \n 字符串替换为真实换行符
  3. 字符串拆分:若分隔符为空则逐字符切分(使用正则 /(.)/u),否则按分隔符 explode 切分
  4. 遍历片段:对每个片段去除首尾空白,跳过空字符串
  5. 模板展开:为每个非空片段构造 {{模板名|1=片段}} 并调用解析器展开
  6. 结果连接:用输出分隔符连接所有展开结果
  7. 返回输出:返回最终拼接的字符串

实际用例

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