MediaWiki REL1_37
MainSlotRoleHandler.php
Go to the documentation of this file.
1<?php
23namespace MediaWiki\Revision;
24
31use TitleFactory;
32
45
51
54
56 private $hookRunner;
57
60
68 public function __construct(
71 HookContainer $hookContainer,
73 ) {
74 parent::__construct( 'main', CONTENT_MODEL_WIKITEXT );
75 $this->namespaceContentModels = $namespaceContentModels;
76 $this->contentHandlerFactory = $contentHandlerFactory;
77 $this->hookRunner = new HookRunner( $hookContainer );
78 $this->titleFactory = $titleFactory;
79 }
80
81 public function supportsArticleCount() {
82 return true;
83 }
84
92 public function isAllowedModel( $model, PageIdentity $page ) {
93 $title = $this->titleFactory->castFromPageIdentity( $page );
94 $handler = $this->contentHandlerFactory->getContentHandler( $model );
95
96 return $handler->canBeUsedOn( $title );
97 }
98
104 public function getDefaultModel( $page ) {
105 // NOTE: this method must not rely on $title->getContentModel() directly or indirectly,
106 // because it is used to initialize the mContentModel member.
107
108 $ext = '';
109 $ns = $page->getNamespace();
110 $model = $this->namespaceContentModels[$ns] ?? null;
111
112 // Hook can determine default model
113 if ( $page instanceof PageIdentity ) {
114 $title = $this->titleFactory->castFromPageIdentity( $page );
115 } else {
116 $title = $this->titleFactory->castFromLinkTarget( $page );
117 }
118 if ( !$this->hookRunner->onContentHandlerDefaultModelFor( $title, $model ) && $model !== null ) {
119 return $model;
120 }
121
122 // Could this page contain code based on the title?
123 $isCodePage = $ns === NS_MEDIAWIKI && preg_match( '!\.(css|js|json)$!u', $title->getText(), $m );
124 if ( $isCodePage ) {
125 $ext = $m[1];
126 }
127
128 // Is this a user subpage containing code?
129 $isCodeSubpage = $ns === NS_USER
130 && !$isCodePage
131 && preg_match( "/\\/.*\\.(js|css|json)$/", $title->getText(), $m );
132
133 if ( $isCodeSubpage ) {
134 $ext = $m[1];
135 }
136
137 // Is this wikitext, according to $wgNamespaceContentModels or the DefaultModelFor hook?
138 $isWikitext = $model === null || $model == CONTENT_MODEL_WIKITEXT;
139 $isWikitext = $isWikitext && !$isCodePage && !$isCodeSubpage;
140
141 if ( !$isWikitext ) {
142 switch ( $ext ) {
143 case 'js':
145 case 'css':
146 return CONTENT_MODEL_CSS;
147 case 'json':
148 return CONTENT_MODEL_JSON;
149 default:
150 return $model ?? CONTENT_MODEL_TEXT;
151 }
152 }
153
154 // We established that it must be wikitext
155
157 }
158
159}
const NS_USER
Definition Defines.php:66
const CONTENT_MODEL_CSS
Definition Defines.php:210
const NS_MEDIAWIKI
Definition Defines.php:72
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:208
const CONTENT_MODEL_JSON
Definition Defines.php:212
const CONTENT_MODEL_TEXT
Definition Defines.php:211
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:209
Exception thrown when an unregistered content model is requested.
This class provides an implementation of the core hook interfaces, forwarding hook calls to HookConta...
A SlotRoleHandler for the main slot.
string[] $namespaceContentModels
A mapping of namespaces to content models.
supportsArticleCount()
Whether this slot should be considered when determining whether a page should be counted as an "artic...
__construct(array $namespaceContentModels, IContentHandlerFactory $contentHandlerFactory, HookContainer $hookContainer, TitleFactory $titleFactory)
isAllowedModel( $model, PageIdentity $page)
SlotRoleHandler instances are used to declare the existence and behavior of slot roles.
Creates Title objects.
Interface for objects (potentially) representing an editable wiki page.
if(!is_readable( $file)) $ext
Definition router.php:48