X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=d4c582abce25604adc0847024f8ba3fcc9daa420;hb=d9adfcf3627ac5da0f8dad8f5cae28e8dad123c8;hp=f9004979db5009559424514d76628d7dc1fa6628;hpb=37091f7483c2e3f9e92beccf9c3decd71840d90a;p=elpher.git diff --git a/elpher.el b/elpher.el index f900497..d4c582a 100644 --- a/elpher.el +++ b/elpher.el @@ -36,9 +36,8 @@ ;; - (m)enu key support, similar to Emacs' info browser, ;; - clickable web and gopher links in plain text. -;; The caching mechanism works by maintaining a hierarchy of visited -;; pages rather than a linear history, meaning that it is quick and -;; easy to navigate this history. +;; Visited pages are stored as a hierarchy rather than a linear history, +;; meaning that navigation between these pages is quick and easy. ;; To launch Elpher, simply use 'M-x elpher'. This will open a start ;; page containing information on key bindings and suggested starting @@ -54,7 +53,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.0.0" +(defconst elpher-version "1.1.0" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -163,6 +162,10 @@ 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 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)) @@ -173,7 +176,6 @@ Otherwise, a list containing the selector, host and port of a directory to use as the start page." :type '(list string string integer)) - ;;; Model ;; @@ -197,6 +199,9 @@ use as the start page." ;; 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. @@ -205,8 +210,16 @@ the gopher page, GETTER provides the getter function used to obtain this 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." @@ -334,8 +347,11 @@ content and cursor position fields of the 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