diff options
| -rw-r--r-- | src/document_tree/attribute_types.rs | 13 | ||||
| -rw-r--r-- | src/parser.rs | 15 | ||||
| -rw-r--r-- | src/parser/simplify.rs | 34 | 
3 files changed, 52 insertions, 10 deletions
| diff --git a/src/document_tree/attribute_types.rs b/src/document_tree/attribute_types.rs index 1648c18..219a0ac 100644 --- a/src/document_tree/attribute_types.rs +++ b/src/document_tree/attribute_types.rs @@ -6,7 +6,7 @@ use regex::Regex;  use crate::target; -#[derive(Debug,PartialEq,Serialize)] +#[derive(Debug,PartialEq,Eq,Hash,Serialize)]  pub enum EnumeratedListType {  	Arabic,  	LowerAlpha, @@ -15,16 +15,17 @@ pub enum EnumeratedListType {  	UpperRoman,  } -#[derive(Debug,PartialEq,Serialize)] +#[derive(Debug,PartialEq,Eq,Hash,Serialize)]  pub enum FixedSpace { Default, Preserve }  // yes, default really is not “Default”  impl Default for FixedSpace { fn default() -> FixedSpace { FixedSpace::Preserve } } -#[derive(Debug,PartialEq,Serialize)] pub enum AlignH { Left, Center, Right} -#[derive(Debug,PartialEq,Serialize)] pub enum AlignHV { Top, Middle, Bottom, Left, Center, Right } +#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub enum AlignH { Left, Center, Right} +#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub enum AlignHV { Top, Middle, Bottom, Left, Center, Right } -#[derive(Debug,PartialEq,Serialize)] pub struct ID(pub String); -#[derive(Debug,PartialEq,Serialize)] pub struct NameToken(pub String); +#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub struct ID(pub String); +#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub struct NameToken(pub String); +// no eq for f64  #[derive(Debug,PartialEq,Serialize)]  pub enum Measure {  // http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#length-units  	Em(f64), diff --git a/src/parser.rs b/src/parser.rs index 89e6827..b2512cc 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,5 +1,6 @@  pub mod token;  pub mod conversion; +mod simplify;  mod pest_rst;  mod pair_ext_parse;  #[cfg(test)] @@ -8,14 +9,20 @@ pub mod tests;  use failure::Error;  use pest::Parser; -use crate::document_tree::elements::Document; +use crate::document_tree::Document;  use self::pest_rst::{RstParser,Rule};  use self::conversion::convert_document; +use self::simplify::resolve_references; -/// tokens to Document tree. resolves sections, but not references +/// Parse into a document tree and resolve sections, but not references. +pub fn parse_only(source: &str) -> Result<Document, Error> { +	let pairs = RstParser::parse(Rule::document, source)?; +	convert_document(pairs) +} + +/// Parse into a document tree and resolve sections and references.   pub fn parse(source: &str) -> Result<Document, Error> { -    let pairs = RstParser::parse(Rule::document, source)?; -    convert_document(pairs) +	parse_only(source).map(resolve_references)  } diff --git a/src/parser/simplify.rs b/src/parser/simplify.rs new file mode 100644 index 0000000..2743a69 --- /dev/null +++ b/src/parser/simplify.rs @@ -0,0 +1,34 @@ +use std::collections::HashMap; + +use crate::target::Target; +use crate::document_tree::{ +	Document, +	HasChildren, +	attribute_types::ID, +	element_categories as c, +}; + + +trait ResolvableRefs { +	fn populate_targets(&self, refs: &mut HashMap<&ID, Target>); +	fn resolve_refs(self, refs: &HashMap<&ID, Target>) -> Self; +} + +pub fn resolve_references(mut doc: Document) -> Document { +	let mut references = HashMap::new(); +	for c in doc.children() { +		c.populate_targets(&mut references); +	} +	let new: Vec<_> = doc.children_mut().drain(..).map(|c| c.resolve_refs(&references)).collect(); +	Document::with_children(new) +} + +impl ResolvableRefs for c::StructuralSubElement { +	fn populate_targets(&self, refs: &mut HashMap<&ID, Target>) { +		//TODO +	} +	fn resolve_refs(self, refs: &HashMap<&ID, Target>) -> Self { +		self //TODO +	} +} + | 
