Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 93
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
PFAutoEditRating
0.00% covered (danger)
0.00%
0 / 93
0.00% covered (danger)
0.00%
0 / 1
600
0.00% covered (danger)
0.00%
0 / 1
 run
0.00% covered (danger)
0.00%
0 / 93
0.00% covered (danger)
0.00%
0 / 1
600
1<?php
2
3/**
4 * '#autoedit_rating' is called as:
5 *
6 * {{#autoedit_rating:form=|target=|rating field=|value=|star width=|num stars=|allow half stars=}}
7 *
8 */
9
10use MediaWiki\MediaWikiServices;
11
12class PFAutoEditRating {
13    public static function run( Parser $parser ) {
14        global $wgPageFormsAutoeditNamespaces;
15
16        $parser->getOutput()->addModules( [ 'ext.pageforms.autoeditrating' ] );
17
18        // Set defaults.
19        $formcontent = '';
20        $summary = null;
21        $minorEdit = false;
22        $inQueryArr = [];
23        $editTime = null;
24        $latestRevId = null;
25        $confirmEdit = false;
26        $ratingAttrs = [
27            'class' => 'pfRating',
28            'data-curvalue' => 0,
29            'data-starwidth' => '24px',
30            'data-numstars' => 5,
31            'data-allows-half' => false
32        ];
33
34        // Parse parameters.
35        $params = func_get_args();
36        array_shift( $params );
37
38        $wikiPageFactory = MediaWikiServices::getInstance()->getWikiPageFactory();
39
40        foreach ( $params as $param ) {
41            $elements = explode( '=', $param, 2 );
42
43            $key = trim( $elements[0] );
44            $value = ( count( $elements ) > 1 ) ? trim( $elements[1] ) : '';
45
46            switch ( $key ) {
47                case 'rating field':
48                    $inQueryArr = PFAutoEdit::convertQueryString( $value, $inQueryArr );
49                    break;
50                case 'target':
51                    $value = $parser->recursiveTagParse( $value );
52                    $arr = [ $key => $value ];
53                    $inQueryArr = PFUtils::arrayMergeRecursiveDistinct( $inQueryArr, $arr );
54
55                    $targetTitle = Title::newFromText( $value );
56
57                    if ( $targetTitle !== null ) {
58                        $allowedNamespaces = array_merge(
59                            $wgPageFormsAutoeditNamespaces,
60                            [ NS_CATEGORY ]
61                        );
62                        if ( !in_array( $targetTitle->getNamespace(), $allowedNamespaces ) ) {
63                            $errorMsg = wfMessage( 'pf-autoedit-invalidnamespace', $targetTitle->getNsText() )->parse();
64                            return Html::element( 'div', [ 'class' => 'error' ], $errorMsg );
65                        }
66                        $targetWikiPage = $wikiPageFactory->newFromTitle( $targetTitle );
67                        $targetWikiPage->clear();
68                        $editTime = $targetWikiPage->getTimestamp();
69                        $latestRevId = $targetWikiPage->getLatest();
70                    }
71                    break;
72                case 'value':
73                    $ratingAttrs['data-curvalue'] = $parser->recursiveTagParse( $value );
74                    break;
75                case 'star width':
76                    $ratingAttrs['data-starwidth'] = $parser->recursiveTagParse( $value ) . 'px';
77                    break;
78                case 'num stars':
79                    $ratingAttrs['data-numstars'] = $parser->recursiveTagParse( $value );
80                    break;
81                case 'allow half stars':
82                    $ratingAttrs['data-allows-half'] = true;
83                    break;
84                case 'summary':
85                    $summary = $parser->recursiveTagParse( $value );
86                    break;
87                case 'minor':
88                    $minorEdit = true;
89                    break;
90                case 'confirm':
91                    $confirmEdit = true;
92                    break;
93                default:
94                    $value = $parser->recursiveTagParse( $value );
95                    $arr = [ $key => $value ];
96                    $inQueryArr = PFUtils::arrayMergeRecursiveDistinct( $inQueryArr, $arr );
97            }
98        }
99
100        // query string has to be turned into hidden inputs.
101        if ( !empty( $inQueryArr ) ) {
102            $query_components = explode( '&', http_build_query( $inQueryArr, '', '&' ) );
103            foreach ( $query_components as $query_component ) {
104                $var_and_val = explode( '=', $query_component, 2 );
105                if ( count( $var_and_val ) == 2 ) {
106                    $formcontent .= Html::hidden( urldecode( $var_and_val[0] ), urldecode( $var_and_val[1] ), $var_and_val[1] == '' ? [ 'id' => 'ratingInput' ] : [] );
107                }
108            }
109        }
110
111        if ( $summary == null ) {
112            $summary = wfMessage( 'pf_autoedit_summary', "[[{$parser->getTitle()}]]" )->text();
113        }
114
115        $formcontent .= Html::hidden( 'wpSummary', $summary );
116
117        if ( $minorEdit ) {
118            $formcontent .= Html::hidden( 'wpMinoredit', true );
119        }
120
121        if ( $editTime !== null ) {
122            $formcontent .= Html::hidden( 'wpEdittime', $editTime );
123        }
124        if ( $latestRevId !== null ) {
125            $formcontent .= Html::hidden( 'editRevId', $latestRevId );
126        }
127
128        if ( $confirmEdit ) {
129            $formAttrs = [ 'class' => [ 'autoedit-data', 'confirm-edit' ] ];
130        } else {
131            $formAttrs = [ 'class' => 'autoedit-data' ];
132        }
133
134        $form = Html::rawElement( 'form', $formAttrs, $formcontent );
135
136        $text = Html::element( 'div', $ratingAttrs );
137        $output = Html::rawElement( 'div', [ 'class' => 'autoedit' ],
138            $text .
139            Html::rawElement( 'span', [ 'class' => "autoedit-result" ], null ) .
140            $form
141        );
142
143        return [ $output, 'noparse' => true, 'isHTML' => true ];
144    }
145}