Fleshed out the step_numbered() method some more

This commit is contained in:
Michael Bryan 2017-06-29 20:05:24 +08:00
parent 42de0fb97a
commit 1e8bc1c384
3 changed files with 51 additions and 10 deletions

View File

@ -25,8 +25,16 @@ impl Loader {
Loader { source_directory: source_directory.as_ref().to_path_buf() }
}
/// Parse the summary file and use it to load a book from disk.
pub fn load(&self) -> Result<()> {
let summary = self.parse_summary()
.chain_err(|| "Couldn't parse `SUMMARY.md`")?;
unimplemented!()
}
/// Parse the `SUMMARY.md` file.
pub fn parse_summary(&self) -> Result<Summary> {
fn parse_summary(&self) -> Result<Summary> {
let path = self.source_directory.join("SUMMARY.md");
let mut summary_content = String::new();
@ -34,4 +42,5 @@ impl Loader {
summary::parse_summary(&summary_content)
}
}

View File

@ -225,7 +225,11 @@ impl<'a> SummaryParser<'a> {
State::Begin => self.step_start(next_event)?,
State::PrefixChapters => self.step_prefix(next_event)?,
State::NumberedChapters(n) => self.step_numbered(next_event, n)?,
_ => unimplemented!(),
other => {
trace!("[*] unimplemented state: {:?}", other);
trace!("{:#?}", self.summary);
unimplemented!()
}
}
Ok(())
@ -280,6 +284,7 @@ impl<'a> SummaryParser<'a> {
Ok(())
}
/// Try to parse the title line.
fn parse_title(&mut self) -> Option<String> {
if let Some(Event::Start(Tag::Header(1))) = self.stream.next() {
debug!("[*] Found a h1 in the SUMMARY");
@ -332,19 +337,48 @@ impl<'a> SummaryParser<'a> {
.chain_err(|| "List items should only contain links")?;
trace!("[*] Found a chapter: {:?}", it);
self.push_numbered_section(SummaryItem::Link(it));
Ok(())
let section_number = self.push_numbered_section(SummaryItem::Link(it));
trace!("[*] Section number was {}", section_number);
}
other => unimplemented!()
Event::Start(Tag::List(_)) => {
match self.state {
State::NumberedChapters(n) => {
let new_nest = n + 1;
self.state = State::NumberedChapters(new_nest);
trace!("[*] Nesting level increased to {}", new_nest);
}
other => unreachable!(),
}
}
Event::End(Tag::List(_)) => {
match self.state {
State::NumberedChapters(n) => {
if n == 0 {
trace!("[*] Finished parsing the numbered chapters");
self.state = State::SuffixChapters;
} else {
trace!("[*] Nesting level decreased to {}", n - 1);
self.state = State::NumberedChapters(n - 1);
}
}
other => unreachable!(),
}
}
other => {
trace!("[*] skipping unexpected token: {:?}", other);
}
}
Ok(())
}
/// Push a new section at the end of the current nesting level.
fn push_numbered_section(&mut self, item: SummaryItem) {
fn push_numbered_section(&mut self, item: SummaryItem) -> SectionNumber {
if let State::NumberedChapters(level) = self.state {
push_item_at_nesting_level(&mut self.summary.numbered_chapters, item, level as usize)
.chain_err(|| "The parser should always ensure we add the next item at the correct level")
.unwrap();
.unwrap()
} else {
// this method should only ever be called when parsing a numbered
// section, therefore if we ever get here something has gone
@ -381,7 +415,6 @@ fn push_item_at_nesting_level(links: &mut Vec<SummaryItem>, item: SummaryItem, l
let mut section_number = push_item_at_nesting_level(&mut last_link.nested_items, item, level - 1)?;
section_number.insert(0, index as u32 + 1);
println!("{:?}\t{:?}", section_number, last_link);
Ok(section_number)
}
}

View File

@ -25,8 +25,7 @@ const SUMMARY: &str = "
";
#[test]
#[ignore]
fn load_summary_md() {
fn parse_summary_md() {
env_logger::init().unwrap();
let should_be = Summary {