WIP: XMLDecl stuff
This commit is contained in:
parent
0a353135c0
commit
3a875666a5
|
@ -30,9 +30,6 @@ struct Attribute<'s> {
|
|||
value: &'s str,
|
||||
}
|
||||
|
||||
/// Contains only latin characters or dash after first char
|
||||
type EncName<'s> = &'s str;
|
||||
|
||||
struct DoctypeDecl<'s> {
|
||||
name: &'s str,
|
||||
// TODO: doctype declaration parsing
|
||||
|
@ -52,15 +49,6 @@ pub fn element(input: &str) -> IResult<&str, Element> {
|
|||
todo!()
|
||||
}
|
||||
|
||||
enum Misc<'s> {
|
||||
Comment(Comment<'s>),
|
||||
PI(PI<'s>),
|
||||
}
|
||||
/// Misc
|
||||
pub fn misc(input: &str) -> IResult<&str, Misc> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
type Document<'s> = (Prolog<'s>, Element<'s>, Vec<Misc<'s>>);
|
||||
/// [1] document ::= prolog element Misc*
|
||||
pub fn document(input: &str) -> IResult<&str, Document> {
|
||||
|
@ -231,6 +219,7 @@ pub fn comment(input: &str) -> IResult<&str, Comment> {
|
|||
)(input)
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct PI<'s> {
|
||||
target: &'s str,
|
||||
instruction: Option<&'s str>,
|
||||
|
@ -294,7 +283,7 @@ pub fn cd_end(input: &str) -> IResult<&str, CDEnd> {
|
|||
}
|
||||
|
||||
type Prolog<'s> = (
|
||||
Option<XMLDecl>,
|
||||
Option<XMLDecl<'s>>,
|
||||
Vec<Misc<'s>>,
|
||||
Option<(DoctypeDecl<'s>, Vec<Misc<'s>>)>,
|
||||
);
|
||||
|
@ -307,25 +296,26 @@ pub fn prolog(input: &str) -> IResult<&str, Prolog> {
|
|||
))(input)
|
||||
}
|
||||
|
||||
struct XMLDecl {
|
||||
struct XMLDecl<'s> {
|
||||
version_info: VersionInfo,
|
||||
// encoding_decl: Option<EncodingDecl>,
|
||||
// sd_decl: Option<SDDecl>,
|
||||
encoding_decl: Option<EncodingDecl<'s>>,
|
||||
sd_decl: Option<SDDecl>,
|
||||
}
|
||||
/// [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
|
||||
pub fn xml_decl(input: &str) -> IResult<&str, XMLDecl> {
|
||||
// (VersionInfo, Option<EncodingDecl>, Option<SDDecl>)
|
||||
let (leftover, (version_info /* encoding_decl, sd_decl */,)) = delimited(
|
||||
let (leftover, (version_info, encoding_decl, sd_decl)) = delimited(
|
||||
tag("<?xml"),
|
||||
tuple((version_info /* opt(encoding_decl), opt(sd_decl) */,)),
|
||||
tag("?>"),
|
||||
tuple((version_info, opt(encoding_decl), opt(sd_decl))),
|
||||
pair(opt(s), tag("?>")),
|
||||
)(input)?;
|
||||
// TODO: change to map
|
||||
Ok((
|
||||
leftover,
|
||||
XMLDecl {
|
||||
version_info,
|
||||
// encoding_decl,
|
||||
// sd_decl,
|
||||
encoding_decl,
|
||||
sd_decl,
|
||||
},
|
||||
))
|
||||
}
|
||||
|
@ -363,6 +353,41 @@ pub fn version_num(input: &str) -> IResult<&str, VersionNum> {
|
|||
)(input)
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
enum Misc<'s> {
|
||||
Comment(Comment<'s>),
|
||||
PI(PI<'s>),
|
||||
S,
|
||||
}
|
||||
/// [27] Misc ::= Comment | PI | S
|
||||
pub fn misc(input: &str) -> IResult<&str, Misc> {
|
||||
alt((
|
||||
map(comment, |comment| Misc::Comment(comment)),
|
||||
map(pi, |pi| Misc::PI(pi)),
|
||||
value(Misc::S, s),
|
||||
))(input)
|
||||
}
|
||||
|
||||
type SDDecl = bool;
|
||||
/// [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))
|
||||
pub fn sd_decl(input: &str) -> IResult<&str, SDDecl> {
|
||||
preceded(
|
||||
tuple((s, tag("standalone"), eq)),
|
||||
alt((
|
||||
delimited(
|
||||
char('\''),
|
||||
alt((value(true, tag("yes")), value(false, tag("no")))),
|
||||
char('\''),
|
||||
),
|
||||
delimited(
|
||||
char('"'),
|
||||
alt((value(true, tag("yes")), value(false, tag("no")))),
|
||||
char('"'),
|
||||
),
|
||||
)),
|
||||
)(input)
|
||||
}
|
||||
|
||||
pub fn reference(input: &str) -> IResult<&str, char> {
|
||||
todo!()
|
||||
}
|
||||
|
@ -371,6 +396,29 @@ pub fn pe_reference(input: &str) -> IResult<&str, char> {
|
|||
todo!()
|
||||
}
|
||||
|
||||
type EncodingDecl<'s> = EncName<'s>;
|
||||
/// [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName
|
||||
pub fn encoding_decl(input: &str) -> IResult<&str, EncodingDecl> {
|
||||
preceded(
|
||||
tuple((s, tag("encoding"), eq)),
|
||||
alt((
|
||||
delimited(char('"'), enc_name, char('"')),
|
||||
delimited(char('\''), enc_name, char('\'')),
|
||||
)),
|
||||
)(input)
|
||||
}
|
||||
|
||||
type EncName<'s> = &'s str;
|
||||
/// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
|
||||
pub fn enc_name(input: &str) -> IResult<&str, EncName> {
|
||||
recognize(pair(
|
||||
satisfy(|c| matches!(c, 'A'..='Z' | 'a'..='z' )),
|
||||
many0(satisfy(
|
||||
|c| matches!(c, 'A'..='Z' | 'a'..='z' | '0'..='9' | '.' | '_' | '-' ),
|
||||
)),
|
||||
))(input)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::num::NonZero;
|
||||
|
|
Loading…
Reference in New Issue