Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
PFArrayMap
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
272
0.00% covered (danger)
0.00%
0 / 1
 run
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 1
272
1<?php
2
3/**
4 * '#arraymap' is called as:
5 * {{#arraymap:value|delimiter|var|formula|new_delimiter}}
6 *
7 * This function applies the same transformation to every section of a
8 * delimited string; each such section, as dictated by the 'delimiter'
9 * value, is given the same transformation that the 'var' string is
10 * given in 'formula'. Finally, the transformed strings are joined
11 * together using the 'new_delimiter' string. Both 'delimiter' and
12 * 'new_delimiter' default to commas.
13 *
14 * Example: to take a semicolon-delimited list, and make each element
15 * in the list a link, you could call the following:
16 *
17 * {{#arraymap:blue;red;yellow|;|x|[[x]]|;}}
18 */
19
20class PFArrayMap {
21    public static function run( Parser $parser, $frame, $args ) {
22        // Set variables.
23        $value = isset( $args[0] ) ? trim( $frame->expand( $args[0] ) ) : '';
24        $delimiter = isset( $args[1] ) ? trim( $frame->expand( $args[1] ) ) : ',';
25        $var = isset( $args[2] ) ? trim( $frame->expand( $args[2], PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES ) ) : 'x';
26        $formula = isset( $args[3] ) ? $args[3] : 'x';
27        $new_delimiter = isset( $args[4] ) ? trim( $frame->expand( $args[4] ) ) : ', ';
28        $conjunction = isset( $args[5] ) ? trim( $frame->expand( $args[5] ) ) : $new_delimiter;
29        // Unstrip some.
30        $delimiter = $parser->getStripState()->unstripNoWiki( $delimiter );
31        // Let '\n' represent newlines, and '\s' represent spaces.
32        $delimiter = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $delimiter );
33        $new_delimiter = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $new_delimiter );
34        $conjunction = str_replace( [ '\n', '\s' ], [ "\n", ' ' ], $conjunction );
35
36        if ( $delimiter == '' ) {
37            $values_array = preg_split( '/(.)/u', $value, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
38        } else {
39            $values_array = explode( $delimiter, $value );
40        }
41
42        $results_array = [];
43        // Add results to the results array only if the old value was
44        // non-null, and the new, mapped value is non-null as well.
45        foreach ( $values_array as $old_value ) {
46            $old_value = trim( $old_value );
47            if ( $old_value == '' ) {
48                continue;
49            }
50            $result_value = $frame->expand( $formula, PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES );
51            $result_value = str_replace( $var, $old_value, $result_value );
52            $result_value = $parser->preprocessToDom( $result_value, $frame->isTemplate() ? Parser::PTD_FOR_INCLUSION : 0 );
53            $result_value = trim( $frame->expand( $result_value ) );
54            if ( $result_value == '' ) {
55                continue;
56            }
57            $results_array[] = $result_value;
58        }
59        if ( $conjunction != $new_delimiter ) {
60            $conjunction = " " . trim( $conjunction ) . " ";
61        }
62
63        $result_text = "";
64        $num_values = count( $results_array );
65        for ( $i = 0; $i < $num_values; $i++ ) {
66            if ( $i == 0 ) {
67                $result_text .= $results_array[$i];
68            } elseif ( $i == $num_values - 1 ) {
69                $result_text .= $conjunction . $results_array[$i];
70            } else {
71                $result_text .= $new_delimiter . $results_array[$i];
72            }
73        }
74        return $result_text;
75    }
76}