@@ -54,8 +54,13 @@ '((((background light)) :background "black" :foreground "black") (((background dark)) :background "white" :foreground "white")) "Face for spoiler text in threads.") +(defface sbbs--uncover-spoiler-face + '((((background light)) :background "black" :foreground "white") + (((background dark)) :background "white" :foreground "black")) + "Face for spoiler text in threads.") + (defface sbbs--code-face '((((background light)) :background "gray89") (((background dark)) :background "gray11")) "Face for code blocks in threads.") @@ -73,8 +78,11 @@ Used in thread and reply buffers.") (defvar-local sbbs--limit-stack nil "Stack of last limit specs.") + +(defvar-local sbbs--last-spoiler nil + "Point of last spoiler visited.") ;; BOARD OBJECT AND FUNCTIONS (defun sbbs-make-board (domain name &optional tls) @@ -310,8 +318,23 @@ (set-text-properties (1- (point)) (point) nil) (sbbs--insert-sxml (cdr (assq 'content (cdr post)))) (add-text-properties start (point) (list 'sbbs-thread-nr (car post))))) +(defun sbbs--uncover-spoiler () + "" + (cond ((eq (get-text-property (point) 'face) 'sbbs--spoiler-face) + (let* ((start (previous-property-change (1+ (point)))) + (end (next-property-change (point))) + (o (make-overlay start end (current-buffer) t t))) + (overlay-put o 'face 'sbbs--uncover-spoiler-face) + (overlay-put o 'sbbs-uncover-p t)) + (setq sbbs--last-spoiler (point))) + (sbbs--last-spoiler + (dolist (o (overlays-at sbbs--last-spoiler)) + (when (overlay-get o 'sbbs-uncover-p) + (delete-overlay o))) + (setq sbbs--last-spoiler nil)))) + ;; URL.EL CALLBACKS (defun sbbs--board-loader (status buf) "Callback function for `url-retrieve' when loading board. @@ -575,9 +598,11 @@ (define-derived-mode sbbs-read-mode special-mode "SchemeBBS Read" "Major mode for reading a thread." (buffer-disable-undo) (visual-line-mode t) - (setq-local revert-buffer-function #'sbbs--reload-thread)) + (setq-local revert-buffer-function #'sbbs--reload-thread) + (add-hook 'post-command-hook #'sbbs--uncover-spoiler + nil t)) (defvar sbbs-compose-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-c C-c") #'sbbs-compose-create)