From f0d495cfd2f7b7bb1fb7743aa8b3996111a5b922 Mon Sep 17 00:00:00 2001 From: Tim Vaughan Date: Wed, 30 Jun 2021 23:40:18 +0200 Subject: [PATCH] Working on context-specific styling. --- lurk.el | 67 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/lurk.el b/lurk.el index 28fe5c6..fb83892 100644 --- a/lurk.el +++ b/lurk.el @@ -333,23 +333,6 @@ portion of the source component of the message, as LURK doesn't use this.") ;;; Buffer ;; - -(defun lurk-display-string (&rest strings) - (with-current-buffer (get-buffer-create "*lurk*") - (save-excursion - (goto-char lurk-prompt-marker) - (let ((inhibit-read-only t) - (old-pos (marker-position lurk-prompt-marker)) - (adaptive-fill-regexp (rx (= 6 anychar))) - (fill-column 80)) - (insert-before-markers - (propertize (concat (format-time-string "%H:%M") " ") - 'face 'lurk-text - 'read-only t) - (propertize (concat (apply #'concat strings) "\n") - 'read-only t)) - (fill-region old-pos lurk-prompt-marker nil t))))) - (defun lurk-render-prompt () (with-current-buffer "*lurk*" (let ((update-point (= lurk-input-marker (point))) @@ -402,6 +385,43 @@ portion of the source component of the message, as LURK doesn't use this.") ;;; Output formatting ;; +;; Partially-implemented idea: the face text property can be +;; a list of faces, applied in order. By assigning each context +;; a unique list and keeping track of these in a hash table, we can +;; easily switch the face corresponding to a particular context +;; by modifying the elements of this list. +;; +;; More subtly, we make only the cdrs of this list shared among +;; all text of a given context, allowing the cars to be different +;; and for different elements of the context-specific text to have +;; different styling. + +(defvar lurk-context-facelists (make-hash-table :test 'equal) + "List of seen contexts and associated face lists.") + +(defun lurk-get-context-facelist (context) + (let ((facelist (gethash context lurk-context-facelists))) + (unless facelist + (setq facelist (list 'lurk-text)) + (puthash context facelist lurk-context-facelists)) + facelist)) + +(defun lurk-display-string (&rest strings) + (with-current-buffer (get-buffer-create "*lurk*") + (save-excursion + (goto-char lurk-prompt-marker) + (let ((inhibit-read-only t) + (old-pos (marker-position lurk-prompt-marker)) + (adaptive-fill-regexp (rx (= 6 anychar))) + (fill-column 80)) + (insert-before-markers + (propertize (concat (format-time-string "%H:%M") " ") + 'face 'lurk-text + 'read-only t) + (propertize (concat (apply #'concat strings) "\n") + 'read-only t)) + (fill-region old-pos lurk-prompt-marker nil t))))) + (defun lurk-display-message (from to text) (let ((context (if (eq 'channel (lurk-get-context-type to)) to @@ -413,7 +433,7 @@ portion of the source component of the message, as LURK doesn't use this.") ('nick (concat "[" from " -> " to "] " text)) (_ (error "Unsupported context type"))) - 'face 'lurk-text + 'face (lurk-get-context-facelist context) 'help-echo (concat "Context: " context) 'context context)))) @@ -501,7 +521,8 @@ portion of the source component of the message, as LURK doesn't use this.") (let ((channel (car (lurk-msg-params msg))) (nick (lurk-msg-src msg))) (lurk-add-context-users channel (list nick)) - (lurk-display-notice channel nick " joined channel " channel))) + (if lurk-show-joins + (lurk-display-notice channel nick " joined channel " channel)))) ((and "PART" (guard (equal lurk-nick (lurk-msg-src msg)))) @@ -516,13 +537,15 @@ portion of the source component of the message, as LURK doesn't use this.") (let ((channel (car (lurk-msg-params msg))) (nick (lurk-msg-src msg))) (lurk-del-context-user channel nick) - (lurk-display-notice channel nick " left channel " channel))) + (if lurk-show-joins + (lurk-display-notice channel nick " left channel " channel)))) ("QUIT" (let ((nick (lurk-msg-src msg)) (reason (mapconcat 'identity (lurk-msg-params msg) " "))) (lurk-del-user nick) - (lurk-display-notice nil nick " quit: " reason))) + (if lurk-show-joins + (lurk-display-notice nil nick " quit: " reason)))) ((and "NICK" (guard (equal lurk-nick (lurk-msg-src msg)))) @@ -571,7 +594,7 @@ portion of the source component of the message, as LURK doesn't use this.") (_ (lurk-display-message from to text))))) (_ - (lurk-display-string (lurk-msg->string msg)))))) + (lurk-display-notice nil (lurk-msg->string msg)))))) ;;; Command entering -- 2.20.1