docspec/lib/docspec.org

1.5 KiB

DocSpec

(in-package :cl)
(defpackage :docspec
  (:use :cl)
  (:import-from :uiop
                :directory-files
                :read-file-string
                :pathname-parent-directory-pathname
                :pathname-root)
  (:export :*preferred-formats*
           :*docspec-file-name*
           :list-entries))
(in-package :docspec)
(defvar *preferred-formats* '(:html :pdf :info :org :md :txt)
  "List of keywords representing user's preferred formats.")

(defvar *docspec-file-name* "docspec.lisp")

(defun find-docspec-file ()
  "Starting from the current directory and descending upwards, find `*docspec-file-name*'."
  (loop
    with dir = *default-pathname-defaults*
    while (not (equal (pathname-root dir) dir))
    when
    (loop for file in (directory-files dir)
          if (and (equal (pathname-name *docspec-file-name*) (pathname-name file))
                  (equal (pathname-type *docspec-file-name*) (pathname-type file)))
            return file)
    return it
    else do (setf dir (pathname-parent-directory-pathname dir))))

(defun parse (file)
  (read-from-string (read-file-string file)))

(defun list-entries (doc-type)
  "Return a list of entries for DOC-TYPE from FILE.
DOC-TYPE must be one of the symbols TUTORIAL, HOWTO, EXPLANATION, or REFERENCE."
  (rest (assoc doc-type (parse (find-docspec-file)))))