diff --git a/wikiq b/wikiq index 8a2e6d1..34a97da 100755 --- a/wikiq +++ b/wikiq @@ -10,6 +10,7 @@ import os.path import re from datetime import datetime, timezone from io import TextIOWrapper +from itertools import groupby from subprocess import Popen, PIPE from collections import deque @@ -93,6 +94,10 @@ class WikiqPage: self.mwpage = page self.__revisions = self.rev_list() + @staticmethod + def user_text(rev) -> str | None: + return None if rev.deleted.user else rev.user.text + def rev_list(self): # Outline for how we want to handle collapse_user=True # iteration rev.user prev_rev.user add prev_rev? @@ -108,27 +113,13 @@ class WikiqPage: yield rev return - collapsed_revs = 1 - prev_rev = next(self.mwpage) - prev_rev.collapsed_revs = collapsed_revs - - for rev in self.mwpage: - # yield if this is the last edit in a seq by a user and reset - # also yield if we don't know who the user is - - if rev.deleted.user or prev_rev.deleted.user or rev.user.text != prev_rev.user.text: - yield prev_rev - collapsed_revs = 1 - rev.collapsed_revs = collapsed_revs - else: - # Otherwise, collapse revision. - collapsed_revs += 1 - rev.collapsed_revs = collapsed_revs - - prev_rev = rev - - # also yield the final time - yield prev_rev + for _, revs in groupby(self.mwpage, self.user_text): + # All revisions are either from the same user, or this is a single + # revision where the user is missing. + revs = list(revs) + rev = revs[-1] + rev.collapsed_revs = len(revs) + yield rev def __iter__(self): return self.__revisions