nendo 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,231 @@
1
+ ;;;
2
+ ;;; html-lite.scm - lightweight HTML construction
3
+ ;;;
4
+ ;;; Copyright (c) 2000-2009 Shiro Kawai <shiro@acm.org>
5
+ ;;;
6
+ ;;; Redistribution and use in source and binary forms, with or without
7
+ ;;; modification, are permitted provided that the following conditions
8
+ ;;; are met:
9
+ ;;;
10
+ ;;; 1. Redistributions of source code must retain the above copyright
11
+ ;;; notice, this list of conditions and the following disclaimer.
12
+ ;;;
13
+ ;;; 2. Redistributions in binary form must reproduce the above copyright
14
+ ;;; notice, this list of conditions and the following disclaimer in the
15
+ ;;; documentation and/or other materials provided with the distribution.
16
+ ;;;
17
+ ;;; 3. Neither the name of the authors nor the names of its contributors
18
+ ;;; may be used to endorse or promote products derived from this
19
+ ;;; software without specific prior written permission.
20
+ ;;;
21
+ ;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ ;;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ ;;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ ;;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ ;;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ ;;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27
+ ;;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
+ ;;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
+ ;;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
+ ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ ;;;
33
+ ;;; $Id: html-lite.scm,v 1.19 2008-05-10 13:36:11 shirok Exp $
34
+ ;;;
35
+ ;;;
36
+ ;;; ported for Nendo language by Kiyoka Nishiyama.
37
+
38
+ ;; Escaping ---------------------------------------------
39
+ (define (html-escape c)
40
+ (case c
41
+ (("<") "&lt;")
42
+ ((">") "&gt;")
43
+ (("&") "&amp;")
44
+ (("\"") "&quot;")
45
+ (else c)))
46
+
47
+ (define (html-escape-string string)
48
+ (string-join
49
+ (map
50
+ html-escape
51
+ (to-list (string.split "")))
52
+ ""))
53
+
54
+ ;;(html-escape-string "<html> & \"abc\"")
55
+
56
+
57
+ ;; Doctype ----------------------------------------------
58
+
59
+ ;; Doctype database
60
+ ;; (type ...) => (xml? doctype)
61
+ (define *doctype-alist*
62
+ '(((:strict :html :html-strict :html-4.01 :html-4.01-strict)
63
+ #f
64
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"
65
+ \"http://www.w3.org/TR/html4/strict.dtd\">\n")
66
+ ((:transitional :html-transitional :html-4.01-transitional)
67
+ #f
68
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
69
+ \"http://www.w3.org/TR/html4/loose.dtd\">\n")
70
+ ((:frameset :html-frameset :html-4.01-frameset)
71
+ #f
72
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"
73
+ \"http://www.w3.org/TR/html4/frameset.dtd\">\n")
74
+ ((:xhtml-1.0-strict :xhtml-1.0)
75
+ #t
76
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
77
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
78
+ ((:xhtml-1.0-transitional)
79
+ #t
80
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
81
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n")
82
+ ((:xhtml-1.0-frameset)
83
+ #t
84
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"
85
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n")
86
+ ((:xhtml-1.1)
87
+ #t
88
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"
89
+ \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n")
90
+ ))
91
+
92
+ (define (html-doctype . type)
93
+ (let1 type (if (null? type)
94
+ :html-4.01-strict
95
+ type)
96
+ (cond ((find (lambda (e) (memq type (car e))) *doctype-alist*)
97
+ => caddr )
98
+ (else (error "Unknown doctype type spec" type)))))
99
+
100
+ ;; Elements ------------------------------------------------
101
+
102
+ (define (make-html-element name . args)
103
+ (define (get-attr args attrs)
104
+ (cond ((null? args) (values (reverse attrs) args))
105
+ ((keyword? (car args))
106
+ (cond ((null? (cdr args))
107
+ (values (reverse (list* (car args) " " attrs)) args))
108
+ ((eq? (cadr args) #f)
109
+ (get-attr (cddr args) attrs))
110
+ ((eq? (cadr args) #t)
111
+ (get-attr (cddr args) (list* (car args) " " attrs)))
112
+ (else
113
+ (get-attr (cddr args)
114
+ (list* (sprintf "=\"%s\""
115
+ (html-escape-string (x->string (cadr args))))
116
+ (car args)
117
+ " "
118
+ attrs)))))
119
+ (else (values (reverse attrs) args))))
120
+
121
+ (let ((empty? (get-keyword :empty? args #f)))
122
+ (if empty?
123
+ (lambda args
124
+ (receive (attr args) (get-attr args '())
125
+ (unless (null? args)
126
+ (errorf "element %s can't have content: %s" name (write-to-string args)))
127
+ (list "<" name attr " />")))
128
+ (lambda args
129
+ (receive (attr args) (get-attr args '())
130
+ (list "<" name attr ">" args "</" name "\n>"))))))
131
+
132
+
133
+ (define define-html-elements
134
+ (macro elements
135
+ (letrec ((make-scheme-name
136
+ (lambda (name)
137
+ (string->symbol (sprintf "html:%s" name)))))
138
+
139
+ (let loop ((elements elements)
140
+ (r '()))
141
+ (cond ((null? elements) `(begin ,@(reverse r)))
142
+ ((and (pair? (cdr elements)) (eqv? (cadr elements) :empty))
143
+ (loop (cddr elements)
144
+ (list* `(define ,(make-scheme-name (car elements))
145
+ (make-html-element ',(car elements) :empty? #t))
146
+ `(export ,(make-scheme-name (car elements)))
147
+ r)))
148
+ (else
149
+ (loop (cdr elements)
150
+ (list* `(define ,(make-scheme-name (car elements))
151
+ (make-html-element ',(car elements)))
152
+ `(export ,(make-scheme-name (car elements)))
153
+ r))))
154
+ ))))
155
+
156
+
157
+ ;; http://www.w3.org/TR/html4/sgml/dtd.html
158
+
159
+ ;; TEXT MARKUP
160
+
161
+ ;; %fontstyle
162
+ (define-html-elements tt i b big small)
163
+
164
+ ;; %phrase
165
+ (define-html-elements em strong dfn code samp kbd var cite abbr acronym)
166
+
167
+ (define-html-elements sub sup span bdo br :empty)
168
+
169
+ ;; HTML CONTENT MODELS
170
+
171
+ ;; DOCUMENT BODY
172
+
173
+ (define-html-elements body address div)
174
+
175
+ ;; THE ANCHOR ELEMENT
176
+ (define-html-elements a)
177
+
178
+ ;; cLIENT-SIDE IMAGE MAPS
179
+ (define-html-elements map area :empty)
180
+
181
+ ;; THE LINK EKEMENT
182
+ (define-html-elements link :empty)
183
+
184
+ ;; IMAGES
185
+ (define-html-elements img :empty)
186
+
187
+ ;; OBJECT
188
+ (define-html-elements object param :empty)
189
+
190
+ ;; HORIZONTAL RULE
191
+ (define-html-elements hr :empty)
192
+
193
+ ;; PARAGRAPHS
194
+ (define-html-elements p)
195
+
196
+ ;; HEADINGS
197
+ (define-html-elements h1 h2 h3 h4 h5 h6)
198
+
199
+ ;; PREFORMATTED
200
+ (define-html-elements pre)
201
+
202
+ ;; INLINE QUOTES
203
+ (define-html-elements q)
204
+
205
+ ;; BLOCK-LIKE QUOTES
206
+ (define-html-elements blockquote)
207
+
208
+ ;; INSERTED/DELETED TEXT
209
+ (define-html-elements ins del)
210
+
211
+ ;; LISTS
212
+ (define-html-elements dl dt dd ol ul li)
213
+
214
+ ;; FORMS
215
+ (define-html-elements form label input :empty select optgroup option
216
+ textarea fieldset legend button)
217
+
218
+ ;; TABLES
219
+ (define-html-elements table caption thead tfoot tbody colgroup
220
+ col :empty tr th td)
221
+
222
+ ;; DOCUMENT HEAD
223
+ (define-html-elements head title base :empty meta :empty
224
+ style script noscript)
225
+
226
+ ;; DOCUMENT STRUCTURE
227
+ (define-html-elements html)
228
+
229
+ ;; FRAMES
230
+ (define-html-elements frameset frame noframes iframe)
231
+