skelrc: New function to insert flowed paragraphs.
[skel] / skelrc
diff --git a/skelrc b/skelrc
index 045075b..67ffd1a 100644 (file)
--- a/skelrc
+++ b/skelrc
@@ -1,5 +1,13 @@
 ;;; -*-emacs-lisp-*-
 
+(defun skelrc-dribble (msg &rest args)
+  "Write MSG (a `format'-style string, with ARGS) to the debug buffer."
+  (let ((buffer (get-buffer "*skel-debug*")))
+    (and buffer
+        (with-current-buffer buffer
+          (goto-char (point-max))
+          (insert (apply #'format msg args) "\n")))))
+
 (defun skelrc-strip-trailing-whitespace (string)
   "Return STRING, but with trailing whitespace removed.
 
@@ -54,6 +62,23 @@ its chosen major-mode before calling `skel-include'."
   (let ((val (assq key alist)))
     (and val (cdr val))))
 
+(defun skelrc-expand-text (text)
+  "Return the result of expanding TEXT in the current context.
+
+The context is extended with any new associations formed during
+the expansion."
+  (let* ((alist skel-alist)
+        (expanded (with-temp-buffer
+                    (let ((skel-alist alist))
+                      (insert text)
+                      (goto-char (point-min))
+                      (skelrc-dribble "before: alist = `%s'" skel-alist)
+                      (skel-do-fill-in)
+                      (setq alist skel-alist)
+                      (buffer-string)))))
+    (setq skel-alist alist)
+    expanded))
+
 (defun skelrc-prefix-lines (prefix lines)
   "Return LINES, each with PREFIX prepended to the beginning.
 
@@ -70,6 +95,28 @@ the PREFIX is removed."
       (forward-line))
     (buffer-string)))
 
+(defun skelrc-prefix-and-reflow (prefix text)
+  "Return LINES, reflowed to `fill-column', with PREFIX at the start."
+  (let ((expanded-prefix (skelrc-expand-text prefix))
+       (expanded-text (skelrc-expand-text text))
+       (col (string-to-number (skel-lookup 'fill-column))))
+    (with-temp-buffer
+      (let* ((fill-prefix expanded-prefix)
+            (paragraph-start (concat (skelrc-strip-trailing-whitespace
+                                      (regexp-quote expanded-prefix))
+                                     "[ \t\f]*$"))
+            (paragraph-separate paragraph-start)
+            (fill-column col))
+
+       (insert (skelrc-prefix-lines expanded-prefix expanded-text))
+
+       (goto-char (point-min))
+       (while (< (point) (point-max))
+         (fill-paragraph)
+         (forward-paragraph))
+
+       (buffer-string)))))
+
 (defun skelrc-component ()
   "Return a suitable a `This file is part of ...' line."
   (if (assq 'full-title skel-alist)