equal
deleted
inserted
replaced
181 parse_comment; |
181 parse_comment; |
182 |
182 |
183 val parse_optional_text = |
183 val parse_optional_text = |
184 Scan.optional (parse_chars >> (single o Text)) []; |
184 Scan.optional (parse_chars >> (single o Text)) []; |
185 |
185 |
|
186 fun name_start_char c = Symbol.is_ascii_letter c orelse c = ":" orelse c = "_"; |
|
187 fun name_char c = name_start_char c orelse Symbol.is_ascii_digit c orelse c = "-" orelse c = "."; |
|
188 val parse_name = Scan.one name_start_char ::: Scan.many name_char; |
|
189 |
186 in |
190 in |
187 |
191 |
188 val parse_comments = |
192 val parse_comments = |
189 blanks -- Scan.repeat (parse_comment -- blanks >> K ()) >> K (); |
193 blanks -- Scan.repeat (parse_comment -- blanks >> K ()) >> K (); |
190 |
194 |
198 parse_processing_instruction || |
202 parse_processing_instruction || |
199 parse_comment) |
203 parse_comment) |
200 @@@ parse_optional_text) >> flat)) xs |
204 @@@ parse_optional_text) >> flat)) xs |
201 |
205 |
202 and parse_element xs = |
206 and parse_element xs = |
203 ($$ "<" |-- Symbol.scan_id -- |
207 ($$ "<" |-- parse_name -- Scan.repeat (blanks |-- parse_att) --| blanks :-- |
204 Scan.repeat (blanks |-- parse_att) --| blanks :-- (fn (s, _) => |
208 (fn (name, _) => |
205 !! (err (fn () => "Expected > or />")) |
209 !! (err (fn () => "Expected > or />")) |
206 (Scan.this_string "/>" >> ignored |
210 ($$ "/" -- $$ ">" >> ignored || |
207 || $$ ">" |-- parse_content --| |
211 $$ ">" |-- parse_content --| |
208 !! (err (fn () => "Expected </" ^ s ^ ">")) |
212 !! (err (fn () => "Expected </" ^ implode name ^ ">")) |
209 (Scan.this_string ("</" ^ s) --| blanks --| $$ ">"))) >> Elem) xs; |
213 ($$ "<" -- $$ "/" -- Scan.this name -- blanks -- $$ ">"))) |
|
214 >> (fn ((name, atts), body) => Elem ((implode name, atts), body))) xs; |
210 |
215 |
211 val parse_document = |
216 val parse_document = |
212 (Scan.repeat parse_misc -- Scan.option parse_doctype -- Scan.repeat parse_misc) |
217 (Scan.repeat parse_misc -- Scan.option parse_doctype -- Scan.repeat parse_misc) |
213 |-- parse_element; |
218 |-- parse_element; |
214 |
219 |