Recently Written · git

gendocs

Simple document generation library.

git clone https://github.com/equwal/gendocs

Log | Files | Refs


commit c941375b67503a44bab2e9760b087ac5159a7414
Spenser Truex <spensertruexonline@gmail.com>
2019-04-28 22:22:37 -0700

Library to generate template docs from docstrings in a package.

 gendocs.lisp | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
diff --git a/gendocs.lisp b/gendocs.lisp
new file mode 100644
index 0000000..90f0fa1
--- /dev/null
+++ b/gendocs.lisp
@@ -0,0 +1,43 @@
+(defpackage #:gendocs
+  (:use #:cl)
+  (:export :gendocs))
+(in-package :gendocs)
+(define-symbol-macro nl (format nil "~%"))
+(defun slurp (file)
+  (with-open-file (i file)
+    (read-sequence (make-array 64 :element-type 'character :adjustable t)
+                   i)))
+(defun gendocs (inputs-pathlist packages outputs-pathlist
+                &optional (delimiters '(#\< . #\>)))
+  (loop for p in packages
+        for i in inputs-pathlist
+        for o in outputs-pathlist
+        do (template-replace i
+                             o
+                             (md-docstrings p)
+                             delimiters)))
+(defun md-docstrings (package)
+  (let ((pairs (read-docstrings package)))
+    (loop for p in pairs
+          collect (concatenate 'string nl
+                               "`" (car p) "`" nl
+                               (cdr p) nl))))
+(defun read-docstrings (package)
+  "Read the docstrings from a file"
+  (loop for x being the external-symbols of package
+        collect (cons (symbol-name x) (documentation x 'function))))
+(defun template-replace (input output replacement-string delimiters)
+  (with-open-file (o output :direction :output)
+    (write-sequence (str-replace (concatenate 'string
+                                              (string (car delimiters))
+                                              (pathname-name input)
+                                              (string (cdr delimiters)))
+                                 replacement-string
+                                 (slurp input))
+                    o)))
+(defun str-replace (from to source)
+  (let ((loc (search from source)))
+    (concatenate 'string
+                 (subseq source 0 loc)
+                 to
+                 (subseq source (+ loc (length from))))))