diff --git a/src/glxml.gleam b/src/glxml.gleam index 25f3638..2fd15a7 100644 --- a/src/glxml.gleam +++ b/src/glxml.gleam @@ -37,11 +37,12 @@ pub type Element { Element(name: String, attrs: List(Attribute), elements: List(Element)) Text(content: String) Comment(content: String) + CData(content: String) } pub fn main() { parse_document( - "\r\n \n", + "\r\n \n]]>", ) |> echo } @@ -158,6 +159,7 @@ fn parse_content( Error(_) -> Error(Nil) } }, + parse_cdata, ], doc, ) @@ -170,6 +172,30 @@ fn parse_content( } } +fn parse_cdata(doc: String) -> Result(#(Element, String), Nil) { + case doc { + " tail -> { + use #(cdata, doc) <- result.try(do_parse_cdata(tail, "")) + + Ok(#(CData(cdata), doc)) + } + _ -> Error(Nil) + } +} + +fn do_parse_cdata(doc: String, cdata: String) -> Result(#(String, String), Nil) { + case doc { + "]]>" <> tail -> Ok(#(cdata, tail)) + "" -> Error(Nil) + _ -> { + case parse_char(doc) { + Ok(#(char, doc)) -> do_parse_cdata(doc, cdata <> char) + _ -> Error(Nil) + } + } + } +} + fn parse_chardata( doc: String, doctype: Option(DocType),