X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=bdb7aabd4484c1b01cd7205328a170b6c5f3b0f5;hp=705880fe64c7c0ae483b5678e276f262bc4ff1bb;hb=3d57d6d240f7bf90c9f0d27675a4830164ddce6c;hpb=55796d20a00ce100595f52ce5c3c639e8ca3d187 diff --git a/elpher.el b/elpher.el index 705880f..bdb7aab 100644 --- a/elpher.el +++ b/elpher.el @@ -82,25 +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 ;; @@ -654,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 ;; @@ -1079,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 @@ -1857,31 +1861,29 @@ To bookmark the link at point use \\[elpher-bookmark-link]." (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)))) + (elpher-with-clean-buffer + (insert " ---- Elpher Bookmarks ---- \n\n") + (bookmark-maybe-load-default-file) + (let ((bookmarks (bookmark-maybe-sort-alist))) + (if bookmarks + (dolist (bookmark bookmarks) + (let* ((name (car bookmark)) + (url (alist-get 'location (cdr bookmark))) + (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" + "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 () "Display the current list of elpher bookmarks.