;;; 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)))
;;; 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
('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))))
(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))))
(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))))
(_
(lurk-display-message from to text)))))
(_
- (lurk-display-string (lurk-msg->string msg))))))
+ (lurk-display-notice nil (lurk-msg->string msg))))))
;;; Command entering