Instead of checking if the resulting $matches array is complete, we can safely assume it is, as long as the preg_match() call returned a non-false value. Note that some of these used empty() before and are actually bogus because of this! empty() considers the string "0" to be empty. In case of a ==0== headline that's an actual bug. I'm also removing the `= []` initialization before the preg_match. I understand why it was added: to make it a little more obvious that the variable is guaranteed to be initialized. But: * This is guaranteed by the preg_match anyway. * Neither initializing it with null or an empty array makes much sense because the code below assumes so much more, e.g. that specific elements exist, and are arrays. Again, these guarantees are all given by the preg_match. I find the additional initialization more distracting than helpful. Change-Id: I22b192b59038d9fa51a7e6f04d8d76634ae3de73
124 lines
3.2 KiB
PHP
124 lines
3.2 KiB
PHP
<?php
|
|
/**
|
|
* Content for JavaScript pages.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @since 1.21
|
|
*
|
|
* @file
|
|
* @ingroup Content
|
|
*
|
|
* @author Daniel Kinzler
|
|
*/
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
|
|
/**
|
|
* Content for JavaScript pages.
|
|
*
|
|
* @newable
|
|
* @ingroup Content
|
|
*/
|
|
class JavaScriptContent extends TextContent {
|
|
|
|
/**
|
|
* @var bool|Title|null
|
|
*/
|
|
private $redirectTarget = false;
|
|
|
|
/**
|
|
* @stable to call
|
|
* @param string $text JavaScript code.
|
|
* @param string $modelId the content model name
|
|
*/
|
|
public function __construct( $text, $modelId = CONTENT_MODEL_JAVASCRIPT ) {
|
|
parent::__construct( $text, $modelId );
|
|
}
|
|
|
|
/**
|
|
* Returns a Content object with pre-save transformations applied using
|
|
* Parser::preSaveTransform().
|
|
*
|
|
* @param Title $title
|
|
* @param User $user
|
|
* @param ParserOptions $popts
|
|
*
|
|
* @return JavaScriptContent
|
|
*/
|
|
public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
|
|
// @todo Make pre-save transformation optional for script pages
|
|
// See T34858
|
|
|
|
$text = $this->getText();
|
|
$pst = MediaWikiServices::getInstance()->getParser()
|
|
->preSaveTransform( $text, $title, $user, $popts );
|
|
|
|
return new static( $pst );
|
|
}
|
|
|
|
/**
|
|
* @return string JavaScript wrapped in a <pre> tag.
|
|
*/
|
|
protected function getHtml() {
|
|
return Html::element( 'pre',
|
|
[ 'class' => 'mw-code mw-js', 'dir' => 'ltr' ],
|
|
"\n" . $this->getText() . "\n"
|
|
) . "\n";
|
|
}
|
|
|
|
/**
|
|
* 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->getText();
|
|
if ( strpos( $text, '/* #REDIRECT */' ) === 0 ) {
|
|
// Extract the title from the url
|
|
if ( preg_match( '/title=(.*?)\\\\u0026action=raw/', $text, $matches ) ) {
|
|
$title = Title::newFromText( urldecode( $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;
|
|
}
|
|
|
|
}
|