X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=e016e4516a4a9ff815be6f238007591153b54a8d;hb=e7cd2b92115ee3680956097dc835faafb67fa879;hp=e4687988807765b3239556d21ffb5fb87b7d889f;hpb=e47d94d214374d314bc52892bf5269ad72a70505;p=elpher.git diff --git a/elpher.el b/elpher.el index e468798..e016e45 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 1.2.2 +;; Version: 1.2.4 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "25")) @@ -57,7 +57,7 @@ ;;; Global constants ;; -(defconst elpher-version "1.2.2" +(defconst elpher-version "1.2.4" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -103,18 +103,18 @@ "Source for elpher start page.") (defconst elpher-type-map - '((?0 elpher-get-text-node "T" elpher-text) + '((?0 elpher-get-text-node "txt" elpher-text) (?1 elpher-get-index-node "/" elpher-index) - (?4 elpher-get-node-download "B" elpher-binary) - (?5 elpher-get-node-download "B" elpher-binary) + (?4 elpher-get-node-download "bin" elpher-binary) + (?5 elpher-get-node-download "bin" elpher-binary) (?7 elpher-get-search-node "?" elpher-search) - (?8 elpher-get-telnet-node "?" elpher-telnet) - (?9 elpher-get-node-download "B" elpher-binary) - (?g elpher-get-image-node "im" elpher-image) - (?p elpher-get-image-node "im" elpher-image) - (?I elpher-get-image-node "im" elpher-image) - (?d elpher-get-node-download "d" elpher-binary) - (?h elpher-get-url-node "W" elpher-url) + (?8 elpher-get-telnet-node "tel" elpher-telnet) + (?9 elpher-get-node-download "bin" elpher-binary) + (?g elpher-get-image-node "img" elpher-image) + (?p elpher-get-image-node "img" elpher-image) + (?I elpher-get-image-node "img" elpher-image) + (?d elpher-get-node-download "doc" elpher-binary) + (?h elpher-get-url-node "web" elpher-url) (bookmarks elpher-get-bookmarks-node "#" elpher-index) (start elpher-get-start-node "#" elpher-index)) "Association list from types to getters, margin codes and index faces.") @@ -343,11 +343,16 @@ unless PRESERVE-PARENT is non-nil." ;;; Index rendering ;; +(defun elpher-decode (string) + "Return decoded STRING." + (let ((coding (detect-coding-string string t))) + (decode-coding-string string coding))) + (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))) + (elpher-decode string)))) (defun elpher-insert-index (string) "Insert the index corresponding to STRING into the current buffer." @@ -389,6 +394,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 +451,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 +583,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) @@ -941,12 +947,14 @@ host, selector and port." (defun elpher-bookmark-current () "Bookmark the current node." (interactive) - (unless (elpher-bookmarks-current-p) - (let ((address (elpher-node-address elpher-current-node)) - (display-string (read-string "Bookmark display string: " - (elpher-node-display-string elpher-current-node)))) - (elpher-add-address-bookmark address display-string) - (message "Bookmark added.")))) + (let ((address (elpher-node-address elpher-current-node)) + (display-string (elpher-node-display-string elpher-current-node))) + (if (not (elpher-address-special-p address)) + (let ((bookmark-display-string (read-string "Bookmark display string: " + display-string))) + (elpher-add-address-bookmark address bookmark-display-string) + (message "Bookmark added.")) + (error "Cannot bookmark %s" display-string)))) (defun elpher-bookmark-link () "Bookmark the link at point." @@ -955,19 +963,23 @@ host, selector and port." (if button (let* ((node (button-get button 'elpher-node)) (address (elpher-node-address node)) - (display-string (read-string "Bookmark display string: " - (elpher-node-display-string node)))) - (elpher-add-address-bookmark address display-string) - (elpher-reload-bookmarks) - (message "Bookmark added.")) + (display-string (elpher-node-display-string node))) + (if (not (elpher-address-special-p address)) + (let ((bookmark-display-string (read-string "Bookmark display string: " + display-string))) + (elpher-add-address-bookmark address bookmark-display-string) + (elpher-reload-bookmarks) + (message "Bookmark added.")) + (error "Cannot bookmark %s" display-string))) (error "No link selected")))) (defun elpher-unbookmark-current () "Remove bookmark for the current node." (interactive) - (unless (elpher-bookmarks-current-p) - (elpher-remove-address-bookmark (elpher-node-address elpher-current-node)) - (message "Bookmark removed."))) + (let ((address (elpher-node-address elpher-current-node))) + (unless (elpher-address-special-p address) + (elpher-remove-address-bookmark address) + (message "Bookmark removed.")))) (defun elpher-unbookmark-link () "Remove bookmark for the link at point." @@ -985,13 +997,13 @@ host, selector and port." (interactive) (switch-to-buffer "*elpher*") (elpher-visit-node - (elpher-make-node "Bookmarks" (elpher-make-address 'bookmarks)))) + (elpher-make-node "Bookmarks Page" (elpher-make-address 'bookmarks)))) (defun elpher-info-node (node) "Display information on NODE." (let ((display-string (elpher-node-display-string node)) (address (elpher-node-address node))) - (if address + (if (not (elpher-address-special-p address)) (message "`%s' on %s port %s" (elpher-address-selector address) (elpher-address-host address) @@ -1013,23 +1025,29 @@ host, selector and port." (defun elpher-get-address-url (address) "Get URL representation of ADDRESS." - (concat "gopher://" - (elpher-address-host address) - (let ((port (elpher-address-port address))) - (if (equal port 70) - "" - (format ":%d" port))) - "/" (string (elpher-address-type address)) - (elpher-address-selector address))) + (let ((type (elpher-address-type address)) + (selector (elpher-address-selector address)) + (host (elpher-address-host address)) + (port (elpher-address-port address))) + (if (and (equal type ?h) + (string-prefix-p "URL:" selector)) + (elt (split-string selector "URL:") 1) + (concat "gopher://" + host + (if (equal port 70) + "" + (format ":%d" port)) + "/" (string type) + selector)))) (defun elpher-copy-node-url (node) "Copy URL representation of address of NODE to `kill-ring'." (let ((address (elpher-node-address node))) - (if address - (let ((url (elpher-get-address-url address))) - (message url) - (kill-new url)) - (error (format "Cannot represent %s as URL" (elpher-node-display-string node)))))) + (if (elpher-address-special-p address) + (error (format "Cannot represent %s as URL" (elpher-node-display-string node))) + (let ((url (elpher-get-address-url address))) + (message "Copied \"%s\" to kill-ring/clipboard." url) + (kill-new url))))) (defun elpher-copy-link-url () "Copy URL of item at point to `kill-ring'."