X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=2e3c5ec7468531356c74c75be812c69abdfbb49f;hp=b4e508ad9e4244888bfac06d5eb8aacb878c27d0;hb=7b52709ddf798fe53db3855eef52ca8862e7700d;hpb=a7145a60ee4ba9699cfb2080ab6e96d1ab64f722 diff --git a/elpher.el b/elpher.el index b4e508a..2e3c5ec 100644 --- a/elpher.el +++ b/elpher.el @@ -20,7 +20,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 3.2.0 +;; Version: 3.2.2 ;; Keywords: comm gopher ;; Homepage: https://thelambdalab.xyz/elpher ;; Package-Requires: ((emacs "27.1")) @@ -85,7 +85,7 @@ ;;; Global constants ;; -(defconst elpher-version "3.2.0" +(defconst elpher-version "3.2.2" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -225,7 +225,7 @@ Otherwise, \\[elpher-show-bookmarks] will visit a special elpher bookmark page within which all of the standard elpher keybindings are active." :type '(boolean)) -(defcustom elpher-start-page "about:welcome" +(defcustom elpher-start-page-url "about:welcome" "Specify the page displayed initially by elpher. The default welcome screen is \"about:welcome\", while the bookmarks list is \"about:bookmarks\". You can also specify local files via \"file:\". @@ -482,9 +482,9 @@ If no address is defined, returns 0. (This is for compatibility with the URL li (list display-string address)) (defun elpher-make-start-page () - "Create the welcome page." + "Create the start page." (elpher-make-page "Start Page" - (elpher-address-from-url elpher-start-page))) + (elpher-address-from-url elpher-start-page-url))) (defun elpher-page-display-string (page) "Retrieve the display string corresponding to PAGE." @@ -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.") @@ -575,15 +582,16 @@ previously-visited pages,unless NO-HISTORY is non-nil." (defun elpher-update-header () "If `elpher-use-header' is true, display current page info in window header." - (if elpher-use-header + (if (and elpher-use-header elpher-current-page) (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 @@ -1046,9 +1053,7 @@ displayed. The _WINDOW argument is currently unused." (when button (let* ((page (button-get button 'elpher-page)) (address (elpher-page-address page))) - (format "mouse-1, RET: open '%s'" (if (elpher-address-about-p address) - address - (elpher-address-to-url address)))))))) + (format "mouse-1, RET: open '%s'" (elpher-address-to-url address))))))) (defun elpher-insert-index-record (display-string &optional address) "Function to insert an index record into the current buffer. @@ -1132,8 +1137,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,15 +1511,21 @@ 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'." - (string-match "\\(^[ \t]*\\)\\(\\*[ \t]+\\|>[ \t]*\\)?" text-line) - (let* ((line-prefix (match-string 2 text-line)) + (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) @@ -1530,8 +1541,8 @@ width defined by `elpher-gemini-max-fill-width'." (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 2 text-line) - (replace-regexp-in-string "[>\*]" " " (match-string 0 text-line)) + (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))) @@ -1708,11 +1719,12 @@ Assumes UTF-8 encoding for all text files." (let ((help-string "RET,mouse-1: Open bookmark list")) (insert-text-button "bookmark list" 'face 'link - 'action (lambda (_) - (interactive) - (call-interactively #'elpher-show-bookmarks)) + 'action #'elpher-click-link 'follow-link t - 'help-echo help-string)) + 'help-echo #'elpher--page-button-help + 'elpher-page + (elpher-make-page "Elpher Bookmarks" + (elpher-make-about-address 'bookmarks)))) (insert ".\n") (insert (propertize "(Bookmarks from legacy elpher-bookmarks files will be automatically imported.)\n" @@ -1851,8 +1863,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)) @@ -2087,8 +2098,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)) @@ -2102,7 +2112,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."