X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=56d82c4526a0d5aa5723f1ef26a353dc5da73d49;hb=7106f9887e1bd5b1f46fcbd8d0d7cdcedc9d14a6;hp=33804cfd14e8c07fc1d3f7b601e55bff54f0c9c3;hpb=63e0f6df1856b9298b90d27ac2ad1ddc1e761590;p=elpher.git diff --git a/elpher.el b/elpher.el index 33804cf..56d82c4 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.2.4 +;; Version: 1.3.0 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -57,7 +57,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.2.4" +(defconst elpher-version "1.3.0" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -79,7 +79,7 @@ "i - m: select an item on current page by name (autocompletes)\tfake\tfake\t1" "i - u: return to parent\tfake\tfake\t1" "i - O: visit the root menu of the current server\tfake\tfake\t1" - "i - g: go to a particular menu or item\tfake\tfake\t1" + "i - g: go to a particular gopher address\tfake\tfake\t1" "i - i/I: info on item under cursor or current page\tfake\tfake\t1" "i - c/C: copy URL representation of item under cursor or current page\tfake\tfake\t1" "i - a/A: bookmark the item under cursor or current page\tfake\tfake\t1" @@ -89,6 +89,7 @@ "i - R: reload current page (regenerates cache)\tfake\tfake\t1" "i - d: download directory entry under cursor\tfake\tfake\t1" "i - w: display the raw server response for the current page\tfake\tfake\t1" + "i - S: set an explicit character coding system (default is to autodetect)\tfake\tfake\t1" "i\tfake\tfake\t1" "iWhere to start exploring Gopherspace:\tfake\tfake\t1" "i\tfake\tfake\t1" @@ -340,14 +341,28 @@ unless PRESERVE-PARENT is non-nil." args))) -;;; Index rendering +;;; Text Processing ;; +(defvar elpher-user-coding-system nil + "User-specified coding system to use for decoding text responses.") + +(defun elpher-decode (string) + "Decode STRING using autodetected or user-specified coding system." + (decode-coding-string string + (if elpher-user-coding-system + elpher-user-coding-system + (detect-coding-string string t)))) + (defun elpher-preprocess-text-response (string) - "Clear away CRs and terminating period from STRING." - (replace-regexp-in-string "\n\.\n$" "\n" - (replace-regexp-in-string "\r" "" - string))) + "Preprocess text selector response contained in STRING. +This involes decoding the character representation, and clearing +away CRs and any terminating period." + (elpher-decode (replace-regexp-in-string "\n\.\n$" "\n" + (replace-regexp-in-string "\r" "" string)))) + +;;; Index rendering +;; (defun elpher-insert-index (string) "Insert the index corresponding to STRING into the current buffer." @@ -389,6 +404,7 @@ unless PRESERVE-PARENT is non-nil." (elpher-address-host address) (elpher-address-port address))))) + (defun elpher-insert-index-record (display-string type selector host port) "Function to insert an index record into the current buffer. The contents of the record are dictated by TYPE, DISPLAY-STRING, SELECTOR, HOST @@ -445,6 +461,8 @@ The result is stored as a string in the variable ‘elpher-selector-string’." (make-network-process :name "elpher-process" :host (elpher-address-host address) :service (elpher-address-port address) + :coding 'no-conversion + :filter-multibyte nil :filter (lambda (proc string) (setq elpher-selector-string (concat elpher-selector-string string))) @@ -575,9 +593,7 @@ calls, as is necessary if the match is performed by `string-match'." (lambda (proc event) (unless (string-prefix-p "deleted" event) (let ((image (create-image - (encode-coding-string - elpher-selector-string - 'no-conversion) + elpher-selector-string nil t))) (elpher-with-clean-buffer (insert-image image) @@ -1056,6 +1072,15 @@ host, selector and port." (interactive) (elpher-copy-node-url elpher-current-node)) +(defun elpher-set-coding-system () + "Specify an explicit character coding system." + (interactive) + (let ((system (read-coding-system "Set coding system to use (default is to autodetect): " nil))) + (setq elpher-user-coding-system system) + (if system + (message "Coding system fixed to %s. (Reload to see effect)." system) + (message "Coding system set to autodetect. (Reload to see effect).")))) + ;;; Mode and keymap ;; @@ -1080,6 +1105,7 @@ host, selector and port." (define-key map (kbd "x") 'elpher-unbookmark-link) (define-key map (kbd "X") 'elpher-unbookmark-current) (define-key map (kbd "B") 'elpher-bookmarks) + (define-key map (kbd "S") 'elpher-set-coding-system) (when (fboundp 'evil-define-key) (evil-define-key 'motion map (kbd "TAB") 'elpher-next-link @@ -1101,7 +1127,8 @@ host, selector and port." (kbd "A") 'elpher-bookmark-current (kbd "x") 'elpher-unbookmark-link (kbd "X") 'elpher-unbookmark-current - (kbd "B") 'elpher-bookmarks)) + (kbd "B") 'elpher-bookmarks + (kbd "S") 'elpher-set-coding-system)) map) "Keymap for gopher client.")