Added basic documentation
WIP.
This commit is contained in:
		
							parent
							
								
									93aa5aa439
								
							
						
					
					
						commit
						969b9a029a
					
				
					 4 changed files with 789 additions and 149 deletions
				
			
		
							
								
								
									
										154
									
								
								documentation/build-doc.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								documentation/build-doc.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,154 @@ | |||
| ;; Don't look too closely - code licensed under public domain. | ||||
| ;; | ||||
| ;; I'm sorry about this. I couldn't find my old xslt files and thought I might as well play with sxlt. | ||||
| ;; this is the sorry result. guile-commonmark does not work with guile-3, so now we use pandoc to process markdown, | ||||
| ;; which leads to all kinds of ugly things. Anyway, it builds doc.xml, just don't use it with anything else. | ||||
| ;; | ||||
| ;; doc.xml is xml+markdown. XML for the overall structure, and markdown for all sections, subsections and syntax | ||||
| ;; elements. | ||||
| 
 | ||||
| (use-modules | ||||
|  (srfi srfi-1) | ||||
|  (srfi srfi-71) | ||||
|  (ice-9 pretty-print) | ||||
|  (ice-9 popen) | ||||
|  (ice-9 textual-ports) | ||||
|  (sxml match) | ||||
|  (sxml xpath) | ||||
|  (sxml simple) | ||||
|  (sxml transform)) | ||||
| 
 | ||||
| (define in-file "doc.xml") | ||||
| (define out-file "doc.html") | ||||
| 
 | ||||
| (define open-process (@@ (ice-9 popen) open-process)) | ||||
| (define (pandoc-str str) | ||||
|   (let ((in out err (open-process OPEN_BOTH "sh" "-c" "pandoc" "-f" "markdown" "-t" "html"))) | ||||
|     (display str out) | ||||
|     (close-port out) | ||||
|     (let* ((res (string-append "<markdown>" (get-string-all in) "</markdown>")) | ||||
|            (res (cdadr (xml->sxml res)))) | ||||
|       (close-port in) | ||||
|       res))) | ||||
| 
 | ||||
| (define (collapse-whitespace str) | ||||
|   (let* ((strings (string-split str #\newline)) | ||||
|          (polished (map string-trim strings)) | ||||
|          (res (string-join polished "\n"))) | ||||
|     res)) | ||||
| 
 | ||||
| (define (markdownize child) | ||||
|   (cond | ||||
|    ((string? child) | ||||
|     (let ((child (pandoc-str (collapse-whitespace child)))) | ||||
|       child)) | ||||
|    (else | ||||
|     child))) | ||||
| 
 | ||||
| (define (read-document) | ||||
|   (let* ((file (open-input-file in-file)) | ||||
|          (contents (get-string-all file))) | ||||
|     (close-port file) | ||||
|     (xml->sxml contents #:trim-whitespace? #t))) | ||||
| 
 | ||||
| (define (default . node) | ||||
|   node) | ||||
| 
 | ||||
| (define (text tag .  text) | ||||
|   (car text)) | ||||
| 
 | ||||
| (define (section->html . node) | ||||
|   (sxml-match node | ||||
|     ((section (@ (title ,t)) . ,children) | ||||
|      (let ((children (map markdownize children))) | ||||
|         `(div (@ (id ,t)) (h2 ,t) . ,children))) | ||||
|     ((subsection (@ (title ,t)) ,children ...) | ||||
|      (let ((children (map markdownize children))) | ||||
|        `(div (@ (id ,t)) (h3 ,t) ,@children))))) | ||||
| 
 | ||||
| (define (unindent str) | ||||
|   (define lines (string-split str #\newline)) | ||||
|   (define first-real (drop-while string-null? lines)) | ||||
|   (if (null? first-real) | ||||
|       str | ||||
|       (let* ((first-nonwhitespace (string-index (car first-real) (lambda (x) (not (char-whitespace? x))))) | ||||
|              (trimmed-lines (map (lambda (x) | ||||
|                                    (if (> (string-length x) first-nonwhitespace) | ||||
|                                        (substring x first-nonwhitespace) | ||||
|                                        x)) | ||||
|                                  lines))) | ||||
|         (string-join trimmed-lines "\n")))) | ||||
| 
 | ||||
| (define (example->html tag str) | ||||
|   `(pre (@ (class "code-example")) ,(unindent str))) | ||||
| 
 | ||||
| (define (verbatim->html tag str) | ||||
|   `(pre ,(unindent str))) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| (define (nullify . node) | ||||
|   '()) | ||||
| 
 | ||||
| (define (title->html node) | ||||
|   (sxml-match node ((title ,t) `(h1 ,t)))) | ||||
| 
 | ||||
| (define (author->html node) | ||||
|   (sxml-match node | ||||
|     ((author (@ (email ,mail)) ,name) | ||||
|      `(a (@ (href ,(string-append "mailto:" mail))) ,name)))) | ||||
| 
 | ||||
| (define (syntax->html . node) | ||||
|   (sxml-match node | ||||
|               ((syntax (@ (name ,name)) . ,rest) | ||||
|                `((dt (a (@ (id ,name)) (b "Scheme syntax: "),name) | ||||
|                      (dd ,@(map markdownize rest))))))) | ||||
| 
 | ||||
| (define (form->html . node) | ||||
|   (sxml-match node | ||||
|               ((form ,content) | ||||
|                `((code ,content) (br))))) | ||||
| 
 | ||||
| 
 | ||||
|    | ||||
| (define (spec->html . node) | ||||
|   `(dl ,@(cdr node))) | ||||
| (when (file-exists? out-file) | ||||
|   (delete-file out-file)) | ||||
| (define file (read-document)) | ||||
| (define author ((sxpath '(doc metadata author)) file)) | ||||
| (define title (car ((sxpath '(doc metadata title)) file))) | ||||
| (define html-title (title->html title)) | ||||
| (define sections ((sxpath '(doc section)) file)) | ||||
| (define doc | ||||
|   `(html | ||||
|     (head | ||||
|      ,title | ||||
|      (style | ||||
|          ,(string-append | ||||
|            "body { max-width: 7.6in; margin: 30pt;} " | ||||
|            "pre { white-space: pre-wrap; }"))) | ||||
|     (body | ||||
|      ,html-title | ||||
|      (div (@ (id "authors")) | ||||
|           ,@(map author->html author)) | ||||
|      ,@sections))) | ||||
| 
 | ||||
| (define output | ||||
|   (pre-post-order | ||||
|    doc | ||||
|    `((*default* . ,default) | ||||
|      (*text* . ,text) | ||||
|      (section . ,section->html) | ||||
|      (subsection . ,section->html) | ||||
|      (spec . ,spec->html) | ||||
|      (syntax . ,syntax->html) | ||||
|      (form . ,form->html) | ||||
|      (verbatim . ,verbatim->html) | ||||
|      (example . ,example->html)))) | ||||
| (with-output-to-file out-file | ||||
|   (lambda () | ||||
|     (display "<!DOCTYPE html>\n") | ||||
|     (sxml->xml output))) | ||||
| 
 | ||||
|    | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus
						Linus