X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=474eee1c9f00700d424410d86525b92f0388cafc;hp=75ae255ab6aa79c6ef7305e312997af3a72508fb;hb=c9175aedfaf3daeca6b2414f74ef703f2f6cbc1f;hpb=0243aa0a1d9ab09ad270b5d3ce6372bbf8c83e15 diff --git a/elpher.el b/elpher.el index 75ae255..474eee1 100644 --- a/elpher.el +++ b/elpher.el @@ -2,9 +2,9 @@ ;; Copyright (C) 2019 Tim Vaughan -;; Author: Tim Vaughan +;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.5.0 +;; Version: 2.5.2 ;; Keywords: comm gopher ;; Homepage: http://thelambdalab.xyz/elpher ;; Package-Requires: ((emacs "26")) @@ -62,12 +62,13 @@ (require 'url-util) (require 'subr-x) (require 'dns) +(require 'ansi-color) ;;; Global constants ;; -(defconst elpher-version "2.5.0" +(defconst elpher-version "2.5.2" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -177,10 +178,10 @@ allows switching from an encrypted channel back to plain text without user input "Specifies the number of seconds to wait for a network connection to time out." :type '(integer)) -(defcustom elpher-strip-ansi-from-text t - "If non-nil, strip ANSI escape sequences from gopher menus and text/gemini files. -This is occasionally desirable, as these sequences are not understood natively by -Emacs, and tend to result in a garbled display." +(defcustom elpher-filter-ansi-from-text nil + "If non-nil, filter ANSI escape sequences from text. +The default behaviour is to use the ansi-color package to interpret these +sequences." :type '(boolean)) ;;; Model @@ -336,12 +337,15 @@ If no address is defined, returns 0. (This is for compatibility with the URL li ;; Page (defun elpher-make-page (display-string address) + "Create a page with DISPLAY-STRING and ADDRESS." (list display-string address)) (defun elpher-page-display-string (page) + "Retrieve the display string corresponding to PAGE." (elt page 0)) (defun elpher-page-address (page) + "Retrieve the address corresponding to PAGE." (elt page 1)) (defvar elpher-current-page nil) @@ -615,9 +619,10 @@ If ADDRESS is not supplied or nil the record is rendered as an (if type-map-entry (let* ((margin-code (elt type-map-entry 2)) (face (elt type-map-entry 3)) - (page (elpher-make-page display-string address))) + (filtered-display-string (ansi-color-filter-apply display-string)) + (page (elpher-make-page filtered-display-string address))) (elpher-insert-margin margin-code) - (insert-text-button display-string + (insert-text-button filtered-display-string 'face face 'elpher-page page 'action #'elpher-click-link @@ -675,22 +680,12 @@ If ADDRESS is not supplied or nil the record is rendered as an (defconst elpher-ansi-regex "\x1b\\[[^m]*m" "Wildly incomplete regexp used to strip out some troublesome ANSI escape sequences.") -(defun elpher-strip-ansi (string) - "Strip ANSI escape codes from STRING." - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (while (re-search-forward elpher-ansi-regex nil t) - (delete-region (match-beginning 0) (match-end 0))) - (buffer-string))) - - (defun elpher-process-text-for-display (string) - "Perform any desired processing of text prior to display. -Currently includes buttonifying URLs and optionally stripping ANSI escape codes." - (elpher-buttonify-urls (if elpher-strip-ansi-from-text - (elpher-strip-ansi string) - 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)))) (defun elpher-render-text (data &optional _mime-type-string) "Render DATA as text. MIME-TYPE-STRING is unused." @@ -826,7 +821,9 @@ to ADDRESS." (set-process-coding-system proc 'binary) (set-process-filter proc (lambda (_proc string) - (cancel-timer timer) + (when timer + (cancel-timer timer) + (setq timer nil)) (setq response-string (concat response-string string)))) (set-process-sentinel proc @@ -1328,8 +1325,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (elpher-page-display-string elpher-current-page)) (elpher-visit-page (elpher-make-page (elpher-page-display-string elpher-current-page) - (elpher-page-address elpher-current-page) - elpher-current-page) + (elpher-page-address elpher-current-page)) #'elpher-render-download t)))