mirror of
https://gitlab.com/xmpp-rs/xmpp-rs.git
synced 2024-07-12 22:21:53 +00:00
minidom: implement Token::XmlDecl
This commit is contained in:
parent
46def7b3a0
commit
931825931a
1 changed files with 46 additions and 2 deletions
|
@ -3,7 +3,7 @@
|
||||||
use nom::{
|
use nom::{
|
||||||
branch::alt,
|
branch::alt,
|
||||||
bytes::streaming::{tag, take_while1},
|
bytes::streaming::{tag, take_while1},
|
||||||
character::{is_space, streaming::{char, digit1, one_of, space0}},
|
character::{is_space, streaming::{char, digit1, one_of, space0, space1}},
|
||||||
combinator::{not, peek, value},
|
combinator::{not, peek, value},
|
||||||
multi::many0,
|
multi::many0,
|
||||||
number::streaming::hex_u32,
|
number::streaming::hex_u32,
|
||||||
|
@ -48,6 +48,11 @@ pub struct Attribute {
|
||||||
/// Parsed XML token
|
/// Parsed XML token
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
pub enum Token {
|
pub enum Token {
|
||||||
|
/// XML declaration `<?xml version="1.0"?>`
|
||||||
|
XmlDecl {
|
||||||
|
/// List of attributes
|
||||||
|
attrs: Vec<Attribute>,
|
||||||
|
},
|
||||||
/// XML element opening tag
|
/// XML element opening tag
|
||||||
StartTag {
|
StartTag {
|
||||||
/// Element name
|
/// Element name
|
||||||
|
@ -96,6 +101,24 @@ impl Token {
|
||||||
} else {
|
} else {
|
||||||
Err(nom::Err::Incomplete(nom::Needed::Unknown))
|
Err(nom::Err::Incomplete(nom::Needed::Unknown))
|
||||||
}
|
}
|
||||||
|
}, |s| {
|
||||||
|
// XmlDecl
|
||||||
|
let (s, _) = tag("?xml")(s)?;
|
||||||
|
let (s, _) = space1(s)?;
|
||||||
|
|
||||||
|
let (s, attrs) = many0(|s| {
|
||||||
|
let (s, (name, value)) = Self::parse_attr(s)?;
|
||||||
|
let (s, _) = space0(s)?;
|
||||||
|
Ok((s, (name, value)))
|
||||||
|
})(s)?;
|
||||||
|
|
||||||
|
let (s, _) = space0(s)?;
|
||||||
|
let (s, _) = tag("?>")(s)?;
|
||||||
|
Ok((s, Token::XmlDecl {
|
||||||
|
attrs: attrs.into_iter()
|
||||||
|
.map(|(name, value)| Attribute { name: name.into(), value })
|
||||||
|
.collect(),
|
||||||
|
}))
|
||||||
}, |s| {
|
}, |s| {
|
||||||
// EndTag
|
// EndTag
|
||||||
let (s, _) = tag("/")(s)?;
|
let (s, _) = tag("/")(s)?;
|
||||||
|
@ -352,7 +375,28 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_xml_decl() {
|
||||||
|
assert_eq!(
|
||||||
|
Ok((&b""[..], Token::XmlDecl {
|
||||||
|
attrs: vec![Attribute {
|
||||||
|
name: LocalName {
|
||||||
|
name: "version".to_owned(),
|
||||||
|
prefix: None,
|
||||||
|
},
|
||||||
|
value: "1.0".to_owned(),
|
||||||
|
}, Attribute {
|
||||||
|
name: LocalName {
|
||||||
|
name: "encoding".to_owned(),
|
||||||
|
prefix: None,
|
||||||
|
},
|
||||||
|
value: "UTF-8".to_owned(),
|
||||||
|
}],
|
||||||
|
})),
|
||||||
|
Token::parse(b"<?xml version='1.0' encoding=\"UTF-8\"?>")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - DOCTYPE
|
// - DOCTYPE
|
||||||
// - xmldecl
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue