From 3cd1539ad81868242b17b4d163d105483dc84983 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Sat, 8 Oct 2022 08:30:37 +0200 Subject: refactor: separate vote parsing from vote rendering --- Vote.php | 56 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'Vote.php') diff --git a/Vote.php b/Vote.php index ada160a..63d8fde 100644 --- a/Vote.php +++ b/Vote.php @@ -63,29 +63,48 @@ class VoteHooks { return formatError($msg('vote-error-missing-newline')); } - $votes = []; + // Parse the passed text into $lines. + // Sidenote: We parse and render in two steps because we need both: + // * lookahead (gray out votes that are superseded), as well as + // * lookbehind (prefix "I changed my mind" for superseding votes). + $lines = []; - $voteText = ''; foreach (explode("\n", $input) as $line) { if (str_starts_with($line, '* ')) { $line = substr($line, 2); - [$date, $userTitle, $vote, $comment] = self::parseVote($line); - $voteText .= '* '; + $vote = self::parseVote($line); - if (!$date) { - $addErrorCategory(); - $voteText .= formatError($msg('vote-error-invalid-date') . ':') . " $line\n"; + if (!$vote['date']) { + array_push($lines, ['error' => $msg('vote-error-invalid-date'), 'line' => $line]); continue; } - if (!in_array($vote, self::$options)) { - $addErrorCategory(); - $voteText .= formatError($msg('vote-error-invalid-vote', '(YES, NO, ABSTAIN)') . ':') . " $line\n"; + if (!in_array($vote['vote'], self::$options)) { + array_push($lines, ['error' => $msg('vote-error-invalid-vote', '(YES, NO, ABSTAIN)'), 'line' => $line]); continue; } - $user = $userTitle->getText(); - $userLink = $parser->getLinkRenderer()->makeLink($userTitle, $user); + array_push($lines, $vote); + continue; + } + array_push($lines, ['raw' => $line . "\n"]); + } + + // Render the parsed $lines into $voteText. + $voteText = ''; + $votes = []; + + foreach ($lines as $line) { + if (array_key_exists('raw', $line)) { + $voteText .= $line['raw']; + } elseif (array_key_exists('error', $line)) { + $addErrorCategory(); + $voteText .= '* ' . formatError($line['error'] . ':') . " " . $line['line'] . "\n"; + } else { + $user = $line['user']; + $vote = $line['vote']; + + $voteText .= '* '; if (array_key_exists($user, $votes)) { if ($votes[$user] == $vote) { $voteText .= "(" . $msg('vote-repeated') . ') '; @@ -95,14 +114,13 @@ class VoteHooks { } $votes[$user] = $vote; $voteText .= $msg('vote-option-' . $vote) . ' '; - if ($comment) { - $voteText .= $parser->recursiveTagParse($comment); + if ($line['comment']) { + $voteText .= $parser->recursiveTagParse($line['comment']); } - $voteText .= " --$userLink ". $date->format('H:i, j F Y') . "\n"; - continue; - } - $voteText .= $line . "\n"; + $userLink = $parser->getLinkRenderer()->makeLink($line['userTitle'], $user); + $voteText .= " --$userLink ". $line['date']->format('H:i, j F Y') . "\n"; + } } $voteCounts = ['yes' => 0, 'no' => 0, 'abstain' => 0]; @@ -143,7 +161,7 @@ class VoteHooks { $user = Title::newFromText('User:' . rtrim(array_shift($parts), ':')); $vote = strtolower(array_shift($parts)); $comment = array_shift($parts); - return [$date, $user, $vote, $comment]; + return ['date' => $date, 'userTitle' => $user, 'user' => $user->getText(), 'vote' => $vote, 'comment' => $comment]; } private static function votingFormHtml($parser, $votes) { -- cgit v1.2.3