diff --git a/Echo.php b/Echo.php index cc1c58c9c..f2326d2a1 100644 --- a/Echo.php +++ b/Echo.php @@ -311,6 +311,7 @@ $wgEchoNotifications = array( 'icon' => 'site', ), 'edit-user-talk' => array( + 'presentation-model' => 'EchoEditUserTalkPresentationModel', 'user-locators' => array( 'EchoUserLocator::locateTalkPageOwner', ), @@ -325,8 +326,6 @@ $wgEchoNotifications = array( 'title-params' => array( 'agent', 'user', 'subject-anchor' ), 'bundle-message' => 'notification-edit-talk-page-bundle', 'bundle-params' => array( 'agent', 'user', 'agent-other-display', 'agent-other-count' ), - 'flyout-message' => 'notification-edit-talk-page-flyout2', - 'flyout-params' => array( 'agent', 'user', 'subject-anchor' ), 'email-subject-message' => 'notification-edit-talk-page-email-subject2', 'email-subject-params' => array( 'agent' ), 'email-body-batch-message' => 'notification-edit-talk-page-email-batch-body2', diff --git a/autoload.php b/autoload.php index 63ee9a99f..ae40880a1 100644 --- a/autoload.php +++ b/autoload.php @@ -38,6 +38,7 @@ $wgAutoloadClasses += array( 'EchoDiscussionParserTest' => __DIR__ . '/tests/phpunit/DiscussionParserTest.php', 'EchoEditFormatter' => __DIR__ . '/includes/formatters/EditFormatter.php', 'EchoEditUserTalkFormatter' => __DIR__ . '/includes/formatters/EditUserTalkFormatter.php', + 'EchoEditUserTalkPresentationModel' => __DIR__ . '/includes/formatters/EditUserTalkPresentationModel.php', 'EchoEmailDecorator' => __DIR__ . '/includes/EmailFormatter.php', 'EchoEmailDigest' => __DIR__ . '/includes/EmailFormatter.php', 'EchoEmailFormatter' => __DIR__ . '/includes/EmailFormatter.php', diff --git a/i18n/en.json b/i18n/en.json index 0972dea37..f5ac9435e 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -60,8 +60,9 @@ "notification-link-text-view-edit": "View edit", "notification-edit-talk-page2": "[[User:$1|$1]] {{GENDER:$1|left}} a message on your [[User talk:$2#$3|talk page]].", "notification-edit-talk-page-with-section": "[[User:$1|$1]] {{GENDER:$1|left}} a message on your talk page in \"[[User talk:$2#$3|$4]]\".", - "notification-edit-talk-page-flyout2": "$1 {{GENDER:$1|left}} a message on your [[User talk:$2#$3|talk page]].", - "notification-edit-talk-page-flyout-with-section": "$1 {{GENDER:$1|left}} a message on your talk page in \"[[User talk:$2#$3|$4]]\".", + "notification-header-edit-user-talk": "$1 {{GENDER:$2|left}} a message on {{GENDER:$3|your}} talk page.", + "notification-header-edit-user-talk-with-section": "$1 {{GENDER:$2|left}} a message on {{GENDER:$3|your}} talk page in \"$4\".", + "notification-body-edit-user-talk-with-section": "$1", "notification-page-linked": "[[:$2]] was {{GENDER:$1|linked}} from [[:$3]]. [[Special:WhatLinksHere/$2|See all links to this page]].", "notification-header-page-linked": "$3 was {{GENDER:$2|linked}} from $4.", "notification-bundle-header-page-linked": "$3 was {{GENDER:$2|linked}} from $4 and $5 other {{PLURAL:$6|page|pages}}.", @@ -116,6 +117,7 @@ "echo-date-yesterday": "Yesterday", "echo-load-more-error": "An error occurred while fetching more results.", "notification-edit-talk-page-bundle": "$1 and $3 {{PLURAL:$4|other|others}} {{GENDER:$1|left}} a message on your [[User talk:$2|talk page]].", + "notification-bundle-header-edit-user-talk": "$1 and $4 {{PLURAL:$5|other|others}} {{GENDER:$2|left}} a message on {{GENDER:$3|your}} talk page.", "notification-edit-user-talk-email-batch-bundle-body": "$1 and $2 {{PLURAL:$3|other|others}} {{GENDER:$1|left}} a message on your talk page.", "notification-page-linked-email-batch-bundle-body": "$2 was {{GENDER:$1|linked}} from $3 and $4 other {{PLURAL:$5|page|pages}}.", "echo-email-batch-separator": "--", diff --git a/i18n/qqq.json b/i18n/qqq.json index 300207524..3fcfe038a 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -81,8 +81,9 @@ "notification-link-text-view-edit": "Label for button that links to a \"diff\" view showing an edit made to a page. This is an alternative to the wording in {{msg-mw|notification-link-text-view-changes}}, which serves essentially the same function.", "notification-edit-talk-page2": "Format for displaying notifications of a user talk page being edited. Parameters:\n* $1 - the username of the person who edited, plain text. Can be used for GENDER.\n* $2 - the current user's name, used in the link to their talk page\n* $3 - the section title of the discussion, if any, used in the link to their talk page\nSee also:\n* {{msg-mw|Notification-edit-talk-page-flyout2}}\n* {{msg-mw|Notification-add-talkpage-topic2}}\n* left is for verb left.", "notification-edit-talk-page-with-section": "Format for displaying notifications of a user talk page being edited with a new section or new comment.\n\nParameters:\n* $1 - the username of the person who edited, plain text. Can be used for GENDER.\n* $2 - the username of current user, used in the link to their talk page\n* $3 - the section title of the discussion, if any, used in the link to their talk page\n* $4 - the raw section title text", - "notification-edit-talk-page-flyout2": "Flyout-specific format for displaying notifications of a user talk page being edited.\n\nParameters:\n* $1 - the username of the person who edited, plain text. Can be used for GENDER.\n* $2 - the current user's name, used in the link to their talk page\n* $3 - the section title of the discussion, if any, used in the link to their talk page\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-add-talkpage-topic2}}", - "notification-edit-talk-page-flyout-with-section": "Flyout-specific format for displaying notifications of a user talk page being edited with a new section or new comment.\n\nParameters:\n* $1 - the username of the person who edited, plain text. Can be used for GENDER.\n* $2 - the username of current user, used in the link to their talk page\n* $3 - the section title of the discussion, if any, used in the link to their talk page\n* $4 - the raw section title text", + "notification-header-edit-user-talk": "Flyout-specific format for displaying notification header of a user talk page being edited.\n\nParameters:\n* $1 - the formatted username of the person who edited.\n* $2 - the username for GENDER\n* $3 - username of the current user, can be used for GENDER\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-add-talkpage-topic2}}", + "notification-header-edit-user-talk-with-section": "Flyout-specific format for displaying notification header of a user talk page being edited with a new section or new comment.\n\nParameters:\n* $1 - the formatted username of the person who edited.\n* $2 - the username for GENDER\n* $3 - username of the current user, can be used for GENDER\n* $4 - the raw section title text\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-add-talkpage-topic2}}", + "notification-body-edit-user-talk-with-section": "Flyout-specific format for displaying notification body of a user talk page being edited with a new section or new comment.\n\nParameters:\n* $1 - comment left on the user talk page.\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-add-talkpage-topic2}}", "notification-page-linked": "Format for displaying notifications of articles being linked. Parameters:\n* $1 - the username of the person who linked the page, plain text. Can be used for GENDER.\n* $2 - the page being linked\n* $3 - the page linked from\nSee also:\n* {{msg-mw|Notification-page-linked-flyout}}\n* {{msg-mw|Notification-page-linked-email-batch-body}}\n* {{msg-mw|Notification-page-linked-email-subject}}", "notification-header-page-linked": "Flyout-specific format for displaying notifications of articles being linked.\n\nParameters:\n* $1 - the formatted username of the person who linked the page. \n* $2 - the username for GENDER\n* $3 - the page being linked\n* $4 - the page linked from\nSee also:\n* {{msg-mw|Notification-page-linked}}\n* {{msg-mw|Notification-page-linked-email-batch-body}}\n* {{msg-mw|Notification-page-linked-email-subject}}", "notification-bundle-header-page-linked": "Bundled message for page-linked notification. Parameters:\n* $1 - the formatted username of the person who linked the page. \n* $2 - the username for GENDER\n* $3 - the page title\n* $4 - the page linked from\n* $5 - the count of other action performers, could be number or {{msg-mw|Echo-notification-count}}. e.g. 7 or 99+\n* $6 - a number used for plural support (numeric version of $5)\nSee also:\n* {{msg-mw|Notification-page-linked}}\n* {{msg-mw|Notification-page-linked-flyout}}\n* {{msg-mw|Notification-page-linked-email-batch-body}}\n* {{msg-mw|Notification-page-linked-email-subject}}", @@ -137,6 +138,7 @@ "echo-date-yesterday": "The header text for yesterday's notification section.\n{{Identical|Yesterday}}", "echo-load-more-error": "Error message for errors in loading more notifications", "notification-edit-talk-page-bundle": "Bundled message for edit-user-talk notification. Parameters:\n* $1 - the name of the user who performed the action, which can be used for gender support\n* $2 - the name of the user being addressed\n* $3 - the count of other action performers, could be a number or {{msg-mw|Echo-notification-count}}. e.g. \"7\" or \"99+\"\n* $4 - a number used for plural support relating to $3 (likely identical to $3 it that is a number, and 100 otherwise)\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-edit-talk-page-email-batch-body2}}\n* {{msg-mw|Notification-edit-talk-page-email-subject2}}", + "notification-bundle-header-edit-user-talk": "Bundled flyout header message for edit-user-talk notification. Parameters:\n* $1 - the formatted name of the user who performed the action\n* $2 - the username for GENDER\n* $3 - the name of the user being addressed\n* $4 - the count of other action performers, could be a number or {{msg-mw|Echo-notification-count}}. e.g. \"7\" or \"99+\"\n* $5 - a number used for plural support relating to $4 (likely identical to $4 it that is a number, and 100 otherwise)\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-edit-talk-page-email-batch-body2}}\n* {{msg-mw|Notification-edit-talk-page-email-subject2}}", "notification-edit-user-talk-email-batch-bundle-body": "Bundled message for edit-user-talk email digest notification. Parameters:\n* $1 - the username who performs the action, which can be used for gender support\n* $2 - the count of other action performers, could be number or {{msg-mw|echo-notification-count}}\n* $3 - a number used for plural support\n\nSee also:\n* {{msg-mw|Notification-edit-talk-page2}}\n* {{msg-mw|Notification-edit-talk-page-flyout2}}\n* {{msg-mw|Notification-edit-talk-page-email-batch-body2}}\n* {{msg-mw|Notification-edit-talk-page-email-subject2}}", "notification-page-linked-email-batch-bundle-body": "Bundled message for page-linked email digest notification. Parameters:\n* $1 - the username who performs the action, which can be used for gender support\n* $2 - the link-to page title\n* $3 - the link-from page title\n* $4 - the count of other link-from page title, can be number or {{msg-mw|echo-notification-count}}\n* $5 - a number used for plural support (numeric version of $4)\n\nSee also:\n* {{msg-mw|Notification-page-linked}}\n* {{msg-mw|Notification-page-linked-flyout}}\n* {{msg-mw|Notification-page-linked-email-batch-body}}\n* {{msg-mw|Notification-page-linked-email-subject}}", "echo-email-batch-separator": "{{optional}}\nEmail batch content separator", diff --git a/includes/formatters/EditUserTalkPresentationModel.php b/includes/formatters/EditUserTalkPresentationModel.php new file mode 100644 index 000000000..7b7252a4c --- /dev/null +++ b/includes/formatters/EditUserTalkPresentationModel.php @@ -0,0 +1,138 @@ +event->getTitle(); + } + + public function getIconType() { + return 'chat'; + } + + public function getPrimaryLink() { + $title = $this->event->getTitle(); + if ( $this->hasSection() ) { + $title = Title::makeTitle( + $title->getNamespace(), + $title->getDBkey(), + $this->formatSubjectAnchor() + ); + } + + return array( + 'url' => $title->getFullURL(), + 'label' => $this->msg( 'notification-link-text-view-message' )->text() + ); + } + + public function getSecondaryLinks() { + $diffLink = array( + 'url' => $this->getDiffLinkUrl(), + 'label' => $this->msg( 'notification-link-text-view-changes' )->text(), + 'prioritized' => true + ); + return array( $diffLink ); + } + + public function getHeaderMessage() { + if ( $this->getBundleCount( true, array( $this,'getEventUser' ) ) > 1 ) { + $msg = $this->getMessageWithAgent( "notification-bundle-header-{$this->type}" ); + list( $formattedCount, $countForPlural ) = + $this->getNotificationCountForOutput( false, array( $this, 'getEventUser' ) ); + $msg->params( $this->getViewingUserForGender() ); + $msg->params( $formattedCount ); + $msg->params( $countForPlural ); + return $msg; + } elseif ( $this->hasSection() ) { + $msg = $this->getMessageWithAgent( "notification-header-{$this->type}-with-section" ); + $msg->params( $this->getViewingUserForGender() ); + $msg->params( $this->getSectionTitleSnippet() ); + return $msg; + } else { + $msg = parent::getHeaderMessage(); + $msg->params( $this->getViewingUserForGender() ); + return $msg; + } + } + + public function getBodyMessage() { + if ( $this->getBundleCount( true, array( $this,'getEventUser' ) ) === 1 && $this->hasSection() ) { + $msg = $this->msg( 'notification-body-edit-user-talk-with-section' ); + $msg->params( $this->getRevisionSnippet() ); + return $msg; + } else { + return false; + } + } + + public static function getEventUser( EchoEvent $event ) { + $agent = $event->getAgent(); + return $agent->isAnon() ? $agent->getName() : $agent->getId(); + } + + private function hasSection() { + return (bool)$this->event->getExtraParam( 'section-title' ); + } + + /** + * Get the section title for a talk page post + * @return string + */ + private function getSectionTitleSnippet() { + if ( $this->userCan( Revision::DELETED_TEXT ) ) { + return EchoDiscussionParser::getTextSnippet( + $this->event->getExtraParam( 'section-title' ), + $this->language, + 30 + ); + } else { + return $this->msg( 'echo-rev-deleted-text-view' )->text(); + } + } + + private function getRevisionSnippet() { + $sectionText = $this->event->getExtraParam( 'section-text' ); + if ( $sectionText === null || !$this->userCan( Revision::DELETED_TEXT ) ) { + return ''; + } + + return trim( $sectionText ); + } + + /** + * Extract the subject anchor (linkable portion of the edited page) from + * the event. + * + * @return string The anchor on page, or an empty string + */ + private function formatSubjectAnchor() { + global $wgParser; + + if ( !$this->userCan( Revision::DELETED_TEXT ) ) { + return $this->msg( 'echo-rev-deleted-text-view' )->text(); + } + $sectionTitle = $this->event->getExtraParam( 'section-title' ); + if ( $sectionTitle === null ) { + return ''; + } + + // Strip out # + return substr( $wgParser->guessLegacySectionNameFromWikiText( $sectionTitle ), 1 ); + } + + private function getDiffLinkUrl() { + $revId = $this->event->getExtraParam( 'revid' ); + $oldId = $this->isBundled() ? $this->getRevBeforeFirstNotification() : 'prev'; + $query = array( + 'oldid' => $oldId, + 'diff' => $revId, + ); + return $this->event->getTitle()->getFullURL( $query ); + } + + private function getRevBeforeFirstNotification() { + $firstNotificationRevId = end( $this->getBundledEvents() )->getExtraParam( 'revid' ); + return $this->event->getTitle()->getPreviousRevisionID( $firstNotificationRevId ); + } +} diff --git a/tests/phpunit/formatters/NotificationFormatterTest.php b/tests/phpunit/formatters/NotificationFormatterTest.php index 143ec4fc1..3d47d99b5 100644 --- a/tests/phpunit/formatters/NotificationFormatterTest.php +++ b/tests/phpunit/formatters/NotificationFormatterTest.php @@ -46,30 +46,6 @@ class EchoNotificationFormatterTest extends MediaWikiTestCase { $this->assertEquals( '', $mainPageCached->getFragment() ); } - public static function provider_editUserTalk() { - return array( - // if there is a section-title, the message should be '[[User:user_name|user_name]] left a message on - // your talk page in '[[User talk:user_name#section_title|section_title]]' - array( '/[[User talk:[^#]+#moar_cowbell|moar_cowbell]]/', 'moar_cowbell', 'text' ), - array( '/#moar_cowbell/', 'moar_cowbell', 'html' ), - array( '/#moar_cowbell/', 'moar_cowbell', 'flyout' ), - ); - } - - /** - * @dataProvider provider_editUserTalk - */ - public function testEditUserTalkFlyoutSectionLinkFragment( $pattern, $sectionTitle, $format ) { - // Required hack so parser doesnt turn the links into redlinks which contain no fragment - global $wgUser; - LinkCache::singleton()->addGoodLinkObj( 42, $wgUser->getTalkPage() ); - - $event = $this->mockEvent( 'edit-user-talk', array( - 'section-title' => $sectionTitle, - ) ); - $this->assertRegExp( $pattern, $this->format( $event, $format ) ); - } - public function provider_formatterDoesntFail() { // Remove events from this array once they have specific tests for their formatting $untested = array(