Changed some wording on bookmark page.
[elpher.git] / elpher.el
index 0c4cd81..f7fa4e1 100644 (file)
--- a/elpher.el
+++ b/elpher.el
 (require 'gnutls)
 (require 'socks)
 
-;;; ANSI colors or XTerm colors
-
-(or (require 'xterm-color nil t)
-    (require 'ansi-color))
-
-(defalias 'elpher-color-filter-apply
-  (if (fboundp 'xterm-color-filter)
-      (lambda (s)
-        (let ((_xterm-color-render nil))
-          (xterm-color-filter s)))
-    #'ansi-color-filter-apply)
-  "A function to filter out ANSI escape sequences.")
-
-(defalias 'elpher-color-apply
-  (if (fboundp 'xterm-color-filter)
-      #'xterm-color-filter
-    #'ansi-color-apply)
-  "A function to apply ANSI escape sequences.")
-
 ;;; Global constants
 ;;
 
@@ -235,6 +216,12 @@ some servers which do not support IPv6 can take a long time to time-out."
 Otherwise, the SOCKS proxy is only used for connections to onion services."
   :type '(boolean))
 
+(defcustom elpher-use-emacs-bookmark-menu nil
+  "If non-nil, elpher will only use the native Emacs bookmark menu.
+Otherwise, \\[elpher-show-bookmarks] will visit a special elpher bookmark
+page within which all of the standard elpher keybindings are active."
+  :type '(boolean))
+
 ;; Face customizations
 
 (defgroup elpher-faces nil
@@ -648,6 +635,57 @@ away CRs and any terminating period."
   (elpher-decode (replace-regexp-in-string "\n\\.\n$" "\n"
                                            (replace-regexp-in-string "\r" "" string))))
 
+;;; Buttonify urls
+
+(defconst elpher-url-regex
+  "\\([a-zA-Z]+\\)://\\([a-zA-Z0-9.-]*[a-zA-Z0-9-]\\|\\[[a-zA-Z0-9:]+\\]\\)\\(:[0-9]+\\)?\\(/\\([0-9a-zA-Z_~?/@|:.%#=&-]*[0-9a-zA-Z_~?/@|#-]\\)?\\)?"
+  "Regexp used to locate and buttonify URLs in text files loaded by elpher.")
+
+(defun elpher-buttonify-urls (string)
+  "Turn substrings which look like urls in STRING into clickable buttons."
+  (with-temp-buffer
+    (insert string)
+    (goto-char (point-min))
+    (while (re-search-forward elpher-url-regex nil t)
+      (let ((page (elpher-make-page (substring-no-properties (match-string 0))
+                                    (elpher-address-from-url (match-string 0)))))
+        (make-text-button (match-beginning 0)
+                          (match-end 0)
+                          'elpher-page  page
+                          'action #'elpher-click-link
+                          'follow-link t
+                          'help-echo #'elpher--page-button-help
+                          'face 'button)))
+    (buffer-string)))
+
+;;; ANSI colors or XTerm colors (application and filtering)
+
+(or (require 'xterm-color nil t)
+    (require 'ansi-color))
+
+(defalias 'elpher-color-filter-apply
+  (if (fboundp 'xterm-color-filter)
+      (lambda (s)
+        (let ((_xterm-color-render nil))
+          (xterm-color-filter s)))
+    #'ansi-color-filter-apply)
+  "A function to filter out ANSI escape sequences.")
+
+(defalias 'elpher-color-apply
+  (if (fboundp 'xterm-color-filter)
+      #'xterm-color-filter
+    #'ansi-color-apply)
+  "A function to apply ANSI escape sequences.")
+
+;;; Processing text for display
+
+(defun elpher-process-text-for-display (string)
+  "Perform any desired processing of STRING prior to display as text.
+Currently includes buttonifying URLs and processing ANSI escape codes."
+  (elpher-buttonify-urls (if elpher-filter-ansi-from-text
+                             (elpher-color-filter-apply string)
+                           (elpher-color-apply string))))
+
 
 ;;; Network error reporting
 ;;
@@ -1073,34 +1111,6 @@ If ADDRESS is not supplied or nil the record is rendered as an
 
 ;; Text rendering
 
-(defconst elpher-url-regex
-  "\\([a-zA-Z]+\\)://\\([a-zA-Z0-9.-]*[a-zA-Z0-9-]\\|\\[[a-zA-Z0-9:]+\\]\\)\\(:[0-9]+\\)?\\(/\\([0-9a-zA-Z_~?/@|:.%#=&-]*[0-9a-zA-Z_~?/@|#-]\\)?\\)?"
-  "Regexp used to locate and buttonify URLs in text files loaded by elpher.")
-
-(defun elpher-buttonify-urls (string)
-  "Turn substrings which look like urls in STRING into clickable buttons."
-  (with-temp-buffer
-    (insert string)
-    (goto-char (point-min))
-    (while (re-search-forward elpher-url-regex nil t)
-      (let ((page (elpher-make-page (substring-no-properties (match-string 0))
-                                    (elpher-address-from-url (match-string 0)))))
-        (make-text-button (match-beginning 0)
-                          (match-end 0)
-                          'elpher-page  page
-                          'action #'elpher-click-link
-                          'follow-link t
-                          'help-echo #'elpher--page-button-help
-                          'face 'button)))
-    (buffer-string)))
-
-(defun elpher-process-text-for-display (string)
-  "Perform any desired processing of STRING prior to display as text.
-Currently includes buttonifying URLs and processing ANSI escape codes."
-  (elpher-buttonify-urls (if elpher-filter-ansi-from-text
-                             (elpher-color-filter-apply string)
-                           (elpher-color-apply string))))
-
 (defun elpher-render-text (data &optional _mime-type-string)
   "Render DATA as text.  MIME-TYPE-STRING is unused."
   (elpher-with-clean-buffer
@@ -1662,12 +1672,12 @@ The result is rendered using RENDERER."
                                (elpher-address-from-url "gemini://geminispace.info/search"))
    (insert "\n"
            "Your bookmarks are stored in your ")
-   (let ((help-string "RET,mouse-1: Open Emacs bookmark list"))
+   (let ((help-string "RET,mouse-1: Open bookmark list"))
      (insert-text-button "Emacs bookmark list"
                          'face 'link
                          'action (lambda (_)
                                    (interactive)
-                                   (call-interactively #'elpher-open-bookmarks))
+                                   (call-interactively #'elpher-show-bookmarks))
                          'follow-link t
                          'help-echo help-string))
    (insert ".\n")
@@ -1846,22 +1856,6 @@ To bookmark the link at point use \\[elpher-bookmark-link]."
       (bookmark-store display-string (cdr record) t)))
   (bookmark-save))
 
-(defun elpher-open-bookmarks ()
-  "Display the current list of elpher bookmarks.
-This is just a call to `bookmark-bmenu-list', but we also check for a legacy
-bookmark file and offer to import it."
-  (interactive)
-  (let ((old-bookmarks-file (or (and (boundp 'elpher-bookmarks-file)
-                                     elpher-bookmarks-file)
-                                (locate-user-emacs-file "elpher-bookmarks"))))
-    (when (and (file-readable-p old-bookmarks-file)
-               (y-or-n-p (concat "Legacy elpher-bookmarks file \""
-                                 old-bookmarks-file
-                                 "\" found. Import now?")))
-      (elpher-bookmark-import old-bookmarks-file)
-      (rename-file old-bookmarks-file (concat old-bookmarks-file "-legacy"))))
-  (call-interactively #'bookmark-bmenu-list))
-
 (defun elpher-get-bookmarks-page (renderer)
   "Getter which displays the history page (RENDERER must be nil)."
   (when renderer
@@ -1869,29 +1863,49 @@ bookmark file and offer to import it."
     (error "Command not supported for bookmarks page"))
   (let* ((names (seq-filter (lambda (name)
                               (let ((record (bookmark-get-bookmark-record name)))
-                                ;; record
-                                (eq (alist-get 'handler record) 'elpher-bookmark-jump)
-                                ))
+                                (eq (alist-get 'handler record) 'elpher-bookmark-jump)))
                             (bookmark-all-names))))
     (elpher-with-clean-buffer
      (insert " ---- Elpher Bookmarks ---- \n\n")
      (if names
-         (dolist (name names)
+         (dolist (name (sort names #'string<))
            (when names
              (let* ((url (alist-get 'location (bookmark-get-bookmark-record name)))
                     (address (elpher-address-from-url url)))
                (elpher-insert-index-record name address))))
        (insert "No bookmarked pages found.\n"))
      (insert "\n --------------------------\n\n"
-             "Select an entry or press 'u' to return to the previous page.")
+             "Select an entry or press 'u' to return to the previous page.\n\n"
+             "Bookmarks can be renamed or deleted via the ")
+     (insert-text-button "Emacs bookmark menu"
+                         'action (lambda (_)
+                                   (interactive)
+                                   (call-interactively #'bookmark-bmenu-list))
+                         'follow-link t
+                         'help-echo "RET,mouse-1: open Emacs bookmark menu")
+     (insert (substitute-command-keys
+              ",\nwhich can also be openned from anywhere using '\\[bookmark-bmenu-list]'."))
      (elpher-restore-pos))))
 
 (defun elpher-show-bookmarks ()
-  "Show elpher bookmarks."
+  "Display the current list of elpher bookmarks.
+This will also check for a legacy bookmark file and offer to import it."
   (interactive)
-  (elpher-visit-page
-   (elpher-make-page "Elpher Bookmarks"
-                    (elpher-make-special-address 'bookmarks))))
+  (let ((old-bookmarks-file (or (and (boundp 'elpher-bookmarks-file)
+                                     elpher-bookmarks-file)
+                                (locate-user-emacs-file "elpher-bookmarks"))))
+    (when (and (file-readable-p old-bookmarks-file)
+               (y-or-n-p (concat "Legacy elpher-bookmarks file \""
+                                 old-bookmarks-file
+                                 "\" found. Import now?")))
+      (elpher-bookmark-import old-bookmarks-file)
+      (rename-file old-bookmarks-file (concat old-bookmarks-file "-legacy"))))
+  (if elpher-use-emacs-bookmark-menu
+      (call-interactively #'bookmark-bmenu-list)
+    (elpher-visit-page
+     (elpher-make-page "Elpher Bookmarks"
+                      (elpher-make-special-address 'bookmarks)))))
+
 
 ;;; Integrations
 ;;
@@ -2233,7 +2247,6 @@ When run interactively HOST-OR-URL is read from the minibuffer."
     (define-key map (kbd "a") 'elpher-bookmark-link)
     (define-key map (kbd "A") 'elpher-bookmark-current)
     (define-key map (kbd "B") 'elpher-show-bookmarks)
-    ;; (define-key map (kbd "B") 'elpher-open-bookmarks)
     (define-key map (kbd "!") 'elpher-set-gopher-coding-system)
     (define-key map (kbd "F") 'elpher-forget-current-certificate)
     (when (fboundp 'evil-define-key*)
@@ -2265,7 +2278,6 @@ When run interactively HOST-OR-URL is read from the minibuffer."
        (kbd "C") 'elpher-copy-current-url
        (kbd "a") 'elpher-bookmark-link
        (kbd "A") 'elpher-bookmark-current
-       ;; (kbd "B") 'elpher-open-bookmarks
        (kbd "B") 'elpher-show-bookmarks
        (kbd "!") 'elpher-set-gopher-coding-system
        (kbd "F") 'elpher-forget-current-certificate))