MediaWiki REL1_28
CoreParserFunctions.php
Go to the documentation of this file.
1<?php
33 public static function register( $parser ) {
35
36 # Syntax for arguments (see Parser::setFunctionHook):
37 # "name for lookup in localized magic words array",
38 # function callback,
39 # optional Parser::SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}}
40 # instead of {{#int:...}})
41 $noHashFunctions = [
42 'ns', 'nse', 'urlencode', 'lcfirst', 'ucfirst', 'lc', 'uc',
43 'localurl', 'localurle', 'fullurl', 'fullurle', 'canonicalurl',
44 'canonicalurle', 'formatnum', 'grammar', 'gender', 'plural', 'bidi',
45 'numberofpages', 'numberofusers', 'numberofactiveusers',
46 'numberofarticles', 'numberoffiles', 'numberofadmins',
47 'numberingroup', 'numberofedits', 'language',
48 'padleft', 'padright', 'anchorencode', 'defaultsort', 'filepath',
49 'pagesincategory', 'pagesize', 'protectionlevel', 'protectionexpiry',
50 'namespacee', 'namespacenumber', 'talkspace', 'talkspacee',
51 'subjectspace', 'subjectspacee', 'pagename', 'pagenamee',
52 'fullpagename', 'fullpagenamee', 'rootpagename', 'rootpagenamee',
53 'basepagename', 'basepagenamee', 'subpagename', 'subpagenamee',
54 'talkpagename', 'talkpagenamee', 'subjectpagename',
55 'subjectpagenamee', 'pageid', 'revisionid', 'revisionday',
56 'revisionday2', 'revisionmonth', 'revisionmonth1', 'revisionyear',
57 'revisiontimestamp', 'revisionuser', 'cascadingsources',
58 ];
59 foreach ( $noHashFunctions as $func ) {
60 $parser->setFunctionHook( $func, [ __CLASS__, $func ], Parser::SFH_NO_HASH );
61 }
62
63 $parser->setFunctionHook(
64 'namespace',
65 [ __CLASS__, 'mwnamespace' ],
66 Parser::SFH_NO_HASH
67 );
68 $parser->setFunctionHook( 'int', [ __CLASS__, 'intFunction' ], Parser::SFH_NO_HASH );
69 $parser->setFunctionHook( 'special', [ __CLASS__, 'special' ] );
70 $parser->setFunctionHook( 'speciale', [ __CLASS__, 'speciale' ] );
71 $parser->setFunctionHook( 'tag', [ __CLASS__, 'tagObj' ], Parser::SFH_OBJECT_ARGS );
72 $parser->setFunctionHook( 'formatdate', [ __CLASS__, 'formatDate' ] );
73
75 $parser->setFunctionHook(
76 'displaytitle',
77 [ __CLASS__, 'displaytitle' ],
78 Parser::SFH_NO_HASH
79 );
80 }
82 $parser->setFunctionHook(
83 'pagesinnamespace',
84 [ __CLASS__, 'pagesinnamespace' ],
85 Parser::SFH_NO_HASH
86 );
87 }
88 }
89
95 public static function intFunction( $parser, $part1 = '' /*, ... */ ) {
96 if ( strval( $part1 ) !== '' ) {
97 $args = array_slice( func_get_args(), 2 );
98 $message = wfMessage( $part1, $args )
99 ->inLanguage( $parser->getOptions()->getUserLangObj() );
100 if ( !$message->exists() ) {
101 // When message does not exists, the message name is surrounded by angle
102 // and can result in a tag, therefore escape the angles
103 return $message->escaped();
104 }
105 return [ $message->plain(), 'noparse' => false ];
106 } else {
107 return [ 'found' => false ];
108 }
109 }
110
118 public static function formatDate( $parser, $date, $defaultPref = null ) {
119 $lang = $parser->getFunctionLang();
121
122 $date = trim( $date );
123
124 $pref = $parser->getOptions()->getDateFormat();
125
126 // Specify a different default date format other than the normal default
127 // if the user has 'default' for their setting
128 if ( $pref == 'default' && $defaultPref ) {
129 $pref = $defaultPref;
130 }
131
132 $date = $df->reformat( $pref, $date, [ 'match-whole' ] );
133 return $date;
134 }
135
136 public static function ns( $parser, $part1 = '' ) {
138 if ( intval( $part1 ) || $part1 == "0" ) {
139 $index = intval( $part1 );
140 } else {
141 $index = $wgContLang->getNsIndex( str_replace( ' ', '_', $part1 ) );
142 }
143 if ( $index !== false ) {
144 return $wgContLang->getFormattedNsText( $index );
145 } else {
146 return [ 'found' => false ];
147 }
148 }
149
150 public static function nse( $parser, $part1 = '' ) {
151 $ret = self::ns( $parser, $part1 );
152 if ( is_string( $ret ) ) {
153 $ret = wfUrlencode( str_replace( ' ', '_', $ret ) );
154 }
155 return $ret;
156 }
157
170 public static function urlencode( $parser, $s = '', $arg = null ) {
171 static $magicWords = null;
172 if ( is_null( $magicWords ) ) {
173 $magicWords = new MagicWordArray( [ 'url_path', 'url_query', 'url_wiki' ] );
174 }
175 switch ( $magicWords->matchStartToEnd( $arg ) ) {
176
177 // Encode as though it's a wiki page, '_' for ' '.
178 case 'url_wiki':
179 $func = 'wfUrlencode';
180 $s = str_replace( ' ', '_', $s );
181 break;
182
183 // Encode for an HTTP Path, '%20' for ' '.
184 case 'url_path':
185 $func = 'rawurlencode';
186 break;
187
188 // Encode for HTTP query, '+' for ' '.
189 case 'url_query':
190 default:
191 $func = 'urlencode';
192 }
193 // See T105242, where the choice to kill markers and various
194 // other options were discussed.
195 return $func( $parser->killMarkers( $s ) );
196 }
197
198 public static function lcfirst( $parser, $s = '' ) {
200 return $wgContLang->lcfirst( $s );
201 }
202
203 public static function ucfirst( $parser, $s = '' ) {
205 return $wgContLang->ucfirst( $s );
206 }
207
213 public static function lc( $parser, $s = '' ) {
215 return $parser->markerSkipCallback( $s, [ $wgContLang, 'lc' ] );
216 }
217
223 public static function uc( $parser, $s = '' ) {
225 return $parser->markerSkipCallback( $s, [ $wgContLang, 'uc' ] );
226 }
227
228 public static function localurl( $parser, $s = '', $arg = null ) {
229 return self::urlFunction( 'getLocalURL', $s, $arg );
230 }
231
232 public static function localurle( $parser, $s = '', $arg = null ) {
233 $temp = self::urlFunction( 'getLocalURL', $s, $arg );
234 if ( !is_string( $temp ) ) {
235 return $temp;
236 } else {
237 return htmlspecialchars( $temp );
238 }
239 }
240
241 public static function fullurl( $parser, $s = '', $arg = null ) {
242 return self::urlFunction( 'getFullURL', $s, $arg );
243 }
244
245 public static function fullurle( $parser, $s = '', $arg = null ) {
246 $temp = self::urlFunction( 'getFullURL', $s, $arg );
247 if ( !is_string( $temp ) ) {
248 return $temp;
249 } else {
250 return htmlspecialchars( $temp );
251 }
252 }
253
254 public static function canonicalurl( $parser, $s = '', $arg = null ) {
255 return self::urlFunction( 'getCanonicalURL', $s, $arg );
256 }
257
258 public static function canonicalurle( $parser, $s = '', $arg = null ) {
259 $temp = self::urlFunction( 'getCanonicalURL', $s, $arg );
260 if ( !is_string( $temp ) ) {
261 return $temp;
262 } else {
263 return htmlspecialchars( $temp );
264 }
265 }
266
267 public static function urlFunction( $func, $s = '', $arg = null ) {
268 $title = Title::newFromText( $s );
269 # Due to order of execution of a lot of bits, the values might be encoded
270 # before arriving here; if that's true, then the title can't be created
271 # and the variable will fail. If we can't get a decent title from the first
272 # attempt, url-decode and try for a second.
273 if ( is_null( $title ) ) {
274 $title = Title::newFromURL( urldecode( $s ) );
275 }
276 if ( !is_null( $title ) ) {
277 # Convert NS_MEDIA -> NS_FILE
278 if ( $title->getNamespace() == NS_MEDIA ) {
279 $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
280 }
281 if ( !is_null( $arg ) ) {
282 $text = $title->$func( $arg );
283 } else {
284 $text = $title->$func();
285 }
286 return $text;
287 } else {
288 return [ 'found' => false ];
289 }
290 }
291
298 public static function formatnum( $parser, $num = '', $arg = null ) {
299 if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) {
300 $func = [ $parser->getFunctionLang(), 'parseFormattedNumber' ];
301 } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) {
302 $func = [ $parser->getFunctionLang(), 'formatNumNoSeparators' ];
303 } else {
304 $func = [ $parser->getFunctionLang(), 'formatNum' ];
305 }
306 return $parser->markerSkipCallback( $num, $func );
307 }
308
315 public static function grammar( $parser, $case = '', $word = '' ) {
316 $word = $parser->killMarkers( $word );
317 return $parser->getFunctionLang()->convertGrammar( $word, $case );
318 }
319
325 public static function gender( $parser, $username ) {
326 $forms = array_slice( func_get_args(), 2 );
327
328 // Some shortcuts to avoid loading user data unnecessarily
329 if ( count( $forms ) === 0 ) {
330 return '';
331 } elseif ( count( $forms ) === 1 ) {
332 return $forms[0];
333 }
334
335 $username = trim( $username );
336
337 // default
338 $gender = User::getDefaultOption( 'gender' );
339
340 // allow prefix.
341 $title = Title::newFromText( $username );
342
343 if ( $title && $title->getNamespace() == NS_USER ) {
344 $username = $title->getText();
345 }
346
347 // check parameter, or use the ParserOptions if in interface message
348 $user = User::newFromName( $username );
349 if ( $user ) {
350 $gender = GenderCache::singleton()->getGenderOf( $user, __METHOD__ );
351 } elseif ( $username === '' && $parser->getOptions()->getInterfaceMessage() ) {
352 $gender = GenderCache::singleton()->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
353 }
354 $ret = $parser->getFunctionLang()->gender( $gender, $forms );
355 return $ret;
356 }
357
363 public static function plural( $parser, $text = '' ) {
364 $forms = array_slice( func_get_args(), 2 );
365 $text = $parser->getFunctionLang()->parseFormattedNumber( $text );
366 settype( $text, ctype_digit( $text ) ? 'int' : 'float' );
367 return $parser->getFunctionLang()->convertPlural( $text, $forms );
368 }
369
375 public static function bidi( $parser, $text = '' ) {
376 return $parser->getFunctionLang()->embedBidi( $text );
377 }
378
388 public static function displaytitle( $parser, $text = '', $uarg = '' ) {
390
391 static $magicWords = null;
392 if ( is_null( $magicWords ) ) {
393 $magicWords = new MagicWordArray( [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
394 }
395 $arg = $magicWords->matchStartToEnd( $uarg );
396
397 // parse a limited subset of wiki markup (just the single quote items)
398 $text = $parser->doQuotes( $text );
399
400 // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
401 $text = $parser->killMarkers( $text );
402
403 // list of disallowed tags for DISPLAYTITLE
404 // these will be escaped even though they are allowed in normal wiki text
405 $bad = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
406 'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'br' ];
407
408 // disallow some styles that could be used to bypass $wgRestrictDisplayTitle
410 $htmlTagsCallback = function ( &$params ) {
411 $decoded = Sanitizer::decodeTagAttributes( $params );
412
413 if ( isset( $decoded['style'] ) ) {
414 // this is called later anyway, but we need it right now for the regexes below to be safe
415 // calling it twice doesn't hurt
416 $decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
417
418 if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
419 $decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
420 }
421 }
422
423 $params = Sanitizer::safeEncodeTagAttributes( $decoded );
424 };
425 } else {
426 $htmlTagsCallback = null;
427 }
428
429 // only requested titles that normalize to the actual title are allowed through
430 // if $wgRestrictDisplayTitle is true (it is by default)
431 // mimic the escaping process that occurs in OutputPage::setPageTitle
432 $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
433 $text,
434 $htmlTagsCallback,
435 [],
436 [],
437 $bad
438 ) );
439 $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
440
442 ( $title instanceof Title
443 && !$title->hasFragment()
444 && $title->equals( $parser->mTitle ) )
445 ) {
446 $old = $parser->mOutput->getProperty( 'displaytitle' );
447 if ( $old === false || $arg !== 'displaytitle_noreplace' ) {
448 $parser->mOutput->setDisplayTitle( $text );
449 }
450 if ( $old !== false && $old !== $text && !$arg ) {
451 $converter = $parser->getConverterLanguage()->getConverter();
452 return '<span class="error">' .
453 wfMessage( 'duplicate-displaytitle',
454 // Message should be parsed, but these params should only be escaped.
455 $converter->markNoConversion( wfEscapeWikiText( $old ) ),
456 $converter->markNoConversion( wfEscapeWikiText( $text ) )
457 )->inContentLanguage()->text() .
458 '</span>';
459 } else {
460 return '';
461 }
462 } else {
463 $converter = $parser->getConverterLanguage()->getConverter();
464 $parser->getOutput()->addWarning(
465 wfMessage( 'restricted-displaytitle',
466 // Message should be parsed, but this param should only be escaped.
467 $converter->markNoConversion( wfEscapeWikiText( $text ) )
468 )->text()
469 );
470 $parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
471 }
472 }
473
481 private static function matchAgainstMagicword( $magicword, $value ) {
482 $value = trim( strval( $value ) );
483 if ( $value === '' ) {
484 return false;
485 }
486 $mwObject = MagicWord::get( $magicword );
487 return $mwObject->matchStartToEnd( $value );
488 }
489
490 public static function formatRaw( $num, $raw ) {
491 if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
492 return $num;
493 } else {
495 return $wgContLang->formatNum( $num );
496 }
497 }
498 public static function numberofpages( $parser, $raw = null ) {
499 return self::formatRaw( SiteStats::pages(), $raw );
500 }
501 public static function numberofusers( $parser, $raw = null ) {
502 return self::formatRaw( SiteStats::users(), $raw );
503 }
504 public static function numberofactiveusers( $parser, $raw = null ) {
505 return self::formatRaw( SiteStats::activeUsers(), $raw );
506 }
507 public static function numberofarticles( $parser, $raw = null ) {
508 return self::formatRaw( SiteStats::articles(), $raw );
509 }
510 public static function numberoffiles( $parser, $raw = null ) {
511 return self::formatRaw( SiteStats::images(), $raw );
512 }
513 public static function numberofadmins( $parser, $raw = null ) {
514 return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw );
515 }
516 public static function numberofedits( $parser, $raw = null ) {
517 return self::formatRaw( SiteStats::edits(), $raw );
518 }
519 public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
520 return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
521 }
522 public static function numberingroup( $parser, $name = '', $raw = null ) {
523 return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
524 }
525
535 public static function mwnamespace( $parser, $title = null ) {
536 $t = Title::newFromText( $title );
537 if ( is_null( $t ) ) {
538 return '';
539 }
540 return str_replace( '_', ' ', $t->getNsText() );
541 }
542 public static function namespacee( $parser, $title = null ) {
543 $t = Title::newFromText( $title );
544 if ( is_null( $t ) ) {
545 return '';
546 }
547 return wfUrlencode( $t->getNsText() );
548 }
549 public static function namespacenumber( $parser, $title = null ) {
550 $t = Title::newFromText( $title );
551 if ( is_null( $t ) ) {
552 return '';
553 }
554 return $t->getNamespace();
555 }
556 public static function talkspace( $parser, $title = null ) {
557 $t = Title::newFromText( $title );
558 if ( is_null( $t ) || !$t->canTalk() ) {
559 return '';
560 }
561 return str_replace( '_', ' ', $t->getTalkNsText() );
562 }
563 public static function talkspacee( $parser, $title = null ) {
564 $t = Title::newFromText( $title );
565 if ( is_null( $t ) || !$t->canTalk() ) {
566 return '';
567 }
568 return wfUrlencode( $t->getTalkNsText() );
569 }
570 public static function subjectspace( $parser, $title = null ) {
571 $t = Title::newFromText( $title );
572 if ( is_null( $t ) ) {
573 return '';
574 }
575 return str_replace( '_', ' ', $t->getSubjectNsText() );
576 }
577 public static function subjectspacee( $parser, $title = null ) {
578 $t = Title::newFromText( $title );
579 if ( is_null( $t ) ) {
580 return '';
581 }
582 return wfUrlencode( $t->getSubjectNsText() );
583 }
584
592 public static function pagename( $parser, $title = null ) {
593 $t = Title::newFromText( $title );
594 if ( is_null( $t ) ) {
595 return '';
596 }
597 return wfEscapeWikiText( $t->getText() );
598 }
599 public static function pagenamee( $parser, $title = null ) {
600 $t = Title::newFromText( $title );
601 if ( is_null( $t ) ) {
602 return '';
603 }
604 return wfEscapeWikiText( $t->getPartialURL() );
605 }
606 public static function fullpagename( $parser, $title = null ) {
607 $t = Title::newFromText( $title );
608 if ( is_null( $t ) || !$t->canTalk() ) {
609 return '';
610 }
611 return wfEscapeWikiText( $t->getPrefixedText() );
612 }
613 public static function fullpagenamee( $parser, $title = null ) {
614 $t = Title::newFromText( $title );
615 if ( is_null( $t ) || !$t->canTalk() ) {
616 return '';
617 }
618 return wfEscapeWikiText( $t->getPrefixedURL() );
619 }
620 public static function subpagename( $parser, $title = null ) {
621 $t = Title::newFromText( $title );
622 if ( is_null( $t ) ) {
623 return '';
624 }
625 return wfEscapeWikiText( $t->getSubpageText() );
626 }
627 public static function subpagenamee( $parser, $title = null ) {
628 $t = Title::newFromText( $title );
629 if ( is_null( $t ) ) {
630 return '';
631 }
632 return wfEscapeWikiText( $t->getSubpageUrlForm() );
633 }
634 public static function rootpagename( $parser, $title = null ) {
635 $t = Title::newFromText( $title );
636 if ( is_null( $t ) ) {
637 return '';
638 }
639 return wfEscapeWikiText( $t->getRootText() );
640 }
641 public static function rootpagenamee( $parser, $title = null ) {
642 $t = Title::newFromText( $title );
643 if ( is_null( $t ) ) {
644 return '';
645 }
646 return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) );
647 }
648 public static function basepagename( $parser, $title = null ) {
649 $t = Title::newFromText( $title );
650 if ( is_null( $t ) ) {
651 return '';
652 }
653 return wfEscapeWikiText( $t->getBaseText() );
654 }
655 public static function basepagenamee( $parser, $title = null ) {
656 $t = Title::newFromText( $title );
657 if ( is_null( $t ) ) {
658 return '';
659 }
660 return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) );
661 }
662 public static function talkpagename( $parser, $title = null ) {
663 $t = Title::newFromText( $title );
664 if ( is_null( $t ) || !$t->canTalk() ) {
665 return '';
666 }
667 return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
668 }
669 public static function talkpagenamee( $parser, $title = null ) {
670 $t = Title::newFromText( $title );
671 if ( is_null( $t ) || !$t->canTalk() ) {
672 return '';
673 }
674 return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
675 }
676 public static function subjectpagename( $parser, $title = null ) {
677 $t = Title::newFromText( $title );
678 if ( is_null( $t ) ) {
679 return '';
680 }
681 return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
682 }
683 public static function subjectpagenamee( $parser, $title = null ) {
684 $t = Title::newFromText( $title );
685 if ( is_null( $t ) ) {
686 return '';
687 }
688 return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
689 }
690
701 public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
703 static $magicWords = null;
704 if ( is_null( $magicWords ) ) {
706 'pagesincategory_all',
707 'pagesincategory_pages',
708 'pagesincategory_subcats',
709 'pagesincategory_files'
710 ] );
711 }
712 static $cache = [];
713
714 // split the given option to its variable
715 if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
716 // {{pagesincategory:|raw[|type]}}
717 $raw = $arg1;
718 $type = $magicWords->matchStartToEnd( $arg2 );
719 } else {
720 // {{pagesincategory:[|type[|raw]]}}
721 $type = $magicWords->matchStartToEnd( $arg1 );
722 $raw = $arg2;
723 }
724 if ( !$type ) { // backward compatibility
725 $type = 'pagesincategory_all';
726 }
727
728 $title = Title::makeTitleSafe( NS_CATEGORY, $name );
729 if ( !$title ) { # invalid title
730 return self::formatRaw( 0, $raw );
731 }
732 $wgContLang->findVariantLink( $name, $title, true );
733
734 // Normalize name for cache
735 $name = $title->getDBkey();
736
737 if ( !isset( $cache[$name] ) ) {
738 $category = Category::newFromTitle( $title );
739
740 $allCount = $subcatCount = $fileCount = $pagesCount = 0;
741 if ( $parser->incrementExpensiveFunctionCount() ) {
742 // $allCount is the total number of cat members,
743 // not the count of how many members are normal pages.
744 $allCount = (int)$category->getPageCount();
745 $subcatCount = (int)$category->getSubcatCount();
746 $fileCount = (int)$category->getFileCount();
747 $pagesCount = $allCount - $subcatCount - $fileCount;
748 }
749 $cache[$name]['pagesincategory_all'] = $allCount;
750 $cache[$name]['pagesincategory_pages'] = $pagesCount;
751 $cache[$name]['pagesincategory_subcats'] = $subcatCount;
752 $cache[$name]['pagesincategory_files'] = $fileCount;
753 }
754
756 return self::formatRaw( $count, $raw );
757 }
758
768 public static function pagesize( $parser, $page = '', $raw = null ) {
769 $title = Title::newFromText( $page );
770
771 if ( !is_object( $title ) ) {
772 return self::formatRaw( 0, $raw );
773 }
774
775 // fetch revision from cache/database and return the value
777 $length = $rev ? $rev->getSize() : 0;
778 if ( $length === null ) {
779 // We've had bugs where rev_len was not being recorded for empty pages, see T135414
780 $length = 0;
781 }
782 return self::formatRaw( $length, $raw );
783 }
784
797 public static function protectionlevel( $parser, $type = '', $title = '' ) {
798 $titleObject = Title::newFromText( $title );
799 if ( !( $titleObject instanceof Title ) ) {
800 $titleObject = $parser->mTitle;
801 }
802 if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
803 $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
804 # Title::getRestrictions returns an array, its possible it may have
805 # multiple values in the future
806 return implode( $restrictions, ',' );
807 }
808 return '';
809 }
810
823 public static function protectionexpiry( $parser, $type = '', $title = '' ) {
824 $titleObject = Title::newFromText( $title );
825 if ( !( $titleObject instanceof Title ) ) {
826 $titleObject = $parser->mTitle;
827 }
828 if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
829 $expiry = $titleObject->getRestrictionExpiry( strtolower( $type ) );
830 // getRestrictionExpiry() returns false on invalid type; trying to
831 // match protectionlevel() function that returns empty string instead
832 if ( $expiry === false ) {
833 $expiry = '';
834 }
835 return $expiry;
836 }
837 return '';
838 }
839
847 public static function language( $parser, $code = '', $inLanguage = '' ) {
848 $code = strtolower( $code );
849 $inLanguage = strtolower( $inLanguage );
850 $lang = Language::fetchLanguageName( $code, $inLanguage );
851 return $lang !== '' ? $lang : wfBCP47( $code );
852 }
853
863 public static function pad(
864 $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT
865 ) {
866 $padding = $parser->killMarkers( $padding );
867 $lengthOfPadding = mb_strlen( $padding );
868 if ( $lengthOfPadding == 0 ) {
869 return $string;
870 }
871
872 # The remaining length to add counts down to 0 as padding is added
873 $length = min( $length, 500 ) - mb_strlen( $string );
874 # $finalPadding is just $padding repeated enough times so that
875 # mb_strlen( $string ) + mb_strlen( $finalPadding ) == $length
876 $finalPadding = '';
877 while ( $length > 0 ) {
878 # If $length < $lengthofPadding, truncate $padding so we get the
879 # exact length desired.
880 $finalPadding .= mb_substr( $padding, 0, $length );
881 $length -= $lengthOfPadding;
882 }
883
884 if ( $direction == STR_PAD_LEFT ) {
885 return $finalPadding . $string;
886 } else {
887 return $string . $finalPadding;
888 }
889 }
890
891 public static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) {
892 return self::pad( $parser, $string, $length, $padding, STR_PAD_LEFT );
893 }
894
895 public static function padright( $parser, $string = '', $length = 0, $padding = '0' ) {
896 return self::pad( $parser, $string, $length, $padding );
897 }
898
904 public static function anchorencode( $parser, $text ) {
905 $text = $parser->killMarkers( $text );
906 return (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
907 }
908
909 public static function special( $parser, $text ) {
910 list( $page, $subpage ) = SpecialPageFactory::resolveAlias( $text );
911 if ( $page ) {
913 return $title->getPrefixedText();
914 } else {
915 // unknown special page, just use the given text as its title, if at all possible
916 $title = Title::makeTitleSafe( NS_SPECIAL, $text );
917 return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
918 }
919 }
920
921 public static function speciale( $parser, $text ) {
922 return wfUrlencode( str_replace( ' ', '_', self::special( $parser, $text ) ) );
923 }
924
933 public static function defaultsort( $parser, $text, $uarg = '' ) {
934 static $magicWords = null;
935 if ( is_null( $magicWords ) ) {
936 $magicWords = new MagicWordArray( [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
937 }
938 $arg = $magicWords->matchStartToEnd( $uarg );
939
940 $text = trim( $text );
941 if ( strlen( $text ) == 0 ) {
942 return '';
943 }
944 $old = $parser->getCustomDefaultSort();
945 if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
946 $parser->setDefaultSort( $text );
947 }
948
949 if ( $old === false || $old == $text || $arg ) {
950 return '';
951 } else {
952 $converter = $parser->getConverterLanguage()->getConverter();
953 return '<span class="error">' .
954 wfMessage( 'duplicate-defaultsort',
955 // Message should be parsed, but these params should only be escaped.
956 $converter->markNoConversion( wfEscapeWikiText( $old ) ),
957 $converter->markNoConversion( wfEscapeWikiText( $text ) )
958 )->inContentLanguage()->text() .
959 '</span>';
960 }
961 }
962
974 public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
975 $file = wfFindFile( $name );
976
977 if ( $argA == 'nowiki' ) {
978 // {{filepath: | option [| size] }}
979 $isNowiki = true;
980 $parsedWidthParam = $parser->parseWidthParam( $argB );
981 } else {
982 // {{filepath: [| size [|option]] }}
983 $parsedWidthParam = $parser->parseWidthParam( $argA );
984 $isNowiki = ( $argB == 'nowiki' );
985 }
986
987 if ( $file ) {
988 $url = $file->getFullUrl();
989
990 // If a size is requested...
991 if ( count( $parsedWidthParam ) ) {
992 $mto = $file->transform( $parsedWidthParam );
993 // ... and we can
994 if ( $mto && !$mto->isError() ) {
995 // ... change the URL to point to a thumbnail.
996 $url = wfExpandUrl( $mto->getUrl(), PROTO_RELATIVE );
997 }
998 }
999 if ( $isNowiki ) {
1000 return [ $url, 'nowiki' => true ];
1001 }
1002 return $url;
1003 } else {
1004 return '';
1005 }
1006 }
1007
1015 public static function tagObj( $parser, $frame, $args ) {
1016 if ( !count( $args ) ) {
1017 return '';
1018 }
1019 $tagName = strtolower( trim( $frame->expand( array_shift( $args ) ) ) );
1020
1021 if ( count( $args ) ) {
1022 $inner = $frame->expand( array_shift( $args ) );
1023 } else {
1024 $inner = null;
1025 }
1026
1027 $attributes = [];
1028 foreach ( $args as $arg ) {
1029 $bits = $arg->splitArg();
1030 if ( strval( $bits['index'] ) === '' ) {
1031 $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
1032 $value = trim( $frame->expand( $bits['value'] ) );
1033 if ( preg_match( '/^(?:["\'](.+)["\']|""|\'\')$/s', $value, $m ) ) {
1034 $value = isset( $m[1] ) ? $m[1] : '';
1035 }
1036 $attributes[$name] = $value;
1037 }
1038 }
1039
1040 $stripList = $parser->getStripList();
1041 if ( !in_array( $tagName, $stripList ) ) {
1042 // we can't handle this tag (at least not now), so just re-emit it as an ordinary tag
1043 $attrText = '';
1044 foreach ( $attributes as $name => $value ) {
1045 $attrText .= ' ' . htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"';
1046 }
1047 if ( $inner === null ) {
1048 return "<$tagName$attrText/>";
1049 }
1050 return "<$tagName$attrText>$inner</$tagName>";
1051 }
1052
1053 $params = [
1054 'name' => $tagName,
1055 'inner' => $inner,
1056 'attributes' => $attributes,
1057 'close' => "</$tagName>",
1058 ];
1059 return $parser->extensionSubstitution( $params, $frame );
1060 }
1061
1074 private static function getCachedRevisionObject( $parser, $title = null ) {
1075 if ( is_null( $title ) ) {
1076 return null;
1077 }
1078
1079 // Use the revision from the parser itself, when param is the current page
1080 // and the revision is the current one
1081 if ( $title->equals( $parser->getTitle() ) ) {
1082 $parserRev = $parser->getRevisionObject();
1083 if ( $parserRev && $parserRev->isCurrent() ) {
1084 // force reparse after edit with vary-revision flag
1085 $parser->getOutput()->setFlag( 'vary-revision' );
1086 wfDebug( __METHOD__ . ": use current revision from parser, setting vary-revision...\n" );
1087 return $parserRev;
1088 }
1089 }
1090
1091 // Normalize name for cache
1092 $page = $title->getPrefixedDBkey();
1093
1094 if ( !( $parser->currentRevisionCache && $parser->currentRevisionCache->has( $page ) )
1095 && !$parser->incrementExpensiveFunctionCount() ) {
1096 return null;
1097 }
1098 $rev = $parser->fetchCurrentRevisionOfTitle( $title );
1099 $pageID = $rev ? $rev->getPage() : 0;
1100 $revID = $rev ? $rev->getId() : 0;
1101
1102 // Register dependency in templatelinks
1103 $parser->getOutput()->addTemplate( $title, $pageID, $revID );
1104
1105 return $rev;
1106 }
1107
1115 public static function pageid( $parser, $title = null ) {
1116 $t = Title::newFromText( $title );
1117 if ( is_null( $t ) ) {
1118 return '';
1119 }
1120 // Use title from parser to have correct pageid after edit
1121 if ( $t->equals( $parser->getTitle() ) ) {
1122 $t = $parser->getTitle();
1123 return $t->getArticleID();
1124 }
1125
1126 // These can't have ids
1127 if ( !$t->canExist() || $t->isExternal() ) {
1128 return 0;
1129 }
1130
1131 // Check the link cache, maybe something already looked it up.
1132 $linkCache = LinkCache::singleton();
1133 $pdbk = $t->getPrefixedDBkey();
1134 $id = $linkCache->getGoodLinkID( $pdbk );
1135 if ( $id != 0 ) {
1136 $parser->mOutput->addLink( $t, $id );
1137 return $id;
1138 }
1139 if ( $linkCache->isBadLink( $pdbk ) ) {
1140 $parser->mOutput->addLink( $t, 0 );
1141 return $id;
1142 }
1143
1144 // We need to load it from the DB, so mark expensive
1145 if ( $parser->incrementExpensiveFunctionCount() ) {
1146 $id = $t->getArticleID();
1147 $parser->mOutput->addLink( $t, $id );
1148 return $id;
1149 }
1150 return null;
1151 }
1152
1160 public static function revisionid( $parser, $title = null ) {
1161 $t = Title::newFromText( $title );
1162 if ( is_null( $t ) ) {
1163 return '';
1164 }
1165 // fetch revision from cache/database and return the value
1167 return $rev ? $rev->getId() : '';
1168 }
1169
1177 public static function revisionday( $parser, $title = null ) {
1178 $t = Title::newFromText( $title );
1179 if ( is_null( $t ) ) {
1180 return '';
1181 }
1182 // fetch revision from cache/database and return the value
1184 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'j' ) : '';
1185 }
1186
1194 public static function revisionday2( $parser, $title = null ) {
1195 $t = Title::newFromText( $title );
1196 if ( is_null( $t ) ) {
1197 return '';
1198 }
1199 // fetch revision from cache/database and return the value
1201 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'd' ) : '';
1202 }
1203
1211 public static function revisionmonth( $parser, $title = null ) {
1212 $t = Title::newFromText( $title );
1213 if ( is_null( $t ) ) {
1214 return '';
1215 }
1216 // fetch revision from cache/database and return the value
1218 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'm' ) : '';
1219 }
1220
1228 public static function revisionmonth1( $parser, $title = null ) {
1229 $t = Title::newFromText( $title );
1230 if ( is_null( $t ) ) {
1231 return '';
1232 }
1233 // fetch revision from cache/database and return the value
1235 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'n' ) : '';
1236 }
1237
1245 public static function revisionyear( $parser, $title = null ) {
1246 $t = Title::newFromText( $title );
1247 if ( is_null( $t ) ) {
1248 return '';
1249 }
1250 // fetch revision from cache/database and return the value
1252 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'Y' ) : '';
1253 }
1254
1262 public static function revisiontimestamp( $parser, $title = null ) {
1263 $t = Title::newFromText( $title );
1264 if ( is_null( $t ) ) {
1265 return '';
1266 }
1267 // fetch revision from cache/database and return the value
1269 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'YmdHis' ) : '';
1270 }
1271
1279 public static function revisionuser( $parser, $title = null ) {
1280 $t = Title::newFromText( $title );
1281 if ( is_null( $t ) ) {
1282 return '';
1283 }
1284 // fetch revision from cache/database and return the value
1286 return $rev ? $rev->getUserText() : '';
1287 }
1288
1301 public static function cascadingsources( $parser, $title = '' ) {
1302 $titleObject = Title::newFromText( $title );
1303 if ( !( $titleObject instanceof Title ) ) {
1304 $titleObject = $parser->mTitle;
1305 }
1306 if ( $titleObject->areCascadeProtectionSourcesLoaded()
1307 || $parser->incrementExpensiveFunctionCount()
1308 ) {
1309 $names = [];
1310 $sources = $titleObject->getCascadeProtectionSources();
1311 foreach ( $sources[0] as $sourceTitle ) {
1312 $names[] = $sourceTitle->getPrefixedText();
1313 }
1314 return implode( $names, '|' );
1315 }
1316 return '';
1317 }
1318
1319}
$wgAllowDisplayTitle
Allow DISPLAYTITLE to change title display.
$wgRestrictDisplayTitle
For consistency, restrict DISPLAYTITLE to text that normalizes to the same canonical DB key.
$wgAllowSlowParserFunctions
Enable slow parser functions.
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfUrlencode( $s)
We want some things to be included as literal characters in our title URLs for prettiness,...
wfBCP47( $code)
Get the normalised IETF language tag See unit test for examples.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL.
wfFindFile( $title, $options=[])
Find a file.
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking,...
if( $line===false) $args
Definition cdb.php:64
Various core parser functions, registered in Parser::firstCallInit()
static language( $parser, $code='', $inLanguage='')
Gives language names.
static numberingroup( $parser, $name='', $raw=null)
static rootpagename( $parser, $title=null)
static localurl( $parser, $s='', $arg=null)
static formatnum( $parser, $num='', $arg=null)
static ns( $parser, $part1='')
static protectionexpiry( $parser, $type='', $title='')
Returns the requested protection expiry for the current page.
static pagenamee( $parser, $title=null)
static padleft( $parser, $string='', $length=0, $padding='0')
static fullurle( $parser, $s='', $arg=null)
static revisionmonth( $parser, $title=null)
Get the month with leading zeros from the last revision of a specified page.
static fullpagename( $parser, $title=null)
static revisionid( $parser, $title=null)
Get the id from the last revision of a specified page.
static intFunction( $parser, $part1='')
static pagesinnamespace( $parser, $namespace=0, $raw=null)
static numberofusers( $parser, $raw=null)
static pagesincategory( $parser, $name='', $arg1=null, $arg2=null)
Return the number of pages, files or subcats in the given category, or 0 if it's nonexistent.
static special( $parser, $text)
static nse( $parser, $part1='')
static pagesize( $parser, $page='', $raw=null)
Return the size of the given page, or 0 if it's nonexistent.
static canonicalurl( $parser, $s='', $arg=null)
static basepagenamee( $parser, $title=null)
static subjectspacee( $parser, $title=null)
static numberofedits( $parser, $raw=null)
static numberoffiles( $parser, $raw=null)
static ucfirst( $parser, $s='')
static basepagename( $parser, $title=null)
static numberofpages( $parser, $raw=null)
static lcfirst( $parser, $s='')
static urlFunction( $func, $s='', $arg=null)
static talkspacee( $parser, $title=null)
static bidi( $parser, $text='')
static revisionuser( $parser, $title=null)
Get the user from the last revision of a specified page.
static anchorencode( $parser, $text)
static subjectpagenamee( $parser, $title=null)
static namespacee( $parser, $title=null)
static subjectpagename( $parser, $title=null)
static filepath( $parser, $name='', $argA='', $argB='')
Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}} or {{...
static padright( $parser, $string='', $length=0, $padding='0')
static pad( $parser, $string, $length, $padding='0', $direction=STR_PAD_RIGHT)
Unicode-safe str_pad with the restriction that $length is forced to be <= 500.
static canonicalurle( $parser, $s='', $arg=null)
static cascadingsources( $parser, $title='')
Returns the sources of any cascading protection acting on a specified page.
static numberofactiveusers( $parser, $raw=null)
static plural( $parser, $text='')
static displaytitle( $parser, $text='', $uarg='')
Override the title of the page when viewed, provided we've been given a title which will normalise to...
static pageid( $parser, $title=null)
Get the pageid of a specified page.
static formatDate( $parser, $date, $defaultPref=null)
static gender( $parser, $username)
static urlencode( $parser, $s='', $arg=null)
urlencodes a string according to one of three patterns: (bug 22474)
static grammar( $parser, $case='', $word='')
static subpagenamee( $parser, $title=null)
static tagObj( $parser, $frame, $args)
Parser function to extension tag adaptor.
static revisionmonth1( $parser, $title=null)
Get the month from the last revision of a specified page.
static rootpagenamee( $parser, $title=null)
static protectionlevel( $parser, $type='', $title='')
Returns the requested protection level for the current page.
static namespacenumber( $parser, $title=null)
static revisionday( $parser, $title=null)
Get the day from the last revision of a specified page.
static subjectspace( $parser, $title=null)
static lc( $parser, $s='')
static talkpagename( $parser, $title=null)
static fullurl( $parser, $s='', $arg=null)
static mwnamespace( $parser, $title=null)
Given a title, return the namespace name that would be given by the corresponding magic word Note: fu...
static pagename( $parser, $title=null)
Functions to get and normalize pagenames, corresponding to the magic words of the same names.
static formatRaw( $num, $raw)
static getCachedRevisionObject( $parser, $title=null)
Fetched the current revision of the given title and return this.
static matchAgainstMagicword( $magicword, $value)
Matches the given value against the value of given magic word.
static numberofadmins( $parser, $raw=null)
static numberofarticles( $parser, $raw=null)
static revisionyear( $parser, $title=null)
Get the year from the last revision of a specified page.
static revisionday2( $parser, $title=null)
Get the day with leading zeros from the last revision of a specified page.
static uc( $parser, $s='')
static talkpagenamee( $parser, $title=null)
static revisiontimestamp( $parser, $title=null)
Get the timestamp from the last revision of a specified page.
static subpagename( $parser, $title=null)
static localurle( $parser, $s='', $arg=null)
static defaultsort( $parser, $text, $uarg='')
static fullpagenamee( $parser, $title=null)
static talkspace( $parser, $title=null)
static speciale( $parser, $text)
static getInstance( $lang=null)
Get a DateFormatter object.
static getLocalInstance( $ts=false)
Get a timestamp instance in the server local timezone ($wgLocaltimezone)
Class for handling an array of magic words.
static & get( $id)
Factory: creates an object representing an ID.
static articles()
static pagesInNs( $ns)
static images()
static edits()
static users()
static pages()
static numberingroup( $group)
Find the number of users in a given user group.
static activeUsers()
static resolveAlias( $alias)
Given a special page name with a possible subpage, return an array where the first element is the spe...
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don't need a full Title object,...
Represents a title within MediaWiki.
Definition Title.php:36
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition deferred.txt:11
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
Definition design.txt:57
when a variable name is used in a it is silently declared as a new local masking the global
Definition design.txt:95
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add text
Definition design.txt:18
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
const NS_USER
Definition Defines.php:58
const NS_FILE
Definition Defines.php:62
const NS_SPECIAL
Definition Defines.php:45
const NS_MEDIA
Definition Defines.php:44
const PROTO_RELATIVE
Definition Defines.php:225
const NS_CATEGORY
Definition Defines.php:70
please add to it if you re going to add events to the MediaWiki code where normally authentication against an external auth plugin would be creating a local account $user
Definition hooks.txt:249
namespace are movable Hooks may change this value to override the return value of MWNamespace::isMovable(). 'NewDifferenceEngine' do that in ParserLimitReportFormat instead $parser
Definition hooks.txt:2259
namespace are movable Hooks may change this value to override the return value of MWNamespace::isMovable(). 'NewDifferenceEngine' do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values before the output is cached one of or reset my talk my contributions etc etc otherwise the built in rate limiting checks are if enabled allows for interception of redirect as a string mapping parameter names to values & $type
Definition hooks.txt:2568
namespace and then decline to actually register it file or subcat img or subcat $title
Definition hooks.txt:986
either a unescaped string or a HtmlArmor object after in associative array form externallinks including delete and has completed for all link tables whether this was an auto creation default is conds Array Extra conditions for the No matching items in log is displayed if loglist is empty msgKey Array If you want a nice box with a set this to the key of the message First element is the message additional optional elements are parameters for the key that are processed with wfMessage() -> params() ->parseAsBlock() - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset - wrap String Wrap the message in html(usually something like "&lt;div ...>$1&lt;/div>"). - flags Integer display flags(NO_ACTION_LINK, NO_EXTRA_USER_LINKS) 'LogException':Called before an exception(or PHP error) is logged. This is meant for integration with external error aggregation services
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition hooks.txt:1950
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses & $ret
Definition hooks.txt:1949
this hook is for auditing only or null if authentication failed before getting that far $username
Definition hooks.txt:807
Allows to change the fields on the form that will be generated $name
Definition hooks.txt:304
namespace are movable Hooks may change this value to override the return value of MWNamespace::isMovable(). 'NewDifferenceEngine' do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values before the output is cached $page
Definition hooks.txt:2534
presenting them properly to the user as errors is done by the caller return true use this to change the list i e etc $rev
Definition hooks.txt:1734
processing should stop and the error should be shown to the user * false
Definition hooks.txt:189
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that probably a stub it is not rendered in wiki pages or galleries in category pages allow injecting custom HTML after the section Any uses of the hook need to handle escaping see BaseTemplate::getToolbox and BaseTemplate::makeListItem for details on the format of individual items inside of this array or by returning and letting standard HTTP rendering take place modifiable or by returning false and taking over the output modifiable & $code
Definition hooks.txt:887
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition injection.txt:37
const STRIP_COMMENTS
magicword txt Magic Words are some phrases used in the wikitext They are used for two that looks like templates but that don t accept any parameter *Parser functions(like {{fullurl:...}}, {{#special:...}}) $magicWords['en']
Definition magicword.txt:33
$cache
Definition mcc.php:33
title
$params
if(!isset( $args[0])) $lang