summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Echo/includes/EchoSummaryParser.php')
-rw-r--r--Echo/includes/EchoSummaryParser.php55
1 files changed, 55 insertions, 0 deletions
diff --git a/Echo/includes/EchoSummaryParser.php b/Echo/includes/EchoSummaryParser.php
new file mode 100644
index 00000000..a701b101
--- /dev/null
+++ b/Echo/includes/EchoSummaryParser.php
@@ -0,0 +1,55 @@
+<?php
+
+class EchoSummaryParser {
+ /** @var callable */
+ private $userLookup;
+
+ /**
+ * @param callable|null $userLookup Function that receives User object and returns its id
+ * or 0 if the user doesn't exist. Passing null to this parameter will result in default
+ * implementation being used.
+ */
+ public function __construct( callable $userLookup = null ) {
+ $this->userLookup = $userLookup;
+ if ( !$this->userLookup ) {
+ $this->userLookup = function ( User $user ) {
+ return $user->getId();
+ };
+ }
+ }
+
+ /**
+ * Returns a list of registered users linked in an edit summary
+ *
+ * @param string $summary
+ * @return User[] Array of username => User object
+ */
+ public function parse( $summary ) {
+ // Remove section autocomments. Replace with characters that can't be in titles,
+ // to prevent fun stuff like "[[foo /* section */ bar]]".
+ $summary = preg_replace( '#/\*.*?\*/#', ' [] ', $summary );
+
+ $users = [];
+ $regex = '/\[\[([' . Title::legalChars() . ']*+)(?:\|.*?)?\]\]/';
+ if ( preg_match_all( $regex, $summary, $matches ) ) {
+ foreach ( $matches[1] as $match ) {
+ if ( preg_match( '/^:/', $match ) ) {
+ continue;
+ }
+ $title = Title::newFromText( $match );
+ if ( $title
+ && $title->isLocal()
+ && $title->getNamespace() === NS_USER
+ ) {
+ $user = User::newFromName( $title->getText() );
+ $lookup = $this->userLookup;
+ if ( $user && $lookup( $user ) > 0 ) {
+ $users[$user->getName()] = $user;
+ }
+ }
+ }
+ }
+
+ return $users;
+ }
+}