-
Notifications
You must be signed in to change notification settings - Fork 98
/
htmlproperties.lyx
427 lines (367 loc) · 8.1 KB
/
htmlproperties.lyx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
#LyX 1.6.7 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass book
\use_default_options true
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\author ""
\author ""
\end_header
\begin_body
\begin_layout Section
HtmlProperties, XHTML and HTML5
\end_layout
\begin_layout Standard
Lift unifies many aspects of parsing and displaying the HTML page in a single
trait,
\family typewriter
HtmlProperties
\family default
.
\end_layout
\begin_layout Standard
HtmlProperties defines, on a session-by-session (and even a request-by-request)
basis, the way that templates are parsed and the way that Scala's
\family typewriter
NodeSeq
\family default
is converted into valid HTML output.
The properties on
\family typewriter
HtmlProperties
\family default
are:
\end_layout
\begin_layout Itemize
\family typewriter
docType
\family default
- the DocType for the HTML page, e.g.,
\family typewriter
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/T
R/xhtml1/DTD/xhtml1-transitional.dtd">
\family default
or
\family typewriter
<!DOCTYPE html>
\end_layout
\begin_layout Itemize
\family typewriter
encoding
\family default
- the page's encoding, e.g.,
\family typewriter
<?xml version="1.0" encoding="UTF-8"?>
\end_layout
\begin_layout Itemize
contentType - the setting of the Content-Type response header, e.g.,
\family typewriter
application/xhtml+xml; charset=utf-8
\family default
or
\family typewriter
text/html; charset=utf-8
\end_layout
\begin_layout Itemize
\family typewriter
htmlOutputHeader
\family default
- calculates the way to combine the
\family typewriter
docType
\family default
and
\family typewriter
encoding
\family default
(this is important for IE6 support where encoding goes after docType).
\end_layout
\begin_layout Itemize
\family typewriter
htmlParser
\family default
- a function that converts an
\family typewriter
InputStream
\family default
to a
\family typewriter
Box[NodeSeq]
\family default
.
This is used by Lift to parse templates.
\end_layout
\begin_layout Itemize
\family typewriter
htmlWriter
\family default
- a function that writes a
\family typewriter
NodeSeq
\family default
to a
\family typewriter
Writer
\family default
.
This is used by Lift to convert the internal XML representation of a page
to a stream of bytes representing an HTML page.
\end_layout
\begin_layout Itemize
\family typewriter
html5FormsSupport
\family default
- a flag indicating whether the current browser supports HTML5 forms.
\end_layout
\begin_layout Itemize
\family typewriter
maxOpenRequests
\family default
- the maximum number of concurrent HTTP requests the browser supports to
a named host.
\end_layout
\begin_layout Itemize
\family typewriter
userAgent
\family default
- the User-Agent string sent from the browser.
\end_layout
\begin_layout Subsection
XHTML via
\family typewriter
OldHtmlProperties
\end_layout
\begin_layout Standard
The default properties that keep compability with the disparate LiftRules
used to calculate DocType and Encoding.
Uses the
\family typewriter
PCDataXmlParser
\family default
parser which requires well-formed XML files.
Output is generally XHTML via
\family typewriter
AltXML.toXML
\family default
, but cerain tags (e.g.,
\family typewriter
<br>
\family default
) are written in IE6/IE7 friendly ways.
\end_layout
\begin_layout Subsection
HTML5 via
\family typewriter
Html5Properties
\end_layout
\begin_layout Standard
Prior to Lift 2.2, Lift always emitted XHTML and by default set the Content-Type
header to
\family typewriter
application/xhtml+xml; charset=utf-8
\family default
.
This continues to be Lift's default behavior.
It turns out that most browsers, even modern ones (Firefox, Chrome and
Safari) had issues with XHTML.
Further, XHTML limited the behavior of certain JavaScript libraries.
\end_layout
\begin_layout Standard
By invoking
\family typewriter
LiftRules.htmlProperties.default.set((r: Req) => new Html5Properties(r.userAgent))
\family default
in Boot.scala, you can set Lift to full HTML5 support.
Lift uses the
\begin_inset CommandInset href
LatexCommand href
name "nu.validator"
target "http://about.validator.nu/htmlparser/"
\end_inset
HTML parser and emits the correct DocType and response headers such that
all tested browsers (IE6+, Firefox 2+, Safari 2+, Chrome 1+) render pages
correctly.
\end_layout
\begin_layout Standard
Because the HTML5 parser is different from the standard XML parser, you
will need to adjust your existing templates in the following ways:
\end_layout
\begin_layout Itemize
All tags are converted to lower case.
This means the
\family typewriter
<lift:FooBar/>
\family default
gets converted to
\family typewriter
<lift:foobar/>
\family default
I advise converting to designer friendly where possible (e.g.,
\family typewriter
<div class="lift:FooBar"></div>
\family default
).
\end_layout
\begin_layout Itemize
Tags of the format
\family typewriter
<div/>
\family default
and
\family typewriter
<my_thing:bind/>
\family default
are not legal.
They must be converted to
\family typewriter
<div></div>
\family default
and
\family typewriter
<my_thing:bind></my_thing:bind>
\family default
.
Unfortunately, the parser is very forgiving so rather than barking about
the lack of closing tag, the parser will nest things in unexpected ways.
\end_layout
\begin_layout Itemize
There are some tags that the parser "ensures".
For example a
\family typewriter
<tr>
\family default
,
\family typewriter
<thead>
\family default
, or
\family typewriter
<tbody>
\family default
tag
\series bold
must
\series default
be the first tag inside
\family typewriter
<table>
\family default
.
This breaks the
\family typewriter
\begin_inset Newline newline
\end_inset
<table><mysnippet:line>
\begin_inset Newline newline
\end_inset
<tr><td><mysnippet:bind_here></mysnippet:bind_here></td></tr>
\begin_inset Newline newline
\end_inset
</mysnippet:line><table>
\family default
\begin_inset Newline newline
\end_inset
paradigm.
You can get the desired behavior with
\begin_inset Newline newline
\end_inset
\family typewriter
<table><tr lift:bind="mysnippet:line"><td><mysnippet:bind_here></mysnippet:bind_
here></td></tr><table>
\family default
.
\end_layout
\begin_layout Subsection
Changing behavior mid-session or mid-request
\end_layout
\begin_layout Standard
You can change the behavior of HtmlProperties mid-session or mid-request.
\family typewriter
LiftSession.sessionHtmlProperties
\family default
is a
\family typewriter
SessionVar
\family default
that contains the
\family typewriter
HtmlProperties
\family default
for the session.
\family typewriter
LiftSession.requestHtmlProperties
\family default
is a
\family typewriter
TranientRequestVar
\family default
containing the
\family typewriter
HtmlProperties
\family default
for the request.
At the begining of the request,
\family typewriter
requestHtmlProperties
\family default
is set to the value of
\family typewriter
sessionHtmlProperties
\family default
.
You can alter a property for the duration of the request using:
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
for {
\end_layout
\begin_layout Plain Layout
session <- S.session
\end_layout
\begin_layout Plain Layout
} session.requestHtmlProperties.set(session.
\end_layout
\begin_layout Plain Layout
requestHtmlProperties.is.setDocType(() =>
\end_layout
\begin_layout Plain Layout
Full("<!DOCTYPE moose>")))
\end_layout
\end_inset
\end_layout
\end_body
\end_document