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),