Summary parser handles suffixes and now all that's left to do is adjusting section numbers
This commit is contained in:
parent
1e757529d7
commit
c3124bc8f3
|
@ -218,18 +218,19 @@ impl<'a> SummaryParser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn step(&mut self) -> Result<()> {
|
fn step(&mut self) -> Result<()> {
|
||||||
let next_event = self.stream.next().expect("TODO: error-chain");
|
if let Some(next_event) = self.stream.next() {
|
||||||
trace!("[*] Current state: {:?}, next event: {:?}", self.state, next_event);
|
trace!("[*] Current state: {:?}, next event: {:?}", self.state, next_event);
|
||||||
|
|
||||||
match self.state {
|
match self.state {
|
||||||
State::Begin => self.step_start(next_event)?,
|
State::Begin => self.step_start(next_event)?,
|
||||||
State::PrefixChapters => self.step_prefix(next_event)?,
|
State::PrefixChapters => self.step_prefix(next_event)?,
|
||||||
State::NumberedChapters(n) => self.step_numbered(next_event, n)?,
|
State::NumberedChapters(n) => self.step_numbered(next_event, n)?,
|
||||||
other => {
|
State::SuffixChapters => self.step_suffix(next_event)?,
|
||||||
trace!("[*] unimplemented state: {:?}", other);
|
State::End => {},
|
||||||
trace!("{:#?}", self.summary);
|
}
|
||||||
unimplemented!()
|
} else {
|
||||||
}
|
trace!("[*] Reached end of SUMMARY.md");
|
||||||
|
self.state = State::End;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -300,6 +301,35 @@ impl<'a> SummaryParser<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn step_suffix(&mut self, event: Event<'a>) -> Result<()> {
|
||||||
|
// FIXME: This has been copy/pasted from step_prefix. make DRY.
|
||||||
|
match event {
|
||||||
|
Event::Start(Tag::Link(location, _)) => {
|
||||||
|
let content = collect_events!(self.stream, Tag::Link(_, _));
|
||||||
|
let text = stringify_events(content);
|
||||||
|
let link = Link {
|
||||||
|
name: text,
|
||||||
|
location: PathBuf::from(location.as_ref()),
|
||||||
|
number: None,
|
||||||
|
nested_items: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
debug!("[*] Found a suffix chapter, {:?}", link.name);
|
||||||
|
self.summary.suffix_chapters.push(SummaryItem::Link(link));
|
||||||
|
},
|
||||||
|
Event::End(Tag::Rule) => {
|
||||||
|
debug!("[*] Found a suffix chapter separator");
|
||||||
|
self.summary.suffix_chapters.push(SummaryItem::Separator);
|
||||||
|
},
|
||||||
|
other => {
|
||||||
|
trace!("[*] Skipping unexpected token in summary: {:?}", other);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Parse a single item (`[Some Chapter Name](./path/to/chapter.md)`).
|
/// Parse a single item (`[Some Chapter Name](./path/to/chapter.md)`).
|
||||||
fn parse_item(&mut self) -> Result<Link> {
|
fn parse_item(&mut self) -> Result<Link> {
|
||||||
let next = self.stream.next();
|
let next = self.stream.next();
|
||||||
|
@ -377,7 +407,8 @@ impl<'a> SummaryParser<'a> {
|
||||||
fn push_numbered_section(&mut self, item: SummaryItem) -> SectionNumber {
|
fn push_numbered_section(&mut self, item: SummaryItem) -> SectionNumber {
|
||||||
if let State::NumberedChapters(level) = self.state {
|
if let State::NumberedChapters(level) = self.state {
|
||||||
push_item_at_nesting_level(&mut self.summary.numbered_chapters, item, level as usize)
|
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")
|
.chain_err(|| format!("The parser should always ensure we add the next \
|
||||||
|
item at the correct level ({}:{})", module_path!(), line!()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
} else {
|
} else {
|
||||||
// this method should only ever be called when parsing a numbered
|
// this method should only ever be called when parsing a numbered
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
//! Integration tests for loading a book into memory
|
//! Integration tests for loading a book into memory
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate pretty_assertions;
|
||||||
extern crate mdbook;
|
extern crate mdbook;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
|
|
||||||
|
@ -7,7 +9,7 @@ use std::path::PathBuf;
|
||||||
use mdbook::loader::{parse_summary, Link, SummaryItem, SectionNumber, Summary};
|
use mdbook::loader::{parse_summary, Link, SummaryItem, SectionNumber, Summary};
|
||||||
|
|
||||||
|
|
||||||
const SUMMARY: &str = "
|
const SUMMARY: &'static str = "
|
||||||
# Summary
|
# Summary
|
||||||
|
|
||||||
[Introduction](/intro.md)
|
[Introduction](/intro.md)
|
||||||
|
@ -16,7 +18,7 @@ const SUMMARY: &str = "
|
||||||
|
|
||||||
[A Prefix Chapter](/some_prefix.md)
|
[A Prefix Chapter](/some_prefix.md)
|
||||||
|
|
||||||
- [First chapter](/chapter_1/index.md)
|
- [First Chapter](/chapter_1/index.md)
|
||||||
- [Some Subsection](/chapter_1/subsection.md)
|
- [Some Subsection](/chapter_1/subsection.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
Loading…
Reference in New Issue