(require 'url-util)
(require 'subr-x)
(require 'dns)
-(require 'ansi-color)
(require 'nsm)
(require 'gnutls)
+;;; 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
;;
'("gophers" "gemini")))
" [TLS encryption]"
""))
- (header (concat display-string
- (propertize tls-string 'face 'bold))))
+ (header (url-unhex-string
+ (concat display-string
+ (propertize tls-string 'face 'bold)))))
(setq header-line-format header))))
(defmacro elpher-with-clean-buffer (&rest args)
(if type-map-entry
(let* ((margin-code (elt type-map-entry 2))
(face (elt type-map-entry 3))
- (filtered-display-string (ansi-color-filter-apply display-string))
+ (filtered-display-string (elpher-color-filter-apply display-string))
(page (elpher-make-page filtered-display-string address)))
(elpher-insert-margin margin-code)
(insert-text-button filtered-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
- (ansi-color-filter-apply string)
- (ansi-color-apply string))))
+ (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."
(insert elpher-gemini-link-string)
(if type-map-entry
(let* ((face (elt type-map-entry 3))
- (filtered-display-string (ansi-color-filter-apply display-string))
+ (filtered-display-string (elpher-color-filter-apply display-string))
(page (elpher-make-page filtered-display-string address)))
(insert-text-button filtered-display-string
'face face
(define-key map "\C-m" 'elpher-menu-this-window)
(define-key map "o" 'elpher-menu-other-window)
(define-key map "\C-o" 'elpher-menu-switch-other-window)
+ (define-key map "c" 'elpher-menu-copy-current-url)
(define-key map "d" 'Buffer-menu-delete)
(define-key map "k" 'Buffer-menu-delete)
(define-key map "\C-k" 'Buffer-menu-delete)
(t
(error "There's no entry on this line of the menu")))))
+(defun elpher-menu-copy-current-url ()
+ "Copy the URL of the current menu item."
+ (interactive)
+ (let ((data (tabulated-list-get-id)))
+ (cond ((bufferp data)
+ (with-current-buffer data
+ (elpher-copy-page-url elpher-current-page)))
+ ((listp data)
+ (elpher-copy-page-url (nth 2 data)))
+ (t
+ (error "There's no entry on this line of the menu")))))
+
+ (defun elpher-copy-current-url ()
+ "Copy URL of current page to `kill-ring'."
+ (interactive)
+ (elpher-copy-page-url elpher-current-page))
+
(defvar elpher-title nil)
(defun elpher-find-title ()
menu commands won't work on them."
(setq tabulated-list-format
(vector '("T" 1 t)
- '("URL" 40 t)
- '("Name" 30 t))
+ '("Name" 30 t)
+ '("URL" 40 t))
tabulated-list-sort-key nil)
;; Collect info for each buffer we're interested in.
(let (entries)
(list (current-buffer)
(cond ((eq major-mode 'elpher-mode)
(vector "G"
- (or (elpher-address-to-url
- (elpher-page-address elpher-current-page))
- "none")
(or (elpher-find-title)
(elpher-page-display-string elpher-current-page)
- (buffer-name))))
+ (buffer-name))
+ (or (elpher-address-to-url
+ (elpher-page-address elpher-current-page))
+ "none")))
((eq major-mode 'gemini-mode)
(vector "E"
+ (or (elpher-page-display-string elpher-current-page)
+ (buffer-name))
(or (elpher-address-to-url
(elpher-page-address elpher-current-page))
- "none")
- (or (elpher-page-display-string elpher-current-page)
- (buffer-name))))
+ "none")))
((eq major-mode 'eww-mode)
(vector "W"
- (or (eww-current-url)
- "none")
(or (plist-get eww-data :title)
- (buffer-name)))))))
+ (buffer-name))
+ (or (eww-current-url)
+ "none"))))))
(defun elpher-menu-refresh-history ()
"Return current entries for `elpher-menu-refresh'.
(if (cdr pair)
(list (car pair)
(vector "G"
+ (or (elpher-page-display-string (cdr pair)) "?")
(or (elpher-address-to-url
- (elpher-page-address (cdr pair))) "none")
- (or (elpher-page-display-string (cdr pair)) "?")))
+ (elpher-page-address (cdr pair))) "none")))
separator))
(cons (cons (current-buffer) elpher-current-page)
(mapcar (lambda (page)
;; No history means a list of one item. Add a separator.
(list (list (current-buffer)
(vector "E"
- (or (elpher-address-to-url
- (elpher-page-address elpher-current-page)))
(or (elpher-page-display-string elpher-current-page)
- (buffer-name))))
+ (buffer-name))
+ (or (elpher-address-to-url
+ (elpher-page-address elpher-current-page)))))
separator))
((eq major-mode 'eww-mode)
;; A pair is (BUFFER-OR-DATA . PAGE) where BUFFER-OR-DTA is
;; what function to call. Add the separator at the end.
(nconc (cons (list (current-buffer)
(vector "W"
- (or (plist-get eww-data :url) "none")
- (or (plist-get eww-data :title) "none")))
+ (or (plist-get eww-data :title) "none")
+ (or (plist-get eww-data :url) "none")))
(mapcar (lambda (data)
(list
(list (current-buffer) 'eww-restore-history data)
(vector "W"
- (or (plist-get data :url) "none")
- (or (plist-get data :title) "none"))))
+ (or (plist-get data :title) "none")
+ (or (plist-get data :url) "none"))))
eww-history))
(list separator))))))