- move XHTML stuff from responses.scm to htmlout.scm
- new function EMIT-PROLOG - define XML namespace declaration - adapt macro %hack-attr-elt: special treatment of xmlnsdecl-attr (this is not nice, but the only alternative was hard-coding the XML namespace declaration into the various handlers) - element names -> lower case
This commit is contained in:
parent
96f0ae41d5
commit
6969b80206
|
@ -11,6 +11,34 @@
|
|||
;;; HTML text representation -- surrounding it with single or double quotes,
|
||||
;;; as appropriate, etc.
|
||||
|
||||
|
||||
;;XHTML 1.0 Strict
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; a well-formed XML document begins with a prolog;
|
||||
;; this is the prolog for an XHTML 1.0 strict document:
|
||||
|
||||
(define XMLdecl
|
||||
"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>")
|
||||
|
||||
(define doctypedecl
|
||||
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")
|
||||
|
||||
(define (emit-prolog out)
|
||||
(display XMLdecl out)
|
||||
(newline out)
|
||||
(display doctypedecl out)
|
||||
(newline out))
|
||||
|
||||
;; the root element html must contain an xmlns declaration for the
|
||||
;; XHTML namespace, which ist defined to be
|
||||
;; http://www.w3.org/1999/xhtml
|
||||
|
||||
(define xmlnsval "http://www.w3.org/1999/xhtml")
|
||||
|
||||
;; for use with emit-tag and with-tag:
|
||||
(define xmlnsdecl-attr (cons 'xmlns xmlnsval))
|
||||
|
||||
;;; Printing HTML tags.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;; All the emit-foo procedures have the same basic calling conventions:
|
||||
|
@ -49,7 +77,7 @@
|
|||
(format out "</~a>" tag))
|
||||
|
||||
|
||||
;;; <P>
|
||||
;;; <p>
|
||||
|
||||
(define (emit-p . args) ; (emit-p [out attr1 ...])
|
||||
(receive (out attrs) (if (pair? args)
|
||||
|
@ -61,13 +89,13 @@
|
|||
(apply emit-tag out 'p attrs)))
|
||||
|
||||
|
||||
;;; <TITLE> Make Money Fast!!! </TITLE>
|
||||
;;; <title> Make Money Fast!!! </title>
|
||||
|
||||
(define (emit-title out title) ; Takes no attributes.
|
||||
(format out "<title>~a~%</title>~%" title))
|
||||
(format out "<title>~a~%</title>" title))
|
||||
|
||||
(define (emit-header out level text . attribs)
|
||||
(apply with-tag* out (string-append "H" (number->string level))
|
||||
(apply with-tag* out (string-append "h" (number->string level))
|
||||
(lambda () (display text (fmt->port out)))
|
||||
attribs))
|
||||
|
||||
|
@ -90,11 +118,11 @@
|
|||
;;; instead of (NAME VALUE).
|
||||
;;;
|
||||
;;; For example,
|
||||
;;; (let ((hp "http://clark.lcs.mit.edu/~shivers")) ; My home page.
|
||||
;;; (with-tag port A ((href hp-url) (name "hp"))
|
||||
;;; (let ((hp-url "http://clark.lcs.mit.edu/~shivers")) ; My home page.
|
||||
;;; (with-tag port a ((href hp-url) (name "hp"))
|
||||
;;; (display "home page" port)))
|
||||
;;; outputs
|
||||
;;; <A href="http://clark.lcs.mit.edu/~shivers" name="hp">home page</A>
|
||||
;;; <a href="http://clark.lcs.mit.edu/~shivers" name="hp">home page</a>
|
||||
|
||||
(define-syntax with-tag
|
||||
(syntax-rules ()
|
||||
|
@ -107,9 +135,11 @@
|
|||
;;; Why can't this be a LET-SYNTAX inside of WITH-TAG?
|
||||
|
||||
(define-syntax %hack-attr-elt
|
||||
(syntax-rules () ; Build attribute-list element:
|
||||
(syntax-rules (xmlnsdecl-attr) ; Build attribute-list element:
|
||||
((%hack-attr-elt (name val)) ; (name elt) => (cons 'name elt)
|
||||
(cons 'name val))
|
||||
((%hack-attr-elt xmlnsdecl-attr)
|
||||
xmlnsdecl-attr)
|
||||
((%hack-attr-elt name) 'name))) ; name => 'name
|
||||
|
||||
|
||||
|
@ -118,8 +148,10 @@
|
|||
(define (with-tag* out tag thunk . attrs)
|
||||
(apply emit-tag out tag attrs)
|
||||
(let ((out (fmt->port out)))
|
||||
(newline out)
|
||||
(call-with-values thunk
|
||||
(lambda results
|
||||
(newline out)
|
||||
(emit-close-tag out tag)
|
||||
(apply values results)))))
|
||||
|
||||
|
@ -191,3 +223,4 @@
|
|||
(if (null? maybe-port)
|
||||
(write-string (escape-html s))
|
||||
(write-string (escape-html s) (fmt->port (car maybe-port)))))
|
||||
|
||||
|
|
Loading…
Reference in New Issue