;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
;; Created: 11 April 2019
-;; Version: 2.7.6
+;; Version: 2.7.8
;; Keywords: comm gopher
;; Homepage: http://thelambdalab.xyz/elpher
;; Package-Requires: ((emacs "26"))
;;; Global constants
;;
-(defconst elpher-version "2.7.6"
+(defconst elpher-version "2.7.8"
"Current version of elpher.")
(defconst elpher-margin-width 6
"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
'((t :inherit bold :height 1.2))
"Face used for gemini heading level 3.")
+(defface elpher-gemini-preformatted
+ '((t :inherit fixed-pitch))
+ "Face used for pre-formatted gemini text blocks.")
+
;;; Model
;;
"Retrieve gopher selector from ADDRESS object."
(if (member (url-filename address) '("" "/"))
""
- (substring (url-filename address) 2)))
+ (url-unhex-string (substring (url-filename address) 2))))
;; Cache
(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)
(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))))))
(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))))))
(_ 'default)))
"\n"))))
+(defun elpher-gemini-insert-text (text-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))
+ nil)))
+ (newline)))
+
(defun elpher-render-gemini-map (data _parameters)
"Render DATA as a gemini map file, PARAMETERS is currently unused."
(elpher-with-clean-buffer
(dolist (line (split-string data "\n"))
(cond
((string-prefix-p "```" line) (setq preformatted (not preformatted)))
- (preformatted (insert (elpher-process-text-for-display line) "\n"))
+ (preformatted (insert (elpher-process-text-for-display
+ (propertize line 'face 'elpher-gemini-preformatted))
+ "\n"))
((string-prefix-p "=>" line) (elpher-gemini-insert-link line))
((string-prefix-p "#" line) (elpher-gemini-insert-header line))
- (t (insert (elpher-process-text-for-display line)) (newline)))))
+ (t (elpher-gemini-insert-text line)))))
(elpher-cache-content
(elpher-page-address elpher-current-page)
(buffer-string))))
(switch-to-buffer "*elpher*")
(switch-to-buffer "*elpher*")
(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)))