userCan( RevisionRecord::DELETED_TEXT ) ) { return null; } $title = $this->event->getTitle(); if ( !$this->isBundled() ) { // For a single-comment notification, make a pretty(ish) direct link to the comment. // The browser scrolls and we highlight it client-side. $commentId = $this->event->getExtraParam( 'comment-id' ); if ( !$commentId ) { return null; } return $title->createFragmentTarget( $commentId )->getFullURL(); } else { // For a multi-comment notification, we can't make a direct link, because we don't know // which comment appears first on the page; the best we can do is a link to the section. // We handle both scrolling and highlighting client-side, using the ugly parameter // listing all comments. // Bundling works differently for different notification types: // * Subscribed topic notifications are bundled per-section. // * User talk page notifications are bundled per-page (so basically, always bundled). // * Mention notifications are *never* bundled. // Code below tries to avoid assumptions in case this behavior changes. $sectionTitles = [ $this->event->getExtraParam( 'section-title' ) ]; $commentIds = [ $this->event->getExtraParam( 'comment-id' ) ]; foreach ( $this->getBundledEvents() as $event ) { $sectionTitles[] = $event->getExtraParam( 'section-title' ); $commentIds[] = $event->getExtraParam( 'comment-id' ); } $commentIds = array_values( array_filter( $commentIds ) ); $sectionTitles = array_values( array_unique( array_filter( $sectionTitles ) ) ); if ( !$commentIds ) { return null; } $params = [ 'dtnewcomments' => implode( '|', $commentIds ) ]; if ( count( $sectionTitles ) === 1 ) { return $title->createFragmentTarget( $sectionTitles[0] )->getFullURL( $params ); } else { return $title->getFullURL( $params ); } } } /** * Get a snippet of the individual comment, if available. * * @return string The snippet, as plain text (may be empty) */ protected function getContentSnippet() { if ( !$this->userCan( RevisionRecord::DELETED_TEXT ) ) { return ''; } // Note that we store plain text in the 'content' param. // Echo also has a 'content' param (for mention notifications), but it contains wikitext. $content = $this->event->getExtraParam( 'content' ); if ( !$content ) { return ''; } return $this->language->truncateForVisual( $content, EchoDiscussionParser::DEFAULT_SNIPPET_LENGTH ); } }