Merge remote-tracking branch 'origin/patch_force_ipv4'
authorTim Vaughan <plugd@thelambdalab.xyz>
Tue, 2 Jun 2020 20:21:50 +0000 (22:21 +0200)
committerTim Vaughan <plugd@thelambdalab.xyz>
Tue, 2 Jun 2020 20:21:50 +0000 (22:21 +0200)
1  2 
elpher.el

diff --combined elpher.el
+++ b/elpher.el
@@@ -4,7 -4,7 +4,7 @@@
  
  ;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
  ;; Created: 11 April 2019
 -;; Version: 2.7.8
 +;; Version: 2.7.9
  ;; Keywords: comm gopher
  ;; Homepage: http://thelambdalab.xyz/elpher
  ;; Package-Requires: ((emacs "26"))
@@@ -70,7 -70,7 +70,7 @@@
  ;;; Global constants
  ;;
  
 -(defconst elpher-version "2.7.8"
 +(defconst elpher-version "2.7.9"
    "Current version of elpher.")
  
  (defconst elpher-margin-width 6
@@@ -148,19 -148,15 +148,24 @@@ The actual width used is the minimum o
  the time when the text is rendered."
    :type '(integer))
  
 +(defcustom elpher-gemini-link-string "→ "
 +  "Specify the string used to indicate links when rendering gemini maps.
 +May be empty."
 +  :type '(string))
 +
 +(defcustom elpher-gemini-bullet-string "•"
 +  "Specify the string used for bullets when rendering gemini maps."
 +  :type '(string))
 +
  (defcustom elpher-bookmarks-file (locate-user-emacs-file "elpher-bookmarks")
    "Specify the name of the file where elpher bookmarks will be saved."
    :type '(file))
  
+ (defcustom elpher-force-ipv4 nil
+   "If non-nil, force elpher to use ipv4 instead of trying an ipv6 address
+ and falling back to an ipv4 address"
+   :type '(boolean))
  ;; Face customizations
  
  (defgroup elpher-faces nil
@@@ -585,7 -581,7 +590,7 @@@ to ADDRESS.
                                            (progn
                                              (message "Disabling TLS mode.")
                                              (setq elpher-use-tls nil)
-                                             (elpher-get-selector address renderer))
+                                             (elpher-get-selector address renderer elpher-force-ipv4))
                                          (elpher-network-error address "Could not establish encrypted connection")))
                                       ('connect
                                        (elpher-process-cleanup)
@@@ -649,7 -645,7 +654,7 @@@ once they are retrieved from the gophe
        (elpher-with-clean-buffer
         (insert "LOADING... (use 'u' to cancel)\n"))
        (condition-case the-error
-           (elpher-get-selector address renderer)
+           (elpher-get-selector address renderer elpher-force-ipv4)
          (error
           (elpher-network-error address the-error))))))
  
          (insert " "))
      (insert (make-string elpher-margin-width ?\s))))
  
 -(defun elpher-page-button-help (page)
 -  "Return a string containing the help text for a button corresponding to PAGE."
 -  (let ((address (elpher-page-address page)))
 -    (format "mouse-1, RET: open '%s'" (if (elpher-address-special-p address)
 -                                          address
 -                                        (elpher-address-to-url address)))))
 +(defun elpher--page-button-help (_window buffer pos)
 +  "Function called by Emacs to generate mouse-over text.
 +The arguments specify the BUFFER and the POS within the buffer of the item
 +for which help is required.  The function returns the help to be
 +displayed.  The _WINDOW argument is currently unused."
 +  (with-current-buffer buffer
 +    (let ((button (button-at pos)))
 +      (when button
 +        (let* ((page (button-get button 'elpher-page))
 +               (address (elpher-page-address page)))
 +          (format "mouse-1, RET: open '%s'" (if (elpher-address-special-p address)
 +                                                address
 +                                              (url-recreate-url address))))))))
  
  (defun elpher-insert-index-record (display-string &optional address)
    "Function to insert an index record into the current buffer.
@@@ -718,7 -707,7 +723,7 @@@ If ADDRESS is not supplied or nil the r
                                'elpher-page page
                                'action #'elpher-click-link
                                'follow-link t
 -                              'help-echo (elpher-page-button-help page)))
 +                              'help-echo #'elpher--page-button-help))
        (pcase type
          ('nil ;; Information
           (elpher-insert-margin)
                              'elpher-page  page
                              'action #'elpher-click-link
                              'follow-link t
 -                            'help-echo (elpher-page-button-help page)
 +                            'help-echo #'elpher--page-button-help
                              'face 'button)))
      (buffer-string)))
  
@@@ -829,7 -818,7 +834,7 @@@ The response is rendered using the rend
  
              (elpher-with-clean-buffer
               (insert "LOADING RESULTS... (use 'u' to cancel)"))
-             (elpher-get-selector search-address renderer))
+             (elpher-get-selector search-address renderer elpher-force-ipv4))
          (if aborted
              (elpher-visit-previous-page))))))
   
@@@ -894,7 -883,6 +899,7 @@@ to ADDRESS.
        (error "Cannot establish gemini connection: GnuTLS not available")
      (unless (< (elpher-address-port address) 65536)
        (error "Cannot establish gemini connection: port number > 65536"))
 +    (defvar gnutls-verify-error)
      (condition-case nil
          (let* ((kill-buffer-query-functions nil)
                 (gnutls-verify-error nil) ; We use the NSM for verification
@@@ -1132,7 -1120,7 +1137,7 @@@ For instance, the filename /a/b/../c/./
           (type (if address (elpher-address-type address) nil))
           (type-map-entry (cdr (assoc type elpher-type-map))))
      (when display-string
 -      (insert "→ ")
 +      (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))
                                  'elpher-page page
                                  'action #'elpher-click-link
                                  'follow-link t
 -                                'help-echo (elpher-page-button-help page)))
 +                                'help-echo #'elpher--page-button-help))
          (insert (propertize display-string 'face 'elpher-unknown)))
        (insert "\n"))))
    
@@@ -1167,18 -1155,12 +1172,18 @@@ by HEADER-LINE.
    "Insert a plain non-preformatted TEXT-LINE into a text/gemini document.
  This function uses Emacs' auto-fill to wrap text sensibly to a maximum
  width defined by elpher-gemini-max-fill-width."
 -  (insert (elpher-process-text-for-display text-line))
 -  (let* ((prefix-end-idx (string-match "[^ \t*]" text-line))
 -         (fill-prefix (if prefix-end-idx
 -                          (let ((raw-prefix (substring text-line 0 prefix-end-idx)))
 -                            (replace-regexp-in-string "\*" " " raw-prefix))
 +  (string-match "\\(^[ \t]*\\)\\(\*[ \t]\\)?" text-line)
 +  (let* ((processed-text-line (if (match-string 2 text-line)
 +                                  (concat
 +                                   (replace-regexp-in-string "\*"
 +                                                             elpher-gemini-bullet-string
 +                                                             (match-string 0 text-line))
 +                                   (substring text-line (match-end 0)))
 +                                text-line))
 +         (fill-prefix (if (match-string 1 text-line)
 +                          (replace-regexp-in-string "\*" " " (match-string 0 text-line))
                          nil)))
 +    (insert (elpher-process-text-for-display processed-text-line))
      (newline)))
  
  (defun elpher-render-gemini-map (data _parameters)
  ;; Finger page connection
  
  (defun elpher-get-finger-page (renderer &optional force-ipv4)
 -  "Opens a finger connection to the current page address and renders it using RENDERER."
 +  "Opens a finger connection to the current page address.
 +The result is rendered using RENDERER.  When the optional argument
 +FORCE-IPV4 is non-nil, the IPv4 address returned by a DNS lookup will
 +be used explicitly in making the connection."
    (let* ((address (elpher-page-address elpher-current-page))
           (content (elpher-get-cached-content address)))
      (if (and content (funcall renderer nil))
                                          (cons string selector-string-parts))))
              (set-process-sentinel proc
                                    (lambda (_proc event)
 -                                    (condition-case the-error
 +                                    (condition-case _the-error
                                          (cond
                                           ((string-prefix-p "deleted" event))
                                           ((string-prefix-p "open" event)
             " - TAB/Shift-TAB: next/prev item on current page\n"
             " - RET/mouse-1: open item under cursor\n"
             " - m: select an item on current page by name (autocompletes)\n"
 -           " - u/mouse-3: return to previous page\n"
 +           " - u/mouse-3/U: return to previous page or to the start page\n"
             " - o/O: visit different selector or the root menu of the current server\n"
             " - g: go to a particular address (gopher, gemini, finger)\n"
             " - d/D: download item under cursor or current page\n"
@@@ -1556,15 -1535,6 +1561,15 @@@ When run interactively HOST-OR-URL is r
    (interactive)
    (elpher-visit-previous-page))
  
 +(defun elpher-back-to-start ()
 +  "Go all the way back to the start page."
 +  (interactive)
 +  (setq elpher-current-page nil)
 +  (setq elpher-history nil)
 +  (let ((start-page (elpher-make-page "Elpher Start Page"
 +                                      (elpher-make-special-address 'start))))
 +    (elpher-visit-page start-page)))
 +
  (defun elpher-download ()
    "Download the link at point."
    (interactive)
      (define-key map (kbd "<backtab>") 'elpher-prev-link)
      (define-key map (kbd "C-M-i") 'elpher-prev-link)
      (define-key map (kbd "u") 'elpher-back)
 +    (define-key map (kbd "U") 'elpher-back-to-start)
      (define-key map [mouse-3] 'elpher-back)
      (define-key map (kbd "O") 'elpher-root-dir)
      (define-key map (kbd "g") 'elpher-go)
          (kbd "C-") 'elpher-follow-current-link
          (kbd "C-t") 'elpher-back
          (kbd "u") 'elpher-back
 +        (kbd "U") 'elpher-back-to-start
          [mouse-3] 'elpher-back
          (kbd "g") 'elpher-go
          (kbd "o") 'elpher-go-current