Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
VisualEditorDataModule
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 1
 getScript
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 getDefinitionSummary
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 getMessageInfo
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
6
 enableModuleContentVersion
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getDependencies
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 addOptional
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2/**
3 * Resource loader module providing extra data from the server to VisualEditor.
4 *
5 * @file
6 * @ingroup Extensions
7 * @copyright 2011-2020 VisualEditor Team and others; see AUTHORS.txt
8 * @license MIT
9 */
10
11namespace MediaWiki\Extension\VisualEditor;
12
13use MediaWiki\Registration\ExtensionRegistry;
14use MediaWiki\ResourceLoader\Context as ResourceLoaderContext;
15use MediaWiki\ResourceLoader\FileModule;
16use MediaWiki\ResourceLoader\Module as ResourceLoaderModule;
17use MediaWiki\ResourceLoader\Module;
18use MediaWiki\Title\Title;
19
20class VisualEditorDataModule extends ResourceLoaderModule {
21
22    /**
23     * @param ResourceLoaderContext $context Object containing information about the state of this
24     *   specific loader request.
25     * @return string JavaScript code
26     */
27    public function getScript( ResourceLoaderContext $context ) {
28        $msgInfo = $this->getMessageInfo( $context );
29        $parsedMessages = [];
30        $plainMessages = [];
31        foreach ( $msgInfo['parse'] as $msgKey => $msgObj ) {
32            $parsedMessages[ $msgKey ] = $msgObj->parse();
33        }
34        foreach ( $msgInfo['plain'] as $msgKey => $msgObj ) {
35            $plainMessages[ $msgKey ] = $msgObj->plain();
36        }
37
38        return 've.init.platform.addParsedMessages(' . $context->encodeJson(
39                $parsedMessages
40            ) . ');' .
41            've.init.platform.addMessages(' . $context->encodeJson(
42                $plainMessages
43            ) . ');';
44    }
45
46    /**
47     * Get the definition summary for this module.
48     *
49     * @param ResourceLoaderContext $context
50     * @return array
51     */
52    public function getDefinitionSummary( ResourceLoaderContext $context ) {
53        $summary = parent::getDefinitionSummary( $context );
54
55        $msgVersion = [];
56        $msgInfo = $this->getMessageInfo( $context );
57        $msgInfo = array_merge( $msgInfo['parse'], $msgInfo['plain'] );
58        foreach ( $msgInfo as $msgKey => $msgObj ) {
59            $msgVersion[ $msgKey ] = [
60                // Include the text of the message, in case the canonical translation changes
61                $msgObj->plain(),
62                // Include the page touched time, in case the on-wiki override is invalidated
63                Title::makeTitle( NS_MEDIAWIKI, ucfirst( $msgObj->getKey() ) )->getTouched(),
64            ];
65        }
66        $summary[] = [ 've-messages' => $msgVersion ];
67        return $summary;
68    }
69
70    /**
71     * @param ResourceLoaderContext $context Object containing information about the state of this
72     *   specific loader request.
73     * @return array[] Messages in various states of parsing
74     */
75    protected function getMessageInfo( ResourceLoaderContext $context ) {
76        $editSubmitButtonLabelPublish = $this->getConfig()
77            ->get( 'EditSubmitButtonLabelPublish' );
78        $saveButtonLabelKey = $editSubmitButtonLabelPublish ? 'publishchanges' : 'savechanges';
79        $saveButtonLabel = $context->msg( $saveButtonLabelKey )->text();
80
81        // Messages to be exported as parsed html
82        $parseMsgs = [
83            'missingsummary' => $context->msg( 'missingsummary', $saveButtonLabel ),
84            'summary' => $context->msg( 'summary' ),
85            'visualeditor-browserwarning' => $context->msg( 'visualeditor-browserwarning' ),
86            'visualeditor-wikitext-warning' => $context->msg( 'visualeditor-wikitext-warning' ),
87        ];
88
89        // Messages to be exported as plain text
90        $plainMsgs = [
91            'visualeditor-feedback-link' =>
92                $context->msg( 'visualeditor-feedback-link' )
93                ->inContentLanguage(),
94            'visualeditor-feedback-source-link' =>
95                $context->msg( 'visualeditor-feedback-source-link' )
96                ->inContentLanguage(),
97            'visualeditor-suggestionfeedback-link' =>
98                $context->msg( 'visualeditor-suggestionfeedback-link' )
99                ->inContentLanguage(),
100            'visualeditor-quick-access-characters.json' =>
101                $context->msg( 'visualeditor-quick-access-characters.json' )
102                ->inContentLanguage(),
103            'visualeditor-template-tools-definition.json' =>
104                $context->msg( 'visualeditor-template-tools-definition.json' )
105                ->inContentLanguage(),
106        ];
107
108        return [
109            'parse' => $parseMsgs,
110            'plain' => $plainMsgs,
111        ];
112    }
113
114    /**
115     * @inheritDoc
116     *
117     * Always true.
118     */
119    public function enableModuleContentVersion() {
120        return true;
121    }
122
123    /**
124     * @inheritDoc
125     */
126    public function getDependencies( ?ResourceLoaderContext $context = null ) {
127        return [
128            'ext.visualEditor.base',
129            'ext.visualEditor.mediawiki',
130        ];
131    }
132
133    /**
134     * Add optional array values to a ResourceLoader module definition depending on loaded extensions.
135     *
136     * "factory": "MediaWiki\\Extension\\VisualEditor\\VisualEditorDataModule::addOptional"
137     * "optional": {
138     *   "MyExtension": {
139     *     "dependencies": [ ... ],
140     *     "messages": [ ... ],
141     *     "packageFiles": [ ... ],
142     *     ...
143     *   }
144     * }
145     */
146    public static function addOptional( array $info ): Module {
147        $extensionRegistry = ExtensionRegistry::getInstance();
148
149        if ( isset( $info['optional'] ) ) {
150            foreach ( $info['optional'] as $ext => $extOptions ) {
151                if ( $extensionRegistry->isLoaded( $ext ) ) {
152                    foreach ( $extOptions as $key => $values ) {
153                        if ( !isset( $info[$key] ) ) {
154                            $info[$key] = [];
155                        }
156                        // TODO: Support non-array properties
157                        $info[$key] = array_merge( $info[$key], (array)$values );
158                    }
159                }
160            }
161        }
162
163        $class = $info['class'] ?? FileModule::class;
164        return new $class( $info );
165    }
166}