MailAddress->toString(): Reduce complexity by inverting ifs
[lhc/web/wiklou.git] / includes / MagicWordFactory.php
1 <?php
2 /**
3 * See docs/magicword.txt.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
19 *
20 * @file
21 * @ingroup Parser
22 */
23
24 /**
25 * A factory that stores information about MagicWords, and creates them on demand with caching.
26 *
27 * Possible future improvements:
28 * * Simultaneous searching for a number of magic words
29 * * $mObjects in shared memory
30 *
31 * @since 1.32
32 * @ingroup Parser
33 */
34 class MagicWordFactory {
35 /**#@-*/
36
37 /** @var bool */
38 private $mVariableIDsInitialised = false;
39
40 /** @var string[] */
41 private $mVariableIDs = [
42 '!',
43 'currentmonth',
44 'currentmonth1',
45 'currentmonthname',
46 'currentmonthnamegen',
47 'currentmonthabbrev',
48 'currentday',
49 'currentday2',
50 'currentdayname',
51 'currentyear',
52 'currenttime',
53 'currenthour',
54 'localmonth',
55 'localmonth1',
56 'localmonthname',
57 'localmonthnamegen',
58 'localmonthabbrev',
59 'localday',
60 'localday2',
61 'localdayname',
62 'localyear',
63 'localtime',
64 'localhour',
65 'numberofarticles',
66 'numberoffiles',
67 'numberofedits',
68 'articlepath',
69 'pageid',
70 'sitename',
71 'server',
72 'servername',
73 'scriptpath',
74 'stylepath',
75 'pagename',
76 'pagenamee',
77 'fullpagename',
78 'fullpagenamee',
79 'namespace',
80 'namespacee',
81 'namespacenumber',
82 'currentweek',
83 'currentdow',
84 'localweek',
85 'localdow',
86 'revisionid',
87 'revisionday',
88 'revisionday2',
89 'revisionmonth',
90 'revisionmonth1',
91 'revisionyear',
92 'revisiontimestamp',
93 'revisionuser',
94 'revisionsize',
95 'subpagename',
96 'subpagenamee',
97 'talkspace',
98 'talkspacee',
99 'subjectspace',
100 'subjectspacee',
101 'talkpagename',
102 'talkpagenamee',
103 'subjectpagename',
104 'subjectpagenamee',
105 'numberofusers',
106 'numberofactiveusers',
107 'numberofpages',
108 'currentversion',
109 'rootpagename',
110 'rootpagenamee',
111 'basepagename',
112 'basepagenamee',
113 'currenttimestamp',
114 'localtimestamp',
115 'directionmark',
116 'contentlanguage',
117 'pagelanguage',
118 'numberofadmins',
119 'cascadingsources',
120 ];
121
122 /** Array of caching hints for ParserCache
123 * @var array [ string => int ]
124 */
125 private $mCacheTTLs = [
126 'currentmonth' => 86400,
127 'currentmonth1' => 86400,
128 'currentmonthname' => 86400,
129 'currentmonthnamegen' => 86400,
130 'currentmonthabbrev' => 86400,
131 'currentday' => 3600,
132 'currentday2' => 3600,
133 'currentdayname' => 3600,
134 'currentyear' => 86400,
135 'currenttime' => 3600,
136 'currenthour' => 3600,
137 'localmonth' => 86400,
138 'localmonth1' => 86400,
139 'localmonthname' => 86400,
140 'localmonthnamegen' => 86400,
141 'localmonthabbrev' => 86400,
142 'localday' => 3600,
143 'localday2' => 3600,
144 'localdayname' => 3600,
145 'localyear' => 86400,
146 'localtime' => 3600,
147 'localhour' => 3600,
148 'numberofarticles' => 3600,
149 'numberoffiles' => 3600,
150 'numberofedits' => 3600,
151 'currentweek' => 3600,
152 'currentdow' => 3600,
153 'localweek' => 3600,
154 'localdow' => 3600,
155 'numberofusers' => 3600,
156 'numberofactiveusers' => 3600,
157 'numberofpages' => 3600,
158 'currentversion' => 86400,
159 'currenttimestamp' => 3600,
160 'localtimestamp' => 3600,
161 'pagesinnamespace' => 3600,
162 'numberofadmins' => 3600,
163 'numberingroup' => 3600,
164 ];
165
166 /** @var string[] */
167 private $mDoubleUnderscoreIDs = [
168 'notoc',
169 'nogallery',
170 'forcetoc',
171 'toc',
172 'noeditsection',
173 'newsectionlink',
174 'nonewsectionlink',
175 'hiddencat',
176 'index',
177 'noindex',
178 'staticredirect',
179 'notitleconvert',
180 'nocontentconvert',
181 ];
182
183 /** @var string[] */
184 private $mSubstIDs = [
185 'subst',
186 'safesubst',
187 ];
188
189 /** @var array [ string => MagicWord ] */
190 private $mObjects = [];
191
192 /** @var MagicWordArray */
193 private $mDoubleUnderscoreArray = null;
194
195 /** @var Language */
196 private $contLang;
197
198 /**#@-*/
199
200 /**
201 * @param Language $contLang Content language
202 */
203 public function __construct( Language $contLang ) {
204 $this->contLang = $contLang;
205 }
206
207 public function getContentLanguage() {
208 return $this->contLang;
209 }
210
211 /**
212 * Factory: creates an object representing an ID
213 *
214 * @param string $id The internal name of the magic word
215 *
216 * @return MagicWord
217 */
218 public function get( $id ) {
219 if ( !isset( $this->mObjects[$id] ) ) {
220 $mw = new MagicWord( null, [], false, $this->contLang );
221 $mw->load( $id );
222 $this->mObjects[$id] = $mw;
223 }
224 return $this->mObjects[$id];
225 }
226
227 /**
228 * Get an array of parser variable IDs
229 *
230 * @return string[]
231 */
232 public function getVariableIDs() {
233 if ( !$this->mVariableIDsInitialised ) {
234 # Get variable IDs
235 Hooks::run( 'MagicWordwgVariableIDs', [ &$this->mVariableIDs ] );
236 $this->mVariableIDsInitialised = true;
237 }
238 return $this->mVariableIDs;
239 }
240
241 /**
242 * Get an array of parser substitution modifier IDs
243 * @return string[]
244 */
245 public function getSubstIDs() {
246 return $this->mSubstIDs;
247 }
248
249 /**
250 * Allow external reads of TTL array
251 *
252 * @param string $id
253 * @return int
254 */
255 public function getCacheTTL( $id ) {
256 if ( array_key_exists( $id, $this->mCacheTTLs ) ) {
257 return $this->mCacheTTLs[$id];
258 } else {
259 return -1;
260 }
261 }
262
263 /**
264 * Get a MagicWordArray of double-underscore entities
265 *
266 * @return MagicWordArray
267 */
268 public function getDoubleUnderscoreArray() {
269 if ( is_null( $this->mDoubleUnderscoreArray ) ) {
270 Hooks::run( 'GetDoubleUnderscoreIDs', [ &$this->mDoubleUnderscoreIDs ] );
271 $this->mDoubleUnderscoreArray = $this->newArray( $this->mDoubleUnderscoreIDs );
272 }
273 return $this->mDoubleUnderscoreArray;
274 }
275
276 /**
277 * Get a new MagicWordArray with provided $names
278 *
279 * @param array $names
280 * @return MagicWordArray
281 */
282 public function newArray( array $names = [] ) : MagicWordArray {
283 return new MagicWordArray( $names, $this );
284 }
285 }