Create library to find and read the docspec file

This commit is contained in:
contrapunctus 2022-01-22 20:19:31 +05:30
parent a6f4748435
commit 7ec68e3713
2 changed files with 58 additions and 0 deletions

8
docspec.asd Normal file
View File

@ -0,0 +1,8 @@
(defsystem docspec
:version "0.0.1"
:serial t
:license "Unlicense"
:author "contrapunctus <contrapunctus at disroot dot org>"
:description "A standard, predictable interface to acces the four types of documentation for a project."
:defsystem-depends-on ("literate-lisp")
:components ((:org "lib/docspec")))

50
lib/docspec.org Normal file
View File

@ -0,0 +1,50 @@
# -*- mode: poly-org; -*-
#+TITLE: DocSpec
#+SUBTITLE: Library to parse docspec files
#+BEGIN_SRC lisp
(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)
#+END_SRC
#+BEGIN_SRC lisp
(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)))))
#+END_SRC
# Local Variables:
# my-org-src-default-lang: "lisp"
# End: