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

全站通知:

帮助:解析函数/arraymap

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

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

arraymap

arraymap用于分割字符串并以指定格式输出。出自扩展 Page Forms

语法

{{#arraymap:字符串|分隔符|别名|输出wikitext|输出分隔符|输出连接词}}

  • 字符串:分割的目标
  • 分隔符:用于分割字符串。默认值为,。为空时将逐字符分割字符串,这会让结果包含很多分隔符。
  • 别名:在输出wikitext中作为占位符。
  • 输出wikitext:包含别名的wikitext,别名将被替换为子字符串多次输出
  • 输出分隔符:可选,默认为英文逗号,。在两个输出wikitext之间会被插入输出分隔符
  • 输出连接词:可选。在最后一个“输出wikitext”前,将使用此连接词替代输出分隔符

示例

指定格式:{{#arraymap:a_b_c | _ | @ | '''@''' | + }}a+b+c
指定格式:{{#arraymap:a_b_c | _ | @ | 有'''@'''的wikitext | …… }}a的wikitext……有b的wikitext……有c的wikitext
指定格式和连接词:{{#arraymap:托奇_环理_小满_秘银_从云_辰纱 | _ | @ | '''@''' | , |和 }}一起开会托奇环理小满秘银从云辰纱一起开会
奇怪的连接词:{{#arraymap:点点,丩卩夂忄,马小萌,Lu | , | @ | {{key|@}} | 、 |同时发现了}}点点丩卩夂忄马小萌 同时发现了 Lu
批量处理:{{#arraymap:apple, banana, cherry | , | @ | {{ucfirst:@}}}}Apple, Banana, Cherry
筛选:{{#arraymap: 2, 7, 4, 9, 3 |,|@|{{#ifexpr: @ > 5 | @ }} }}7, 9

更多用法

字符串可以来自SMW查询,模板参数或其他表达式
这可以在不额外使用模板的情况下,格式化SMW查询结果。
比如:{{#arraymap:一个模板用于获取数据|分隔符|别称|{{一个模板|别称|其他参数}}}}
比如:{{#arraymap:SMW查询|分隔符|别称|简单的wikitext}}

底层代码

/** mediawiki-extensions-PageForms-REL1_37 includes\parserfunctions\PF_ArrayMap.php
 * '#arraymap' is called as:
 * {{#arraymap:value|delimiter|var|formula|new_delimiter}}
 *
 * This function applies the same transformation to every section of a
 * delimited string; each such section, as dictated by the 'delimiter'
 * value, is given the same transformation that the 'var' string is
 * given in 'formula'. 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 make each element
 * in the list a link, you could call the following:
 *
 * {{#arraymap:blue;red;yellow|;|x|[[x]]|;}}
 */

class PFArrayMap {
	public static function run( Parser $parser, $frame, $args ) {
		// Set variables.
		$value = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
		$delimiter = isset( $args[1] ) ? trim( $frame->expand( $args[1] ) ) : ',';
		$var = isset( $args[2] ) ? trim( $frame->expand( $args[2], PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES ) ) : 'x';
		$formula = isset( $args[3] ) ? $args[3] : 'x';
		$new_delimiter = isset( $args[4] ) ? trim( $frame->expand( $args[4] ) ) : ', ';
		$conjunction = isset( $args[5] ) ? trim( $frame->expand( $args[5] ) ) : $new_delimiter;
		// 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, and '\s' represent spaces.
		$delimiter = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $delimiter );
		$new_delimiter = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $new_delimiter );
		$conjunction = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $conjunction );

		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 = [];
		// Add results to the results array only if the old value was
		// non-null, and the new, mapped value is non-null as well.
		foreach ( $values_array as $old_value ) {
			$old_value = trim( $old_value );
			if ( $old_value == '' ) {
				continue;
			}
			$result_value = $frame->expand( $formula, PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES );
			$result_value = str_replace( $var, $old_value, $result_value );
			$result_value = $parser->preprocessToDom( $result_value, $frame->isTemplate() ? Parser::PTD_FOR_INCLUSION : 0 );
			$result_value = trim( $frame->expand( $result_value ) );
			if ( $result_value == '' ) {
				continue;
			}
			$results_array[] = $result_value;
		}
		if ( $conjunction != $new_delimiter ) {
			$conjunction = " " . trim( $conjunction ) . " ";
		}

		$result_text = "";
		$num_values = count( $results_array );
		for ( $i = 0; $i < $num_values; $i++ ) {
			if ( $i == 0 ) {
				$result_text .= $results_array[$i];
			} elseif ( $i == $num_values - 1 ) {
				$result_text .= $conjunction . $results_array[$i];
			} else {
				$result_text .= $new_delimiter . $results_array[$i];
			}
		}
		return $result_text;
	}
}
从 $args 数组中提取传递给函数的参数,并进行必要的处理和展开。
根据指定的分隔符将输入字符串拆分为一个数组。
遍历数组中的每个元素,使用指定的输出wikitext($formula)进行替换和展开,wikitext中的别名($var)被替换为当前元素的值。
对处理后的结果进行修整和展开。
如果结果非空,则将其添加到结果数组中。
根据指定的输出分隔符和输出连接词,将结果数组中的元素连接成最终的结果字符串。
返回结果字符串,用于输出。