MediaWiki  master
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' ],
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 
75  if ( $wgAllowDisplayTitle ) {
76  $parser->setFunctionHook(
77  'displaytitle',
78  [ __CLASS__, 'displaytitle' ],
80  );
81  }
82  if ( $wgAllowSlowParserFunctions ) {
83  $parser->setFunctionHook(
84  'pagesinnamespace',
85  [ __CLASS__, 'pagesinnamespace' ],
87  );
88  }
89  }
90 
97  public static function intFunction( $parser, $part1 = '', ...$params ) {
98  if ( strval( $part1 ) !== '' ) {
99  $message = wfMessage( $part1, $params )
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();
116  $df = MediaWikiServices::getInstance()->getDateFormatterFactory()->get( $lang );
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 ) ) {
168  $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 ) {
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 
319  public static function gender( $parser, $username, ...$forms ) {
320  // Some shortcuts to avoid loading user data unnecessarily
321  if ( count( $forms ) === 0 ) {
322  return '';
323  } elseif ( count( $forms ) === 1 ) {
324  return $forms[0];
325  }
326 
327  $username = trim( $username );
328 
329  $gender = User::getDefaultOption( 'gender' );
330 
331  // allow prefix and normalize (e.g. "&#42;foo" -> "*foo" ).
333 
334  if ( $title && $title->inNamespace( NS_USER ) ) {
335  $username = $title->getText();
336  }
337 
338  // check parameter, or use the ParserOptions if in interface message
340  $genderCache = MediaWikiServices::getInstance()->getGenderCache();
341  if ( $user ) {
342  $gender = $genderCache->getGenderOf( $user, __METHOD__ );
343  } elseif ( $username === '' && $parser->getOptions()->getInterfaceMessage() ) {
344  $gender = $genderCache->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
345  }
346  $ret = $parser->getFunctionLang()->gender( $gender, $forms );
347  return $ret;
348  }
349 
356  public static function plural( $parser, $text = '', ...$forms ) {
357  $text = $parser->getFunctionLang()->parseFormattedNumber( $text );
358  settype( $text, ctype_digit( $text ) ? 'int' : 'float' );
359  return $parser->getFunctionLang()->convertPlural( $text, $forms );
360  }
361 
367  public static function bidi( $parser, $text = '' ) {
368  return $parser->getFunctionLang()->embedBidi( $text );
369  }
370 
380  public static function displaytitle( $parser, $text = '', $uarg = '' ) {
382 
383  static $magicWords = null;
384  if ( is_null( $magicWords ) ) {
385  $magicWords = $parser->getMagicWordFactory()->newArray(
386  [ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
387  }
388  $arg = $magicWords->matchStartToEnd( $uarg );
389 
390  // parse a limited subset of wiki markup (just the single quote items)
391  $text = $parser->doQuotes( $text );
392 
393  // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
394  $text = $parser->killMarkers( $text );
395 
396  // list of disallowed tags for DISPLAYTITLE
397  // these will be escaped even though they are allowed in normal wiki text
398  $bad = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
399  'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'br' ];
400 
401  // disallow some styles that could be used to bypass $wgRestrictDisplayTitle
402  if ( $wgRestrictDisplayTitle ) {
403  $htmlTagsCallback = function ( &$params ) {
405 
406  if ( isset( $decoded['style'] ) ) {
407  // this is called later anyway, but we need it right now for the regexes below to be safe
408  // calling it twice doesn't hurt
409  $decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
410 
411  if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
412  $decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
413  }
414  }
415 
417  };
418  } else {
419  $htmlTagsCallback = null;
420  }
421 
422  // only requested titles that normalize to the actual title are allowed through
423  // if $wgRestrictDisplayTitle is true (it is by default)
424  // mimic the escaping process that occurs in OutputPage::setPageTitle
426  $text,
427  $htmlTagsCallback,
428  [],
429  [],
430  $bad
431  ) );
433 
434  if ( !$wgRestrictDisplayTitle ||
435  ( $title instanceof Title
436  && !$title->hasFragment()
437  && $title->equals( $parser->mTitle ) )
438  ) {
439  $old = $parser->mOutput->getProperty( 'displaytitle' );
440  if ( $old === false || $arg !== 'displaytitle_noreplace' ) {
441  $parser->mOutput->setDisplayTitle( $text );
442  }
443  if ( $old !== false && $old !== $text && !$arg ) {
444  $converter = $parser->getTargetLanguage()->getConverter();
445  return '<span class="error">' .
446  wfMessage( 'duplicate-displaytitle',
447  // Message should be parsed, but these params should only be escaped.
448  $converter->markNoConversion( wfEscapeWikiText( $old ) ),
449  $converter->markNoConversion( wfEscapeWikiText( $text ) )
450  )->inContentLanguage()->text() .
451  '</span>';
452  } else {
453  return '';
454  }
455  } else {
456  $parser->getOutput()->addWarning(
457  wfMessage( 'restricted-displaytitle',
458  // Message should be parsed, but this param should only be escaped.
459  wfEscapeWikiText( $text )
460  )->text()
461  );
462  $parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
463  }
464  }
465 
475  private static function matchAgainstMagicword(
476  MagicWordFactory $magicWordFactory, $magicword, $value
477  ) {
478  $value = trim( strval( $value ) );
479  if ( $value === '' ) {
480  return false;
481  }
482  $mwObject = $magicWordFactory->get( $magicword );
483  return $mwObject->matchStartToEnd( $value );
484  }
485 
495  public static function formatRaw(
496  $num, $raw, $language, MagicWordFactory $magicWordFactory = null
497  ) {
498  if ( $raw !== null && !$magicWordFactory ) {
499  $magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory();
500  }
501  if (
502  $raw !== null && self::matchAgainstMagicword( $magicWordFactory, 'rawsuffix', $raw )
503  ) {
504  return $num;
505  } else {
506  return $language->formatNum( $num );
507  }
508  }
509 
510  public static function numberofpages( $parser, $raw = null ) {
511  return self::formatRaw( SiteStats::pages(), $raw, $parser->getFunctionLang() );
512  }
513 
514  public static function numberofusers( $parser, $raw = null ) {
515  return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
516  }
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 
550  public static function numberingroup( $parser, $name = '', $raw = null ) {
551  return self::formatRaw(
552  SiteStats::numberingroup( strtolower( $name ) ),
553  $raw,
554  $parser->getFunctionLang()
555  );
556  }
557 
567  public static function mwnamespace( $parser, $title = null ) {
569  if ( is_null( $t ) ) {
570  return '';
571  }
572  return str_replace( '_', ' ', $t->getNsText() );
573  }
574 
575  public static function namespacee( $parser, $title = null ) {
577  if ( is_null( $t ) ) {
578  return '';
579  }
580  return wfUrlencode( $t->getNsText() );
581  }
582 
583  public static function namespacenumber( $parser, $title = null ) {
585  if ( is_null( $t ) ) {
586  return '';
587  }
588  return $t->getNamespace();
589  }
590 
591  public static function talkspace( $parser, $title = null ) {
593  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
594  return '';
595  }
596  return str_replace( '_', ' ', $t->getTalkNsText() );
597  }
598 
599  public static function talkspacee( $parser, $title = null ) {
601  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
602  return '';
603  }
604  return wfUrlencode( $t->getTalkNsText() );
605  }
606 
607  public static function subjectspace( $parser, $title = null ) {
609  if ( is_null( $t ) ) {
610  return '';
611  }
612  return str_replace( '_', ' ', $t->getSubjectNsText() );
613  }
614 
615  public static function subjectspacee( $parser, $title = null ) {
617  if ( is_null( $t ) ) {
618  return '';
619  }
620  return wfUrlencode( $t->getSubjectNsText() );
621  }
622 
630  public static function pagename( $parser, $title = null ) {
632  if ( is_null( $t ) ) {
633  return '';
634  }
635  return wfEscapeWikiText( $t->getText() );
636  }
637 
638  public static function pagenamee( $parser, $title = null ) {
640  if ( is_null( $t ) ) {
641  return '';
642  }
643  return wfEscapeWikiText( $t->getPartialURL() );
644  }
645 
646  public static function fullpagename( $parser, $title = null ) {
648  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
649  return '';
650  }
651  return wfEscapeWikiText( $t->getPrefixedText() );
652  }
653 
654  public static function fullpagenamee( $parser, $title = null ) {
656  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
657  return '';
658  }
659  return wfEscapeWikiText( $t->getPrefixedURL() );
660  }
661 
662  public static function subpagename( $parser, $title = null ) {
664  if ( is_null( $t ) ) {
665  return '';
666  }
667  return wfEscapeWikiText( $t->getSubpageText() );
668  }
669 
670  public static function subpagenamee( $parser, $title = null ) {
672  if ( is_null( $t ) ) {
673  return '';
674  }
675  return wfEscapeWikiText( $t->getSubpageUrlForm() );
676  }
677 
678  public static function rootpagename( $parser, $title = null ) {
680  if ( is_null( $t ) ) {
681  return '';
682  }
683  return wfEscapeWikiText( $t->getRootText() );
684  }
685 
686  public static function rootpagenamee( $parser, $title = null ) {
688  if ( is_null( $t ) ) {
689  return '';
690  }
691  return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) );
692  }
693 
694  public static function basepagename( $parser, $title = null ) {
696  if ( is_null( $t ) ) {
697  return '';
698  }
699  return wfEscapeWikiText( $t->getBaseText() );
700  }
701 
702  public static function basepagenamee( $parser, $title = null ) {
704  if ( is_null( $t ) ) {
705  return '';
706  }
707  return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) );
708  }
709 
710  public static function talkpagename( $parser, $title = null ) {
712  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
713  return '';
714  }
715  return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
716  }
717 
718  public static function talkpagenamee( $parser, $title = null ) {
720  if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
721  return '';
722  }
723  return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
724  }
725 
726  public static function subjectpagename( $parser, $title = null ) {
728  if ( is_null( $t ) ) {
729  return '';
730  }
731  return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
732  }
733 
734  public static function subjectpagenamee( $parser, $title = null ) {
736  if ( is_null( $t ) ) {
737  return '';
738  }
739  return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
740  }
741 
752  public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
753  static $magicWords = null;
754  if ( is_null( $magicWords ) ) {
755  $magicWords = $parser->getMagicWordFactory()->newArray( [
756  'pagesincategory_all',
757  'pagesincategory_pages',
758  'pagesincategory_subcats',
759  'pagesincategory_files'
760  ] );
761  }
762  static $cache = [];
763 
764  // split the given option to its variable
765  if ( self::matchAgainstMagicword( $parser->getMagicWordFactory(), 'rawsuffix', $arg1 ) ) {
766  // {{pagesincategory:|raw[|type]}}
767  $raw = $arg1;
768  $type = $magicWords->matchStartToEnd( $arg2 );
769  } else {
770  // {{pagesincategory:[|type[|raw]]}}
771  $type = $magicWords->matchStartToEnd( $arg1 );
772  $raw = $arg2;
773  }
774  if ( !$type ) { // backward compatibility
775  $type = 'pagesincategory_all';
776  }
777 
779  if ( !$title ) { # invalid title
780  return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
781  }
782  $parser->getContentLanguage()->findVariantLink( $name, $title, true );
783 
784  // Normalize name for cache
785  $name = $title->getDBkey();
786 
787  if ( !isset( $cache[$name] ) ) {
788  $category = Category::newFromTitle( $title );
789 
790  $allCount = $subcatCount = $fileCount = $pagesCount = 0;
791  if ( $parser->incrementExpensiveFunctionCount() ) {
792  // $allCount is the total number of cat members,
793  // not the count of how many members are normal pages.
794  $allCount = (int)$category->getPageCount();
795  $subcatCount = (int)$category->getSubcatCount();
796  $fileCount = (int)$category->getFileCount();
797  $pagesCount = $allCount - $subcatCount - $fileCount;
798  }
799  $cache[$name]['pagesincategory_all'] = $allCount;
800  $cache[$name]['pagesincategory_pages'] = $pagesCount;
801  $cache[$name]['pagesincategory_subcats'] = $subcatCount;
802  $cache[$name]['pagesincategory_files'] = $fileCount;
803  }
804 
805  $count = $cache[$name][$type];
806  return self::formatRaw( $count, $raw, $parser->getFunctionLang() );
807  }
808 
818  public static function pagesize( $parser, $page = '', $raw = null ) {
819  $title = Title::newFromText( $page );
820 
821  if ( !is_object( $title ) ) {
822  return self::formatRaw( 0, $raw, $parser->getFunctionLang() );
823  }
824 
825  // fetch revision from cache/database and return the value
826  $rev = self::getCachedRevisionObject( $parser, $title );
827  $length = $rev ? $rev->getSize() : 0;
828  if ( $length === null ) {
829  // We've had bugs where rev_len was not being recorded for empty pages, see T135414
830  $length = 0;
831  }
832  return self::formatRaw( $length, $raw, $parser->getFunctionLang() );
833  }
834 
847  public static function protectionlevel( $parser, $type = '', $title = '' ) {
848  $titleObject = Title::newFromText( $title );
849  if ( !( $titleObject instanceof Title ) ) {
850  $titleObject = $parser->mTitle;
851  }
852  if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
853  $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
854  # Title::getRestrictions returns an array, its possible it may have
855  # multiple values in the future
856  return implode( ',', $restrictions );
857  }
858  return '';
859  }
860 
873  public static function protectionexpiry( $parser, $type = '', $title = '' ) {
874  $titleObject = Title::newFromText( $title );
875  if ( !( $titleObject instanceof Title ) ) {
876  $titleObject = $parser->mTitle;
877  }
878  if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
879  $expiry = $titleObject->getRestrictionExpiry( strtolower( $type ) );
880  // getRestrictionExpiry() returns false on invalid type; trying to
881  // match protectionlevel() function that returns empty string instead
882  if ( $expiry === false ) {
883  $expiry = '';
884  }
885  return $expiry;
886  }
887  return '';
888  }
889 
897  public static function language( $parser, $code = '', $inLanguage = '' ) {
898  $code = strtolower( $code );
899  $inLanguage = strtolower( $inLanguage );
900  $lang = Language::fetchLanguageName( $code, $inLanguage );
901  return $lang !== '' ? $lang : LanguageCode::bcp47( $code );
902  }
903 
913  public static function pad(
914  $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT
915  ) {
916  $padding = $parser->killMarkers( $padding );
917  $lengthOfPadding = mb_strlen( $padding );
918  if ( $lengthOfPadding == 0 ) {
919  return $string;
920  }
921 
922  # The remaining length to add counts down to 0 as padding is added
923  $length = min( (int)$length, 500 ) - mb_strlen( $string );
924  if ( $length <= 0 ) {
925  // Nothing to add
926  return $string;
927  }
928 
929  # $finalPadding is just $padding repeated enough times so that
930  # mb_strlen( $string ) + mb_strlen( $finalPadding ) == $length
931  $finalPadding = '';
932  while ( $length > 0 ) {
933  # If $length < $lengthofPadding, truncate $padding so we get the
934  # exact length desired.
935  $finalPadding .= mb_substr( $padding, 0, $length );
936  $length -= $lengthOfPadding;
937  }
938 
939  if ( $direction == STR_PAD_LEFT ) {
940  return $finalPadding . $string;
941  } else {
942  return $string . $finalPadding;
943  }
944  }
945 
946  public static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) {
947  return self::pad( $parser, $string, $length, $padding, STR_PAD_LEFT );
948  }
949 
950  public static function padright( $parser, $string = '', $length = 0, $padding = '0' ) {
951  return self::pad( $parser, $string, $length, $padding );
952  }
953 
959  public static function anchorencode( $parser, $text ) {
960  $text = $parser->killMarkers( $text );
961  $section = (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
963  }
964 
965  public static function special( $parser, $text ) {
966  list( $page, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
967  resolveAlias( $text );
968  if ( $page ) {
969  $title = SpecialPage::getTitleFor( $page, $subpage );
970  return $title->getPrefixedText();
971  } else {
972  // unknown special page, just use the given text as its title, if at all possible
974  return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
975  }
976  }
977 
978  public static function speciale( $parser, $text ) {
979  return wfUrlencode( str_replace( ' ', '_', self::special( $parser, $text ) ) );
980  }
981 
990  public static function defaultsort( $parser, $text, $uarg = '' ) {
991  static $magicWords = null;
992  if ( is_null( $magicWords ) ) {
993  $magicWords = $parser->getMagicWordFactory()->newArray(
994  [ 'defaultsort_noerror', 'defaultsort_noreplace' ] );
995  }
996  $arg = $magicWords->matchStartToEnd( $uarg );
997 
998  $text = trim( $text );
999  if ( strlen( $text ) == 0 ) {
1000  return '';
1001  }
1002  $old = $parser->getCustomDefaultSort();
1003  if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
1004  $parser->setDefaultSort( $text );
1005  }
1006 
1007  if ( $old === false || $old == $text || $arg ) {
1008  return '';
1009  } else {
1010  $converter = $parser->getTargetLanguage()->getConverter();
1011  return '<span class="error">' .
1012  wfMessage( 'duplicate-defaultsort',
1013  // Message should be parsed, but these params should only be escaped.
1014  $converter->markNoConversion( wfEscapeWikiText( $old ) ),
1015  $converter->markNoConversion( wfEscapeWikiText( $text ) )
1016  )->inContentLanguage()->text() .
1017  '</span>';
1018  }
1019  }
1020 
1032  public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
1033  $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $name );
1034 
1035  if ( $argA == 'nowiki' ) {
1036  // {{filepath: | option [| size] }}
1037  $isNowiki = true;
1038  $parsedWidthParam = Parser::parseWidthParam( $argB );
1039  } else {
1040  // {{filepath: [| size [|option]] }}
1041  $parsedWidthParam = Parser::parseWidthParam( $argA );
1042  $isNowiki = ( $argB == 'nowiki' );
1043  }
1044 
1045  if ( $file ) {
1046  $url = $file->getFullUrl();
1047 
1048  // If a size is requested...
1049  if ( count( $parsedWidthParam ) ) {
1050  $mto = $file->transform( $parsedWidthParam );
1051  // ... and we can
1052  if ( $mto && !$mto->isError() ) {
1053  // ... change the URL to point to a thumbnail.
1054  $url = wfExpandUrl( $mto->getUrl(), PROTO_RELATIVE );
1055  }
1056  }
1057  if ( $isNowiki ) {
1058  return [ $url, 'nowiki' => true ];
1059  }
1060  return $url;
1061  } else {
1062  return '';
1063  }
1064  }
1065 
1073  public static function tagObj( $parser, $frame, $args ) {
1074  if ( !count( $args ) ) {
1075  return '';
1076  }
1077  $tagName = strtolower( trim( $frame->expand( array_shift( $args ) ) ) );
1078 
1079  if ( count( $args ) ) {
1080  $inner = $frame->expand( array_shift( $args ) );
1081  } else {
1082  $inner = null;
1083  }
1084 
1085  $attributes = [];
1086  foreach ( $args as $arg ) {
1087  $bits = $arg->splitArg();
1088  if ( strval( $bits['index'] ) === '' ) {
1089  $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
1090  $value = trim( $frame->expand( $bits['value'] ) );
1091  if ( preg_match( '/^(?:["\'](.+)["\']|""|\'\')$/s', $value, $m ) ) {
1092  $value = $m[1] ?? '';
1093  }
1094  $attributes[$name] = $value;
1095  }
1096  }
1097 
1098  $stripList = $parser->getStripList();
1099  if ( !in_array( $tagName, $stripList ) ) {
1100  // we can't handle this tag (at least not now), so just re-emit it as an ordinary tag
1101  $attrText = '';
1102  foreach ( $attributes as $name => $value ) {
1103  $attrText .= ' ' . htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"';
1104  }
1105  if ( $inner === null ) {
1106  return "<$tagName$attrText/>";
1107  }
1108  return "<$tagName$attrText>$inner</$tagName>";
1109  }
1110 
1111  $params = [
1112  'name' => $tagName,
1113  'inner' => $inner,
1114  'attributes' => $attributes,
1115  'close' => "</$tagName>",
1116  ];
1117  return $parser->extensionSubstitution( $params, $frame );
1118  }
1119 
1132  private static function getCachedRevisionObject( $parser, $title = null ) {
1133  if ( is_null( $title ) ) {
1134  return null;
1135  }
1136 
1137  // Use the revision from the parser itself, when param is the current page
1138  // and the revision is the current one
1139  if ( $title->equals( $parser->getTitle() ) ) {
1140  $parserRev = $parser->getRevisionObject();
1141  if ( $parserRev && $parserRev->isCurrent() ) {
1142  // force reparse after edit with vary-revision flag
1143  $parser->getOutput()->setFlag( 'vary-revision' );
1144  wfDebug( __METHOD__ . ": use current revision from parser, setting vary-revision...\n" );
1145  return $parserRev;
1146  }
1147  }
1148 
1149  // Normalize name for cache
1150  $page = $title->getPrefixedDBkey();
1151 
1152  if ( !( $parser->currentRevisionCache && $parser->currentRevisionCache->has( $page ) )
1153  && !$parser->incrementExpensiveFunctionCount() ) {
1154  return null;
1155  }
1156  $rev = $parser->fetchCurrentRevisionOfTitle( $title );
1157  $pageID = $rev ? $rev->getPage() : 0;
1158  $revID = $rev ? $rev->getId() : 0;
1159 
1160  // Register dependency in templatelinks
1161  $parser->getOutput()->addTemplate( $title, $pageID, $revID );
1162 
1163  return $rev;
1164  }
1165 
1173  public static function pageid( $parser, $title = null ) {
1175  if ( is_null( $t ) ) {
1176  return '';
1177  }
1178  // Use title from parser to have correct pageid after edit
1179  if ( $t->equals( $parser->getTitle() ) ) {
1180  $t = $parser->getTitle();
1181  return $t->getArticleID();
1182  }
1183 
1184  // These can't have ids
1185  if ( !$t->canExist() || $t->isExternal() ) {
1186  return 0;
1187  }
1188 
1189  // Check the link cache, maybe something already looked it up.
1190  $linkCache = MediaWikiServices::getInstance()->getLinkCache();
1191  $pdbk = $t->getPrefixedDBkey();
1192  $id = $linkCache->getGoodLinkID( $pdbk );
1193  if ( $id != 0 ) {
1194  $parser->mOutput->addLink( $t, $id );
1195  return $id;
1196  }
1197  if ( $linkCache->isBadLink( $pdbk ) ) {
1198  $parser->mOutput->addLink( $t, 0 );
1199  return $id;
1200  }
1201 
1202  // We need to load it from the DB, so mark expensive
1203  if ( $parser->incrementExpensiveFunctionCount() ) {
1204  $id = $t->getArticleID();
1205  $parser->mOutput->addLink( $t, $id );
1206  return $id;
1207  }
1208  return null;
1209  }
1210 
1218  public static function revisionid( $parser, $title = null ) {
1220  if ( is_null( $t ) ) {
1221  return '';
1222  }
1223  // fetch revision from cache/database and return the value
1224  $rev = self::getCachedRevisionObject( $parser, $t );
1225  return $rev ? $rev->getId() : '';
1226  }
1227 
1235  public static function revisionday( $parser, $title = null ) {
1237  if ( is_null( $t ) ) {
1238  return '';
1239  }
1240  // fetch revision from cache/database and return the value
1241  $rev = self::getCachedRevisionObject( $parser, $t );
1242  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'j' ) : '';
1243  }
1244 
1252  public static function revisionday2( $parser, $title = null ) {
1254  if ( is_null( $t ) ) {
1255  return '';
1256  }
1257  // fetch revision from cache/database and return the value
1258  $rev = self::getCachedRevisionObject( $parser, $t );
1259  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'd' ) : '';
1260  }
1261 
1269  public static function revisionmonth( $parser, $title = null ) {
1271  if ( is_null( $t ) ) {
1272  return '';
1273  }
1274  // fetch revision from cache/database and return the value
1275  $rev = self::getCachedRevisionObject( $parser, $t );
1276  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'm' ) : '';
1277  }
1278 
1286  public static function revisionmonth1( $parser, $title = null ) {
1288  if ( is_null( $t ) ) {
1289  return '';
1290  }
1291  // fetch revision from cache/database and return the value
1292  $rev = self::getCachedRevisionObject( $parser, $t );
1293  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'n' ) : '';
1294  }
1295 
1303  public static function revisionyear( $parser, $title = null ) {
1305  if ( is_null( $t ) ) {
1306  return '';
1307  }
1308  // fetch revision from cache/database and return the value
1309  $rev = self::getCachedRevisionObject( $parser, $t );
1310  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'Y' ) : '';
1311  }
1312 
1320  public static function revisiontimestamp( $parser, $title = null ) {
1322  if ( is_null( $t ) ) {
1323  return '';
1324  }
1325  // fetch revision from cache/database and return the value
1326  $rev = self::getCachedRevisionObject( $parser, $t );
1327  return $rev ? MWTimestamp::getLocalInstance( $rev->getTimestamp() )->format( 'YmdHis' ) : '';
1328  }
1329 
1337  public static function revisionuser( $parser, $title = null ) {
1339  if ( is_null( $t ) ) {
1340  return '';
1341  }
1342  // fetch revision from cache/database and return the value
1343  $rev = self::getCachedRevisionObject( $parser, $t );
1344  return $rev ? $rev->getUserText() : '';
1345  }
1346 
1359  public static function cascadingsources( $parser, $title = '' ) {
1360  $titleObject = Title::newFromText( $title );
1361  if ( !( $titleObject instanceof Title ) ) {
1362  $titleObject = $parser->mTitle;
1363  }
1364  if ( $titleObject->areCascadeProtectionSourcesLoaded()
1365  || $parser->incrementExpensiveFunctionCount()
1366  ) {
1367  $names = [];
1368  $sources = $titleObject->getCascadeProtectionSources();
1369  foreach ( $sources[0] as $sourceTitle ) {
1370  $names[] = $sourceTitle->getPrefixedText();
1371  }
1372  return implode( '|', $names );
1373  }
1374  return '';
1375  }
1376 
1377 }
static intFunction( $parser, $part1='',... $params)
static revisionday( $parser, $title=null)
Get the day from the last revision of a specified page.
static special( $parser, $text)
static subpagenamee( $parser, $title=null)
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
wfEscapeWikiText( $text)
Escapes the given text so that it may be output using addWikiText() without any linking, formatting, etc.
static grammar( $parser, $case='', $word='')
static getLocalInstance( $ts=false)
Get a timestamp instance in the server local timezone ($wgLocaltimezone)
static numberofusers( $parser, $raw=null)
static rootpagename( $parser, $title=null)
static fullpagename( $parser, $title=null)
processing should stop and the error should be shown to the user * false
Definition: hooks.txt:187
static pagename( $parser, $title=null)
Functions to get and normalize pagenames, corresponding to the magic words of the same names...
static newFromTitle( $title)
Factory function.
Definition: Category.php:146
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:1982
Apache License January AND DISTRIBUTION Definitions License shall mean the terms and conditions for use
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Definition: router.php:42
static getCachedRevisionObject( $parser, $title=null)
Fetched the current revision of the given title and return this.
static revisiontimestamp( $parser, $title=null)
Get the timestamp from the last revision of a specified page.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL.
if(!isset( $args[0])) $lang
static nse( $parser, $part1='')
static revisionday2( $parser, $title=null)
Get the day with leading zeros from the last revision of a specified page.
static talkpagename( $parser, $title=null)
static namespacee( $parser, $title=null)
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:175
$value
const NS_SPECIAL
Definition: Defines.php:49
static basepagenamee( $parser, $title=null)
static talkspace( $parser, $title=null)
static localurl( $parser, $s='', $arg=null)
static language( $parser, $code='', $inLanguage='')
Gives language names.
static gender( $parser, $username,... $forms)
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 MediaWikiServices
Definition: injection.txt:23
static activeUsers()
Definition: SiteStats.php:130
$wgRestrictDisplayTitle
For consistency, restrict DISPLAYTITLE to text that normalizes to the same canonical DB key...
static anchorencode( $parser, $text)
static uc( $parser, $s='')
static subjectspacee( $parser, $title=null)
title
see documentation in includes Linker php for Linker::makeImageLink or false for current used if you return false $parser
Definition: hooks.txt:1799
static pagesize( $parser, $page='', $raw=null)
Return the size of the given page, or 0 if it&#39;s nonexistent.
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
const SFH_NO_HASH
Definition: Parser.php:86
static fullpagenamee( $parser, $title=null)
static padleft( $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.
if( $line===false) $args
Definition: cdb.php:64
static numberingroup( $group)
Find the number of users in a given user group.
Definition: SiteStats.php:150
static revisionmonth1( $parser, $title=null)
Get the month from the last revision of a specified page.
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:1982
static formatDate( $parser, $date, $defaultPref=null)
static edits()
Definition: SiteStats.php:94
static pagesincategory( $parser, $name='', $arg1=null, $arg2=null)
Return the number of pages, files or subcats in the given category, or 0 if it&#39;s nonexistent.
static parseWidthParam( $value, $parseHeight=true)
Parsed a width param of imagelink like 300px or 200x300px.
Definition: Parser.php:6351
static stripAllTags( $html)
Take a fragment of (potentially invalid) HTML and return a version with any tags removed, encoded as plain text.
Definition: Sanitizer.php:1995
static revisionyear( $parser, $title=null)
Get the year from the last revision of a specified page.
wfUrlencode( $s)
We want some things to be included as literal characters in our title URLs for prettiness, which urlencode encodes by default.
static pagesInNs( $ns)
Definition: SiteStats.php:201
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
static numberofpages( $parser, $raw=null)
static fullurl( $parser, $s='', $arg=null)
const NS_MEDIA
Definition: Defines.php:48
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
static localurle( $parser, $s='', $arg=null)
static pagenamee( $parser, $title=null)
$cache
Definition: mcc.php:33
static bidi( $parser, $text='')
$params
const NS_CATEGORY
Definition: Defines.php:74
static numberofadmins( $parser, $raw=null)
static urlencode( $parser, $s='', $arg=null)
urlencodes a string according to one of three patterns: (T24474)
static fullurle( $parser, $s='', $arg=null)
Various core parser functions, registered in Parser::firstCallInit()
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 null
Definition: hooks.txt:780
static displaytitle( $parser, $text='', $uarg='')
Override the title of the page when viewed, provided we&#39;ve been given a title which will normalise to...
static decodeTagAttributes( $text)
Return an associative array of attribute names and values from a partial tag string.
Definition: Sanitizer.php:1443
namespace and then decline to actually register it file or subcat img or subcat $title
Definition: hooks.txt:925
const PROTO_RELATIVE
Definition: Defines.php:217
static numberoffiles( $parser, $raw=null)
static talkspacee( $parser, $title=null)
const NS_FILE
Definition: Defines.php:66
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don&#39;t need a full Title object...
Definition: SpecialPage.php:83
static rootpagenamee( $parser, $title=null)
static normalizeCharReferences( $text)
Ensure that any entities and character references are legal for XML and XHTML specifically.
Definition: Sanitizer.php:1562
static subjectpagename( $parser, $title=null)
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:1766
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:780
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
Definition: distributors.txt:9
static padright( $parser, $string='', $length=0, $padding='0')
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:3051
static speciale( $parser, $text)
static getDefaultOption( $opt)
Get a given default option value.
Definition: User.php:1792
static makeTitleSafe( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:617
static images()
Definition: SiteStats.php:139
static formatRaw( $num, $raw, $language, MagicWordFactory $magicWordFactory=null)
Formats a number according to a language.
static filepath( $parser, $name='', $argA='', $argB='')
Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}} or {{...
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:589
static fetchLanguageName( $code, $inLanguage=self::AS_AUTONYMS, $include=self::ALL)
Definition: Language.php:937
static ns( $parser, $part1='')
static matchAgainstMagicword(MagicWordFactory $magicWordFactory, $magicword, $value)
Matches the given value against the value of given magic word.
static talkpagenamee( $parser, $title=null)
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:35
static safeEncodeTagAttributes( $assoc_array)
Build a partial tag string from an associative array of attribute names and values as returned by dec...
Definition: Sanitizer.php:1485
this hook is for auditing only or null if authentication failed before getting that far $username
Definition: hooks.txt:780
static lcfirst( $parser, $s='')
static defaultsort( $parser, $text, $uarg='')
static numberofactiveusers( $parser, $raw=null)
static newFromURL( $url)
THIS IS NOT THE FUNCTION YOU WANT.
Definition: Title.php:407
static numberofedits( $parser, $raw=null)
static urlFunction( $func, $s='', $arg=null)
static lc( $parser, $s='')
static subjectspace( $parser, $title=null)
static articles()
Definition: SiteStats.php:103
static pages()
Definition: SiteStats.php:112
static namespacenumber( $parser, $title=null)
const SFH_OBJECT_ARGS
Definition: Parser.php:87
static protectionlevel( $parser, $type='', $title='')
Returns the requested protection level for the current page.
$wgAllowSlowParserFunctions
Enable slow parser functions.
static plural( $parser, $text='',... $forms)
static checkCss( $value)
Pick apart some CSS and check it for forbidden or unsafe structures.
Definition: Sanitizer.php:1058
Allows to change the fields on the form that will be generated $name
Definition: hooks.txt:271
static tagObj( $parser, $frame, $args)
Parser function to extension tag adaptor.
static revisionid( $parser, $title=null)
Get the id from the last revision of a specified page.
static removeHTMLtags( $text, $processCallback=null, $args=[], $extratags=[], $removetags=[], $warnCallback=null)
Cleans up HTML, removes dangerous tags and attributes, and removes HTML comments. ...
Definition: Sanitizer.php:497
static formatnum( $parser, $num='', $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 newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:594
const STRIP_COMMENTS
Definition: PPFrame.php:28
static revisionuser( $parser, $title=null)
Get the user from the last revision of a specified page.
static subpagename( $parser, $title=null)
static cascadingsources( $parser, $title='')
Returns the sources of any cascading protection acting on a specified page.
static revisionmonth( $parser, $title=null)
Get the month with leading zeros from the last revision of a specified page.
static numberingroup( $parser, $name='', $raw=null)
$wgAllowDisplayTitle
Allow DISPLAYTITLE to change title display.
static pageid( $parser, $title=null)
Get the pageid of a specified page.
static basepagename( $parser, $title=null)
static canonicalurle( $parser, $s='', $arg=null)
static ucfirst( $parser, $s='')
static numberofarticles( $parser, $raw=null)
static subjectpagenamee( $parser, $title=null)
get( $id)
Factory: creates an object representing an ID.
static users()
Definition: SiteStats.php:121
static pagesinnamespace( $parser, $namespace=0, $raw=null)
static protectionexpiry( $parser, $type='', $title='')
Returns the requested protection expiry for the current page.
static bcp47( $code)
Get the normalised IETF language tag See unit test for examples.
return true to allow those checks to and false if checking is done & $user
Definition: hooks.txt:1473
if the prop value should be in the metadata multi language array format
Definition: hooks.txt:1641
static canonicalurl( $parser, $s='', $arg=null)
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
static safeEncodeAttribute( $text)
Encode an attribute value for HTML tags, with extra armoring against further wiki processing...
Definition: Sanitizer.php:1192
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319