MediaWiki REL1_33
CoreParserFunctions.php
Go to the documentation of this file.
1<?php
24
34 public static function register( $parser ) {
36
37 # Syntax for arguments (see Parser::setFunctionHook):
38 # "name for lookup in localized magic words array",
39 # function callback,
40 # optional Parser::SFH_NO_HASH to omit the hash from calls (e.g. {{int:...}}
41 # instead of {{#int:...}})
42 $noHashFunctions = [
43 'ns', 'nse', 'urlencode', 'lcfirst', 'ucfirst', 'lc', 'uc',
44 'localurl', 'localurle', 'fullurl', 'fullurle', 'canonicalurl',
45 'canonicalurle', 'formatnum', 'grammar', 'gender', 'plural', 'bidi',
46 'numberofpages', 'numberofusers', 'numberofactiveusers',
47 'numberofarticles', 'numberoffiles', 'numberofadmins',
48 'numberingroup', 'numberofedits', 'language',
49 'padleft', 'padright', 'anchorencode', 'defaultsort', 'filepath',
50 'pagesincategory', 'pagesize', 'protectionlevel', 'protectionexpiry',
51 'namespacee', 'namespacenumber', 'talkspace', 'talkspacee',
52 'subjectspace', 'subjectspacee', 'pagename', 'pagenamee',
53 'fullpagename', 'fullpagenamee', 'rootpagename', 'rootpagenamee',
54 'basepagename', 'basepagenamee', 'subpagename', 'subpagenamee',
55 'talkpagename', 'talkpagenamee', 'subjectpagename',
56 'subjectpagenamee', 'pageid', 'revisionid', 'revisionday',
57 'revisionday2', 'revisionmonth', 'revisionmonth1', 'revisionyear',
58 'revisiontimestamp', 'revisionuser', 'cascadingsources',
59 ];
60 foreach ( $noHashFunctions as $func ) {
61 $parser->setFunctionHook( $func, [ __CLASS__, $func ], Parser::SFH_NO_HASH );
62 }
63
64 $parser->setFunctionHook(
65 'namespace',
66 [ __CLASS__, 'mwnamespace' ],
67 Parser::SFH_NO_HASH
68 );
69 $parser->setFunctionHook( 'int', [ __CLASS__, 'intFunction' ], Parser::SFH_NO_HASH );
70 $parser->setFunctionHook( 'special', [ __CLASS__, 'special' ] );
71 $parser->setFunctionHook( 'speciale', [ __CLASS__, 'speciale' ] );
72 $parser->setFunctionHook( 'tag', [ __CLASS__, 'tagObj' ], Parser::SFH_OBJECT_ARGS );
73 $parser->setFunctionHook( 'formatdate', [ __CLASS__, 'formatDate' ] );
74
76 $parser->setFunctionHook(
77 'displaytitle',
78 [ __CLASS__, 'displaytitle' ],
79 Parser::SFH_NO_HASH
80 );
81 }
83 $parser->setFunctionHook(
84 'pagesinnamespace',
85 [ __CLASS__, 'pagesinnamespace' ],
86 Parser::SFH_NO_HASH
87 );
88 }
89 }
90
96 public static function intFunction( $parser, $part1 = '' /*, ... */ ) {
97 if ( strval( $part1 ) !== '' ) {
99 $message = wfMessage( $part1, $args )
100 ->inLanguage( $parser->getOptions()->getUserLangObj() );
101 return [ $message->plain(), 'noparse' => false ];
102 } else {
103 return [ 'found' => false ];
104 }
105 }
106
114 public static function formatDate( $parser, $date, $defaultPref = null ) {
115 $lang = $parser->getFunctionLang();
117
118 $date = trim( $date );
119
120 $pref = $parser->getOptions()->getDateFormat();
121
122 // Specify a different default date format other than the normal default
123 // if the user has 'default' for their setting
124 if ( $pref == 'default' && $defaultPref ) {
125 $pref = $defaultPref;
126 }
127
128 $date = $df->reformat( $pref, $date, [ 'match-whole' ] );
129 return $date;
130 }
131
132 public static function ns( $parser, $part1 = '' ) {
133 if ( intval( $part1 ) || $part1 == "0" ) {
134 $index = intval( $part1 );
135 } else {
136 $index = $parser->getContentLanguage()->getNsIndex( str_replace( ' ', '_', $part1 ) );
137 }
138 if ( $index !== false ) {
139 return $parser->getContentLanguage()->getFormattedNsText( $index );
140 } else {
141 return [ 'found' => false ];
142 }
143 }
144
145 public static function nse( $parser, $part1 = '' ) {
146 $ret = self::ns( $parser, $part1 );
147 if ( is_string( $ret ) ) {
148 $ret = wfUrlencode( str_replace( ' ', '_', $ret ) );
149 }
150 return $ret;
151 }
152
165 public static function urlencode( $parser, $s = '', $arg = null ) {
166 static $magicWords = null;
167 if ( is_null( $magicWords ) ) {
169 $parser->getMagicWordFactory()->newArray( [ 'url_path', 'url_query', 'url_wiki' ] );
170 }
171 switch ( $magicWords->matchStartToEnd( $arg ) ) {
172 // Encode as though it's a wiki page, '_' for ' '.
173 case 'url_wiki':
174 $func = 'wfUrlencode';
175 $s = str_replace( ' ', '_', $s );
176 break;
177
178 // Encode for an HTTP Path, '%20' for ' '.
179 case 'url_path':
180 $func = 'rawurlencode';
181 break;
182
183 // Encode for HTTP query, '+' for ' '.
184 case 'url_query':
185 default:
186 $func = 'urlencode';
187 }
188 // See T105242, where the choice to kill markers and various
189 // other options were discussed.
190 return $func( $parser->killMarkers( $s ) );
191 }
192
193 public static function lcfirst( $parser, $s = '' ) {
194 return $parser->getContentLanguage()->lcfirst( $s );
195 }
196
197 public static function ucfirst( $parser, $s = '' ) {
198 return $parser->getContentLanguage()->ucfirst( $s );
199 }
200
206 public static function lc( $parser, $s = '' ) {
207 return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'lc' ] );
208 }
209
215 public static function uc( $parser, $s = '' ) {
216 return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'uc' ] );
217 }
218
219 public static function localurl( $parser, $s = '', $arg = null ) {
220 return self::urlFunction( 'getLocalURL', $s, $arg );
221 }
222
223 public static function localurle( $parser, $s = '', $arg = null ) {
224 $temp = self::urlFunction( 'getLocalURL', $s, $arg );
225 if ( !is_string( $temp ) ) {
226 return $temp;
227 } else {
228 return htmlspecialchars( $temp );
229 }
230 }
231
232 public static function fullurl( $parser, $s = '', $arg = null ) {
233 return self::urlFunction( 'getFullURL', $s, $arg );
234 }
235
236 public static function fullurle( $parser, $s = '', $arg = null ) {
237 $temp = self::urlFunction( 'getFullURL', $s, $arg );
238 if ( !is_string( $temp ) ) {
239 return $temp;
240 } else {
241 return htmlspecialchars( $temp );
242 }
243 }
244
245 public static function canonicalurl( $parser, $s = '', $arg = null ) {
246 return self::urlFunction( 'getCanonicalURL', $s, $arg );
247 }
248
249 public static function canonicalurle( $parser, $s = '', $arg = null ) {
250 $temp = self::urlFunction( 'getCanonicalURL', $s, $arg );
251 if ( !is_string( $temp ) ) {
252 return $temp;
253 } else {
254 return htmlspecialchars( $temp );
255 }
256 }
257
258 public static function urlFunction( $func, $s = '', $arg = null ) {
259 $title = Title::newFromText( $s );
260 # Due to order of execution of a lot of bits, the values might be encoded
261 # before arriving here; if that's true, then the title can't be created
262 # and the variable will fail. If we can't get a decent title from the first
263 # attempt, url-decode and try for a second.
264 if ( is_null( $title ) ) {
265 $title = Title::newFromURL( urldecode( $s ) );
266 }
267 if ( !is_null( $title ) ) {
268 # Convert NS_MEDIA -> NS_FILE
269 if ( $title->inNamespace( NS_MEDIA ) ) {
270 $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
271 }
272 if ( !is_null( $arg ) ) {
273 $text = $title->$func( $arg );
274 } else {
275 $text = $title->$func();
276 }
277 return $text;
278 } else {
279 return [ 'found' => false ];
280 }
281 }
282
289 public static function formatnum( $parser, $num = '', $arg = null ) {
290 if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg ) ) {
291 $func = [ $parser->getFunctionLang(), 'parseFormattedNumber' ];
292 } elseif (
293 self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'nocommafysuffix', $arg )
294 ) {
295 $func = [ $parser->getFunctionLang(), 'formatNumNoSeparators' ];
296 } else {
297 $func = [ $parser->getFunctionLang(), 'formatNum' ];
298 }
299 return $parser->markerSkipCallback( $num, $func );
300 }
301
308 public static function grammar( $parser, $case = '', $word = '' ) {
309 $word = $parser->killMarkers( $word );
310 return $parser->getFunctionLang()->convertGrammar( $word, $case );
311 }
312
318 public static function gender( $parser, $username ) {
319 $forms = array_slice( func_get_args(), 2 );
320
321 // Some shortcuts to avoid loading user data unnecessarily
322 if ( count( $forms ) === 0 ) {
323 return '';
324 } elseif ( count( $forms ) === 1 ) {
325 return $forms[0];
326 }
327
329
330 $gender = User::getDefaultOption( 'gender' );
331
332 // allow prefix and normalize (e.g. "&#42;foo" -> "*foo" ).
333 $title = Title::newFromText( $username, NS_USER );
334
335 if ( $title && $title->inNamespace( NS_USER ) ) {
336 $username = $title->getText();
337 }
338
339 // check parameter, or use the ParserOptions if in interface message
340 $user = User::newFromName( $username );
341 $genderCache = MediaWikiServices::getInstance()->getGenderCache();
342 if ( $user ) {
343 $gender = $genderCache->getGenderOf( $user, __METHOD__ );
344 } elseif ( $username === '' && $parser->getOptions()->getInterfaceMessage() ) {
345 $gender = $genderCache->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
346 }
347 $ret = $parser->getFunctionLang()->gender( $gender, $forms );
348 return $ret;
349 }
350
356 public static function plural( $parser, $text = '' ) {
357 $forms = array_slice( func_get_args(), 2 );
358 $text = $parser->getFunctionLang()->parseFormattedNumber( $text );
359 settype( $text, ctype_digit( $text ) ? 'int' : 'float' );
360 return $parser->getFunctionLang()->convertPlural( $text, $forms );
361 }
362
368 public static function bidi( $parser, $text = '' ) {
369 return $parser->getFunctionLang()->embedBidi( $text );
370 }
371
381 public static function displaytitle( $parser, $text = '', $uarg = '' ) {
383
384 static $magicWords = null;
385 if ( is_null( $magicWords ) ) {
386 $magicWords = $parser->getMagicWordFactory()->newArray(
387 [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
388 }
389 $arg = $magicWords->matchStartToEnd( $uarg );
390
391 // parse a limited subset of wiki markup (just the single quote items)
392 $text = $parser->doQuotes( $text );
393
394 // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
395 $text = $parser->killMarkers( $text );
396
397 // list of disallowed tags for DISPLAYTITLE
398 // these will be escaped even though they are allowed in normal wiki text
399 $bad = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
400 'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'br' ];
401
402 // disallow some styles that could be used to bypass $wgRestrictDisplayTitle
404 $htmlTagsCallback = function ( &$params ) {
405 $decoded = Sanitizer::decodeTagAttributes( $params );
406
407 if ( isset( $decoded['style'] ) ) {
408 // this is called later anyway, but we need it right now for the regexes below to be safe
409 // calling it twice doesn't hurt
410 $decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
411
412 if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
413 $decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
414 }
415 }
416
417 $params = Sanitizer::safeEncodeTagAttributes( $decoded );
418 };
419 } else {
420 $htmlTagsCallback = null;
421 }
422
423 // only requested titles that normalize to the actual title are allowed through
424 // if $wgRestrictDisplayTitle is true (it is by default)
425 // mimic the escaping process that occurs in OutputPage::setPageTitle
426 $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
427 $text,
428 $htmlTagsCallback,
429 [],
430 [],
431 $bad
432 ) );
433 $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
434
436 ( $title instanceof Title
437 && !$title->hasFragment()
438 && $title->equals( $parser->mTitle ) )
439 ) {
440 $old = $parser->mOutput->getProperty( 'displaytitle' );
441 if ( $old === false || $arg !== 'displaytitle_noreplace' ) {
442 $parser->mOutput->setDisplayTitle( $text );
443 }
444 if ( $old !== false && $old !== $text && !$arg ) {
445 $converter = $parser->getTargetLanguage()->getConverter();
446 return '<span class="error">' .
447 wfMessage( 'duplicate-displaytitle',
448 // Message should be parsed, but these params should only be escaped.
449 $converter->markNoConversion( wfEscapeWikiText( $old ) ),
450 $converter->markNoConversion( wfEscapeWikiText( $text ) )
451 )->inContentLanguage()->text() .
452 '</span>';
453 } else {
454 return '';
455 }
456 } else {
457 $parser->getOutput()->addWarning(
458 wfMessage( 'restricted-displaytitle',
459 // Message should be parsed, but this param should only be escaped.
460 wfEscapeWikiText( $text )
461 )->text()
462 );
463 $parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
464 }
465 }
466
476 private static function matchAgainstMagicword(
477 MagicWordFactory $magicWordFactory, $magicword, $value
478 ) {
479 $value = trim( strval( $value ) );
480 if ( $value === '' ) {
481 return false;
482 }
483 $mwObject = $magicWordFactory->get( $magicword );
484 return $mwObject->matchStartToEnd( $value );
485 }
486
496 public static function formatRaw(
497 $num, $raw, $language, MagicWordFactory $magicWordFactory = null
498 ) {
499 if ( $raw !== null && !$magicWordFactory ) {
500 $magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
501 }
502 if (
503 $raw !== null && self::matchAgainstMagicword( $magicWordFactory, 'rawsuffix', $raw )
504 ) {
505 return $num;
506 } else {
507 return $language->formatNum( $num );
508 }
509 }
510
511 public static function numberofpages( $parser, $raw = null ) {
512 return self::formatRaw( SiteStats::pages(), $raw, $parser->getFunctionLang() );
513 }
514
515 public static function numberofusers( $parser, $raw = null ) {
516 return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
517 }
518 public static function numberofactiveusers( $parser, $raw = null ) {
519 return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() );
520 }
521
522 public static function numberofarticles( $parser, $raw = null ) {
523 return self::formatRaw( SiteStats::articles(), $raw, $parser->getFunctionLang() );
524 }
525
526 public static function numberoffiles( $parser, $raw = null ) {
527 return self::formatRaw( SiteStats::images(), $raw, $parser->getFunctionLang() );
528 }
529
530 public static function numberofadmins( $parser, $raw = null ) {
531 return self::formatRaw(
532 SiteStats::numberingroup( 'sysop' ),
533 $raw,
534 $parser->getFunctionLang()
535 );
536 }
537
538 public static function numberofedits( $parser, $raw = null ) {
539 return self::formatRaw( SiteStats::edits(), $raw, $parser->getFunctionLang() );
540 }
541
542 public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
543 return self::formatRaw(
544 SiteStats::pagesInNs( intval( $namespace ) ),
545 $raw,
546 $parser->getFunctionLang()
547 );
548 }
549 public static function numberingroup( $parser, $name = '', $raw = null ) {
550 return self::formatRaw(
552 $raw,
553 $parser->getFunctionLang()
554 );
555 }
556
566 public static function mwnamespace( $parser, $title = null ) {
567 $t = Title::newFromText( $title );
568 if ( is_null( $t ) ) {
569 return '';
570 }
571 return str_replace( '_', ' ', $t->getNsText() );
572 }
573 public static function namespacee( $parser, $title = null ) {
574 $t = Title::newFromText( $title );
575 if ( is_null( $t ) ) {
576 return '';
577 }
578 return wfUrlencode( $t->getNsText() );
579 }
580 public static function namespacenumber( $parser, $title = null ) {
581 $t = Title::newFromText( $title );
582 if ( is_null( $t ) ) {
583 return '';
584 }
585 return $t->getNamespace();
586 }
587 public static function talkspace( $parser, $title = null ) {
588 $t = Title::newFromText( $title );
589 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
590 return '';
591 }
592 return str_replace( '_', ' ', $t->getTalkNsText() );
593 }
594 public static function talkspacee( $parser, $title = null ) {
595 $t = Title::newFromText( $title );
596 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
597 return '';
598 }
599 return wfUrlencode( $t->getTalkNsText() );
600 }
601 public static function subjectspace( $parser, $title = null ) {
602 $t = Title::newFromText( $title );
603 if ( is_null( $t ) ) {
604 return '';
605 }
606 return str_replace( '_', ' ', $t->getSubjectNsText() );
607 }
608 public static function subjectspacee( $parser, $title = null ) {
609 $t = Title::newFromText( $title );
610 if ( is_null( $t ) ) {
611 return '';
612 }
613 return wfUrlencode( $t->getSubjectNsText() );
614 }
615
623 public static function pagename( $parser, $title = null ) {
624 $t = Title::newFromText( $title );
625 if ( is_null( $t ) ) {
626 return '';
627 }
628 return wfEscapeWikiText( $t->getText() );
629 }
630 public static function pagenamee( $parser, $title = null ) {
631 $t = Title::newFromText( $title );
632 if ( is_null( $t ) ) {
633 return '';
634 }
635 return wfEscapeWikiText( $t->getPartialURL() );
636 }
637 public static function fullpagename( $parser, $title = null ) {
638 $t = Title::newFromText( $title );
639 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
640 return '';
641 }
642 return wfEscapeWikiText( $t->getPrefixedText() );
643 }
644 public static function fullpagenamee( $parser, $title = null ) {
645 $t = Title::newFromText( $title );
646 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
647 return '';
648 }
649 return wfEscapeWikiText( $t->getPrefixedURL() );
650 }
651 public static function subpagename( $parser, $title = null ) {
652 $t = Title::newFromText( $title );
653 if ( is_null( $t ) ) {
654 return '';
655 }
656 return wfEscapeWikiText( $t->getSubpageText() );
657 }
658 public static function subpagenamee( $parser, $title = null ) {
659 $t = Title::newFromText( $title );
660 if ( is_null( $t ) ) {
661 return '';
662 }
663 return wfEscapeWikiText( $t->getSubpageUrlForm() );
664 }
665 public static function rootpagename( $parser, $title = null ) {
666 $t = Title::newFromText( $title );
667 if ( is_null( $t ) ) {
668 return '';
669 }
670 return wfEscapeWikiText( $t->getRootText() );
671 }
672 public static function rootpagenamee( $parser, $title = null ) {
673 $t = Title::newFromText( $title );
674 if ( is_null( $t ) ) {
675 return '';
676 }
677 return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) );
678 }
679 public static function basepagename( $parser, $title = null ) {
680 $t = Title::newFromText( $title );
681 if ( is_null( $t ) ) {
682 return '';
683 }
684 return wfEscapeWikiText( $t->getBaseText() );
685 }
686 public static function basepagenamee( $parser, $title = null ) {
687 $t = Title::newFromText( $title );
688 if ( is_null( $t ) ) {
689 return '';
690 }
691 return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) );
692 }
693 public static function talkpagename( $parser, $title = null ) {
694 $t = Title::newFromText( $title );
695 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
696 return '';
697 }
698 return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
699 }
700 public static function talkpagenamee( $parser, $title = null ) {
701 $t = Title::newFromText( $title );
702 if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
703 return '';
704 }
705 return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
706 }
707 public static function subjectpagename( $parser, $title = null ) {
708 $t = Title::newFromText( $title );
709 if ( is_null( $t ) ) {
710 return '';
711 }
712 return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
713 }
714 public static function subjectpagenamee( $parser, $title = null ) {
715 $t = Title::newFromText( $title );
716 if ( is_null( $t ) ) {
717 return '';
718 }
719 return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
720 }
721
732 public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
733 static $magicWords = null;
734 if ( is_null( $magicWords ) ) {
735 $magicWords = $parser->getMagicWordFactory()->newArray( [
736 'pagesincategory_all',
737 'pagesincategory_pages',
738 'pagesincategory_subcats',
739 'pagesincategory_files'
740 ] );
741 }
742 static $cache = [];
743
744 // split the given option to its variable
745 if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg1 ) ) {
746 // {{pagesincategory:|raw[|type]}}
747 $raw = $arg1;
748 $type = $magicWords->matchStartToEnd( $arg2 );
749 } else {
750 // {{pagesincategory:[|type[|raw]]}}
751 $type = $magicWords->matchStartToEnd( $arg1 );
752 $raw = $arg2;
753 }
754 if ( !$type ) { // backward compatibility
755 $type = 'pagesincategory_all';
756 }
757
758 $title = Title::makeTitleSafe( NS_CATEGORY, $name );
759 if ( !$title ) { # invalid title
760 return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
761 }
762 $parser->getContentLanguage()->findVariantLink( $name, $title, true );
763
764 // Normalize name for cache
765 $name = $title->getDBkey();
766
767 if ( !isset( $cache[$name] ) ) {
768 $category = Category::newFromTitle( $title );
769
770 $allCount = $subcatCount = $fileCount = $pagesCount = 0;
771 if ( $parser->incrementExpensiveFunctionCount() ) {
772 // $allCount is the total number of cat members,
773 // not the count of how many members are normal pages.
774 $allCount = (int)$category->getPageCount();
775 $subcatCount = (int)$category->getSubcatCount();
776 $fileCount = (int)$category->getFileCount();
777 $pagesCount = $allCount - $subcatCount - $fileCount;
778 }
779 $cache[$name]['pagesincategory_all'] = $allCount;
780 $cache[$name]['pagesincategory_pages'] = $pagesCount;
781 $cache[$name]['pagesincategory_subcats'] = $subcatCount;
782 $cache[$name]['pagesincategory_files'] = $fileCount;
783 }
784
785 $count = $cache[$name][$type];
786 return self::formatRaw( $count, $raw, $parser->getFunctionLang() );
787 }
788
798 public static function pagesize( $parser, $page = '', $raw = null ) {
799 $title = Title::newFromText( $page );
800
801 if ( !is_object( $title ) ) {
802 return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
803 }
804
805 // fetch revision from cache/database and return the value
807 $length = $rev ? $rev->getSize() : 0;
808 if ( $length === null ) {
809 // We've had bugs where rev_len was not being recorded for empty pages, see T135414
810 $length = 0;
811 }
812 return self::formatRaw( $length, $raw, $parser->getFunctionLang() );
813 }
814
827 public static function protectionlevel( $parser, $type = '', $title = '' ) {
828 $titleObject = Title::newFromText( $title );
829 if ( !( $titleObject instanceof Title ) ) {
830 $titleObject = $parser->mTitle;
831 }
832 if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
833 $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
834 # Title::getRestrictions returns an array, its possible it may have
835 # multiple values in the future
836 return implode( ',', $restrictions );
837 }
838 return '';
839 }
840
853 public static function protectionexpiry( $parser, $type = '', $title = '' ) {
854 $titleObject = Title::newFromText( $title );
855 if ( !( $titleObject instanceof Title ) ) {
856 $titleObject = $parser->mTitle;
857 }
858 if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
859 $expiry = $titleObject->getRestrictionExpiry( strtolower( $type ) );
860 // getRestrictionExpiry() returns false on invalid type; trying to
861 // match protectionlevel() function that returns empty string instead
862 if ( $expiry === false ) {
863 $expiry = '';
864 }
865 return $expiry;
866 }
867 return '';
868 }
869
877 public static function language( $parser, $code = '', $inLanguage = '' ) {
879 $inLanguage = strtolower( $inLanguage );
880 $lang = Language::fetchLanguageName( $code, $inLanguage );
881 return $lang !== '' ? $lang : LanguageCode::bcp47( $code );
882 }
883
893 public static function pad(
894 $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT
895 ) {
896 $padding = $parser->killMarkers( $padding );
897 $lengthOfPadding = mb_strlen( $padding );
898 if ( $lengthOfPadding == 0 ) {
899 return $string;
900 }
901
902 # The remaining length to add counts down to 0 as padding is added
903 $length = min( (int)$length, 500 ) - mb_strlen( $string );
904 if ( $length <= 0 ) {
905 // Nothing to add
906 return $string;
907 }
908
909 # $finalPadding is just $padding repeated enough times so that
910 # mb_strlen( $string ) + mb_strlen( $finalPadding ) == $length
911 $finalPadding = '';
912 while ( $length > 0 ) {
913 # If $length < $lengthofPadding, truncate $padding so we get the
914 # exact length desired.
915 $finalPadding .= mb_substr( $padding, 0, $length );
916 $length -= $lengthOfPadding;
917 }
918
919 if ( $direction == STR_PAD_LEFT ) {
920 return $finalPadding . $string;
921 } else {
922 return $string . $finalPadding;
923 }
924 }
925
926 public static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) {
927 return self::pad( $parser, $string, $length, $padding, STR_PAD_LEFT );
928 }
929
930 public static function padright( $parser, $string = '', $length = 0, $padding = '0' ) {
931 return self::pad( $parser, $string, $length, $padding );
932 }
933
939 public static function anchorencode( $parser, $text ) {
940 $text = $parser->killMarkers( $text );
941 $section = (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
942 return Sanitizer::safeEncodeAttribute( $section );
943 }
944
945 public static function special( $parser, $text ) {
946 list( $page, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
947 resolveAlias( $text );
948 if ( $page ) {
949 $title = SpecialPage::getTitleFor( $page, $subpage );
950 return $title->getPrefixedText();
951 } else {
952 // unknown special page, just use the given text as its title, if at all possible
953 $title = Title::makeTitleSafe( NS_SPECIAL, $text );
954 return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
955 }
956 }
957
958 public static function speciale( $parser, $text ) {
959 return wfUrlencode( str_replace( ' ', '_', self::special( $parser, $text ) ) );
960 }
961
970 public static function defaultsort( $parser, $text, $uarg = '' ) {
971 static $magicWords = null;
972 if ( is_null( $magicWords ) ) {
973 $magicWords = $parser->getMagicWordFactory()->newArray(
974 [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
975 }
976 $arg = $magicWords->matchStartToEnd( $uarg );
977
978 $text = trim( $text );
979 if ( strlen( $text ) == 0 ) {
980 return '';
981 }
982 $old = $parser->getCustomDefaultSort();
983 if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
984 $parser->setDefaultSort( $text );
985 }
986
987 if ( $old === false || $old == $text || $arg ) {
988 return '';
989 } else {
990 $converter = $parser->getTargetLanguage()->getConverter();
991 return '<span class="error">' .
992 wfMessage( 'duplicate-defaultsort',
993 // Message should be parsed, but these params should only be escaped.
994 $converter->markNoConversion( wfEscapeWikiText( $old ) ),
995 $converter->markNoConversion( wfEscapeWikiText( $text ) )
996 )->inContentLanguage()->text() .
997 '</span>';
998 }
999 }
1000
1012 public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
1013 $file = wfFindFile( $name );
1014
1015 if ( $argA == 'nowiki' ) {
1016 // {{filepath: | option [| size] }}
1017 $isNowiki = true;
1018 $parsedWidthParam = Parser::parseWidthParam( $argB );
1019 } else {
1020 // {{filepath: [| size [|option]] }}
1021 $parsedWidthParam = Parser::parseWidthParam( $argA );
1022 $isNowiki = ( $argB == 'nowiki' );
1023 }
1024
1025 if ( $file ) {
1026 $url = $file->getFullUrl();
1027
1028 // If a size is requested...
1029 if ( count( $parsedWidthParam ) ) {
1030 $mto = $file->transform( $parsedWidthParam );
1031 // ... and we can
1032 if ( $mto && !$mto->isError() ) {
1033 // ... change the URL to point to a thumbnail.
1034 $url = wfExpandUrl( $mto->getUrl(), PROTO_RELATIVE );
1035 }
1036 }
1037 if ( $isNowiki ) {
1038 return [ $url, 'nowiki' => true ];
1039 }
1040 return $url;
1041 } else {
1042 return '';
1043 }
1044 }
1045
1053 public static function tagObj( $parser, $frame, $args ) {
1054 if ( !count( $args ) ) {
1055 return '';
1056 }
1057 $tagName = strtolower( trim( $frame->expand( array_shift( $args ) ) ) );
1058
1059 if ( count( $args ) ) {
1060 $inner = $frame->expand( array_shift( $args ) );
1061 } else {
1062 $inner = null;
1063 }
1064
1065 $attributes = [];
1066 foreach ( $args as $arg ) {
1067 $bits = $arg->splitArg();
1068 if ( strval( $bits['index'] ) === '' ) {
1069 $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
1070 $value = trim( $frame->expand( $bits['value'] ) );
1071 if ( preg_match( '/^(?:["\'](.+)["\']|""|\'\')$/s', $value, $m ) ) {
1072 $value = $m[1] ?? '';
1073 }
1074 $attributes[$name] = $value;
1075 }
1076 }
1077
1078 $stripList = $parser->getStripList();
1079 if ( !in_array( $tagName, $stripList ) ) {
1080 // we can't handle this tag (at least not now), so just re-emit it as an ordinary tag
1081 $attrText = '';
1082 foreach ( $attributes as $name => $value ) {
1083 $attrText .= ' ' . htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"';
1084 }
1085 if ( $inner === null ) {
1086 return "<$tagName$attrText/>";
1087 }
1088 return "<$tagName$attrText>$inner</$tagName>";
1089 }
1090
1091 $params = [
1092 'name' => $tagName,
1093 'inner' => $inner,
1094 'attributes' => $attributes,
1095 'close' => "</$tagName>",
1096 ];
1097 return $parser->extensionSubstitution( $params, $frame );
1098 }
1099
1112 private static function getCachedRevisionObject( $parser, $title = null ) {
1113 if ( is_null( $title ) ) {
1114 return null;
1115 }
1116
1117 // Use the revision from the parser itself, when param is the current page
1118 // and the revision is the current one
1119 if ( $title->equals( $parser->getTitle() ) ) {
1120 $parserRev = $parser->getRevisionObject();
1121 if ( $parserRev && $parserRev->isCurrent() ) {
1122 // force reparse after edit with vary-revision flag
1123 $parser->getOutput()->setFlag( 'vary-revision' );
1124 wfDebug( __METHOD__ . ": use current revision from parser, setting vary-revision...\n" );
1125 return $parserRev;
1126 }
1127 }
1128
1129 // Normalize name for cache
1130 $page = $title->getPrefixedDBkey();
1131
1132 if ( !( $parser->currentRevisionCache && $parser->currentRevisionCache->has( $page ) )
1133 && !$parser->incrementExpensiveFunctionCount() ) {
1134 return null;
1135 }
1136 $rev = $parser->fetchCurrentRevisionOfTitle( $title );
1137 $pageID = $rev ? $rev->getPage() : 0;
1138 $revID = $rev ? $rev->getId() : 0;
1139
1140 // Register dependency in templatelinks
1141 $parser->getOutput()->addTemplate( $title, $pageID, $revID );
1142
1143 return $rev;
1144 }
1145
1153 public static function pageid( $parser, $title = null ) {
1154 $t = Title::newFromText( $title );
1155 if ( is_null( $t ) ) {
1156 return '';
1157 }
1158 // Use title from parser to have correct pageid after edit
1159 if ( $t->equals( $parser->getTitle() ) ) {
1160 $t = $parser->getTitle();
1161 return $t->getArticleID();
1162 }
1163
1164 // These can't have ids
1165 if ( !$t->canExist() || $t->isExternal() ) {
1166 return 0;
1167 }
1168
1169 // Check the link cache, maybe something already looked it up.
1170 $linkCache = MediaWikiServices::getInstance()->getLinkCache();
1171 $pdbk = $t->getPrefixedDBkey();
1172 $id = $linkCache->getGoodLinkID( $pdbk );
1173 if ( $id != 0 ) {
1174 $parser->mOutput->addLink( $t, $id );
1175 return $id;
1176 }
1177 if ( $linkCache->isBadLink( $pdbk ) ) {
1178 $parser->mOutput->addLink( $t, 0 );
1179 return $id;
1180 }
1181
1182 // We need to load it from the DB, so mark expensive
1183 if ( $parser->incrementExpensiveFunctionCount() ) {
1184 $id = $t->getArticleID();
1185 $parser->mOutput->addLink( $t, $id );
1186 return $id;
1187 }
1188 return null;
1189 }
1190
1198 public static function revisionid( $parser, $title = null ) {
1199 $t = Title::newFromText( $title );
1200 if ( is_null( $t ) ) {
1201 return '';
1202 }
1203 // fetch revision from cache/database and return the value
1205 return $rev ? $rev->getId() : '';
1206 }
1207
1215 public static function revisionday( $parser, $title = null ) {
1216 $t = Title::newFromText( $title );
1217 if ( is_null( $t ) ) {
1218 return '';
1219 }
1220 // fetch revision from cache/database and return the value
1222 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'j' ) : '';
1223 }
1224
1232 public static function revisionday2( $parser, $title = null ) {
1233 $t = Title::newFromText( $title );
1234 if ( is_null( $t ) ) {
1235 return '';
1236 }
1237 // fetch revision from cache/database and return the value
1239 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'd' ) : '';
1240 }
1241
1249 public static function revisionmonth( $parser, $title = null ) {
1250 $t = Title::newFromText( $title );
1251 if ( is_null( $t ) ) {
1252 return '';
1253 }
1254 // fetch revision from cache/database and return the value
1256 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'm' ) : '';
1257 }
1258
1266 public static function revisionmonth1( $parser, $title = null ) {
1267 $t = Title::newFromText( $title );
1268 if ( is_null( $t ) ) {
1269 return '';
1270 }
1271 // fetch revision from cache/database and return the value
1273 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'n' ) : '';
1274 }
1275
1283 public static function revisionyear( $parser, $title = null ) {
1284 $t = Title::newFromText( $title );
1285 if ( is_null( $t ) ) {
1286 return '';
1287 }
1288 // fetch revision from cache/database and return the value
1290 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'Y' ) : '';
1291 }
1292
1300 public static function revisiontimestamp( $parser, $title = null ) {
1301 $t = Title::newFromText( $title );
1302 if ( is_null( $t ) ) {
1303 return '';
1304 }
1305 // fetch revision from cache/database and return the value
1307 return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'YmdHis' ) : '';
1308 }
1309
1317 public static function revisionuser( $parser, $title = null ) {
1318 $t = Title::newFromText( $title );
1319 if ( is_null( $t ) ) {
1320 return '';
1321 }
1322 // fetch revision from cache/database and return the value
1324 return $rev ? $rev->getUserText() : '';
1325 }
1326
1339 public static function cascadingsources( $parser, $title = '' ) {
1340 $titleObject = Title::newFromText( $title );
1341 if ( !( $titleObject instanceof Title ) ) {
1342 $titleObject = $parser->mTitle;
1343 }
1344 if ( $titleObject->areCascadeProtectionSourcesLoaded()
1345 || $parser->incrementExpensiveFunctionCount()
1346 ) {
1347 $names = [];
1348 $sources = $titleObject->getCascadeProtectionSources();
1349 foreach ( $sources[0] as $sourceTitle ) {
1350 $names[] = $sourceTitle->getPrefixedText();
1351 }
1352 return implode( '|', $names );
1353 }
1354 return '';
1355 }
1356
1357}
This list may contain false positives That usually means there is additional text with links below the first Each row contains links to the first and second as well as the first line of the second redirect text
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
$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,...
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 formatRaw( $num, $raw, $language, MagicWordFactory $magicWordFactory=null)
Formats a number according to a language.
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: (T24474)
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 matchAgainstMagicword(MagicWordFactory $magicWordFactory, $magicword, $value)
Matches the given value against the value of given magic word.
static pagename( $parser, $title=null)
Functions to get and normalize pagenames, corresponding to the magic words of the same names.
static getCachedRevisionObject( $parser, $title=null)
Fetched the current revision of the given title and return this.
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(Language $lang=null)
Get a DateFormatter object.
A factory that stores information about MagicWords, and creates them on demand with caching.
get( $id)
Factory: creates an object representing an ID.
MediaWikiServices is the service locator for the application scope of MediaWiki.
static articles()
static pagesInNs( $ns)
static images()
static edits()
Definition SiteStats.php:94
static users()
static pages()
static numberingroup( $group)
Find the number of users in a given user group.
static activeUsers()
Represents a title within MediaWiki.
Definition Title.php:40
hasFragment()
Check if a Title fragment is set.
Definition Title.php:1559
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition User.php:585
static getDefaultOption( $opt)
Get a given default option value.
Definition User.php:1818
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
see documentation in includes Linker php for Linker::makeImageLink or false for current used if you return false $parser
Definition hooks.txt:1834
This code would result in ircNotify being run twice when an article is and once for brion Hooks can return three possible true was required This is the default since MediaWiki *some string
Definition hooks.txt:181
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that When $user is not it can be in the form of< username >< more info > e g for bot passwords intended to be added to log contexts Fields it might only if the login was with a bot password 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:856
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:2004
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:2003
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 use $formDescriptor instead 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
Allows to change the fields on the form that will be generated $name
Definition hooks.txt:271
this hook is for auditing only or null if authentication failed before getting that far $username
Definition hooks.txt:782
usually copyright or history_copyright This message must be in HTML not wikitext if the section is included from a template $section
Definition hooks.txt:3070
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:1779
processing should stop and the error should be shown to the user * false
Definition hooks.txt:187
const NS_FILE
Definition Defines.php:79
const NS_SPECIAL
Definition Defines.php:62
const NS_MEDIA
Definition Defines.php:61
const PROTO_RELATIVE
Definition Defines.php:230
const NS_CATEGORY
Definition Defines.php:87
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
$params
if(!isset( $args[0])) $lang
title