From 588f2474c4f13417c9dae18defc657fcb6c0f07e Mon Sep 17 00:00:00 2001 From: Philipp A Date: Sun, 8 Dec 2019 16:05:52 +0100 Subject: Convert bullet list --- src/parser/conversion/block.rs | 57 +++++++++++++++++++++++++++++++---------- src/parser/conversion/inline.rs | 4 +++ 2 files changed, 48 insertions(+), 13 deletions(-) (limited to 'src/parser') diff --git a/src/parser/conversion/block.rs b/src/parser/conversion/block.rs index cc2d7d1..1e5d88f 100644 --- a/src/parser/conversion/block.rs +++ b/src/parser/conversion/block.rs @@ -13,7 +13,7 @@ use crate::parser::{ pest_rst::Rule, pair_ext_parse::PairExt, }; -use super::{whitespace_normalize_name, inline::convert_inline}; +use super::{whitespace_normalize_name, inline::convert_inlines}; #[derive(PartialEq)] @@ -28,18 +28,35 @@ pub(super) enum TitleOrSsubel { pub(super) fn convert_ssubel(pair: Pair) -> Result, Error> { use self::TitleOrSsubel::*; Ok(Some(match pair.as_rule() { - Rule::title => { let (t, k) = convert_title(pair)?; Title(t, k) }, - Rule::paragraph => Ssubel(convert_paragraph(pair)?.into()), - Rule::target => Ssubel(convert_target(pair)?.into()), - Rule::substitution_def => Ssubel(convert_substitution_def(pair)?.into()), - Rule::admonition_gen => Ssubel(convert_admonition_gen(pair)?.into()), - Rule::image => Ssubel(convert_image::(pair)?.into()), - Rule::EOI => return Ok(None), - rule => panic!("unknown rule {:?}", rule), + Rule::title => { let (t, k) = convert_title(pair)?; Title(t, k) }, + //TODO: subtitle, dectoration, docinfo + Rule::EOI => return Ok(None), + _ => Ssubel(convert_substructure(pair)?.into()), })) } +fn convert_substructure(pair: Pair) -> Result { + Ok(match pair.as_rule() { + // todo: Topic, Sidebar, Transition, Section + _ => convert_body_elem(pair)?.into(), + }) +} + + +fn convert_body_elem(pair: Pair) -> Result { + Ok(match pair.as_rule() { + Rule::paragraph => convert_paragraph(pair)?.into(), + Rule::target => convert_target(pair)?.into(), + Rule::substitution_def => convert_substitution_def(pair)?.into(), + Rule::admonition_gen => convert_admonition_gen(pair)?.into(), + Rule::image => convert_image::(pair)?.into(), + Rule::bullet_list => convert_bullet_list(pair)?.into(), + rule => unimplemented!("unhandled rule {:?}", rule), + }) +} + + fn convert_title(pair: Pair) -> Result<(e::Title, TitleKind), Error> { let mut title: Option> = None; let mut adornment_char: Option = None; @@ -48,7 +65,7 @@ fn convert_title(pair: Pair) -> Result<(e::Title, TitleKind), Error> { let kind = inner_pair.as_rule(); for p in inner_pair.into_inner() { match p.as_rule() { - Rule::line => title = Some(p.into_inner().map(convert_inline).collect::>()?), + Rule::line => title = Some(convert_inlines(p)?), Rule::adornments => adornment_char = Some(p.as_str().chars().next().expect("Empty adornment?")), rule => unimplemented!("Unexpected rule in title: {:?}", rule), }; @@ -66,8 +83,7 @@ fn convert_title(pair: Pair) -> Result<(e::Title, TitleKind), Error> { fn convert_paragraph(pair: Pair) -> Result { - let children = pair.into_inner().map(convert_inline).collect::>()?; - Ok(e::Paragraph::with_children(children)) + Ok(e::Paragraph::with_children(convert_inlines(pair)?)) } @@ -105,7 +121,7 @@ fn convert_substitution_def(pair: Pair) -> Result) -> Result, Error> { let mut pairs = pair.into_inner(); let paragraph = pairs.next().unwrap(); - paragraph.into_inner().map(convert_inline).collect() + convert_inlines(paragraph) } fn convert_image(pair: Pair) -> Result where I: Element + ExtraAttributes { @@ -159,3 +175,18 @@ fn convert_admonition_gen(pair: Pair) -> Result { typ => panic!("Unknown admontion type {}!", typ), }) } + +fn convert_bullet_list(pair: Pair) -> Result { + Ok(e::BulletList::with_children(pair.into_inner().map(convert_bullet_item).collect::>()?)) +} + +fn convert_bullet_item(pair: Pair) -> Result { + let mut iter = pair.into_inner(); + let mut children: Vec = vec![ + convert_paragraph(iter.next().unwrap())?.into() + ]; + for p in iter { + children.push(convert_body_elem(p)?); + } + Ok(e::ListItem::with_children(children)) +} diff --git a/src/parser/conversion/inline.rs b/src/parser/conversion/inline.rs index 79e6f12..ed118c3 100644 --- a/src/parser/conversion/inline.rs +++ b/src/parser/conversion/inline.rs @@ -26,6 +26,10 @@ pub fn convert_inline(pair: Pair) -> Result }) } +pub fn convert_inlines(pair: Pair) -> Result, Error> { + pair.into_inner().map(convert_inline).collect() +} + fn convert_reference(pair: Pair) -> Result { let name; let refuri; -- cgit v1.2.3