(require 'coolj)
+(declare-function notmuch-show-insert-bodypart "notmuch-show" (msg part depth))
+
;;
(defvar notmuch-wash-signature-regexp
"\\(^[[:space:]]*>.*\n\\)+"
"Pattern to match citation lines.")
-(defvar notmuch-wash-signature-button-format
- "[ %d-line signature. Click/Enter to toggle visibility. ]"
+(defvar notmuch-wash-button-signature-hidden-format
+ "[ %d-line signature. Click/Enter to show. ]"
"String used to construct button text for hidden signatures.
Can use up to one integer format parameter, i.e. %d")
-(defvar notmuch-wash-citation-button-format
- "[ %d more citation lines. Click/Enter to toggle visibility. ]"
+(defvar notmuch-wash-button-signature-visible-format
+ "[ %d-line signature. Click/Enter to hide. ]"
+ "String used to construct button text for visible signatures.
+Can use up to one integer format parameter, i.e. %d")
+
+(defvar notmuch-wash-button-citation-hidden-format
+ "[ %d more citation lines. Click/Enter to show. ]"
"String used to construct button text for hidden citations.
Can use up to one integer format parameter, i.e. %d")
+(defvar notmuch-wash-button-citation-visible-format
+ "[ %d more citation lines. Click/Enter to hide. ]"
+ "String used to construct button text for visible citations.
+Can use up to one integer format parameter, i.e. %d")
+
(defvar notmuch-wash-signature-lines-max 12
"Maximum length of signature that will be hidden by default.")
(if (invisible-p invis-spec)
(remove-from-invisibility-spec invis-spec)
(add-to-invisibility-spec invis-spec)))
+ (let* ((new-start (button-start cite-button))
+ (overlay (button-get cite-button 'overlay))
+ (button-label (notmuch-wash-button-label overlay))
+ (old-point (point))
+ (inhibit-read-only t))
+ (goto-char new-start)
+ (insert button-label)
+ (let ((old-end (button-end cite-button)))
+ (move-overlay cite-button new-start (point))
+ (delete-region (point) old-end))
+ (goto-char (min old-point (1- (button-end cite-button)))))
(force-window-update)
(redisplay t))
(defun notmuch-wash-region-isearch-show (overlay)
(remove-from-invisibility-spec (overlay-get overlay 'invisible)))
-(defun notmuch-wash-region-to-button (beg end type prefix button-text)
+(defun notmuch-wash-button-label (overlay)
+ (let* ((type (overlay-get overlay 'type))
+ (invis-spec (overlay-get overlay 'invisible))
+ (state (if (invisible-p invis-spec) "hidden" "visible"))
+ (label-format (symbol-value (intern-soft (concat "notmuch-wash-button-"
+ type "-" state "-format"))))
+ (lines-count (count-lines (overlay-start overlay) (overlay-end overlay))))
+ (format label-format lines-count)))
+
+(defun notmuch-wash-region-to-button (beg end type prefix)
"Auxilary function to do the actual making of overlays and buttons
BEG and END are buffer locations. TYPE should a string, either
\"citation\" or \"signature\". PREFIX is some arbitrary text to
-insert before the button, probably for indentation. BUTTON-TEXT
-is what to put on the button."
+insert before the button, probably for indentation."
;; This uses some slightly tricky conversions between strings and
;; symbols because of the way the button code works. Note that
(add-to-invisibility-spec invis-spec)
(overlay-put overlay 'invisible invis-spec)
(overlay-put overlay 'isearch-open-invisible #'notmuch-wash-region-isearch-show)
+ (overlay-put overlay 'type type)
(goto-char (1+ end))
(save-excursion
(goto-char (1- beg))
(insert prefix)
- (insert-button button-text
+ (insert-button (notmuch-wash-button-label overlay)
'invisibility-spec invis-spec
+ 'overlay overlay
:type button-type))))
(defun notmuch-wash-excerpt-citations (depth)
(forward-line (- notmuch-wash-citation-lines-suffix))
(notmuch-wash-region-to-button
hidden-start (point-marker)
- "citation" "\n"
- (format notmuch-wash-citation-button-format
- (- cite-lines
- notmuch-wash-citation-lines-prefix
- notmuch-wash-citation-lines-suffix)))))))
+ "citation" "\n")))))
(if (and (not (eobp))
(re-search-forward notmuch-wash-signature-regexp nil t))
(let* ((sig-start (match-beginning 0))
(sig-end (match-end 0))
- (sig-lines (1- (count-lines sig-start (point-max)))))
+ (sig-lines (count-lines sig-start (point-max))))
(if (<= sig-lines notmuch-wash-signature-lines-max)
(let ((sig-start-marker (make-marker))
(sig-end-marker (make-marker)))
(overlay-put (make-overlay sig-start-marker sig-end-marker) 'face 'message-cited-text-face)
(notmuch-wash-region-to-button
sig-start-marker sig-end-marker
- "signature" "\n"
- (format notmuch-wash-signature-button-format sig-lines)))))))
+ "signature" "\n"))))))
;;
(defun notmuch-wash-tidy-citations (depth)
"Improve the display of cited regions of a message.
-Perform four transformations on the message body:
+Perform several transformations on the message body:
- Remove lines of repeated citation leaders with no other
content,
;;
+(require 'diff-mode)
+
+(defvar diff-file-header-re) ; From `diff-mode.el'.
+
+(defun notmuch-wash-convert-inline-patch-to-part (depth)
+ "Convert an inline patch into a fake 'text/x-diff' attachment.
+
+Given that this function guesses whether a buffer includes a
+patch and then guesses the extent of the patch, there is scope
+for error."
+
+ (goto-char (point-min))
+ (if (re-search-forward diff-file-header-re nil t)
+ (progn
+ (beginning-of-line -1)
+ (let ((patch-start (point))
+ (patch-end (point-max))
+ part)
+ (goto-char patch-start)
+ (if (or
+ ;; Patch ends with signature.
+ (re-search-forward notmuch-wash-signature-regexp nil t)
+ ;; Patch ends with bugtraq comment.
+ (re-search-forward "^\\*\\*\\* " nil t))
+ (setq patch-end (match-beginning 0)))
+ (save-restriction
+ (narrow-to-region patch-start patch-end)
+ (setq part (plist-put part :content-type "text/x-diff"))
+ (setq part (plist-put part :content (buffer-string)))
+ (setq part (plist-put part :id -1))
+ (setq part (plist-put part :filename "inline patch"))
+ (delete-region (point-min) (point-max))
+ (notmuch-show-insert-bodypart nil part depth))))))
+
+;;
+
(provide 'notmuch-wash)