summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/guile/skribilo/engine/info.scm216
1 files changed, 94 insertions, 122 deletions
diff --git a/src/guile/skribilo/engine/info.scm b/src/guile/skribilo/engine/info.scm
index e2b4f7c..08c969c 100644
--- a/src/guile/skribilo/engine/info.scm
+++ b/src/guile/skribilo/engine/info.scm
@@ -24,14 +24,10 @@
:use-module (skribilo ast)
:use-module (skribilo engine)
:use-module (skribilo writer)
- :use-module (skribilo location)
- :use-module (skribilo utils strings)
:use-module (skribilo utils syntax)
:use-module (skribilo package base)
:autoload (skribilo parameters) (*destination-file*)
- :autoload (skribilo evaluator) (evaluate-document)
:autoload (skribilo output) (output)
- :autoload (skribilo debug) (*debug*)
:autoload (skribilo utils justify) (make-justifier)
:autoload (skribilo utils text-table) (table->ascii)
:use-module (srfi srfi-8)
@@ -41,7 +37,6 @@
(fluid-set! current-reader %skribilo-module-reader)
-
(define info-engine
(make-engine 'info
@@ -94,18 +89,18 @@
(values "Top" "(dir)" "(dir)"))
((or (is-markup? (car c) 'chapter)
(is-markup? (car c) 'section))
- (values (block-title (car c)) "(dir)" "(dir)"))
+ (values (block-title (car c) e) "(dir)" "(dir)"))
(else
(loop (cdr c)))))))
;*---------------------------------------------------------------------*/
;* node-next+prev+top ... */
;*---------------------------------------------------------------------*/
-(define (node-next+prev+top section)
+(define (node-next+prev+top section e)
(let ((parent (ast-parent section)))
(let ((top (if (document? parent)
"Top"
- (block-title parent))))
+ (block-title parent e))))
(let loop ((els (markup-body parent))
(prev #f))
(cond
@@ -113,11 +108,11 @@
(values top top top))
((eq? (car els) section)
(let ((p (if prev
- (block-title prev)
+ (block-title prev e)
top))
(n (if (null? (cdr els))
top
- (block-title (cadr els)))))
+ (block-title (cadr els) e))))
(values p n top)))
(else
(loop (cdr els) (car els))))))))
@@ -127,7 +122,9 @@
;*---------------------------------------------------------------------*/
(define (node-menu container e)
(let ((children (markup-body container)))
- (if (pair? (filter (lambda (x) (or (%chapter? x) (%section? x)))
+ (if (pair? (filter (lambda (x)
+ (memq (markup-markup x)
+ '(chapter section)))
children))
(begin
(newline)
@@ -157,15 +154,15 @@
(markup-writer 'document info-engine
:action (lambda (doc e)
(let ((title (markup-option doc :title))
- (author (markup-option doc :author))
+ (authors (markup-option doc :author))
(body (markup-body doc))
(footnotes (reverse!
- (container-env-get n 'footnote-env))))
+ (container-env-get doc 'footnote-env))))
(scribe-document->info doc (if title title "")
(if (list? authors)
authors
(list authors))
- body)
+ body e)
(if (pair? footnotes)
(begin
(with-justification
@@ -179,10 +176,7 @@
(let ((label (markup-option fn :label))
(note (markup-body fn))
(id (markup-ident fn)))
- (output (string-append "*"
- (number->string number)
- ": ")
- e)
+ (output (list "*" label ": ") e)
(output note e)
(output-newline)))
footnotes)
@@ -191,9 +185,9 @@
;*---------------------------------------------------------------------*/
;* scribe-document->info ... */
;*---------------------------------------------------------------------*/
-(define (scribe-document->info obj title authors body)
+(define (scribe-document->info obj title authors body e)
(define (info-authors1 author)
- (info author)
+ (output author e)
(output-newline)
(output-newline))
(define (info-authorsN authors cols first)
@@ -219,16 +213,17 @@
rows
(cons (car authors) row)
(+ cnum 1))))))
- (info (apply table
+ (output (apply table
(if first
(cons (make-row (list (car authors)) :colspan cols)
(make-rows (cdr authors)))
- (make-rows authors)))))
+ (make-rows authors)))
+ e))
(define (info-authors authors)
(if (pair? authors)
(begin
(output-newline)
- (output "--o-0-o--")
+ (output-justified "--o-0-o--")
(output-newline)
(output-newline)
(let ((len (length authors)))
@@ -246,38 +241,37 @@
(with-justification
(make-justifier (justification-width) 'center)
(lambda ()
- (output (make-string *text-column-width* #\=))
+ (output-justified (make-string *text-column-width* #\=))
(output-newline)
(if (string? title)
- (output (list->string
+ (output-justified
+ (list->string
(apply append
(map (lambda (c) (list c #\bs))
(string->list title)))))
- (info title))
+ (output title e))
(output-newline)
(info-authors authors)
- (output (make-string *text-column-width* #\=))
+ (output-justified (make-string *text-column-width* #\=))
(output-newline)
(output-newline)
(output-flush *margin*))))
-;; display the footer
- (define (info-footer)
- (if *scribe-footer* (info *scribe-footer*)))
+
;; the main node
(receive (next prev top)
- (node-next+prev+top obj)
+ (node-next+prev+top obj e)
(newline)
(info-node "Top" next prev top))
;; the title
(info-title title authors)
(output-flush 0)
;; the main info menu
- (node-menu obj)
+ (node-menu obj e)
;; the body
- (info body)
+ (output body e)
(output-flush 0)
;; the footer of the document
- (info-footer)
+ ;(info-footer)
(output-flush 0)
;; we are done
(newline)
@@ -327,7 +321,7 @@
:action (lambda (n e)
(with-justification (make-justifier (justification-width) 'center)
(lambda ()
- (output (%center-body obj) e)))))
+ (output (markup-body n) e)))))
;*---------------------------------------------------------------------*/
;* info ::%flush ... */
@@ -335,10 +329,10 @@
(markup-writer 'flush info-engine
:options '(:side)
:action (lambda (n e)
- (let ((side (markup-option :side)))
+ (let ((side (markup-option n :side)))
(with-justification (make-justifier (justification-width) side)
(lambda ()
- (output (%flush-body obj) e))))))
+ (output (markup-body n) e))))))
;*---------------------------------------------------------------------*/
;* *ornaments* ... */
@@ -374,7 +368,7 @@
:action (lambda (n e)
(with-justification (make-justifier *text-column-width* 'verbatim)
(lambda ()
- (output (markup-body obj) e)
+ (output (markup-body n) e)
(output-newline)))))
;*---------------------------------------------------------------------*/
@@ -386,10 +380,22 @@
;*---------------------------------------------------------------------*/
;* info ::%reference ... */
;*---------------------------------------------------------------------*/
-;; FIXME: Implement `ref' using `info-chapter-ref', etc.
-;; (markup-writer 'ref info-engine
-;; :action (lambda (n e)
-;; #f))
+(markup-writer 'ref info-engine
+ :action (lambda (n e)
+ (let ((target (handle-ast (markup-body n))))
+ (case (markup-markup target)
+ ((chapter)
+ (info-chapter-ref target e))
+ ((section)
+ (info-section-ref target e))
+ ((subsection)
+ (info-subsection-ref target e))
+ ((subsubsection)
+ (info-subsubsection-ref target e))
+ (else
+ (skribe-warning/ast 1 target
+ "ref: don't know how to refer to target")
+ (output-justified "section:???"))))))
;*---------------------------------------------------------------------*/
;* info ::%url-ref ... */
@@ -397,87 +403,51 @@
(markup-writer 'url-ref info-engine
:options '(:url :text)
:action (lambda (n e)
- (let ((url (markup-option :url))
- (text (markup-option :text)))
+ (let ((url (markup-option n :url))
+ (text (markup-option n :text)))
(if text
(begin
- (output "*Note ")
+ (output-justified "*Note ")
(output text e)
- (output " (")))
+ (output-justified " (")))
(output url e)
- (if text (output ")"))
- (output ":: "))))
+ (if text (output-justified ")"))
+ (output-justified ":: "))))
;*---------------------------------------------------------------------*/
;* info-chapter-ref ... */
;*---------------------------------------------------------------------*/
-(define (info-chapter-ref obj)
- (output "*Note ")
- (output (block-title obj))
- (output ":: "))
-
-;*---------------------------------------------------------------------*/
-;* info ::%section-ref ... */
-;*---------------------------------------------------------------------*/
-(define (info obj)
- (receive (_ section)
- (find-reference obj (current-document))
- (if (not (%section? section))
- (let ((anchor (markup-ident obj)))
- (warning "ref" "Can't find section -- " anchor)
- (output "section:???"))
- (info-section-ref section))))
+(define (info-chapter-ref obj e)
+ (output-justified "*Note ")
+ (output (block-title obj e) e)
+ (output-justified ":: "))
;*---------------------------------------------------------------------*/
;* info-section-ref ... */
;*---------------------------------------------------------------------*/
-(define (info-section-ref obj)
+(define (info-section-ref obj e)
(let ((title (markup-option obj :title)))
- (output "*Note ")
- (output title)
- (output ":: ")))
-
-;*---------------------------------------------------------------------*/
-;* info ::%subsection-ref ... */
-;*---------------------------------------------------------------------*/
-(define (info obj)
- (receive (_ subsection)
- (find-reference obj (current-document))
- (if (not (%subsection? subsection))
- (let ((anchor (markup-ident obj)))
- (warning "ref" "Can't find subsection -- " anchor)
- (output "subsection:???"))
- (info-subsection-ref subsection))))
+ (output-justified "*Note ")
+ (output title e)
+ (output-justified ":: ")))
;*---------------------------------------------------------------------*/
;* info-subsection-ref ... */
;*---------------------------------------------------------------------*/
-(define (info-subsection-ref obj)
+(define (info-subsection-ref obj e)
(let ((title (markup-option obj :title)))
- (output "*Note ")
- (output title)
- (output ":: ")))
-
-;*---------------------------------------------------------------------*/
-;* info ::%subsubsection-ref ... */
-;*---------------------------------------------------------------------*/
-(define (info obj)
- (receive (_ subsubsection)
- (find-reference obj (current-document))
- (if (not (%subsubsection? subsubsection))
- (let ((anchor (markup-ident obj)))
- (warning "ref" "Can't find subsubsection -- " anchor)
- (output "subsubsection:???"))
- (info-subsubsection-ref subsubsection))))
+ (output-justified "*Note ")
+ (output title e)
+ (output-justified ":: ")))
;*---------------------------------------------------------------------*/
;* info-subsubsection-ref ... */
;*---------------------------------------------------------------------*/
-(define (info-subsubsection-ref obj)
+(define (info-subsubsection-ref obj e)
(let ((title (markup-option obj :title)))
- (output "*Note ")
- (output title)
- (output ":: ")))
+ (output-justified "*Note ")
+ (output title e)
+ (output-justified ":: ")))
;*---------------------------------------------------------------------*/
;* info ::%biblio-ref ... */
@@ -489,9 +459,9 @@
(let ((text (markup-option n :text))
(bib (markup-option n :bib)))
(if text (output text e))
- (output " [")
+ (output-justified " [")
(output bib e)
- (output "]"))))
+ (output-justified "]"))))
;*---------------------------------------------------------------------*/
;* mailto ... */
@@ -527,10 +497,10 @@
(- (justification-width) 3)
'left)
(lambda ()
- (output "- ")
+ (output-justified "- ")
(output item e))
3))
- items)))
+ (markup-body n))))
(markup-writer 'enumerate info-engine
:action (lambda (n e)
@@ -542,9 +512,9 @@
(- (justification-width) 3)
'left)
(lambda ()
- (output (integer->string num))
- (output " - ")
- (info item))
+ (output-justified (number->string num))
+ (output-justified " - ")
+ (output item e))
3)
(loop (+ num 1) (cdr items)))))))
@@ -557,7 +527,7 @@
'left)
(output item e)
3))
- items)))
+ (markup-body n))))
;*---------------------------------------------------------------------*/
;* info ::%section ... */
@@ -569,9 +539,9 @@
(title (markup-option n :title)))
(output-newline)
(output-flush *margin*)
- (let ((t (block-title n)))
+ (let ((t (block-title n e)))
(receive (next prev top)
- (node-next+prev+top n)
+ (node-next+prev+top n e)
(info-node t next prev top)
(print t)
(print (make-string (string-length t) #\=))))
@@ -589,9 +559,9 @@
(let ((body (markup-body n))
(title (markup-option n :title)))
(output-flush *margin*)
- (let ((t (block-title n)))
+ (let ((t (block-title n e)))
(receive (next prev top)
- (node-next+prev+top n)
+ (node-next+prev+top n e)
(info-node t next prev top)
(print t)
(print (make-string (string-length t) #\-))))
@@ -606,9 +576,9 @@
(let ((body (markup-body n))
(title (markup-option n :title)))
(output-flush *margin*)
- (let ((t (block-title n)))
+ (let ((t (block-title n e)))
(receive (next prev top)
- (node-next+prev+top n)
+ (node-next+prev+top n e)
(info-node t next prev top)
(print t)
(print (make-string (string-length t) #\~))))
@@ -634,9 +604,9 @@
(title (markup-option n :title)))
(output-newline)
(output-flush *margin*)
- (let ((t (block-title n)))
+ (let ((t (block-title n e)))
(receive (next prev top)
- (node-next+prev+top n)
+ (node-next+prev+top n e)
(info-node t next prev top)
(print t)
(print (make-string (string-length t) #\*))))
@@ -655,7 +625,7 @@
(inexact->exact
(* (exact->inexact (justification-width))
(/ (exact->inexact width) 100.))))))
- (output (make-string w #\-))))))
+ (output-justified (make-string w #\-))))))
;*---------------------------------------------------------------------*/
;* info ::%table ... */
@@ -667,14 +637,16 @@
(output-flush *margin*)
(if border
(border-table->info n)
- (table->ascii n info))
+ (table->ascii n (lambda (obj)
+ (output obj e))))
(output-flush *margin*))))
;*---------------------------------------------------------------------*/
;* border-table->info ... */
;*---------------------------------------------------------------------*/
(define (border-table->info table)
- (table->ascii table info))
+ (table->ascii table (lambda (obj)
+ (output obj info-engine))))
;*---------------------------------------------------------------------*/
;* info ::%figure ... */
@@ -689,9 +661,9 @@
(output body e)
(output-newline)
(output-newline)
- (output "Fig. ")
- (output (number->string number))
- (output ": ")
+ (output-justified "Fig. ")
+ (output-justified (number->string number))
+ (output-justified ": ")
(output legend e)
(output-newline))))