Index: sbbs.el ================================================================== --- sbbs.el +++ sbbs.el @@ -53,10 +53,15 @@ (defface sbbs--spoiler-face '((((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.") @@ -72,10 +77,13 @@ 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) "Create board object, using DOMAIN, NAME and TLS flag." @@ -309,10 +317,25 @@ (add-text-properties start (1- (point)) '(face highlight)) (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. @@ -574,11 +597,13 @@ (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) map))