rewrite to actually use pulldown idiomatically
This commit is contained in:
		
							parent
							
								
									bca533c701
								
							
						
					
					
						commit
						f5d6c9c05b
					
				
					 1 changed files with 31 additions and 49 deletions
				
			
		
							
								
								
									
										78
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										78
									
								
								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 last_nontext_event: Option<Event> = None; | ||||||
|  | 
 | ||||||
|     let mut links: Vec<String> = vec![]; |     let mut links: Vec<String> = vec![]; | ||||||
| 
 | 
 | ||||||
|         let parser = GardenParser { |     let parser = Parser::new_ext(text.as_ref(), Options::all()).map(|event| { | ||||||
|             parser: Parser::new_ext(text.as_ref(), Options::all()), |         if let Event::Start(Tag::Link(_, str, _)) = &event { | ||||||
|             last_nontext_event: None, |             links.push(str.to_string()); | ||||||
|             current_top_heading: 999, |         } | ||||||
|             top_heading_text: &mut title, | 
 | ||||||
|             links: &mut links, |         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 | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     let mut html = String::new(); |     let mut html = String::new(); | ||||||
|     html::push_html(&mut html, parser); |     html::push_html(&mut html, parser); | ||||||
|     html = postprocess_html(html)?; |     html = postprocess_html(html)?; | ||||||
| 
 | 
 | ||||||
|         Ok(ParseResult { html, title, links }) |     Ok(ParseResult { | ||||||
|     } |         html, | ||||||
| } |         title: top_heading_text, | ||||||
| 
 |         links, | ||||||
| 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()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         event |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn preprocess_markdown(string: String) -> String { | fn preprocess_markdown(string: String) -> String { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue