Some linting.
[elpher.git] / elpher.el
index 565131a..814f0fb 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -15,7 +15,7 @@
 ;; Copyright (C) 2020 Koushk Roy <kroy@twilio.com>
 ;; Copyright (C) 2020 Vee <vee@vnsf.xyz>
 ;; Copyright (C) 2020 Simon South <simon@simonsouth.net>
-;; Copyright (C) 2019-2020 Tim Vaughan <plugd@thelambdalab.xyz>
+;; Copyright (C) 2019-2021 Tim Vaughan <plugd@thelambdalab.xyz>
 
 ;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
 ;; Created: 11 April 2019
     (finger elpher-get-finger-page elpher-render-text "txt" elpher-text)
     (telnet elpher-get-telnet-page nil "tel" elpher-telnet)
     (other-url elpher-get-other-url-page nil "url" elpher-other-url)
-    ((special start) elpher-get-start-page nil))
+    ((special start) elpher-get-start-page nil)
+    ((special history) elpher-get-history-page nil)
+    ((special history-all) elpher-get-history-all-page nil))
   "Association list from types to getters, renderers, margin codes and index faces.")
 
 
@@ -328,8 +330,6 @@ Links can be accessed by pressing `v' ('visit') followed by the link number."
         (let ((url (url-generic-parse-url url-string)))
           (unless (and (not (url-fullness url)) (url-type url))
             (setf (url-fullness url) t)
-            (setf (url-filename url)
-                  (url-unhex-string (url-filename url)))
             (unless (url-type url)
               (setf (url-type url) elpher-default-url-type))
             (unless (url-host url)
@@ -436,7 +436,7 @@ address refers to, via the table `elpher-type-map'."
 For gopher addresses this is a combination of the selector type and selector."
   (if (symbolp address)
       nil
-    (url-filename address)))
+    (url-unhex-string (url-filename address))))
 
 (defun elpher-address-host (address)
   "Retrieve host from ADDRESS object."
@@ -460,7 +460,7 @@ If no address is defined, returns 0.  (This is for compatibility with the URL li
 (defun elpher-address-gopher-p (address)
   "Return non-nill if ADDRESS object is a gopher address."
   (and (not (elpher-address-special-p address))
-       (member (elpher-address-protocol address) '("gopher gophers"))))
+       (member (elpher-address-protocol address) '("gopher" "gophers"))))
 
 (defun elpher-gopher-address-selector (address)
   "Retrieve gopher selector from ADDRESS object."
@@ -509,8 +509,17 @@ If no address is defined, returns 0.  (This is for compatibility with the URL li
   "Set the address corresponding to PAGE to NEW-ADDRESS."
   (setcar (cdr page) new-address))
 
-(defvar elpher-current-page nil) ; buffer local
-(defvar elpher-history nil)      ; buffer local
+(defvar elpher-current-page nil
+  "The current page for this Elpher buffer.")
+
+(defvar elpher-history nil
+  "The local history for this Elpher buffer.
+This variable is used by `elpher-back' and
+`elpher-show-history'.")
+
+(defvar elpher-history-all nil
+  "The global history for all Elpher buffers.
+This variable is used by `elpher-show-history-all'.")
 
 (defun elpher-visit-page (page &optional renderer no-history)
   "Visit PAGE using its own renderer or RENDERER, if non-nil.
@@ -521,7 +530,8 @@ unless NO-HISTORY is non-nil."
   (unless (or no-history
               (equal (elpher-page-address elpher-current-page)
                      (elpher-page-address page)))
-    (push elpher-current-page elpher-history))
+    (push elpher-current-page elpher-history)
+    (push elpher-current-page elpher-history-all))
   (setq-local elpher-current-page page)
   (let* ((address (elpher-page-address page))
          (type (elpher-address-type address))
@@ -1631,6 +1641,7 @@ The result is rendered using RENDERER."
            " - c/C: copy URL representation of item under cursor or current page\n"
            " - a/A: bookmark the item under cursor or current page\n"
            " - B: list all bookmarks\n"
+           " - h/H: show history of current buffer or for all buffers\n"
            " - r: redraw current page (using cached contents if available)\n"
            " - R: reload current page (regenerates cache)\n"
            " - S: set character coding system for gopher (default is to autodetect)\n"
@@ -1673,6 +1684,51 @@ The result is rendered using RENDERER."
             'face 'shadow))
    (elpher-restore-pos)))
 
+;; History page retrieval
+
+(defun elpher-history ()
+  "Show the history of pages leading to the current page in this buffer.
+Use \\[elpher-history-all] to see the entire history.
+This is rendered using `elpher-get-history-page' via `elpher-type-map'."
+  (interactive)
+  (elpher-visit-page
+   (elpher-make-page "Elpher History Page"
+                    (elpher-make-special-address 'history))))
+
+(defun elpher-history-all ()
+  "Show the all the pages you've visited using Elpher.
+Use \\[elpher-history] to see just the history for the current buffer.
+This is rendered using `elpher-get-history-all-page' via `elpher-type-map'."
+  (interactive)
+  (elpher-visit-page
+   (elpher-make-page "Elpher History Of All Seen Pages"
+                    (elpher-make-special-address 'history-all))))
+
+(defun elpher-get-history-page (renderer)
+  "Getter which displays the history page (RENDERER must be nil)."
+  (when renderer
+    (elpher-visit-previous-page)
+    (error "Command not supported for history page"))
+  (elpher-show-history elpher-history))
+
+(defun elpher-get-history-all-page (renderer)
+  "Getter which displays the history page (RENDERER must be nil)."
+  (when renderer
+    (elpher-visit-previous-page)
+    (error "Command not supported for history page"))
+  (elpher-show-history elpher-history-all))
+
+(defun elpher-show-history (pages)
+  "Show all PAGES in the Elpher buffer."
+  (elpher-with-clean-buffer
+   (if pages
+       (dolist (page pages)
+        (when page
+           (let ((display-string (elpher-page-display-string page))
+                (address (elpher-page-address page)))
+             (elpher-insert-index-record display-string address))))
+     (insert "No history items found.\n"))))
+
 ;;; Bookmarks
 
 ;; This code allows Elpher to use the standard Emacs bookmarks: `C-x r
@@ -1689,7 +1745,7 @@ and \\[elpher-set-bookmark-no-overwrite] do the same thing.")
 (defun elpher-bookmark-make-record ()
   "Return a bookmark record.
 If `elpher-bookmark-link' is non-nil and point is on a link button,
-return a bookmark record for that link. Otherwise, return a bookmark
+return a bookmark record for that link.  Otherwise, return a bookmark
 record for the current elpher page."
   (let* ((button (and elpher-bookmark-link (button-at (point))))
         (page (if button
@@ -1721,7 +1777,7 @@ To bookmark the current page, use \\[bookmark-set-no-overwrite]."
     (bookmark-set-no-overwrite)))
 
 (defun elpher-bookmark-import (file)
-  "Import Elpher bookmarks into Emacs bookmarks."
+  "Import Elpher bookmarks file FILE into Emacs bookmarks."
   (interactive (list (if (and (boundp 'elpher-bookmarks-file)
                              (file-readable-p elpher-bookmarks-file))
                         elpher-bookmarks-file
@@ -2081,6 +2137,8 @@ When run interactively HOST-OR-URL is read from the minibuffer."
     (define-key map (kbd "O") 'elpher-root-dir)
     (define-key map (kbd "g") 'elpher-go)
     (define-key map (kbd "o") 'elpher-go-current)
+    (define-key map (kbd "h") 'elpher-history)
+    (define-key map (kbd "H") 'elpher-history-all)
     (define-key map (kbd "r") 'elpher-redraw)
     (define-key map (kbd "R") 'elpher-reload)
     (define-key map (kbd "T") 'elpher-toggle-tls)