Version number bump.
[elpher.git] / elpher.el
index 33804cf..56d82c4 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -4,7 +4,7 @@
 
 ;; Author: Tim Vaughan <tgvaughan@gmail.com>
 ;; 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.")