Otherwise, use the system browser via the BROWSE-URL function."
:type '(boolean))
+(defcustom elpher-buttonify-urls-in-directories nil
+ "If non-nil, turns URLs matched in \"i\" item types in directories
+into clickable buttons."
+ :type '(boolean))
+
(defcustom elpher-cache-images nil
"If non-nil, cache images in memory in the same way as other content."
:type '(boolean))
use as the start page."
:type '(list string string integer))
-
;;; Model
;;
;; Node
+(defvar elpher-seen-nodes (make-hash-table :test 'equal)
+ "Table mapping addresses to existing (seen) node objects.")
+
(defun elpher-make-node (parent address getter &optional content pos)
"Create a node in the gopher page hierarchy.
page.
The optional arguments CONTENT and POS can be used to fill the cached
-content and cursor position fields of the node."
- (list parent address getter content pos))
+content and cursor position fields of the node.
+
+If the hash table `elpher-seen-nodes' contains a key equal to ADDRESS,
+the node contained as its value will be returned instead."
+ (let ((existing-node (gethash address elpher-seen-nodes)))
+ (if existing-node
+ existing-node
+ (let ((new-node (list parent address getter content pos)))
+ (puthash address new-node elpher-seen-nodes)
+ new-node))))
(defun elpher-node-parent (node)
"Retrieve the parent node of NODE."
selector host port)))
(pcase type
(?i (elpher-insert-margin) ;; Information
- (insert (propertize display-string
- 'face 'elpher-info)))
+ (insert (propertize
+ (if elpher-buttonify-urls-in-directories
+ (elpher-buttonify-urls display-string)
+ display-string)
+ 'face 'elpher-info)))
(?h (elpher-insert-margin "W") ;; Web link
(let ((url (elt (split-string selector "URL:") 1)))
(insert-text-button display-string