Merge.
authorplugd <plugd@thelambdalab.xyz>
Tue, 27 Jul 2021 12:19:27 +0000 (14:19 +0200)
committerplugd <plugd@thelambdalab.xyz>
Tue, 27 Jul 2021 12:20:08 +0000 (14:20 +0200)
1  2 
elpher.el

diff --combined 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
  ;;
  
      (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 "E" elpher-index)
 +    ((special bookmarks) elpher-get-bookmarks-page nil "E" elpher-index)
      ((special history) elpher-get-history-page nil "E" elpher-index)
      ((special visited-pages) elpher-get-visited-pages-page nil "E" elpher-index))
    "Association list from types to getters, renderers, margin codes and index faces.")
@@@ -235,12 -215,6 +216,12 @@@ some servers which do not support IPv6 
  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
@@@ -654,6 -628,57 +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
  ;;
@@@ -1079,34 -1104,6 +1111,6 @@@ If ADDRESS is not supplied or nil the r
  
  ;; 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
@@@ -1668,12 -1665,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")
@@@ -1765,7 -1762,7 +1769,7 @@@ This is rendered using `elpher-get-visi
                 (elpher-insert-index-record display-string address))))
         (insert "No history items found.\n"))
       (insert "\n" footer-line "\n"
 -             "Select and entry or press 'u' to return to the previous page.")
 +             "Select an entry or press 'u' to return to the previous page.")
       (elpher-restore-pos))))
  
  
@@@ -1852,40 -1849,10 +1856,40 @@@ To bookmark the link at point use \\[el
        (bookmark-store display-string (cdr record) t)))
    (bookmark-save))
  
 -(defun elpher-open-bookmarks ()
 +(defun elpher-get-bookmarks-page (renderer)
 +  "Getter which displays the history page (RENDERER must be nil)."
 +  (when renderer
 +    (elpher-visit-previous-page)
 +    (error "Command not supported for bookmarks page"))
 +  (let* ((names (seq-filter (lambda (name)
 +                              (let ((record (bookmark-get-bookmark-record name)))
 +                                (eq (alist-get 'handler record) 'elpher-bookmark-jump)))
 +                            (bookmark-all-names))))
 +    (elpher-with-clean-buffer
 +     (insert " ---- Elpher Bookmarks ---- \n\n")
 +     (if 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.\n\n")
 +     (insert "To rename or delete bookmark entries, open your bookmark list\n"
 +             "using 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 " via '\\[bookmark-bmenu-list]'."))
 +     (elpher-restore-pos))))
 +
 +(defun elpher-show-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."
 +This will 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)
                                   "\" found. Import now?")))
        (elpher-bookmark-import old-bookmarks-file)
        (rename-file old-bookmarks-file (concat old-bookmarks-file "-legacy"))))
 -  (call-interactively #'bookmark-bmenu-list))
 +  (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
@@@ -2242,7 -2205,7 +2246,7 @@@ When run interactively HOST-OR-URL is r
      (define-key map (kbd "C") 'elpher-copy-current-url)
      (define-key map (kbd "a") 'elpher-bookmark-link)
      (define-key map (kbd "A") 'elpher-bookmark-current)
 -    (define-key map (kbd "B") 'elpher-open-bookmarks)
 +    (define-key map (kbd "B") 'elpher-show-bookmarks)
      (define-key map (kbd "!") 'elpher-set-gopher-coding-system)
      (define-key map (kbd "F") 'elpher-forget-current-certificate)
      (when (fboundp 'evil-define-key*)
         (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))
      map)