summaryrefslogtreecommitdiff
path: root/includes/content
diff options
context:
space:
mode:
Diffstat (limited to 'includes/content')
-rw-r--r--includes/content/ContentHandler.php54
-rw-r--r--includes/content/CssContent.php44
-rw-r--r--includes/content/CssContentHandler.php19
-rw-r--r--includes/content/JavaScriptContent.php47
-rw-r--r--includes/content/JavaScriptContentHandler.php18
-rw-r--r--includes/content/TextContentHandler.php9
-rw-r--r--includes/content/WikitextContent.php4
7 files changed, 177 insertions, 18 deletions
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
index 371b267e..bf91a4f0 100644
--- a/includes/content/ContentHandler.php
+++ b/includes/content/ContentHandler.php
@@ -207,26 +207,26 @@ abstract class ContentHandler {
}
}
- // Could this page contain custom CSS or JavaScript, based on the title?
- $isCssOrJsPage = NS_MEDIAWIKI == $ns && preg_match( '!\.(css|js)$!u', $title->getText(), $m );
- if ( $isCssOrJsPage ) {
+ // Could this page contain code based on the title?
+ $isCodePage = NS_MEDIAWIKI == $ns && preg_match( '!\.(css|js|json)$!u', $title->getText(), $m );
+ if ( $isCodePage ) {
$ext = $m[1];
}
// Hook can force JS/CSS
- Hooks::run( 'TitleIsCssOrJsPage', array( $title, &$isCssOrJsPage ), '1.25' );
+ Hooks::run( 'TitleIsCssOrJsPage', array( $title, &$isCodePage ), '1.25' );
- // Is this a .css subpage of a user page?
- $isJsCssSubpage = NS_USER == $ns
- && !$isCssOrJsPage
- && preg_match( "/\\/.*\\.(js|css)$/", $title->getText(), $m );
- if ( $isJsCssSubpage ) {
+ // Is this a user subpage containing code?
+ $isCodeSubpage = NS_USER == $ns
+ && !$isCodePage
+ && preg_match( "/\\/.*\\.(js|css|json)$/", $title->getText(), $m );
+ if ( $isCodeSubpage ) {
$ext = $m[1];
}
// Is this wikitext, according to $wgNamespaceContentModels or the DefaultModelFor hook?
$isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
- $isWikitext = $isWikitext && !$isCssOrJsPage && !$isJsCssSubpage;
+ $isWikitext = $isWikitext && !$isCodePage && !$isCodeSubpage;
// Hook can override $isWikitext
Hooks::run( 'TitleIsWikitextPage', array( $title, &$isWikitext ), '1.25' );
@@ -237,6 +237,8 @@ abstract class ContentHandler {
return CONTENT_MODEL_JAVASCRIPT;
case 'css':
return CONTENT_MODEL_CSS;
+ case 'json':
+ return CONTENT_MODEL_JSON;
default:
return is_null( $model ) ? CONTENT_MODEL_TEXT : $model;
}
@@ -353,16 +355,20 @@ abstract class ContentHandler {
*
* @param string $name The content model ID, as given by a CONTENT_MODEL_XXX
* constant or returned by Revision::getContentModel().
+ * @param Language|null $lang The language to parse the message in (since 1.26)
*
* @throws MWException If the model ID isn't known.
* @return string The content model's localized name.
*/
- public static function getLocalizedName( $name ) {
+ public static function getLocalizedName( $name, Language $lang = null ) {
// Messages: content-model-wikitext, content-model-text,
// content-model-javascript, content-model-css
$key = "content-model-$name";
$msg = wfMessage( $key );
+ if ( $lang ) {
+ $msg->inLanguage( $lang );
+ }
return $msg->exists() ? $msg->plain() : $name;
}
@@ -629,7 +635,7 @@ abstract class ContentHandler {
// hook: get difference engine
$differenceEngine = null;
- if ( !wfRunHooks( 'GetDifferenceEngine',
+ if ( !Hooks::run( 'GetDifferenceEngine',
array( $context, $old, $new, $refreshCache, $unhide, &$differenceEngine )
) ) {
return $differenceEngine;
@@ -1021,7 +1027,7 @@ abstract class ContentHandler {
/**
* Returns true for content models that support caching using the
- * ParserCache mechanism. See WikiPage::isParserCacheUsed().
+ * ParserCache mechanism. See WikiPage::shouldCheckParserCache().
*
* @since 1.21
*
@@ -1058,6 +1064,24 @@ abstract class ContentHandler {
}
/**
+ * Return true if this content model supports direct editing, such as via EditPage.
+ *
+ * @return bool Default is false, and true for TextContent and it's derivatives.
+ */
+ public function supportsDirectEditing() {
+ return false;
+ }
+
+ /**
+ * Whether or not this content model supports direct editing via ApiEditPage
+ *
+ * @return bool Default is false, and true for TextContent and derivatives.
+ */
+ public function supportsDirectApiEditing() {
+ return $this->supportsDirectEditing();
+ }
+
+ /**
* Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
* self::$enableDeprecationWarnings is set to true.
*
@@ -1112,7 +1136,7 @@ abstract class ContentHandler {
$handlers = Hooks::getHandlers( $event );
$handlerInfo = array();
- wfSuppressWarnings();
+ MediaWiki\suppressWarnings();
foreach ( $handlers as $handler ) {
if ( is_array( $handler ) ) {
@@ -1135,7 +1159,7 @@ abstract class ContentHandler {
$handlerInfo[] = $info;
}
- wfRestoreWarnings();
+ MediaWiki\restoreWarnings();
wfWarn( "Using obsolete hook $event via ContentHandler::runLegacyHooks()! Handlers: " .
implode( ', ', $handlerInfo ), 2 );
diff --git a/includes/content/CssContent.php b/includes/content/CssContent.php
index 8290603c..b4f5196d 100644
--- a/includes/content/CssContent.php
+++ b/includes/content/CssContent.php
@@ -33,6 +33,11 @@
class CssContent extends TextContent {
/**
+ * @var bool|Title|null
+ */
+ private $redirectTarget = false;
+
+ /**
* @param string $text CSS code.
* @param string $modelId the content content model
*/
@@ -74,4 +79,43 @@ class CssContent extends TextContent {
return $html;
}
+ /**
+ * @param Title $target
+ * @return CssContent
+ */
+ public function updateRedirect( Title $target ) {
+ if ( !$this->isRedirect() ) {
+ return $this;
+ }
+
+ return $this->getContentHandler()->makeRedirectContent( $target );
+ }
+
+ /**
+ * @return Title|null
+ */
+ public function getRedirectTarget() {
+ if ( $this->redirectTarget !== false ) {
+ return $this->redirectTarget;
+ }
+ $this->redirectTarget = null;
+ $text = $this->getNativeData();
+ if ( strpos( $text, '/* #REDIRECT */' ) === 0 ) {
+ // Extract the title from the url
+ preg_match( '/title=(.*?)&action=raw/', $text, $matches );
+ if ( isset( $matches[1] ) ) {
+ $title = Title::newFromText( $matches[1] );
+ if ( $title ) {
+ // Have a title, check that the current content equals what
+ // the redirect content should be
+ if ( $this->equals( $this->getContentHandler()->makeRedirectContent( $title ) ) ) {
+ $this->redirectTarget = $title;
+ }
+ }
+ }
+ }
+
+ return $this->redirectTarget;
+ }
+
}
diff --git a/includes/content/CssContentHandler.php b/includes/content/CssContentHandler.php
index b2a8676b..ae5f742a 100644
--- a/includes/content/CssContentHandler.php
+++ b/includes/content/CssContentHandler.php
@@ -39,4 +39,23 @@ class CssContentHandler extends CodeContentHandler {
protected function getContentClass() {
return 'CssContent';
}
+
+ public function supportsRedirects() {
+ return true;
+ }
+
+ /**
+ * Create a redirect that is also valid CSS
+ *
+ * @param Title $destination
+ * @param string $text ignored
+ * @return CssContent
+ */
+ public function makeRedirectContent( Title $destination, $text = '' ) {
+ // The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
+ $url = $destination->getFullURL( 'action=raw&ctype=text/css', false, PROTO_RELATIVE );
+ $class = $this->getContentClass();
+ return new $class( '/* #REDIRECT */@import ' . CSSMin::buildUrlValue( $url ) . ';' );
+ }
+
}
diff --git a/includes/content/JavaScriptContent.php b/includes/content/JavaScriptContent.php
index c0194c2e..6d236560 100644
--- a/includes/content/JavaScriptContent.php
+++ b/includes/content/JavaScriptContent.php
@@ -33,6 +33,11 @@
class JavaScriptContent extends TextContent {
/**
+ * @var bool|Title|null
+ */
+ private $redirectTarget = false;
+
+ /**
* @param string $text JavaScript code.
* @param string $modelId the content model name
*/
@@ -73,4 +78,46 @@ class JavaScriptContent extends TextContent {
return $html;
}
+ /**
+ * If this page is a redirect, return the content
+ * if it should redirect to $target instead
+ *
+ * @param Title $target
+ * @return JavaScriptContent
+ */
+ public function updateRedirect( Title $target ) {
+ if ( !$this->isRedirect() ) {
+ return $this;
+ }
+
+ return $this->getContentHandler()->makeRedirectContent( $target );
+ }
+
+ /**
+ * @return Title|null
+ */
+ public function getRedirectTarget() {
+ if ( $this->redirectTarget !== false ) {
+ return $this->redirectTarget;
+ }
+ $this->redirectTarget = null;
+ $text = $this->getNativeData();
+ if ( strpos( $text, '/* #REDIRECT */' ) === 0 ) {
+ // Extract the title from the url
+ preg_match( '/title=(.*?)\\\\u0026action=raw/', $text, $matches );
+ if ( isset( $matches[1] ) ) {
+ $title = Title::newFromText( $matches[1] );
+ if ( $title ) {
+ // Have a title, check that the current content equals what
+ // the redirect content should be
+ if ( $this->equals( $this->getContentHandler()->makeRedirectContent( $title ) ) ) {
+ $this->redirectTarget = $title;
+ }
+ }
+ }
+ }
+
+ return $this->redirectTarget;
+ }
+
}
diff --git a/includes/content/JavaScriptContentHandler.php b/includes/content/JavaScriptContentHandler.php
index d2218971..65e3a6f0 100644
--- a/includes/content/JavaScriptContentHandler.php
+++ b/includes/content/JavaScriptContentHandler.php
@@ -41,4 +41,22 @@ class JavaScriptContentHandler extends CodeContentHandler {
protected function getContentClass() {
return 'JavaScriptContent';
}
+
+ public function supportsRedirects() {
+ return true;
+ }
+
+ /**
+ * Create a redirect that is also valid JavaScript
+ *
+ * @param Title $destination
+ * @param string $text ignored
+ * @return JavaScriptContent
+ */
+ public function makeRedirectContent( Title $destination, $text = '' ) {
+ // The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
+ $url = $destination->getFullURL( 'action=raw&ctype=text/javascript', false, PROTO_RELATIVE );
+ $class = $this->getContentClass();
+ return new $class( '/* #REDIRECT */' . Xml::encodeJsCall( 'mw.loader.load', array( $url ) ) );
+ }
}
diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php
index ffe1acbd..f5e87830 100644
--- a/includes/content/TextContentHandler.php
+++ b/includes/content/TextContentHandler.php
@@ -134,4 +134,13 @@ class TextContentHandler extends ContentHandler {
return new $class( '' );
}
+ /**
+ * @see ContentHandler::supportsDirectEditing
+ *
+ * @return bool Default is true for TextContent and derivatives.
+ */
+ public function supportsDirectEditing() {
+ return true;
+ }
+
}
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
index dbe09f91..8beae393 100644
--- a/includes/content/WikitextContent.php
+++ b/includes/content/WikitextContent.php
@@ -82,7 +82,6 @@ class WikitextContent extends TextContent {
$text = $with->getNativeData();
if ( strval( $sectionId ) === '' ) {
-
return $with; # XXX: copy first?
}
@@ -273,12 +272,11 @@ class WikitextContent extends TextContent {
return false;
}
- $text = $this->getNativeData();
-
switch ( $wgArticleCountMethod ) {
case 'any':
return true;
case 'comma':
+ $text = $this->getNativeData();
return strpos( $text, ',' ) !== false;
case 'link':
if ( $hasLinks === null ) { # not known, find out