From: plugd Date: Tue, 27 Jul 2021 12:19:27 +0000 (+0200) Subject: Merge. X-Git-Tag: v3.1.0~11 X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=commitdiff_plain;h=5b4ad44db249c7bce8f2c18a16043ee3ddc77f55;hp=-c Merge. --- 5b4ad44db249c7bce8f2c18a16043ee3ddc77f55 diff --combined elpher.el index 705880f,ef20de0..fb71b3d --- a/elpher.el +++ b/elpher.el @@@ -82,25 -82,6 +82,6 @@@ (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 ;; @@@ -129,7 -110,6 +110,7 @@@ (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) @@@ -1896,11 -1863,7 +1900,11 @@@ "\" 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*) @@@ -2274,7 -2237,7 +2278,7 @@@ (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)