feat: Added CData parsing
Some checks failed
test / test (push) Has been cancelled

This commit is contained in:
2025-10-09 18:50:00 +01:00
parent 43d0638fd8
commit 963f44dbeb

View File

@@ -37,11 +37,12 @@ pub type Element {
Element(name: String, attrs: List(Attribute), elements: List(Element)) Element(name: String, attrs: List(Attribute), elements: List(Element))
Text(content: String) Text(content: String)
Comment(content: String) Comment(content: String)
CData(content: String)
} }
pub fn main() { pub fn main() {
parse_document( parse_document(
"<?xml version=\"1.1\" encoding='UTF-8'?>\r\n <!-- hello-world --> \n<b><a attr='ha&#x20;&#38;#38;ha' battr='baba' ref='&amp;'/><!-- ma comment --></b>", "<?xml version=\"1.1\" encoding='UTF-8'?>\r\n <!-- hello-world --> \n<b><a attr='ha&#x20;&#38;#38;ha' battr='baba' ref='&amp;'/><!-- ma comment --><![CDATA[Testing&&<haha>]]></b>",
) )
|> echo |> echo
} }
@@ -158,6 +159,7 @@ fn parse_content(
Error(_) -> Error(Nil) Error(_) -> Error(Nil)
} }
}, },
parse_cdata,
], ],
doc, doc,
) )
@@ -170,6 +172,30 @@ fn parse_content(
} }
} }
fn parse_cdata(doc: String) -> Result(#(Element, String), Nil) {
case doc {
"<![CDATA[" <> 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( fn parse_chardata(
doc: String, doc: String,
doctype: Option(DocType), doctype: Option(DocType),