src/Pure/General/xml.ML
changeset 44821 94033767ef9b
parent 44818 9b00f09f7721
equal deleted inserted replaced
44819:8f5add916a99 44821:94033767ef9b
   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