This commit is contained in:
@@ -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 &#38;ha' battr='baba' ref='&'/><!-- ma comment --></b>",
|
"<?xml version=\"1.1\" encoding='UTF-8'?>\r\n <!-- hello-world --> \n<b><a attr='ha &#38;ha' battr='baba' ref='&'/><!-- 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),
|
||||||
|
|||||||
Reference in New Issue
Block a user