2daf5fb2fe92

Add API documentation building
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Fri, 18 Mar 2016 13:50:04 +0000
parents ae2b13a9a629
children 3a8ee0586fdf
branches/tags (none)
files Makefile docs/03-reference.markdown docs/api.lisp package.lisp

Changes

--- a/Makefile	Fri Mar 18 12:09:36 2016 +0000
+++ b/Makefile	Fri Mar 18 13:50:04 2016 +0000
@@ -1,6 +1,8 @@
 .PHONY: test pubdocs
 
+sourcefiles = $(shell ffind --full-path --dir src --literal .lisp)
 docfiles = $(shell ls docs/*.markdown)
+apidoc = docs/03-reference.markdown
 
 test:
 	sbcl --noinform --load test/run.lisp  --eval '(quit)'
@@ -8,6 +10,9 @@
 src/utils.lisp: src/make-utilities.lisp
 	cd src && sbcl --noinform --load make-utilities.lisp  --eval '(quit)'
 
+$(apidoc): $(sourcefiles) docs/api.lisp
+	sbcl --noinform --load docs/api.lisp  --eval '(quit)'
+
 docs: docs/build/index.html
 
 docs/build/index.html: $(docfiles)
--- a/docs/03-reference.markdown	Fri Mar 18 12:09:36 2016 +0000
+++ b/docs/03-reference.markdown	Fri Mar 18 13:50:04 2016 +0000
@@ -1,2 +1,70 @@
-Reference
-=========
+# API Reference
+
+The following is a list of all user-facing parts of Bones.
+
+If there are backwards-incompatible changes to anything listed here, they will be noted in the changelog and the author will feel bad.
+
+Anything not listed here is subject to change at any time with no warning, so don't touch it.
+
+[TOC]
+
+## Package BONES.PAIP
+
+Test?
+
+### \*CHECK-OCCURS\* (variable)
+
+Whether to perform an occurs check.
+
+### CLEAR-DB (function)
+
+    (CLEAR-DB)
+
+### FACT (macro)
+
+    (FACT &REST BODY)
+
+### FAIL (variable)
+
+Failure to unify
+
+### NO-BINDINGS (variable)
+
+A succesful unification, with no bindings.
+
+### QUERY (macro)
+
+    (QUERY &REST GOALS)
+
+Perform the query interactively.
+
+### QUERY-ALL (macro)
+
+    (QUERY-ALL &REST GOALS)
+
+Perform the query and automatically show all results.
+
+### QUERY-ONE (macro)
+
+    (QUERY-ONE &REST GOALS)
+
+Perform the query and just show the first result.
+
+### RETURN-ALL (macro)
+
+    (RETURN-ALL &REST GOALS)
+
+### RETURN-ONE (macro)
+
+    (RETURN-ONE &REST GOALS)
+
+### RULE (macro)
+
+    (RULE &REST CLAUSE)
+
+### UNIFY (function)
+
+    (UNIFY X Y &OPTIONAL (BINDINGS NO-BINDINGS))
+
+Unify the two terms and return bindings necessary to do so (or FAIL).
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api.lisp	Fri Mar 18 13:50:04 2016 +0000
@@ -0,0 +1,126 @@
+(let ((*standard-output* (make-broadcast-stream)))
+  (ql:quickload "docparser"))
+
+(defparameter *index*
+  (docparser:parse :bones))
+
+(defparameter *document-packages*
+  (list "BONES.PAIP"))
+
+
+;;;; From the CL Cookbook
+(defun replace-all (string part replacement &key (test #'char=))
+  "Returns a new string in which all the occurences of the part
+is replaced with replacement."
+  (with-output-to-string (out)
+    (loop with part-length = (length part)
+          for old-pos = 0 then (+ pos part-length)
+          for pos = (search part string
+                            :start2 old-pos
+                            :test test)
+          do (write-string string out
+                           :start old-pos
+                           :end (or pos (length string)))
+          when pos do (write-string replacement out)
+          while pos)))
+
+
+;;;; Documentation Utils
+(defun get-doc (package-name symbol-name)
+  (elt (docparser:query *index*
+                        :package-name package-name
+                        :symbol-name symbol-name)
+       0))
+(defun get-package-doc (package-name)
+  ;; good god, lemon
+  (docparser::find-package-index *index* package-name))
+
+
+;;;; Markdown Rendering
+(defun render-package-header (package-name)
+  (format t "## Package ~A~%~%"
+          (replace-all package-name "*" "\\*")))
+
+(defun render-package-docstring (package-name)
+  (let ((package-docstring
+         (docparser::package-index-docstring (get-package-doc package-name))))
+    (when package-docstring
+      (format t "~A~%~%" package-docstring))))
+
+(defun render-symbol-header (symbol-name extra)
+  (format t "### ~A~A~%~%"
+          (replace-all symbol-name "*" "\\*")
+          extra))
+
+(defun render-docstring (node)
+  (let ((documentation (docparser:node-docstring node)))
+    (when documentation
+      (format t "~A~%~%" documentation))))
+
+(defun render-lambda-list (node)
+  (format t "    ~A~%~%"
+          (cons (docparser:node-name node)
+                (docparser:operator-lambda-list node))))
+
+(defgeneric render-documentation (node symbol-name))
+
+
+(defmethod render-documentation ((node docparser:documentation-node) symbol-name)
+  (render-symbol-header symbol-name "")
+  (format t "`~A`~%~%" (class-of node))
+  (render-docstring node))
+
+(defmethod render-documentation ((node docparser:variable-node) symbol-name)
+  (render-symbol-header symbol-name " (variable)")
+  (render-docstring node))
+
+(defmethod render-documentation ((node docparser:function-node) symbol-name)
+  (render-symbol-header symbol-name " (function)")
+  (render-lambda-list node)
+  (render-docstring node))
+
+(defmethod render-documentation ((node docparser:macro-node) symbol-name)
+  (render-symbol-header symbol-name " (macro)")
+  (render-lambda-list node)
+  (render-docstring node))
+
+
+;;;; Documentation Sections
+(defun document-symbol (package-name symbol)
+  (let* ((symbol-name (symbol-name symbol))
+         (doc-node (get-doc package-name symbol-name)))
+    (render-documentation doc-node symbol-name)))
+
+(defun document-package (package-name)
+  (render-package-header package-name)
+  (render-package-docstring package-name)
+  (let ((symbols (loop :for s :being :the external-symbol :of package-name
+                       :collect s)))
+    (mapc #'(lambda (symbol)
+             (document-symbol package-name symbol))
+          (sort symbols #'string-lessp :key #'symbol-name))))
+
+(defun document-header ()
+  (format t "# API Reference~%~%")
+  ; (format t "API reference for Bones.~%~%")
+  (format t "The following is a list of all user-facing parts of Bones.
+
+If there are backwards-incompatible changes to anything listed here, they will be noted in the changelog and the author will feel bad.
+
+Anything not listed here is subject to change at any time with no warning, so don't touch it.
+
+")
+  (format t "[TOC]~%~%"))
+
+
+;;;; Main
+(defun main ()
+  (with-open-file (*standard-output* #p"docs/03-reference.markdown"
+                                     :direction :output
+                                     :if-exists :supersede)
+    (document-header)
+    (mapc #'document-package *document-packages*)))
+
+
+(main)
+
--- a/package.lisp	Fri Mar 18 12:09:36 2016 +0000
+++ b/package.lisp	Fri Mar 18 13:50:04 2016 +0000
@@ -4,6 +4,7 @@
 
 (defpackage #:bones.paip
   (:use #:cl #:defstar #:bones.utils)
+  (:documentation "Test?")
   (:export
 
    ;; Unification, constants