MediaWiki  master
MainSlotRoleHandler.php
Go to the documentation of this file.
1 <?php
23 namespace MediaWiki\Revision;
24 
25 use ContentHandler;
26 use Hooks;
28 use Title;
29 
42 
48 
53  public function __construct( array $namespaceContentModels ) {
54  parent::__construct( 'main', CONTENT_MODEL_WIKITEXT );
55  $this->namespaceContentModels = $namespaceContentModels;
56  }
57 
58  public function supportsArticleCount() {
59  return true;
60  }
61 
68  public function isAllowedModel( $model, LinkTarget $page ) {
70  $handler = ContentHandler::getForModelID( $model );
71  return $handler->canBeUsedOn( $title );
72  }
73 
79  public function getDefaultModel( LinkTarget $page ) {
80  // NOTE: this method must not rely on $title->getContentModel() directly or indirectly,
81  // because it is used to initialize the mContentModel member.
82 
83  $ext = '';
84  $ns = $page->getNamespace();
85  $model = $this->namespaceContentModels[$ns] ?? null;
86 
87  // Hook can determine default model
89  if ( !Hooks::run( 'ContentHandlerDefaultModelFor', [ $title, &$model ] ) && !is_null( $model ) ) {
90  return $model;
91  }
92 
93  // Could this page contain code based on the title?
94  $isCodePage = $ns === NS_MEDIAWIKI && preg_match( '!\.(css|js|json)$!u', $title->getText(), $m );
95  if ( $isCodePage ) {
96  $ext = $m[1];
97  }
98 
99  // Is this a user subpage containing code?
100  $isCodeSubpage = $ns === NS_USER
101  && !$isCodePage
102  && preg_match( "/\\/.*\\.(js|css|json)$/", $title->getText(), $m );
103 
104  if ( $isCodeSubpage ) {
105  $ext = $m[1];
106  }
107 
108  // Is this wikitext, according to $wgNamespaceContentModels or the DefaultModelFor hook?
109  $isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
110  $isWikitext = $isWikitext && !$isCodePage && !$isCodeSubpage;
111 
112  if ( !$isWikitext ) {
113  switch ( $ext ) {
114  case 'js':
116  case 'css':
117  return CONTENT_MODEL_CSS;
118  case 'json':
119  return CONTENT_MODEL_JSON;
120  default:
121  return $model ?? CONTENT_MODEL_TEXT;
122  }
123  }
124 
125  // We established that it must be wikitext
126 
127  return CONTENT_MODEL_WIKITEXT;
128  }
129 
130 }
const CONTENT_MODEL_WIKITEXT
Definition: Defines.php:215
const CONTENT_MODEL_TEXT
Definition: Defines.php:218
const CONTENT_MODEL_JSON
Definition: Defines.php:219
SlotRoleHandler instances are used to declare the existence and behavior of slot roles.
Created by PhpStorm.
string [] $namespaceContentModels
A mapping of namespaces to content models.
static getForModelID( $modelId)
Returns the ContentHandler singleton for the given model ID.
const NS_MEDIAWIKI
Definition: Defines.php:68
CONTENT_MODEL_JAVASCRIPT
Allow users to upload files.
static newFromLinkTarget(LinkTarget $linkTarget, $forceClone='')
Returns a Title given a LinkTarget.
Definition: Title.php:271
isAllowedModel( $model, LinkTarget $page)
A SlotRoleHandler for the main slot.
__construct(array $namespaceContentModels)
if(!is_readable( $file)) $ext
Definition: router.php:48
const CONTENT_MODEL_CSS
Definition: Defines.php:217
static run( $event, array $args=[], $deprecatedVersion=null)
Call hook functions defined in Hooks::register and $wgHooks.
Definition: Hooks.php:200