Add structure documentation
authorFrank Duncan <frank@kank.net>
Thu, 13 Aug 2015 10:39:13 +0000 (05:39 -0500)
committerFrank Duncan <frank@kank.net>
Thu, 13 Aug 2015 10:57:34 +0000 (05:57 -0500)
resources/emptydocs.lisp
resources/success1.lisp
resources/success1.md
src/main/docgen.asd
src/main/docgen.lisp
src/main/package.lisp
src/main/struc.lisp [new file with mode: 0644]
src/test/main.lisp

index 7076c6a631e2e477148617f7f8442dc357092183..608383136f2b8ce185ef2759dc73d8051e803dc5 100644 (file)
@@ -1,6 +1,8 @@
 (defpackage #:emptydocs (:use :cl)
- (:export #:no-doc-func))
+ (:export #:no-doc-condition #:no-doc-func))
 
 (in-package #:emptydocs)
 
+(define-condition no-doc-condition nil nil)
+
 (defun no-doc-func (path x) path)
index 9b1bd140a1c2fa909dd797410e343c0b10e45e02..338b5b63afe3f13d72291159ef76b4a480749bcb 100644 (file)
@@ -5,11 +5,18 @@
 This is should all get pulled in and the markdown.md should be equal
 to success1.md.")
  (:export
+  #:test-condition
   #:func-that-does-stuff #:noargs #:result-list #:has-no-examples
   #:values-result #:has-optional #:has-keywords #:has-rest))
 
 (in-package #:success1)
 
+(define-condition test-condition nil nil
+ (:documentation
+  "Simple documentation.
+
+For a simple condition."))
+
 (defun func-that-does-stuff (path x)
  "FUNC-THAT-DOES-STUFF PATH X => RESULT
 
index c5cfe16132692dda26cf0d382f137ae46dd41074..c3a91d1b82072f2ee7488d8dfbece2653a74ecb1 100644 (file)
@@ -162,6 +162,12 @@ _msg_---a string containing the failure message
 
 NOARGS runs all the things against a file and returns as soon as the first func error is found.
 
+## Condition TEST-CONDITION
+
+Simple documentation.
+
+For a simple condition.
+
 ## Function **VALUES-RESULT**
 
 #### Syntax:
index 169a1b8b5caacfbd8461441df76bf31ac863a09e..6927c03f69c9f57388043bbd82c5536eb45d446b 100644 (file)
@@ -8,7 +8,7 @@
 ; There's probably a better way, but I don't know it
 (asdf:defsystem docgen.internal
  :serial t
- :components ((:file "package") (:file "func") (:file "pkg") (:file "docgen")))
+ :components ((:file "package") (:file "func") (:file "pkg") (:file "struc") (:file "docgen")))
 
 (asdf:defsystem docgen
  :name "Documentation Generator"
index 48d237121c5d62c2fa8bd0f939d93de3fff09850..b3d251e907e0b1c30867bc6dd1f53a878eaa86d9 100644 (file)
@@ -5,7 +5,7 @@
 (defun get-symb-type (symb)
  (cond
   ;((documentation symb 'variable) :variable)
-  ;((documentation symb 'structure) :structure)
+  ((documentation symb 'structure) :structure)
   ((documentation symb 'function) :function)))
 
 (defun validate-package (pkg)
@@ -26,6 +26,7 @@
        (with-success-check
         (case (get-symb-type symb)
          (:function (docgen-func:doc->ast symb))
+         (:structure (docgen-struc:doc->ast symb))
          (t (error (make-condition 'validation-failure :msg (format nil "Symbol ~A has no documentation" symb)))))))
       symbs))))))
 
@@ -51,6 +52,8 @@
    (format str "~{~A~^~%~}"
     (mapcar
      (lambda (symb)
+      (format t "HAHAHAH ~A ~A~%" symb (get-symb-type symb))
       (case (get-symb-type symb)
-       (:function (docgen-func:ast->md (docgen-func:doc->ast symb)))))
+       (:function (docgen-func:ast->md (docgen-func:doc->ast symb)))
+       (:structure (docgen-struc:ast->md (docgen-struc:doc->ast symb)))))
      symbs)))))
index 458060244f0b9902fa98a46aba3688ed60174a9c..00c3bb7faf1c23398001c795653870a98091018a 100644 (file)
@@ -6,3 +6,6 @@
 
 (defpackage #:docgen-pkg (:use :cl)
  (:export #:doc->ast #:ast->md))
+
+(defpackage #:docgen-struc (:use :cl)
+ (:export #:doc->ast #:ast->md))
diff --git a/src/main/struc.lisp b/src/main/struc.lisp
new file mode 100644 (file)
index 0000000..a616ee9
--- /dev/null
@@ -0,0 +1,39 @@
+(in-package #:docgen-struc)
+
+(defun fire-error (msg) (error (make-instance 'docgen:validation-failure :msg msg)))
+
+(defun doc->ast (struc)
+ (labels
+  ((validate (strs)
+    (mapcar
+     (lambda (str)
+      (cond
+       ((< 120 (length str)) (fire-error (format nil "Structure description longer than 120 characters: ~A" str)))
+       ((cl-ppcre:scan "^ " str) (fire-error (format nil "Structure description line started with space: ~A" str)))
+       ((cl-ppcre:scan " $" str) (fire-error (format nil "Structure description line ended with space: ~A" str)))))
+     strs))
+   (combine (strs)
+    (cond
+     ((not strs) (list ""))
+     ((string= "" (car strs)) (cons "" (combine (cdr strs))))
+     (t
+      (let
+       ((rest (combine (cdr strs))))
+       (cons (format nil "~A~A~A" (car strs) (if (string/= "" (car rest)) " " "") (car rest)) (cdr rest)))))))
+  (let
+   ((lines (cl-ppcre:split "\\n" (documentation struc 'structure))))
+   (validate lines)
+   (let
+    ((paragraphs (combine lines)))
+    (when (find "" paragraphs :test #'string=) (fire-error "Structure description has two empty lines in it"))
+    (cons
+     (cond
+      ((typep (make-instance struc) 'condition) :condition)
+      (t :struct))
+     (cons struc paragraphs))))))
+
+(defun ast->md (ast)
+ (format nil "## ~@(~A~) ~A~%~%~{~A~%~^~%~}"
+  (first ast)
+  (second ast)
+  (cddr ast)))
index 1b796f5ddd55b887eaab736690875f8fd5f18389..a73dd7bac468278c8ede478c842736f19bdc24a6 100644 (file)
@@ -71,4 +71,5 @@
 (defsuccesstest :success1 "resources/success1.lisp" "resources/success1.md")
 (deffailuretest :emptydocs "resources/emptydocs.lisp"
  '((:failure "Package EMPTYDOCS has no documentation")
+   (:failure "Symbol NO-DOC-CONDITION has no documentation")
    (:failure "Symbol NO-DOC-FUNC has no documentation")))