diff options
| author | Andreu Botella | 2019-10-23 09:29:24 +0200 | 
|---|---|---|
| committer | Philipp A | 2019-10-23 09:29:24 +0200 | 
| commit | 10cc972f2e4b99e6d3082970ee6982bfee5211c0 (patch) | |
| tree | 038f7199c2a27e89df55d7e15ddea1b1e8781341 /src/parser/conversion | |
| parent | 7d38186a0ae3222b6de9bc91290a87d0e4564e18 (diff) | |
| download | rust-rst-10cc972f2e4b99e6d3082970ee6982bfee5211c0.tar.bz2 | |
Resolving substitutions. (#9)
Diffstat (limited to 'src/parser/conversion')
| -rw-r--r-- | src/parser/conversion/block.rs | 7 | ||||
| -rw-r--r-- | src/parser/conversion/inline.rs | 23 | 
2 files changed, 25 insertions, 5 deletions
| diff --git a/src/parser/conversion/block.rs b/src/parser/conversion/block.rs index 714b410..9552539 100644 --- a/src/parser/conversion/block.rs +++ b/src/parser/conversion/block.rs @@ -6,13 +6,14 @@ use crate::document_tree::{  	elements as e,  	element_categories as c,  	extra_attributes as a, +	attribute_types as at  };  use crate::parser::{  	pest_rst::Rule,  	pair_ext_parse::PairExt,  }; -use super::inline::convert_inline; +use super::{whitespace_normalize_name, inline::convert_inline};  #[derive(PartialEq)] @@ -92,14 +93,14 @@ fn convert_target(pair: Pair<Rule>) -> Result<e::Target, Error> {  fn convert_substitution_def(pair: Pair<Rule>) -> Result<e::SubstitutionDefinition, Error> {  	let mut pairs = pair.into_inner(); -	let name = pairs.next().unwrap().as_str();  // Rule::substitution_name +	let name = whitespace_normalize_name(pairs.next().unwrap().as_str());  // Rule::substitution_name  	let inner_pair = pairs.next().unwrap();  	let inner: c::TextOrInlineElement = match inner_pair.as_rule() {  		Rule::image => convert_image::<e::ImageInline>(inner_pair)?.into(),  		rule => panic!("Unknown substitution rule {:?}", rule),  	};  	let mut subst_def = e::SubstitutionDefinition::with_children(vec![inner]); -	subst_def.names_mut().push(name.into()); +	subst_def.names_mut().push(at::NameToken(name));  	Ok(subst_def)  } diff --git a/src/parser/conversion/inline.rs b/src/parser/conversion/inline.rs index c30b71d..50a6258 100644 --- a/src/parser/conversion/inline.rs +++ b/src/parser/conversion/inline.rs @@ -6,6 +6,7 @@ use crate::document_tree::{  	elements as e,  	element_categories as c,  	extra_attributes as a, +	attribute_types as at  };  use crate::parser::{ @@ -13,11 +14,14 @@ use crate::parser::{  //    pair_ext_parse::PairExt,  }; +use super::whitespace_normalize_name; +  pub fn convert_inline(pair: Pair<Rule>) -> Result<c::TextOrInlineElement, Error> {  	Ok(match pair.as_rule() { -		Rule::str       => pair.as_str().into(), -		Rule::reference => convert_reference(pair)?.into(), +		Rule::str       		=> pair.as_str().into(), +		Rule::reference 		=> convert_reference(pair)?.into(), +		Rule::substitution_ref 	=> convert_substitution(pair)?.into(),  		rule => unimplemented!("unknown rule {:?}", rule),  	})  } @@ -42,3 +46,18 @@ fn convert_reference(pair: Pair<Rule>) -> Result<e::Reference, Error> {  		a::Reference { name, refuri, refid, refname }  	))  } + +fn convert_substitution(pair: Pair<Rule>) -> Result<e::SubstitutionReference, Error> { +	let concrete = pair.into_inner().next().unwrap(); +	match concrete.as_rule() { +		Rule::substitution_name => { +			let name = whitespace_normalize_name(concrete.as_str()); +			Ok(a::ExtraAttributes::with_extra( +				a::SubstitutionReference { +					refname: vec![at::NameToken(name)] +				} +			)) +		} +		_ => unreachable!() +	} +} | 
