X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=6049d0de10e43db69e108de74f5ff0713c1fd9ed;hb=f68258e6ac8b5ab733566e98b16a0a7447ac7a11;hp=7c1b9d0883a1b7d6fd979399edabfc7d2cc8d0dc;hpb=4b724b9e38b023b87b7c372688ea6e4d6adaabce;p=elpher.git diff --git a/elpher.el b/elpher.el index 7c1b9d0..6049d0d 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.0.0 +;; Version: 1.1.0 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -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 @@ -64,10 +63,10 @@ (mapconcat 'identity (list "i\tfake\tfake\t1" - "i--------------------------------------------\tfake\tfake\t1" - "i Elpher Gopher Client \tfake\tfake\t1" - (format "i version %s\tfake\tfake\t1" elpher-version) - "i--------------------------------------------\tfake\tfake\t1" + "i --------------------------------------------\tfake\tfake\t1" + "i Elpher Gopher Client \tfake\tfake\t1" + (format "i version %s\tfake\tfake\t1" elpher-version) + "i --------------------------------------------\tfake\tfake\t1" "i\tfake\tfake\t1" "iUsage:\tfake\tfake\t1" "i\tfake\tfake\t1" @@ -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 ;; @@ -238,7 +240,7 @@ content and cursor position fields of the node." ;; Node graph traversal -(defvar elpher-current-node) +(defvar elpher-current-node nil) (defun elpher-visit-node (node &optional getter) "Visit NODE using its own getter or GETTER, if non-nil." @@ -334,8 +336,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 @@ -420,7 +425,9 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (protocol (downcase (match-string 1)))) (if (string= protocol "gopher") (let* ((host (match-string 2)) - (port 70) + (port (if (match-string 3) + (string-to-number (substring (match-string 3) 1)) + 70)) (type-and-selector (match-string 4)) (type (if (> (length type-and-selector) 1) (elt type-and-selector 1) @@ -617,32 +624,57 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (defun elpher-go () "Go to a particular gopher site." (interactive) - (switch-to-buffer "*elpher*") - (let* ( - (hostname (read-string "Gopher host: ")) - (selector (read-string "Selector (default none): " nil nil "")) - (port (read-string "Port (default 70): " nil nil 70)) - (address (list selector hostname port))) - (elpher-visit-node - (elpher-make-node elpher-current-node - address - #'elpher-get-index-node)))) + (let ((node + (let ((host-or-url (read-string "Gopher host or URL: "))) + (if (string-match elpher-url-regex host-or-url) + (if (not (string= (downcase (match-string 1 host-or-url)) "gopher")) + (error "Only gopher URLs acceptable.") + (let* ((host (match-string 2 host-or-url)) + (port (if (match-string 3 host-or-url) + (string-to-number (substring (match-string 3 host-or-url) 1)) + 70)) + (type-and-selector (match-string 4 host-or-url)) + (type (if (> (length type-and-selector) 1) + (elt type-and-selector 1) + ?1)) + (selector (if (> (length type-and-selector) 1) + (substring type-and-selector 2) + "")) + (address (elpher-make-address selector host port)) + (getter (car (alist-get type elpher-type-map)))) + (elpher-make-node elpher-current-node + address + getter))) + (let* ((selector (read-string "Selector (default none): " nil nil "")) + (port (read-string "Port (default 70): " nil nil 70)) + (address (list selector host-or-url port))) + (elpher-make-node elpher-current-node + address + #'elpher-get-index-node)))))) + (switch-to-buffer "*elpher*") + (elpher-visit-node node))) (defun elpher-redraw () "Redraw current page." (interactive) - (elpher-visit-node elpher-current-node)) + (if elpher-current-node + (elpher-visit-node elpher-current-node) + (message "No current site."))) (defun elpher-reload () "Reload current page." (interactive) - (elpher-reload-current-node)) + (if elpher-current-node + (elpher-reload-current-node) + (message "No current site."))) (defun elpher-view-raw () "View current page as plain text." (interactive) - (elpher-visit-node elpher-current-node - #'elpher-get-node-raw)) + (if elpher-current-node + (elpher-visit-node elpher-current-node + #'elpher-get-node-raw) + (message "No current site."))) (defun elpher-back () "Go to previous site."