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

全站通知:

帮助:解析函数/arraymaptemplate

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

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

arraymaptemplate

分割字符串,并以指定模板格式逐一输出。其行为与arraymap相似。出自扩展 Page Forms

说明
有些类型的映射非常复杂,不能放在 #arraymap 函数中。为此,您可以使用类似的 #arraymaptemplate 函数。
要使用该函数,首先创建一个模板,接收一个字段(模板中应将其称为 {{{1}}}),并将您想要的映射应用到该字段。然后在主模板字段上应用 #arraymaptemplate,就像使用 #arraymap一样
其中 "模板 "是相关映射模板的名称。

语法

{{#arraymaptemplate:字符串|模板名|分隔符|输出分隔符}}
  • 字符串:分割的目标
  • 模板名:用于格式化输出的模板。被分割的字符将作为参数{{{1}}}传入模板
  • 分隔符:用于分割字符串
  • 输出分隔符:可选,默认为,英文逗号,在两个模板输出之间会被插入输出分隔符

示例

要以列表的形式显示作者列表,可以先创建一个名为 "Author"的模板,内容如下:

* {{{1}}}

然后即可使用arraymaptemplate:

{{#arraymaptemplate:托奇、环理、辰纱|Author|、|\n}}


底层代码

/** 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 );
	}
}

代码逻辑简述:

  • 解析参数,并处理 delimiter 和 new_delimiter 中的特殊字符。
  • 拆分字符串,支持正则表达式
  • 调用模板渲染每个子字符串,格式为{{template|1=部分内容}}
  • 使用 new_delimiter 作为分隔符组合结果并返回处理好的字符串

实际用例

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