X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=1178bfccb2d0c0e1b0f269d93d1d8f12bbb8881b;hp=e4d0e6e882989d1c0155b6847db8c7db4d3a9348;hb=c8c2d1acec623fc9f634a8cfc0b28d72f22295ad;hpb=7a7fc41273acf74bf2982a9607cf066c15f875d7 diff --git a/elpher.el b/elpher.el index e4d0e6e..1178bfc 100644 --- a/elpher.el +++ b/elpher.el @@ -498,6 +498,13 @@ If no address is defined, returns 0. (This is for compatibility with the URL li "Set the address corresponding to PAGE to NEW-ADDRESS." (setcar (cdr page) new-address)) +(defun elpher-page-from-url (url) + "Create a page with address and display string defined by URL. +The URL is unhexed prior to its use as a display string to improve +readability." + (elpher-make-page (elpher-decode (url-unhex-string url)) + (elpher-address-from-url url))) + (defvar elpher-current-page nil "The current page for this Elpher buffer.") @@ -577,13 +584,14 @@ previously-visited pages,unless NO-HISTORY is non-nil." "If `elpher-use-header' is true, display current page info in window header." (if elpher-use-header (let* ((display-string (elpher-page-display-string elpher-current-page)) + (sanitized-display-string (replace-regexp-in-string "%" "%%" display-string)) (address (elpher-page-address elpher-current-page)) (tls-string (if (and (not (elpher-address-about-p address)) (member (elpher-address-protocol address) '("gophers" "gemini"))) " [TLS encryption]" "")) - (header (concat display-string + (header (concat sanitized-display-string (propertize tls-string 'face 'bold)))) (setq header-line-format header)))) @@ -650,8 +658,7 @@ away CRs and any terminating period." (insert string) (goto-char (point-min)) (while (re-search-forward elpher-url-regex nil t) - (let ((page (elpher-make-page (substring-no-properties (match-string 0)) - (elpher-address-from-url (match-string 0))))) + (let ((page (elpher-page-from-url (substring-no-properties (match-string 0))))) (make-text-button (match-beginning 0) (match-end 0) 'elpher-page page @@ -1132,8 +1139,8 @@ If ADDRESS is not supplied or nil the record is rendered as an nil t)) (window (get-buffer-window elpher-buffer-name))) (when window - (setf (image-property image :max-width) (window-pixel-width window)) - (setf (image-property image :max-height) (window-pixel-height window))) + (setf (image-property image :max-width) (window-body-width window t)) + (setf (image-property image :max-height) (window-body-height window t))) (elpher-with-clean-buffer (insert-image image) (elpher-restore-pos))) @@ -1506,43 +1513,41 @@ by HEADER-LINE." elpher--gemini-page-headings)) (unless (display-graphic-p) (insert (make-string level ?#) " ")) - (insert (propertize header 'face face)) + (insert (propertize header 'face face 'rear-nonsticky t)) (newline)))) (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'." - (if (string-empty-p text-line) - (insert "\n") - (string-match - (rx (: line-start - (* (any " \t")) - (optional - (group (or (: "*" (+ (any " \t"))) - (: ">" (* (any " \t")))))))) - text-line) - (let* ((line-prefix (match-string 1 text-line)) - (processed-text-line - (if line-prefix - (cond ((string-prefix-p "*" line-prefix) - (concat - (replace-regexp-in-string "\\*" - elpher-gemini-bullet-string - (match-string 0 text-line)) - (substring text-line (match-end 0)))) - ((string-prefix-p ">" line-prefix) - (propertize text-line 'face 'elpher-gemini-quoted)) - (t text-line)) - text-line)) - (adaptive-fill-mode t) - ;; fill-prefix is important for adaptive-fill-mode: without - ;; it, multi-line list items are not indented correct - (fill-prefix (if (match-string 1 text-line) - (make-string (length (match-string 0 text-line)) ?\s) - nil))) - (insert (elpher-process-text-for-display processed-text-line)) - (newline)))) + (string-match + (rx (: line-start + (* (any " \t")) + (optional + (group (or (: "*" (+ (any " \t"))) + (: ">" (* (any " \t")))))))) + text-line) + (let* ((line-prefix (match-string 1 text-line)) + (processed-text-line + (if line-prefix + (cond ((string-prefix-p "*" line-prefix) + (concat + (replace-regexp-in-string "\\*" + elpher-gemini-bullet-string + (match-string 0 text-line)) + (substring text-line (match-end 0)))) + ((string-prefix-p ">" line-prefix) + (propertize text-line 'face 'elpher-gemini-quoted)) + (t text-line)) + text-line)) + (adaptive-fill-mode t) + ;; fill-prefix is important for adaptive-fill-mode: without + ;; it, multi-line list items are not indented correct + (fill-prefix (if (match-string 1 text-line) + (make-string (length (match-string 0 text-line)) ?\s) + nil))) + (insert (elpher-process-text-for-display processed-text-line)) + (newline))) (defun elpher-render-gemini-map (data _parameters) "Render DATA as a gemini map file, PARAMETERS is currently unused." @@ -1859,8 +1864,7 @@ then making that buffer the current buffer. It should not switch to the buffer." (let* ((url (cdr (assq 'location bookmark))) (cleaned-url (string-trim url)) - (address (elpher-address-from-url cleaned-url)) - (page (elpher-make-page cleaned-url address))) + (page (elpher-page-from-url cleaned-url))) (elpher-with-clean-buffer (elpher-visit-page page)) (set-buffer (get-buffer elpher-buffer-name)) @@ -2095,8 +2099,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (interactive "sGopher or Gemini URL: ") (let ((trimmed-host-or-url (string-trim host-or-url))) (unless (string-empty-p trimmed-host-or-url) - (let* ((address (elpher-address-from-url trimmed-host-or-url)) - (page (elpher-make-page trimmed-host-or-url address))) + (let ((page (elpher-page-from-url trimmed-host-or-url))) (switch-to-buffer elpher-buffer-name) (elpher-with-clean-buffer (elpher-visit-page page)) @@ -2110,7 +2113,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (unless (elpher-address-about-p address) (elpher-address-to-url address))))) (unless (string-empty-p (string-trim url)) - (elpher-visit-page (elpher-make-page url (elpher-address-from-url url)))))) + (elpher-visit-page (elpher-page-from-url url))))) (defun elpher-redraw () "Redraw current page."