changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/doc/file.lisp

changeset 698: 96958d3eb5b0
parent: c40d2a41d7ce
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
137
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; lib/doc/file.lisp --- File Documentation
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
2
 
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
3
 ;; Support for inline documentation and comments in source-code files.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
4
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
5
 ;;; Commentary:
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
6
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
7
 ;; As of [2024-04-04] we aren't considering any other files besides
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
8
 ;; Lisp source-code. We'll eventually open the door to other langs via
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
9
 ;; SYN, and finally integrate with other types of
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
10
 ;; documentation-specific files like READMEs.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
11
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
12
 ;;;; Lisp Files
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
13
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
14
 ;; We determine the flavor of Lisp used in a source file by the file
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
15
 ;; extension. In reality we're only dealing with two flavors: Common
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
16
 ;; Lisp and Emacs Lisp.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
17
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
18
 ;; The way we treat them at the read stage is almost identical. The
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
19
 ;; only difference being that Emacs Lisp does not support the inline
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
20
 ;; comment syntax '#| some comment |#'.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
21
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
22
 ;; In any case the idea is to do 'something' with comments instead of
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
23
 ;; getting rid of them at read-time.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
24
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
25
 ;;;; Headers
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
26
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
27
 ;; Special consideration is given to source-code 'header' blocks. In
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
28
 ;; our own code, we use them as much as possible but haven't been
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
29
 ;; using them to their full potential just yet.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
30
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
31
 ;; You will find most code, including this file begins with a block of
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
32
 ;; the following form:
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
33
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
34
 #|
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
35
  ;;; PATH --- SHORT-DESCRIPTION
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
36
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
37
  ;; LONG-DESCRIPTION
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
38
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
39
  ;;; Commentary:
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
40
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
41
  ;; COMMENTARY
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
42
 
431
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
43
  ;;; Code:
c40d2a41d7ce source concatenating std.lisp, more systems, got zstd simple working, IO work, added dat/tar
Richard Westhaver <ellis@rwest.io>
parents: 395
diff changeset
44
  CODE
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
45
 |#
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
46
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
47
 ;; Note the difference in comment characters used between the
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
48
 ;; lines. Headings start with 3, and the contents of those Headings
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
49
 ;; start with 2. The first heading/section is an 'anonymous' or 'meta'
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
50
 ;; section that should be considered required. All headings beneath it
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
51
 ;; are 'named' sections. 'Code:' is the only required named section,
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
52
 ;; so in the example above, we may exclude the 'Commentary:' section.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
53
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
54
 ;;;;; Headings
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
55
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
56
 ;; We define headings according to the Emacs notion of the term, as
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
57
 ;; used in outline-mode and org-mode. As mentioned, headings in source
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
58
 ;; files begin with a minimum of 3 comment characters. For each
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
59
 ;; additional comment character, the nested 'level' of the heading is
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
60
 ;; increased and any non-header elements or header elements with a
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
61
 ;; level greater than the top-level are nested inside that heading.
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
62
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
63
 ;; 3 comment headings represent a level of 0. Any heading with a level
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
64
 ;; > 0 is a Subheading. For example, we are in a subheading named
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
65
 ;; 'Headings' of level 2, inside a subheading of level 1, inside a
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
66
 ;; heading named 'Commentary'.
137
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
67
 
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
68
 ;;; Notes:
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
69
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
70
 ;; NOTE 2024-04-05: sb-impl::read-comment takes an 'ignore' second
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
71
 ;; arg, but the return value is always ignored anyways?
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
72
 
137
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
73
 ;;; Code:
a067da6d51c1 init doc system
ellis <ellis@rwest.io>
parents:
diff changeset
74
 (in-package :doc)
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
75
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
76
 ;; asdf:source-file-type asdf:source-file-explicit-type
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
77
 (defvar *source-file-types* nil)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
78
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
79
 (defmacro define-source-file* (type ext &optional opts shebangp &body body)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
80
   (with-gensyms (f)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
81
     (let ((rname (symbolicate "READ-" type "-SOURCE-FILE"))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
82
           (wname (symbolicate "WRITE-" type "-SOURCE-FILE"))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
83
           #+nil (kw (sb-int:keywordicate type)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
84
       `(progn
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
85
          (pushnew ',type *source-file-types*)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
86
          (defun ,rname (path)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
87
            (with-open-file (,f path)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
88
              (read ,f)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
89
          (defun ,wname (source path)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
90
            (with-open-file (,f path)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
91
              (write source :stream ,f)))))))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
92
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
93
 (define-source-file* rust "rs")
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
94
 (define-source-file* shell "sh")
395
d876b572b5b9 updates
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
95
 (define-source-file* makefile "mk")
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
96
 (define-source-file* nushell "nu")
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
97
 (define-source-file* common-lisp "lisp")
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
98
 (define-source-file* emacs-lisp "el")
395
d876b572b5b9 updates
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
99
 (define-source-file* scheme "scm")
d876b572b5b9 updates
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
100
 (define-source-file* skel "sk")
d876b572b5b9 updates
Richard Westhaver <ellis@rwest.io>
parents: 263
diff changeset
101
 (define-source-file* sxp "sxp")
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
102
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
103
 (defconstant +max-file-heading-level+ 8)
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
104
 (defconstant +min-file-heading-level+ 3)
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
105
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
106
 (defclass file-heading ()
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
107
   ((name :initarg :name :type string)
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
108
    (level :initform 0 :initarg :level :type (integer 0 #.+max-file-heading-level+))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
109
    (contents :initarg :contents :type string)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
110
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
111
 (defun heading-line-p (string)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
112
   (uiop:string-prefix-p ";;;" string))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
113
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
114
 (defun read-comment-line (stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
115
   "Read a comment line from STREAM. Returns two values: the uncommented
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
116
 string and a 'level' indicating how many comment characters were
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
117
 stripped. Note that this level is NOT the same as the heading level."
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
118
   (let ((level 0) (contents (organ::read-line stream)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
119
     (loop for c = (char contents level)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
120
           until (not (char= c #\;))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
121
           do (incf level))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
122
     (values
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
123
      (if (zerop level) contents (subseq contents (1+ level)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
124
      level)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
125
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
126
 (defun read-file-heading (stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
127
   (destructuring-bind (name level) (read-comment-line stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
128
     (make-instance 'file-heading :name name :level level :contents "")))
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
129
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
130
 (defclass file-headline (file-heading)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
131
   ((summary :initarg :summary :type string)
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
132
    (opts :initform nil :initarg :opts :type list)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
133
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
134
 (defun read-file-headline-description (stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
135
   "Read a headline description returning a string. Second value is the
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
136
 next heading line found or nil if EOF."
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
137
   (apply #'concatenate 'string
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
138
          (loop for l = (read-line stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
139
                until (heading-line-p l)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
140
                collect l)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
141
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
142
 (defun headline-values-p (string)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
143
   (let ((found (search " --- " string)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
144
     (values (subseq string 0 found) (when found (subseq string (+ found 5))))))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
145
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
146
 (defun split-headline-values (string)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
147
   "Split the headline in STRING into individual values."
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
148
   (multiple-value-bind (name rest) (headline-values-p string)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
149
     (if rest
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
150
         (multiple-value-bind (summary opts) (headline-values-p rest)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
151
           (values name summary opts))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
152
         (values name nil nil))))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
153
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
154
 (defun read-file-headline (stream)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
155
   (let ((line (read-comment-line stream))) ;; throw out second value
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
156
     (multiple-value-bind (name summary opts) (split-headline-values line)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
157
       (make-instance 'file-headline
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
158
         :name name
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
159
         :summary summary
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
160
         :opts opts
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
161
         :level 0
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
162
         :contents (read-file-headline-description stream)))))
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
163
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
164
 (defclass file-header ()
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
165
   ((headline :initarg :headline :type file-headline)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
166
    (headings :initarg :headings :type (array file-heading)))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
167
   (:documentation "A source-file header object containing a FILE-HEADLINE and array of
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
168
 optional top-level FILE-HEADINGs."))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
169
 
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
170
 (defun read-file-header (path)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
171
   "Read a FILE-HEADER from PATH which should be an INPUT-FILE-STREAM.
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
172
 
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
173
 File headers always appear at the very start of a file so the stream
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
174
 position is always assumed to be 0."
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
175
   (with-open-file (f path :if-does-not-exist :error)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
176
     (let ((hl (read-file-headline f)))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
177
       (loop for l = (read-line f nil)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
178
             while l
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
179
             until (uiop:string-prefix-p ";;; Code:" l)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
180
             collect l into contents)
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
181
       (make-instance 'file-header
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
182
         :headline hl
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
183
         :headings #()
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
184
         ))))
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
185
 
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
186
 ;; (defmacro define-file-heading (type slots))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
187
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
188
 (defclass file-documentation ()
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
189
   ((path :initarg :path :type pathname :accessor doc-path)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
190
    (header :initarg :header :type file-header)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
191
    (contents :initarg :contents :type sequence)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
192
    (locations :initarg :locations :type sequence))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
193
   (:documentation "An object containing the header, contents, and relevant
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
194
   locations of a source file. This object should be the result of a
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
195
   function like COMPILE-FILE-DOCUMENTATION. Note that this object only
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
196
   contains inline comments. Symbol documentation such as this one will
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
197
   not be captured in instances of this object."))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
198
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
199
 (defmethod print-object ((self file-documentation) stream)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
200
   (print-unreadable-object (self stream :type t)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
201
     (format stream "~A" (doc-path self))))
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
202
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
203
 (defun file-documentation (path)
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
204
   "Return the FILE-DOCUMENTATION for PATH."
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
205
   (make-instance 'file-documentation
263
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
206
     :path path
b7183bfd7107 add doc/readme.txt, more doc upgrades
Richard Westhaver <ellis@rwest.io>
parents: 262
diff changeset
207
     :header (read-file-header path)))
262
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
208
 
5673cd3f11e1 documentation system
Richard Westhaver <ellis@rwest.io>
parents: 137
diff changeset
209
 ;; asdf:source-file