+;; 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.
+
+;; Additionally, we allow selective hiding of contexts via
+;; the buffer-invisibility-spec.
+
+(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 (context prefix &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))
+ (padded-timestamp (concat (format-time-string "%H:%M ")))
+ (padded-prefix (if prefix (concat prefix " ") ""))
+ (adaptive-fill-regexp (rx-to-string
+ `(= ,(+ (length padded-timestamp)
+ (length padded-prefix))
+ anychar)))
+ (fill-column 80)
+ (context-atom (if context (intern context) nil)))
+ (insert-before-markers
+ (propertize padded-timestamp
+ 'face 'lurk-timestamp
+ 'read-only t
+ 'context context
+ 'invisible context-atom)
+ (propertize padded-prefix
+ 'read-only t
+ 'context context
+ 'invisible context-atom)
+ (propertize (concat (lurk-buttonify-urls (apply #'concat strings)) "\n")
+ 'face (lurk-get-context-facelist context)
+ 'read-only t
+ 'context context
+ 'invisible context-atom))
+ (fill-region old-pos lurk-prompt-marker nil t)))))
+