Add option to fill paragraphs
[elpher.git] / elpher.el
index 02fb212..c57b1c2 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -4,7 +4,7 @@
 
 ;; Author: Tim Vaughan <plugd@thelambdalab.xyz>
 ;; Created: 11 April 2019
-;; Version: 2.10.0
+;; Version: 2.10.2
 ;; Keywords: comm gopher
 ;; Homepage: http://thelambdalab.xyz/elpher
 ;; Package-Requires: ((emacs "26.2"))
@@ -71,7 +71,7 @@
 ;;; Global constants
 ;;
 
-(defconst elpher-version "2.10.0"
+(defconst elpher-version "2.10.2"
   "Current version of elpher.")
 
 (defconst elpher-margin-width 6
@@ -209,7 +209,7 @@ some servers which do not support IPv6 can take a long time to time-out."
   "Face used for html type directory records.")
 
 (defface elpher-gemini
-  '((t :inherit font-lock-regexp-grouping-backslash))
+  '((t :inherit font-lock-constant-face))
   "Face used for Gemini type directory records.")
 
 (defface elpher-other-url
@@ -547,6 +547,9 @@ If LINE is non-nil, replace that line instead."
 (defvar elpher-user-coding-system nil
   "User-specified coding system to use for decoding text responses.")
 
+(defvar elpher-fill-paragraph nil
+  "Whether to fill text paragraphs using `fill-paragraph`.")
+
 (defun elpher-decode (string)
   "Decode STRING using autodetected or user-specified coding system."
   (decode-coding-string string
@@ -1365,17 +1368,20 @@ treatment that a separate function is warranted."
 The gemini map file line describing the header is given
 by HEADER-LINE."
   (when (string-match "^\\(#+\\)[ \t]*" header-line)
-    (let ((level (length (match-string 1 header-line)))
-          (header (substring header-line (match-end 0))))
+    (let* ((level (length (match-string 1 header-line)))
+           (header (substring header-line (match-end 0)))
+          (face (pcase level
+                   (1 'elpher-gemini-heading1)
+                   (2 'elpher-gemini-heading2)
+                   (3 'elpher-gemini-heading3)
+                   (_ 'default)))
+          (fill-column (/ (* fill-column
+                             (font-get (font-spec :name (face-font 'default)) :size))
+                          (font-get (font-spec :name (face-font face)) :size))))
       (unless (display-graphic-p)
         (insert (make-string level ?#) " "))
-      (insert (propertize header 'face
-                          (pcase level
-                            (1 'elpher-gemini-heading1)
-                            (2 'elpher-gemini-heading2)
-                            (3 'elpher-gemini-heading3)
-                            (_ 'default)))
-              "\n"))))
+      (insert (propertize header 'face face))
+      (newline))))
 
 (defun elpher-gemini-insert-text (text-line)
   "Insert a plain non-preformatted TEXT-LINE into a text/gemini document.
@@ -1394,6 +1400,10 @@ width defined by elpher-gemini-max-fill-width."
                           (replace-regexp-in-string "[>\*]" " " (match-string 0 text-line))
                         nil)))
     (insert (elpher-process-text-for-display processed-text-line))
+    (when elpher-fill-paragraph
+      (save-restriction
+        (narrow-to-region (line-beginning-position) (line-end-position))
+        (fill-paragraph)))
     (newline)))
 
 (defun elpher-render-gemini-map (data _parameters)