rewrite to actually use pulldown idiomatically
This commit is contained in:
parent
bca533c701
commit
f5d6c9c05b
1 changed files with 31 additions and 49 deletions
80
src/main.rs
80
src/main.rs
|
@ -407,7 +407,7 @@ fn update_garden<P: AsRef<Path>>(
|
||||||
let mut file_string = String::new();
|
let mut file_string = String::new();
|
||||||
file.read_to_string(&mut file_string)?;
|
file.read_to_string(&mut file_string)?;
|
||||||
let markdown_source = preprocess_markdown(file_string);
|
let markdown_source = preprocess_markdown(file_string);
|
||||||
let result = GardenParser::parse(&markdown_source)?;
|
let result = parse_garden(&markdown_source)?;
|
||||||
|
|
||||||
pages.insert(
|
pages.insert(
|
||||||
String::from(path.to_str().unwrap()),
|
String::from(path.to_str().unwrap()),
|
||||||
|
@ -435,66 +435,48 @@ fn update_garden<P: AsRef<Path>>(
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GardenParser<'a> {
|
|
||||||
parser: Parser<'a>,
|
|
||||||
last_nontext_event: Option<Event<'a>>,
|
|
||||||
current_top_heading: u32,
|
|
||||||
top_heading_text: &'a mut Option<String>,
|
|
||||||
links: &'a mut Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ParseResult {
|
struct ParseResult {
|
||||||
html: String,
|
html: String,
|
||||||
title: Option<String>,
|
title: Option<String>,
|
||||||
links: Vec<String>,
|
links: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GardenParser<'a> {
|
fn parse_garden<S: AsRef<str>>(text: S) -> anyhow::Result<ParseResult> {
|
||||||
fn parse<S: AsRef<str>>(text: &'a S) -> anyhow::Result<ParseResult> {
|
let mut current_top_heading = 999;
|
||||||
let mut title: Option<String> = None;
|
let mut top_heading_text: Option<String> = None;
|
||||||
let mut links: Vec<String> = vec![];
|
|
||||||
|
|
||||||
let parser = GardenParser {
|
let mut last_nontext_event: Option<Event> = None;
|
||||||
parser: Parser::new_ext(text.as_ref(), Options::all()),
|
|
||||||
last_nontext_event: None,
|
|
||||||
current_top_heading: 999,
|
|
||||||
top_heading_text: &mut title,
|
|
||||||
links: &mut links,
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut html = String::new();
|
let mut links: Vec<String> = vec![];
|
||||||
html::push_html(&mut html, parser);
|
|
||||||
html = postprocess_html(html)?;
|
|
||||||
|
|
||||||
Ok(ParseResult { html, title, links })
|
let parser = Parser::new_ext(text.as_ref(), Options::all()).map(|event| {
|
||||||
}
|
if let Event::Start(Tag::Link(_, str, _)) = &event {
|
||||||
}
|
links.push(str.to_string());
|
||||||
|
|
||||||
impl<'a> Iterator for GardenParser<'a> {
|
|
||||||
type Item = Event<'a>;
|
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
|
||||||
let event = self.parser.next();
|
|
||||||
|
|
||||||
if let Some(event) = &event {
|
|
||||||
if let Event::Start(Tag::Link(_, str, _)) = &event {
|
|
||||||
self.links.push(str.to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(Event::Start(Tag::Heading(hl))) = self.last_nontext_event {
|
|
||||||
if hl < self.current_top_heading {
|
|
||||||
self.current_top_heading = hl;
|
|
||||||
if let Event::Text(str) = &event {
|
|
||||||
*self.top_heading_text = Some(str.clone().into_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.last_nontext_event = Some(event.clone());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(Event::Start(Tag::Heading(hl))) = last_nontext_event {
|
||||||
|
if hl < current_top_heading {
|
||||||
|
current_top_heading = hl;
|
||||||
|
if let Event::Text(str) = &event {
|
||||||
|
top_heading_text = Some(str.clone().into_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
last_nontext_event = Some(event.clone());
|
||||||
|
|
||||||
event
|
event
|
||||||
}
|
});
|
||||||
|
|
||||||
|
let mut html = String::new();
|
||||||
|
html::push_html(&mut html, parser);
|
||||||
|
html = postprocess_html(html)?;
|
||||||
|
|
||||||
|
Ok(ParseResult {
|
||||||
|
html,
|
||||||
|
title: top_heading_text,
|
||||||
|
links,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn preprocess_markdown(string: String) -> String {
|
fn preprocess_markdown(string: String) -> String {
|
||||||
|
|
Loading…
Reference in a new issue