From 10cc972f2e4b99e6d3082970ee6982bfee5211c0 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Wed, 23 Oct 2019 09:29:24 +0200 Subject: Resolving substitutions. (#9) --- src/parser/conversion/block.rs | 7 ++++--- src/parser/conversion/inline.rs | 23 +++++++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) (limited to 'src/parser/conversion') 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) -> Result { fn convert_substitution_def(pair: Pair) -> Result { 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::(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) -> Result { 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) -> Result { a::Reference { name, refuri, refid, refname } )) } + +fn convert_substitution(pair: Pair) -> Result { + 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!() + } +} -- cgit v1.2.3