Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /smlnj-lib/trunk/HTML4/html4-parser.sml
ViewVC logotype

Diff of /smlnj-lib/trunk/HTML4/html4-parser.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3542, Wed Jun 23 21:14:56 2010 UTC revision 3543, Thu Jun 24 21:55:32 2010 UTC
# Line 10  Line 10 
10  structure HTML4Parser = struct  structure HTML4Parser = struct
11    
12  structure H4 = HTML4  structure H4 = HTML4
13    structure H4U = HTML4Utils
14    structure H4T = HTML4Tokens
15    structure H4TU = HTML4TokenUtils
16    structure AtomMap = H4TU.AtomMap
17    
18  local  local
19      structure TheParser = HTML4ParseFn(HTML4Lexer)      structure TheParser = HTML4ParseFn(HTML4Lexer)
# Line 27  Line 31 
31          result          result
32      end      end
33    
34    exception IllFormedHTMLParseStream of
35              H4T.token H4U.parsevisitation H4U.stream * string option
36    
37    val tokVisitationToString = H4U.visitationToString H4T.toString
38    
39    val strVisitationToString = H4U.visitationToString (fn x : string => x)
40    
41    val visitationSimilar = let
42        fun tokSimilarToString (tok1, tokStr2) = (H4T.toString tok1) = tokStr2
43    in H4U.visitationSame tokSimilarToString end
44    
45    fun expect expectedVisit pstrm =
46        let val pstrmHd = H4U.stream_hd pstrm
47                handle _ => H4U.VisitT H4T.EOF
48            fun expectationError () =
49                let val msg = "Expected " ^ (strVisitationToString expectedVisit) ^  ", got "
50                              ^ (tokVisitationToString pstrmHd) ^ " instead."
51                in IllFormedHTMLParseStream(pstrm, SOME msg) end
52        in
53            if visitationSimilar(pstrmHd, expectedVisit) then H4U.stream_tl pstrm
54            else raise (expectationError())
55        end
56    
57    fun expectEnterNT nt = expect (H4U.EnterNT (Atom.atom nt))
58    
59    fun expectExitNT nt = expect (H4U.ExitNT (Atom.atom nt))
60    
61    fun expectVisitT tokStr = expect (H4U.VisitT tokStr)
62    
63    fun expectEnterNTInDomain ntMap pstrm =
64        let val pstrmHd = H4U.stream_hd pstrm
65                handle _ => H4U.VisitT H4T.EOF
66            fun expectationError () =
67                let val msg = String.concat ["Expected entry of one of ",
68                                             String.concatWith
69                                                 ", " (map (Atom.toString)
70                                                           (AtomMap.listKeys ntMap)),
71                                             "; got ", tokVisitationToString pstrmHd,
72                                             " instead."]
73                in IllFormedHTMLParseStream(pstrm, SOME msg) end
74        in case pstrmHd
75            of H4U.EnterNT ntAtom =>
76               if AtomMap.inDomain (ntMap, ntAtom) then AtomMap.lookup (ntMap, ntAtom)
77               else raise (expectationError ())
78             | _ => raise (expectationError ())
79        end
80    
81    fun optional optVisit (strm as H4U.StreamCons(strmHd, _)) =
82        if visitationSimilar(strmHd, optVisit) then (H4U.stream_tl strm, SOME strmHd)
83        else (strm, NONE)
84      | optional _ _ = (H4U.StreamNil, NONE)
85    
86    fun optVisitTok tokName strm =
87        case optional (H4U.VisitT tokName) strm
88         of (strm', SOME (H4U.VisitT tok)) => (strm', SOME tok)
89          | _ => (strm, NONE)
90    
91    fun isEnterNT nt pstrm = (expectEnterNT nt pstrm; true)
92        handle IllFormedHTMLParseStream _ => false
93    
94    fun isExitNT nt pstrm = (expectExitNT nt pstrm; true)
95        handle IllFormedHTMLParseStream _ => false
96    
97    fun isVisitT tokStr pstrm = (expectVisitT tokStr pstrm; true)
98        handle IllFormedHTMLParseStream _ => false
99    
100    fun isEither (is1, is2) pstrm = (is1 pstrm) orelse (is2 pstrm)
101    
102    fun streamSkipUntil _ H4U.StreamNil = H4U.StreamNil
103      | streamSkipUntil pred (strm as H4U.StreamCons (strmHd, _)) =
104        if pred strmHd then strm else streamSkipUntil pred (H4U.stream_tl strm)
105    
106    fun streamSkipWhile pred = streamSkipUntil (fn strmHd => not (pred strmHd))
107    
108    fun streamConsumeUntil consumer until strm =
109        let fun streamConsumeUntil' strm' acc =
110                if until strm' then (strm', rev acc)
111                else let val (strm'', consumerVal) = consumer strm
112                     in streamConsumeUntil' strm'' (consumerVal :: acc) end
113        in streamConsumeUntil' strm [] end
114    
115    fun tokIsSpace (H4T.PCDATA pcstr) =
116        let fun loop nil = true
117              | loop (ch :: rst) = if Char.isSpace ch then loop rst else false
118        in loop (String.explode pcstr) end
119      | tokIsSpace _ = false
120    
121    fun visitationIsSpace (H4U.VisitT tok) = tokIsSpace tok
122      | visitationIsSpace _ = false
123    
124    val skipWhitespace = streamSkipWhile visitationIsSpace
125    
126    fun tokIsCdata (H4T.PCDATA _) = true
127      | tokIsCdata (H4T.ENTITY_REF _) = true
128      | tokIsCdata (H4T.CHAR_REF _) = true
129      | tokIsCdata (H4T.COMMENT _) = true
130      | tokIsCdata _ = false
131    
132    fun isNotCdata (H4U.StreamCons(H4U.VisitT tok, _)) = not (tokIsCdata tok)
133      | isNotCdata _ = true
134    
135    exception InvalidToken of H4T.token
136    
137    fun tokToCdata (H4T.PCDATA str) = H4.PCDATA str
138      | tokToCdata (H4T.ENTITY_REF ent) = H4.ENTITY ent
139      | tokToCdata (H4T.CHAR_REF chr) = H4.CHAR chr
140      | tokToCdata (H4T.COMMENT cmt) = H4.COMMENT cmt
141      | tokToCdata tok = raise (InvalidToken tok)
142    
143    (*+DEBUG*)
144    fun tokToString (H4T.DOCTYPE doctypeStr) = doctypeStr
145      | tokToString (H4T.PCDATA dataStr) = ("PCDATA \"" ^ (String.toString dataStr) ^ "\"")
146      | tokToString (H4T.COMMENT commentStr) = commentStr
147      | tokToString tok = H4TU.tokToString tok
148    
149    fun printVisitationStream strm =
150        print ((H4U.visitationToString tokToString (H4U.stream_hd strm)) ^ "\n")
151    
152    fun printIllFormedErr (IllFormedHTMLParseStream (strm, msgOpt)) =
153        (print "Error in parse stream at: ";
154         printVisitationStream strm;
155         if isSome msgOpt then print ("Message: " ^ (valOf msgOpt) ^ "\n") else ())
156      | printIllFormedErr exn = raise exn
157    (*-DEBUG*)
158    
159    fun getAttrsFromStream (H4U.StreamCons (H4U.VisitT tok, _)) =
160        (case H4TU.tokGetAttrs tok
161          of SOME attrs => attrs
162           | NONE => [])
163      | getAttrsFromStream _ = []
164    
165    fun html0aryFromParseStream tag ctor pstrm =
166        let val pstrm1 = expectEnterNT tag pstrm
167            val pstrm2 = expectVisitT ("START" ^ (String.map Char.toUpper tag)) pstrm1
168            val attrs = getAttrsFromStream pstrm1
169            val pstrm3 = expectExitNT tag (skipWhitespace pstrm2)
170        in
171            (pstrm3, SOME (ctor attrs))
172        end
173    
174    fun listOfOptsToList lst = map Option.valOf lst
175    
176    fun htmlNaryFromParseStream tag ctor childFromParseStream pstrm =
177        let val tagUpper = (String.map Char.toUpper tag)
178            val endTag = "END" ^ tagUpper
179            val pstrm1 = expectEnterNT tag pstrm
180            val pstrm2 = expectVisitT ("START" ^ tagUpper) pstrm1
181            val attrs = getAttrsFromStream pstrm1
182            val (pstrm3, children) =
183                streamConsumeUntil childFromParseStream (isVisitT endTag)
184                                   (skipWhitespace pstrm2)
185            val pstrm4 = expectVisitT endTag pstrm3
186            val pstrm5 = expectExitNT tag (skipWhitespace pstrm4)
187        in (pstrm5, SOME (ctor (attrs, listOfOptsToList children))) end
188    
189    type parseVisitStream = H4T.token H4U.parsevisitation H4U.stream
190    
191    val headContentHandlerMap : (parseVisitStream ->
192                                 parseVisitStream *
193                                 H4.head_content option) AtomMap.map ref = ref AtomMap.empty
194    
195    val blockContentHandlerMap : (parseVisitStream ->
196                                  parseVisitStream *
197                                  H4.block option) AtomMap.map ref = ref AtomMap.empty
198    
199    val inlineContentHandlerMap : (parseVisitStream ->
200                                   parseVisitStream *
201                                   H4.inline option) AtomMap.map ref = ref AtomMap.empty
202    
203    fun htmlFromParseStream pstrm0 =
204        let val pstrm1 = (skipWhitespace o (expectEnterNT "document")) pstrm0
205            val (pstrm2, doctypeTokOpt) = optVisitTok "DOCTYPE" pstrm1
206            val theVersion = (case doctypeTokOpt
207                               of SOME (H4T.DOCTYPE doctype) => SOME doctype
208                                | _ => NONE)
209            val (pstrm3, starthtmlTokOpt) = optVisitTok "STARTHTML" (skipWhitespace pstrm2)
210            val (pstrm4, headDataListOpt) = headFromParseStream (skipWhitespace pstrm3)
211        in if not (isSome headDataListOpt) then (pstrm4, NONE)
212           else
213               let val (pstrm5, contentDataOpt) = bodyOrFramesetFromParseStream pstrm4
214               in if not (isSome contentDataOpt) then (pstrm5, NONE)
215                  else
216                      let val (pstrm6, _) = optVisitTok "ENDHTML" pstrm5
217                          val pstrm7 = (skipWhitespace o (expectExitNT "document") o
218                                        skipWhitespace) pstrm6
219                      in
220                          (pstrm7, SOME (H4.HTML { version = theVersion,
221                                                   head = [],
222                                                   content = valOf contentDataOpt } ))
223                      end
224               end
225        end
226    and headFromParseStream pstrm0 =
227        let val pstrm1 = (skipWhitespace o (expectEnterNT "head")) pstrm0
228            val (pstrm2, startheadTokOpt) = optVisitTok "STARTHEAD" pstrm1
229            val (pstrm3, children) =
230                streamConsumeUntil headContentFromParseStream (isEither(isExitNT "head",
231                                                                        isVisitT "ENDHEAD"))
232                                   (skipWhitespace pstrm2)
233            val (pstrm4, _) = optVisitTok "ENDHEAD" pstrm3
234            val pstrm5 = expectExitNT "head" (skipWhitespace pstrm4)
235        in (pstrm5, SOME []) end
236    and headContentFromParseStream pstrm =
237        let val pstrmHd = H4U.stream_hd pstrm
238            fun expectationErr () =
239                let val msg = String.concat ["Expected entry of one of title, base, script,",
240                                             "style, meta, link, or object, got ",
241                                             tokVisitationToString pstrmHd, " instead."]
242                in IllFormedHTMLParseStream (pstrm, SOME msg) end
243        in case pstrmHd
244            of H4U.EnterNT ntAtom =>
245               (case AtomMap.find (!headContentHandlerMap, ntAtom)
246                 of SOME handler => handler pstrm
247                  | NONE => raise (expectationErr ()))
248             | _ => raise (expectationErr ())
249        end
250    and bodyOrFramesetFromParseStream pstrm =
251        let fun bodyFromParseStream pstrm0 =
252                let val pstrm1 = expectEnterNT "body" pstrm0
253                    val (pstrm2, startbodyTokOpt) = optVisitTok "STARTBODY" pstrm1
254                    val attrs = if isSome startbodyTokOpt
255                                then case H4TU.tokGetAttrs (valOf startbodyTokOpt)
256                                      of SOME attrs => attrs
257                                       | NONE => []
258                                else []
259                    val (pstrm3, children) =
260                        streamConsumeUntil blockOrScriptFromParseStream
261                                           (isEither(isExitNT "body", isVisitT "ENDBODY"))
262                                           (skipWhitespace pstrm2)
263                    val (pstrm4, _) = optVisitTok "ENDBODY" pstrm3
264                    val pstrm5 = expectExitNT "body" (skipWhitespace pstrm4)
265                in (pstrm5, SOME (H4.BODY (attrs, listOfOptsToList children))) end
266            fun bodyOrFrameset_FRAMESET_FromParseStream pstrm0 =
267                let val (pstrm1, framesetOpt) = framesetFromParseStream pstrm0
268                in
269                    (pstrm1,
270                     case framesetOpt
271                      of SOME frameset => SOME (H4.BodyOrFrameset_FRAMESET frameset)
272                       | NONE => NONE)
273                end
274        in
275            if isEnterNT "body" pstrm then bodyFromParseStream pstrm
276            else bodyOrFrameset_FRAMESET_FromParseStream pstrm
277        end
278    and framesetFromParseStream pstrm0 =
279        let val pstrm1 = expectEnterNT "frameset" pstrm0
280            val pstrm2 = expectVisitT "STARTFRAMESET" pstrm1
281            val attrs = getAttrsFromStream pstrm1
282            val (pstrm3, children) =
283                streamConsumeUntil framesetOrFrameFromParseStream
284                                   (isEither(isVisitT "ENDFRAMESET",
285                                             isEnterNT "noframes"))
286                                   (skipWhitespace pstrm2)
287            val (pstrm4, noframesOpt) =
288                if isEnterNT "noframes" pstrm3 then
289                    let val (pstrm4', noframesOpt') = noFramesFromParseStream pstrm3
290                    in (skipWhitespace pstrm4', noframesOpt') end
291                else (pstrm3, NONE)
292            val pstrm5 = expectVisitT "ENDFRAMESET" pstrm4
293            val pstrm6 = expectExitNT "frameset" (skipWhitespace pstrm5)
294        in
295            (pstrm6, SOME (H4.FRAMESET (attrs, listOfOptsToList children, noframesOpt)))
296        end
297    and framesetOrFrameFromParseStream pstrm0 =
298        let fun cvtFrameset (SOME frameset) = SOME (H4.FramesetOrFrame_FRAMESET frameset)
299              | cvtFrameset NONE = NONE
300            val pstrm1 = skipWhitespace pstrm0
301            val (pstrm2, result) =
302                if isEnterNT "frameset" pstrm1
303                then let val (pstrm', result') = framesetFromParseStream pstrm1
304                     in (pstrm', cvtFrameset result') end
305                else html0aryFromParseStream "frame" H4.FRAME pstrm1
306        in (skipWhitespace pstrm2, result) end
307    and noFramesFromParseStream pstrm = (pstrm, NONE) (* XXX *)
308    and flowFromParseStream pstrm =
309        let val pstrmHd = H4U.stream_hd pstrm
310            fun cvtBlock (SOME block) = SOME (H4.Flow_BLOCK block)
311              | cvtBlock NONE = NONE
312            fun cvtInline (SOME inline) = SOME (H4.Flow_INLINE inline)
313              | cvtInline NONE = NONE
314            fun handleInline pstrm =
315                let val (pstrm', result') = inlineFromParseStream pstrm
316                in (pstrm', cvtInline result') end
317        in case pstrmHd
318            of H4U.EnterNT ntAtom =>
319               if AtomMap.inDomain (!blockContentHandlerMap, ntAtom)
320               then let val (pstrm', result') = blockFromParseStream pstrm
321                    in (pstrm', cvtBlock result') end
322               else handleInline pstrm
323             | _ => handleInline pstrm
324        end
325    and blockFromParseStream pstrm =
326        (expectEnterNTInDomain (!blockContentHandlerMap) pstrm) pstrm
327    and inlineFromParseStream pstrm =
328        let val pstrmHd = H4U.stream_hd pstrm
329        in case pstrmHd
330            of H4U.VisitT tok => (H4U.stream_tl pstrm, NONE) (* XXX *)
331             | _ => (expectEnterNTInDomain (!inlineContentHandlerMap) pstrm) pstrm
332        end
333    and listItemFromParseStream pstrm = (pstrm, NONE)
334    and scriptFromParseStream pstrm = (pstrm, NONE)
335    and paramFromParseStream pstrm = (pstrm, NONE)
336    and legendFromParseStream pstrm = (pstrm, NONE)
337    and defTermOrDescFromParseStream pstrm = (pstrm, NONE)
338    and tableDataFromParseStream pstrm = (pstrm, NONE)
339    and trFromParseStream pstrm = (pstrm, NONE)
340    and thOrTdFromParseStream pstrm = (pstrm, NONE)
341    and optgrouporOptionFromParseStream pstrm = (pstrm, NONE)
342    and htmlOptionFromParseStream pstrm = (pstrm, NONE)
343    and flowOrParamFromParseStream pstrm = (pstrm, NONE)
344    and blockOrScriptFromParseStream pstrm = (pstrm, NONE)
345    and blockOrAreaFromParseStream pstrm = (pstrm, NONE)
346    and objectFromParseStream pstrm =
347        htmlNaryFromParseStream "object" H4.Head_OBJECT flowOrParamFromParseStream pstrm
348    and headScriptFromParseStream pstrm =
349        let val (pstrm', scriptOpt) = scriptFromParseStream pstrm
350        in case scriptOpt of NONE => (pstrm', NONE)
351                           | SOME script => (pstrm', SOME (H4.Head_SCRIPT script))
352        end
353    
354    fun cdataFromParseStream pstrm =
355        if isNotCdata pstrm
356        then raise (IllFormedHTMLParseStream(pstrm, SOME "Expected character data."))
357        else
358            let val pstrmHd = H4U.stream_hd pstrm
359                val pstrmTl = H4U.stream_tl pstrm
360            in case pstrmHd
361                of H4U.VisitT tok => (pstrmTl, SOME (tokToCdata tok))
362                 | _ => (pstrmTl, NONE)
363            end
364    
365    val titleFromParseStream =
366        htmlNaryFromParseStream "title" H4.Head_TITLE cdataFromParseStream
367    val baseFromParseStream = html0aryFromParseStream "base" H4.Head_BASE
368    val metaFromParseStream = html0aryFromParseStream "meta" H4.Head_META
369    val linkFromParseStream = html0aryFromParseStream "link" H4.Head_LINK
370    fun pFromParseStream pstrm = (pstrm, NONE)
371    fun h1FromParseStream pstrm = (pstrm, NONE)
372    fun h2FromParseStream pstrm = (pstrm, NONE)
373    fun h3FromParseStream pstrm = (pstrm, NONE)
374    fun h4FromParseStream pstrm = (pstrm, NONE)
375    fun h5FromParseStream pstrm = (pstrm, NONE)
376    fun h6FromParseStream pstrm = (pstrm, NONE)
377    fun ulFromParseStream pstrm = (pstrm, NONE)
378    fun olFromParseStream pstrm = (pstrm, NONE)
379    fun dirFromParseStream pstrm = (pstrm, NONE)
380    fun menuFromParseStream pstrm = (pstrm, NONE)
381    fun preFromParseStream pstrm = (pstrm, NONE)
382    fun dlFromParseStream pstrm = (pstrm, NONE)
383    fun divFromParseStream pstrm = (pstrm, NONE)
384    fun noscriptFromParseStream pstrm = (pstrm, NONE)
385    fun blockquoteFromParseStream pstrm = (pstrm, NONE)
386    fun formFromParseStream pstrm = (pstrm, NONE)
387    fun hrFromParseStream pstrm = (pstrm, NONE)
388    fun tableFromParseStream pstrm = (pstrm, NONE)
389    fun fieldsetFromParseStream pstrm = (pstrm, NONE)
390    fun addressFromParseStream pstrm = (pstrm, NONE)
391    fun centerFromParseStream pstrm = (pstrm, NONE)
392    fun isindexFromParseStream pstrm = (pstrm, NONE)
393    fun ttFromParseStream pstrm = (pstrm, NONE)
394    fun iFromParseStream pstrm = (pstrm, NONE)
395    fun bFromParseStream pstrm = (pstrm, NONE)
396    fun bigFromParseStream pstrm = (pstrm, NONE)
397    fun smallFromParseStream pstrm = (pstrm, NONE)
398    fun uFromParseStream pstrm = (pstrm, NONE)
399    fun sFromParseStream pstrm = (pstrm, NONE)
400    fun strikeFromParseStream pstrm = (pstrm, NONE)
401    fun emFromParseStream pstrm = (pstrm, NONE)
402    fun strongFromParseStream pstrm = (pstrm, NONE)
403    fun dfnFromParseStream pstrm = (pstrm, NONE)
404    fun codeFromParseStream pstrm = (pstrm, NONE)
405    fun sampFromParseStream pstrm = (pstrm, NONE)
406    fun kbdFromParseStream pstrm = (pstrm, NONE)
407    fun varFromParseStream pstrm = (pstrm, NONE)
408    fun citeFromParseStream pstrm = (pstrm, NONE)
409    fun abbrFromParseStream pstrm = (pstrm, NONE)
410    fun acronymFromParseStream pstrm = (pstrm, NONE)
411    fun aFromParseStream pstrm = (pstrm, NONE)
412    fun imgFromParseStream pstrm = (pstrm, NONE)
413    fun objectFromParseStream pstrm = (pstrm, NONE)
414    fun brFromParseStream pstrm = (pstrm, NONE)
415    fun inlineScriptFromParseStream pstrm = (pstrm, NONE)
416    fun mapFromParseStream pstrm = (pstrm, NONE)
417    fun qFromParseStream pstrm = (pstrm, NONE)
418    fun subFromParseStream pstrm = (pstrm, NONE)
419    fun supFromParseStream pstrm = (pstrm, NONE)
420    fun spanFromParseStream pstrm = (pstrm, NONE)
421    fun bdoFromParseStream pstrm = (pstrm, NONE)
422    fun appletFromParseStream pstrm = (pstrm, NONE)
423    fun basefontFromParseStream pstrm = (pstrm, NONE)
424    fun fontFromParseStream pstrm = (pstrm, NONE)
425    fun iframeFromParseStream pstrm = (pstrm, NONE)
426    fun inputFromParseStream pstrm = (pstrm, NONE)
427    fun selectFromParseStream pstrm = (pstrm, NONE)
428    fun textareaFromParseStream pstrm = (pstrm, NONE)
429    fun labelFromParseStream pstrm = (pstrm, NONE)
430    fun buttonFromParseStream pstrm = (pstrm, NONE)
431    fun inlineCdataFromParseStream pstrm = (pstrm, NONE)
432    
433    val _ =
434        (headContentHandlerMap := (foldl AtomMap.insert' AtomMap.empty
435                                         [ (Atom.atom "title", titleFromParseStream),
436                                           (Atom.atom "base", baseFromParseStream),
437                                           (Atom.atom "script", headScriptFromParseStream),
438                                           (Atom.atom "meta", metaFromParseStream),
439                                           (Atom.atom "link", linkFromParseStream),
440                                           (Atom.atom "object", objectFromParseStream) ]),
441         blockContentHandlerMap := (foldl AtomMap.insert' AtomMap.empty
442                                          [ (Atom.atom "p", pFromParseStream),
443                                            (Atom.atom "h1", h1FromParseStream),
444                                            (Atom.atom "h2", h2FromParseStream),
445                                            (Atom.atom "h3", h3FromParseStream),
446                                            (Atom.atom "h4", h4FromParseStream),
447                                            (Atom.atom "h5", h5FromParseStream),
448                                            (Atom.atom "h6", h6FromParseStream),
449                                            (Atom.atom "ul", ulFromParseStream),
450                                            (Atom.atom "ol", olFromParseStream),
451                                            (Atom.atom "dir", dirFromParseStream),
452                                            (Atom.atom "menu", menuFromParseStream),
453                                            (Atom.atom "pre", preFromParseStream),
454                                            (Atom.atom "dl", dlFromParseStream),
455                                            (Atom.atom "div", divFromParseStream),
456                                            (Atom.atom "noscript", noscriptFromParseStream),
457                                            (Atom.atom "blockquote",
458                                             blockquoteFromParseStream),
459                                            (Atom.atom "form", formFromParseStream),
460                                            (Atom.atom "hr", hrFromParseStream),
461                                            (Atom.atom "table", tableFromParseStream),
462                                            (Atom.atom "fieldset", fieldsetFromParseStream),
463                                            (Atom.atom "address", addressFromParseStream),
464                                            (Atom.atom "isindex", isindexFromParseStream),
465                                            (Atom.atom "center", centerFromParseStream) ]),
466         inlineContentHandlerMap := (foldl AtomMap.insert' AtomMap.empty
467                                           [(Atom.atom "tt", ttFromParseStream),
468                                            (Atom.atom "i", iFromParseStream),
469                                            (Atom.atom "b", bFromParseStream),
470                                            (Atom.atom "big", bigFromParseStream),
471                                            (Atom.atom "small", smallFromParseStream),
472                                            (Atom.atom "u", uFromParseStream),
473                                            (Atom.atom "s", sFromParseStream),
474                                            (Atom.atom "strike", strikeFromParseStream),
475                                            (Atom.atom "em", emFromParseStream),
476                                            (Atom.atom "strong", strongFromParseStream),
477                                            (Atom.atom "dfn", dfnFromParseStream),
478                                            (Atom.atom "code", codeFromParseStream),
479                                            (Atom.atom "samp", sampFromParseStream),
480                                            (Atom.atom "kbd", kbdFromParseStream),
481                                            (Atom.atom "var", varFromParseStream),
482                                            (Atom.atom "cite", citeFromParseStream),
483                                            (Atom.atom "abbr", abbrFromParseStream),
484                                            (Atom.atom "acronym", acronymFromParseStream),
485                                            (Atom.atom "a", aFromParseStream),
486                                            (Atom.atom "img", imgFromParseStream),
487                                            (Atom.atom "object", objectFromParseStream),
488                                            (Atom.atom "br", brFromParseStream),
489                                            (Atom.atom "script",
490                                             inlineScriptFromParseStream),
491                                            (Atom.atom "map", mapFromParseStream),
492                                            (Atom.atom "q", qFromParseStream),
493                                            (Atom.atom "sub", subFromParseStream),
494                                            (Atom.atom "sup", supFromParseStream),
495                                            (Atom.atom "span", spanFromParseStream),
496                                            (Atom.atom "bdo", bdoFromParseStream),
497                                            (Atom.atom "applet", appletFromParseStream),
498                                            (Atom.atom "basefont", basefontFromParseStream),
499                                            (Atom.atom "font", fontFromParseStream),
500                                            (Atom.atom "iframe", iframeFromParseStream),
501                                            (Atom.atom "input", inputFromParseStream),
502                                            (Atom.atom "select", selectFromParseStream),
503                                            (Atom.atom "textarea", textareaFromParseStream),
504                                            (Atom.atom "label", labelFromParseStream),
505                                            (Atom.atom "button", buttonFromParseStream) ])
506        )
507    
508  fun fromParseTree pt =  fun fromParseTree pt =
509      SOME (H4.HTML { version = NONE, head = [], content = H4.BODY([],[]) })      let val (_, result) = htmlFromParseStream (H4U.parsetreeToVisitationStream pt)
510        in result end
511    
512  fun fromString str = let  fun fromString str = let
513      val pt_opt = parseStream (TextIO.openString str)      val pt_opt = parseStream (TextIO.openString str)

Legend:
Removed from v.3542  
changed lines
  Added in v.3543

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0