text/gemini formatting improvements.
authorplugd <plugd@thelambdalab.xyz>
Mon, 2 Aug 2021 12:31:56 +0000 (14:31 +0200)
committerplugd <plugd@thelambdalab.xyz>
Mon, 2 Aug 2021 12:32:08 +0000 (14:32 +0200)
elpher.el

index 6963987..e4d0e6e 100644 (file)
--- a/elpher.el
+++ b/elpher.el
@@ -1513,28 +1513,36 @@ 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 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))
-         (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 2 text-line)
-                          (replace-regexp-in-string "[>\*]" " " (match-string 0 text-line))
-                        nil)))
-    (insert (elpher-process-text-for-display processed-text-line))
-    (newline)))
+  (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))))
 
 (defun elpher-render-gemini-map (data _parameters)
   "Render DATA as a gemini map file, PARAMETERS is currently unused."
 
 (defun elpher-render-gemini-map (data _parameters)
   "Render DATA as a gemini map file, PARAMETERS is currently unused."