cite parent #3

Merged
dickmao merged 1 commits from dev into master 2020-02-14 17:26:22 +00:00
1 changed files with 63 additions and 51 deletions

View File

@ -221,7 +221,7 @@ Starting in emacs-src commit c1b63af, Gnus moved from obarrays to normal hashtab
(defvar-local nndiscourse--refs-hashtb (gnus-make-hashtable) (defvar-local nndiscourse--refs-hashtb (gnus-make-hashtable)
"Id -> parent. Buffer-local to individual servers' proc buffer.") "Id -> parent. Buffer-local to individual servers' proc buffer.")
(defun nndiscourse-get-ref (server id) (defun nndiscourse-get-refs (server id)
"Amongst SERVER refs, return list of descending ancestors for ID." "Amongst SERVER refs, return list of descending ancestors for ID."
(declare (indent defun)) (declare (indent defun))
(with-current-buffer (nndiscourse--server-buffer server) (with-current-buffer (nndiscourse--server-buffer server)
@ -649,6 +649,13 @@ Originally written by Paul Issartel."
(= post-number* (plist-get plst :post_number)))))))) (= post-number* (plist-get plst :post_number))))))))
(elt headers found))) (elt headers found)))
(defun nndiscourse--earliest-header (server group topic-id)
"O(n) search for first header satisfying SERVER GROUP TOPIC-ID."
(declare (indent defun))
(-when-let* ((headers (nndiscourse-get-headers server group)))
(seq-find (lambda (plst) (= topic-id (plist-get plst :topic_id)))
headers)))
(defsubst nndiscourse-hash-count (table-or-obarray) (defsubst nndiscourse-hash-count (table-or-obarray)
"Return number items in TABLE-OR-OBARRAY." "Return number items in TABLE-OR-OBARRAY."
(let ((result 0)) (let ((result 0))
@ -688,13 +695,18 @@ Originally written by Paul Issartel."
(full-group (gnus-group-full-name (full-group (gnus-group-full-name
group group
(cons 'nndiscourse (list server))))) (cons 'nndiscourse (list server)))))
(when-let ((parent-number (plist-get plst :reply_to_post_number))) (aif (plist-get plst :reply_to_post_number)
(nndiscourse-set-ref server (nndiscourse-set-ref server
(plist-get plst :id) (plist-get plst :id)
(plist-get (nndiscourse--number-to-header (plist-get (nndiscourse--number-to-header
server group (plist-get plst :topic_id) server group
parent-number) (plist-get plst :topic_id) it)
:id))) :id))
(awhen (plist-get (nndiscourse--earliest-header
server group
(plist-get plst :topic_id))
:id)
(nndiscourse-set-ref server (plist-get plst :id) it)))
(nndiscourse--replace-hash type (lambda (x) (1+ (or x 0))) counts) (nndiscourse--replace-hash type (lambda (x) (1+ (or x 0))) counts)
(if-let ((info (gnus-get-info full-group))) (if-let ((info (gnus-get-info full-group)))
(progn (progn
@ -742,7 +754,7 @@ Originally written by Paul Issartel."
(defsubst nndiscourse--make-references (server id) (defsubst nndiscourse--make-references (server id)
"For SERVER, construct a space delimited string of message ancestors of ID." "For SERVER, construct a space delimited string of message ancestors of ID."
(mapconcat (lambda (ref) (nndiscourse--make-message-id ref)) (mapconcat (lambda (ref) (nndiscourse--make-message-id ref))
(nndiscourse-get-ref server id) " ")) (nndiscourse-get-refs server id) " "))
(defsubst nndiscourse--make-header (server group article-number) (defsubst nndiscourse--make-header (server group article-number)
"Construct mail headers from article header. "Construct mail headers from article header.
@ -797,7 +809,7 @@ article header. Gnus manual does say the term `header` is oft conflated."
"Score: " score "\n" "Score: " score "\n"
"\n") "\n")
(-when-let* (-when-let*
((parent (plist-get header :parent)) ((parent (car (last (nndiscourse-get-refs server (plist-get header :id)))))
(parent-author (parent-author
(or (plist-get (nndiscourse--get-header server group parent) (or (plist-get (nndiscourse--get-header server group parent)
:username) :username)