* @return CommentStoreComment
*/
public function createComment( IDatabase $dbw, $comment, array $data = null ) {
- global $wgContLang;
-
- if ( !$comment instanceof CommentStoreComment ) {
- if ( $data !== null ) {
- foreach ( $data as $k => $v ) {
- if ( substr( $k, 0, 1 ) === '_' ) {
- throw new InvalidArgumentException( 'Keys in $data beginning with "_" are reserved' );
- }
- }
- }
- if ( $comment instanceof Message ) {
- $message = clone $comment;
- $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg
- ->setInterfaceMessageFlag( true )
- ->text();
- $comment = new CommentStoreComment( null, $text, $message, $data );
- } else {
- $comment = new CommentStoreComment( null, $comment, null, $data );
- }
- }
+ $comment = CommentStoreComment::newUnsavedComment( $comment, $data );
# Truncate comment in a Unicode-sensitive manner
$comment->text = $this->lang->truncate( $comment->text, self::MAX_COMMENT_LENGTH );
public $data;
/**
- * @private For use by CommentStore only
+ * @private For use by CommentStore only. Use self::newUnsavedComment() instead.
* @param int|null $id
* @param string $text
* @param Message|null $message
$this->message = $message ?: new RawMessage( '$1', [ $text ] );
$this->data = $data;
}
+
+ /**
+ * Create a new, unsaved CommentStoreComment
+ *
+ * @param string|Message|CommentStoreComment $comment Comment text or Message object.
+ * A CommentStoreComment is also accepted here, in which case it is returned unchanged.
+ * @param array|null $data Structured data to store. Keys beginning with '_' are reserved.
+ * Ignored if $comment is a CommentStoreComment.
+ * @return CommentStoreComment
+ */
+ public static function newUnsavedComment( $comment, array $data = null ) {
+ global $wgContLang;
+
+ if ( $comment instanceof CommentStoreComment ) {
+ return $comment;
+ }
+
+ if ( $data !== null ) {
+ foreach ( $data as $k => $v ) {
+ if ( substr( $k, 0, 1 ) === '_' ) {
+ throw new InvalidArgumentException( 'Keys in $data beginning with "_" are reserved' );
+ }
+ }
+ }
+
+ if ( $comment instanceof Message ) {
+ $message = clone $comment;
+ $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg
+ ->setInterfaceMessageFlag( true )
+ ->text();
+ return new CommentStoreComment( null, $text, $message, $data );
+ } else {
+ return new CommentStoreComment( null, $comment, null, $data );
+ }
+ }
}
* @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
* @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
*
- * @param Title $target Can currently only be a Title, but this may
+ * @param LinkTarget $target Can currently only be a LinkTarget, but this may
* change to support Images, literal URLs, etc.
* @param string $html The HTML contents of the <a> element, i.e.,
* the link text. This is raw HTML and will not be escaped. If null,
public static function link(
$target, $html = null, $customAttribs = [], $query = [], $options = []
) {
- if ( !$target instanceof Title ) {
- wfWarn( __METHOD__ . ': Requires $target to be a Title object.', 2 );
+ if ( !$target instanceof LinkTarget ) {
+ wfWarn( __METHOD__ . ': Requires $target to be a LinkTarget object.', 2 );
return "<!-- ERROR -->$html";
}
if ( $target->getText() == '' && !$target->isExternal()
&& !$local && $title
) {
- $newTarget = clone $title;
- $newTarget->setFragment( '#' . $target->getFragment() );
- $target = $newTarget;
+ $target = $title->createFragmentTarget( $target->getFragment() );
}
$thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
*
* @note This is only public for technical reasons. It's not intended for use outside Linker.
*
- * @param Title $title
+ * @param LinkTarget $linkTarget
* @param string $text
* @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
* as used by WikiMap.
* @return string HTML link
*/
public static function makeCommentLink(
- Title $title, $text, $wikiId = null, $options = []
+ LinkTarget $linkTarget, $text, $wikiId = null, $options = []
) {
- if ( $wikiId !== null && !$title->isExternal() ) {
+ if ( $wikiId !== null && !$linkTarget->isExternal() ) {
$link = self::makeExternalLink(
WikiMap::getForeignURL(
$wikiId,
- $title->getNamespace() === 0
- ? $title->getDBkey()
- : MWNamespace::getCanonicalName( $title->getNamespace() ) . ':'
- . $title->getDBkey(),
- $title->getFragment()
+ $linkTarget->getNamespace() === 0
+ ? $linkTarget->getDBkey()
+ : MWNamespace::getCanonicalName( $linkTarget->getNamespace() ) . ':'
+ . $linkTarget->getDBkey(),
+ $linkTarget->getFragment()
),
$text,
/* escape = */ false // Already escaped
);
} else {
- $link = self::link( $title, $text, [], [], $options );
+ $link = self::link( $linkTarget, $text, [], [], $options );
}
return $link;
public function deletedLink( $id ) {
if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
$dbr = wfGetDB( DB_REPLICA );
- $row = $dbr->selectRow( 'archive', '*',
+ $row = $dbr->selectRow( 'archive',
+ Revision::selectArchiveFields(),
[ 'ar_rev_id' => $id ],
__METHOD__ );
if ( $row ) {
if ( $this->historyLine == 0 ) { // called for the first time, return line from cur
$this->historyRes = $dbr->select( 'image',
- [
- '*',
- "'' AS oi_archive_name",
- '0 as oi_deleted',
- 'img_sha1'
+ self::selectFields() + [
+ 'oi_archive_name' => $dbr->addQuotes( '' ),
+ 'oi_deleted' => 0,
],
[ 'img_name' => $this->title->getDBkey() ],
$fname
return false;
}
} elseif ( $this->historyLine == 1 ) {
- $this->historyRes = $dbr->select( 'oldimage', '*',
+ $this->historyRes = $dbr->select(
+ 'oldimage',
+ OldLocalFile::selectFields(),
[ 'oi_name' => $this->title->getDBkey() ],
$fname,
[ 'ORDER BY' => 'oi_timestamp DESC' ]
public function __construct( $imagePage ) {
parent::__construct( $imagePage->getContext() );
$this->mImagePage = $imagePage;
- $this->mTitle = clone $imagePage->getTitle();
- $this->mTitle->setFragment( '#filehistory' );
+ $this->mTitle = $imagePage->getTitle()->createFragmentTarget( 'filehistory' );
$this->mImg = null;
$this->mHist = [];
$this->mRange = [ 0, 0 ]; // display range
$wikiPage = $this;
// Trigger post-create hook
$params = [ &$wikiPage, &$user, $content, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision ];
+ $flags & EDIT_MINOR, null, null, &$flags, $revision ];
Hooks::run( 'PageContentInsertComplete', $params );
// Trigger post-save hook
- $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
+ $params = array_merge( $params, [ &$status, $meta['baseRevId'], 0 ] );
Hooks::run( 'PageContentSaveComplete', $params );
}
),
$result .= implode(
'<span class="mw-editsection-divider">'
- . wfMessage( 'pipe-separator' )->inLanguage( $lang )->text()
+ . wfMessage( 'pipe-separator' )->inLanguage( $lang )->escaped()
. '</span>',
$linksHtml
);
'scripts' => [
'resources/src/mediawiki/htmlform/htmlform.Checker.js',
],
+ 'dependencies' => [
+ 'jquery.throttle-debounce',
+ ],
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.htmlform.ooui' => [
'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js',
],
'dependencies' => [
+ 'jquery.byteLength',
'oojs',
'mediawiki.api',
'mediawiki.api.options',
* @static
* @inheritable
* @param {string} str
- * @return {string}
+ * @return {number}
*/
jQuery.byteLength = function ( str ) {
// This basically figures out how many bytes a UTF-16 string (which is what js sees)
// Stringify state
stringified = JSON.stringify( state );
- if ( stringified.length > 65535 ) {
+ if ( $.byteLength( stringified ) > 65535 ) {
// Sanity check, since the preference can only hold that.
return;
}