This commit is contained in:
@@ -38,11 +38,13 @@ pub type Element {
|
|||||||
Text(content: String)
|
Text(content: String)
|
||||||
Comment(content: String)
|
Comment(content: String)
|
||||||
CData(content: String)
|
CData(content: String)
|
||||||
|
PI(name: String, content: String)
|
||||||
|
Whitespace
|
||||||
}
|
}
|
||||||
|
|
||||||
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 --><![CDATA[Testing&&<haha>]]></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>]]><?test asuhashd ?></b>",
|
||||||
)
|
)
|
||||||
|> echo
|
|> echo
|
||||||
}
|
}
|
||||||
@@ -153,13 +155,9 @@ fn parse_content(
|
|||||||
try_parsers(
|
try_parsers(
|
||||||
[
|
[
|
||||||
parse_element(_, doctype),
|
parse_element(_, doctype),
|
||||||
fn(doc) {
|
parse_comment,
|
||||||
case parse_comment(doc) {
|
|
||||||
Ok(#(comment, doc)) -> Ok(#(Comment(comment), doc))
|
|
||||||
Error(_) -> Error(Nil)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
parse_cdata,
|
parse_cdata,
|
||||||
|
parse_pi,
|
||||||
],
|
],
|
||||||
doc,
|
doc,
|
||||||
)
|
)
|
||||||
@@ -172,6 +170,38 @@ fn parse_content(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_pi(doc: String) -> Result(#(Element, String), Nil) {
|
||||||
|
case doc {
|
||||||
|
"<?" <> tail -> {
|
||||||
|
use #(name, doc) <- result.try(parse_name(tail))
|
||||||
|
use <- bool.guard(
|
||||||
|
when: string.lowercase(name) == "xml",
|
||||||
|
return: Error(Nil),
|
||||||
|
)
|
||||||
|
let doc = trim_space(doc)
|
||||||
|
use #(content, doc) <- result.try(parse_pi_content(doc, ""))
|
||||||
|
case doc {
|
||||||
|
"?>" <> tail -> Ok(#(PI(name, content), tail))
|
||||||
|
_ -> Error(Nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ -> Error(Nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_pi_content(doc: String, pi: String) -> Result(#(String, String), Nil) {
|
||||||
|
case doc {
|
||||||
|
"?>" <> _ -> Ok(#(pi, doc))
|
||||||
|
"" -> Error(Nil)
|
||||||
|
_ -> {
|
||||||
|
case parse_char(doc) {
|
||||||
|
Ok(#(char, doc)) -> parse_pi_content(doc, pi <> char)
|
||||||
|
Error(_) -> Ok(#(pi, doc))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_cdata(doc: String) -> Result(#(Element, String), Nil) {
|
fn parse_cdata(doc: String) -> Result(#(Element, String), Nil) {
|
||||||
case doc {
|
case doc {
|
||||||
"<![CDATA[" <> tail -> {
|
"<![CDATA[" <> tail -> {
|
||||||
@@ -404,13 +434,22 @@ fn parse_prolog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_misc(doc: String) -> String {
|
fn parse_misc(doc: String) -> String {
|
||||||
let #(_, doc) =
|
case
|
||||||
parse_multiple_optional(
|
try_parsers(
|
||||||
|
[
|
||||||
|
parse_comment,
|
||||||
|
fn(doc) {
|
||||||
|
parse_space(doc)
|
||||||
|
|> result.map(fn(sp) { #(Whitespace, sp.1) })
|
||||||
|
},
|
||||||
|
parse_pi,
|
||||||
|
],
|
||||||
doc,
|
doc,
|
||||||
try_parsers([parse_comment, parse_space], _),
|
|
||||||
"",
|
|
||||||
)
|
)
|
||||||
doc
|
{
|
||||||
|
Ok(#(_element, doc)) -> parse_misc(doc)
|
||||||
|
Error(Nil) -> doc
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_decl(doc: String) -> Result(#(Declaration, String), Nil) {
|
fn parse_decl(doc: String) -> Result(#(Declaration, String), Nil) {
|
||||||
@@ -640,12 +679,12 @@ fn parse_alpha(doc: String) -> Result(#(String, String), Nil) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_comment(doc: String) -> Result(#(String, String), Nil) {
|
fn parse_comment(doc: String) -> Result(#(Element, String), Nil) {
|
||||||
case doc {
|
case doc {
|
||||||
"<!--" <> tail -> {
|
"<!--" <> tail -> {
|
||||||
let #(comment, doc) = do_parse_comment(tail)
|
let #(comment, doc) = do_parse_comment(tail)
|
||||||
case doc {
|
case doc {
|
||||||
"-->" <> tail -> Ok(#(comment, tail))
|
"-->" <> tail -> Ok(#(Comment(comment), tail))
|
||||||
_ -> Error(Nil)
|
_ -> Error(Nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user