);
}
+ /**
+ * @param stdClass $row Result row from recent changes
+ * @return Revision|bool
+ */
+ protected function revisionFromRcResult( stdClass $result ) {
+ return new Revision( [
+ 'comment' => $result->rc_comment,
+ 'deleted' => $result->rc_deleted,
+ 'user_text' => $result->rc_user_text,
+ 'user' => $result->rc_user,
+ ] );
+ }
+
/**
* Format a row, providing the timestamp, links to the page/history,
* size, user links, and a comment
public function formatRow( $result ) {
$title = Title::newFromRow( $result );
- # Revision deletion works on revisions, so we should cast one
- $row = [
- 'comment' => $result->rc_comment,
- 'deleted' => $result->rc_deleted,
- 'user_text' => $result->rc_user_text,
- 'user' => $result->rc_user,
- ];
- $rev = new Revision( $row );
+ // Revision deletion works on revisions,
+ // so cast our recent change row to a revision row.
+ $rev = $this->revisionFromRcResult( $result );
$rev->setTitle( $title );
$classes = [];
+ $attribs = [ 'data-mw-revid' => $result->rev_id ];
$lang = $this->getLanguage();
$dm = $lang->getDirMark();
$tagDisplay = '';
}
- $css = count( $classes ) ? ' class="' . implode( ' ', $classes ) . '"' : '';
-
# Display the old title if the namespace/title has been changed
$oldTitleText = '';
$oldTitle = Title::makeTitle( $result->rc_namespace, $result->rc_title );
+ if ( count( $classes ) ) {
+ $attribs['class'] = implode( ' ', $classes );
+ }
+
if ( !$title->equals( $oldTitle ) ) {
$oldTitleText = $oldTitle->getPrefixedText();
$oldTitleText = Html::rawElement(
);
}
- return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} "
- . "{$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
+ $ret = "{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} "
+ . "{$tagDisplay} {$oldTitleText}";
+
+ // Let extensions add data
+ Hooks::run( 'NewPagesLineEnding', [ $this, &$ret, $result, &$classes, &$attribs ] );
+ $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+
+ return Html::rawElement( 'li', $attribs, $ret ) . "\n";
}
/**
protected function feedItemDesc( $row ) {
$revision = Revision::newFromId( $row->rev_id );
- if ( $revision ) {
- // XXX: include content model/type in feed item?
- return '<p>' . htmlspecialchars( $revision->getUserText() ) .
- $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
- htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
- "</p>\n<hr />\n<div>" .
- nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
+ if ( !$revision ) {
+ return '';
+ }
+
+ $content = $revision->getContent();
+ if ( $content === null ) {
+ return '';
}
- return '';
+ // XXX: include content model/type in feed item?
+ return '<p>' . htmlspecialchars( $revision->getUserText() ) .
+ $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
+ htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
+ "</p>\n<hr />\n<div>" .
+ nl2br( htmlspecialchars( $content->serialize() ) ) . "</div>";
}
protected function getGroupName() {