From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:aacc::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms12 with LMTPS id 8IvGHETpu2BIbQAAsNZ9tg (envelope-from ); Sat, 05 Jun 2021 21:14:44 +0000 Received: from out2.migadu.com ([2001:41d0:2:aacc::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id kKvtHEDpu2CPXQAAB5/wlQ (envelope-from ); Sat, 05 Jun 2021 21:14:40 +0000 X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kyleam.com; s=key1; t=1622927680; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l4hZYgn1fcXZ2s/N0WkCooAj6KVlbMgBOPGif+uI/1U=; b=h0wlJyD9+KvvNPGNSr2tziHmixHww7dfJXfiHm5IOeAO8Mfmtr+9xAUjgAmfkI59KKuLMu +ibqNpwusIExwAqLOWFgubgjLIp48kNiQ9NHx1RLhL2Uqa6oLEBHrn/Ztn7LeQnrb2+4ZC g3aPfFYfOiHC4G43Gf+4vAHzNGhLvdoHG7CgPrSLnbeF0H+pw46kaKqAAgEDl3FRaCruVY qTos5wvQIaeU/o7oTyxsSH/hfD+2tYWaZR6UWqq79v6+nwetnUQ6MJ8Ux4QKLY8K0cREu2 nGELV2D0/f8SzISKRqXc+ayKm8jSOU5h/oiCSnKQ3yn95xASluRWeyQbBlZraQ== From: Kyle Meyer To: piem@inbox.kyleam.com Subject: [PATCH 11/18] piem-lei-query-thread: Omit main part of subject if shared Date: Sat, 5 Jun 2021 17:13:55 -0400 Message-Id: <20210605211402.20304-12-kyle@kyleam.com> In-Reply-To: <20210605211402.20304-1-kyle@kyleam.com> References: <20210605211402.20304-1-kyle@kyleam.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: kyle@kyleam.com X-TUID: aG/cdfkvrDlG In addition to suppressing identical subjects (after stripping "re:"), public-inbox's web interface will compare the current line's subject with the previous line's, and cut off the shared tail: [PATCH] Add basic integration for Rmail ` ` [PATCH v2] " <-- here ` I think the above is helpful. However, in some cases, I find the presentation more confusing than helpful: [PATCH 0/3] notmuch: Improve handling of attached patches ` [PATCH 1/3] piem-notmuch--with-current-message: Declare debug and indent specs ` [PATCH 2/3] piem-notmuch-am-ready-mbox: Improve handling of attachments ` ` [PATCH v2 0/3] notmuch: Improve handling of attached patches ` [PATCH v2 1/3] piem-notmuch--with-current-message: Declare debug and indent specs ` [PATCH v2 2/3] piem-notmuch-am-ready-mbox: Improve handling of attachments ` [PATCH v2 3/3] gnus, notmuch: Absorb now-shared bits into patch attachment helper ` [PATCH " It takes me a second to figure out what the omitted bits in the last line's subject are. I'm not sure, but I think the subject truncation that I find clear is where the omitted text is the main subject after a bracketed tag (i.e. "[tag] main"), not more or less. Teach piem-lei-query-thread to split the subject into a "prefix" (some number of "[tag]" items) and a "main" part (everything else), and elide a line's main part if it matches the previous line's. In the above example, the last line would be ` [PATCH 3/3] … --- piem-lei.el | 30 ++++++++++++++++++++++++++++- tests/piem-lei-tests.el | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/piem-lei.el b/piem-lei.el index cf19195b..f7ccc6e4 100644 --- a/piem-lei.el +++ b/piem-lei.el @@ -341,6 +341,33 @@ (defun piem-lei-query--thread (records) thread) (nreverse roots)))) +(defvar piem-lei-query--subject-split-re + (rx string-start + ;; Prefix. + (group (zero-or-more space) + (one-or-more "[" (one-or-more (not (any "]" "\n"))) "]" + (one-or-more space))) + ;; Main subject. A match consists of at least two islands of + ;; non-space characters because there's not much point in + ;; eliding one word. + (group (one-or-more (not space)) + (one-or-more space) + (not space) + (one-or-more anychar)))) + +(defun piem-lei-query--split-subject (s) + (if (string-match piem-lei-query--subject-split-re s) + (cons (match-string 1 s) (match-string 2 s)) + (cons nil s))) + +(defun piem-lei-query--elide-subject (s1 s2) + (pcase-let ((`(,head2 . ,tail2) (piem-lei-query--split-subject s2))) + (if (and s1 head2 + (let ((tail1 (cdr (piem-lei-query--split-subject s1)))) + (equal tail1 tail2))) + (concat head2 (if (char-displayable-p ?…) "…" "...")) + s2))) + (defun piem-lei-query--format-thread-marker (level) (if (= level 0) "" @@ -400,7 +427,8 @@ (defun piem-lei-query-thread (mid) (if (equal subject subject-prev) "" (concat " " - (propertize subject + (propertize (piem-lei-query--elide-subject + subject-prev subject) 'font-lock-face 'piem-lei-query-subject)))) (add-text-properties (line-beginning-position) diff --git a/tests/piem-lei-tests.el b/tests/piem-lei-tests.el index e20c62fa..71dc1099 100644 --- a/tests/piem-lei-tests.el +++ b/tests/piem-lei-tests.el @@ -70,5 +70,47 @@ (ert-deftest piem-lei-query--has-descendant () (should-not (piem-lei-query--has-descendant m3 m2)) (should-not (piem-lei-query--has-descendant m3 m1)))) +(ert-deftest piem-lei-query--elide-subject:keep-original () + (should (equal "ghi jlk" + (piem-lei-query--elide-subject + nil + "ghi jlk"))) + (should (equal "ghi jlk" + (piem-lei-query--elide-subject + "abc def" + "ghi jlk"))) + (should (equal "abc def" + (piem-lei-query--elide-subject + "[PATCH] abc def" + "abc def"))) + (should (equal "abc def" + (piem-lei-query--elide-subject + "[bug#00000] [PATCH] abc def" + "abc def"))) + (should (equal "abc def" + (piem-lei-query--elide-subject + "[PATCH] abc def" + "abc def"))) + (should (equal "[bug#00000] [PATCH v2] abc" + (piem-lei-query--elide-subject + "[bug#00000] [PATCH] abc" + "[bug#00000] [PATCH v2] abc"))) + (should (equal "[bug#00000] [PATCH v2] ghi jlk mno" + (piem-lei-query--elide-subject + "[bug#00000] [PATCH] abc def" + "[bug#00000] [PATCH v2] ghi jlk mno")))) + +(defvar piem-lei-tests-elide-string (if (char-displayable-p ?…) "…" "...")) + +(ert-deftest piem-lei-query--elide-subject:elide () + (should (equal (concat "[PATCH v2] " piem-lei-tests-elide-string) + (piem-lei-query--elide-subject + "[PATCH] abc def" + "[PATCH v2] abc def"))) + (should (equal (concat "[bug#00000] [PATCH v2] " piem-lei-tests-elide-string) + (piem-lei-query--elide-subject + "[bug#00000] [PATCH] abc def" + "[bug#00000] [PATCH v2] abc def")))) + (provide 'piem-lei-tests) ;;; piem-lei-tests.el ends here -- 2.31.1