#![crate_name="rbatis_xml_parser"]
#![crate_type="dylib"]
#![deny(missing_docs)]
#[macro_use] extern crate html5ever_atoms;
#[macro_use] extern crate log;
#[macro_use] extern crate mac;
extern crate phf;
extern crate time;
pub use html5ever_atoms::{Prefix, Namespace, LocalName, QualName};
pub mod tendril {
extern crate tendril;
pub use self::tendril::*;
}
macro_rules! time {
($e:expr) => {{
let t0 = std::time::Instant::now();
let result = $e;
let dt = t0.elapsed().as_secs();
(result, dt)
}}
}
#[macro_use] mod util;
pub mod tokenizer;
pub mod tree_builder;
pub mod rcdom;
use tokenizer::{XmlTokenizerOpts, XmlTokenizer, TokenSink};
use tree_builder::{TreeSink, XmlTreeBuilder};
pub fn parse_to<
Sink:TreeSink,
It: IntoIterator<Item=tendril::StrTendril>
>(
sink: Sink,
input: It,
opts: XmlTokenizerOpts) -> Sink {
let tb = XmlTreeBuilder::new(sink);
let mut tok = XmlTokenizer::new(tb, opts);
for s in input {
tok.feed(s);
}
tok.end();
tok.unwrap().unwrap()
}
pub fn parse<Output, It>(input: It, opts: XmlTokenizerOpts) -> Output
where Output: ParseResult,
It: IntoIterator<Item=tendril::StrTendril>,
{
let sink = parse_to(Default::default(), input, opts);
ParseResult::get_result(sink)
}
pub trait ParseResult {
type Sink: TreeSink + Default;
fn get_result(sink: Self::Sink) -> Self;
}
pub fn tokenize_to<
Sink: TokenSink,
It: IntoIterator<Item=tendril::StrTendril>
>(
sink: Sink,
input: It,
opts: XmlTokenizerOpts) -> Sink {
let mut tok = XmlTokenizer::new(sink, opts);
for s in input {
tok.feed(s);
}
tok.end();
tok.unwrap()
}