prepass: avoid peekable for block iter
This commit is contained in:
		
					parent
					
						
							
								5ddbd728a8
							
						
					
				
			
			
				commit
				
					
						253d1d2d4b
					
				
			
		
					 1 changed files with 27 additions and 20 deletions
				
			
		
							
								
								
									
										47
									
								
								src/lib.rs
									
										
									
									
									
								
							
							
						
						
									
										47
									
								
								src/lib.rs
									
										
									
									
									
								
							| 
						 | 
					@ -598,49 +598,56 @@ impl<'s> PrePass<'s> {
 | 
				
			||||||
    #[must_use]
 | 
					    #[must_use]
 | 
				
			||||||
    fn new(
 | 
					    fn new(
 | 
				
			||||||
        src: &'s str,
 | 
					        src: &'s str,
 | 
				
			||||||
        blocks: std::slice::Iter<block::Event<'s>>,
 | 
					        mut blocks: std::slice::Iter<block::Event<'s>>,
 | 
				
			||||||
        inline_parser: &mut inline::Parser<'s>,
 | 
					        inline_parser: &mut inline::Parser<'s>,
 | 
				
			||||||
    ) -> Self {
 | 
					    ) -> Self {
 | 
				
			||||||
        let mut link_definitions = Map::new();
 | 
					        let mut link_definitions = Map::new();
 | 
				
			||||||
        let mut headings: Vec<Heading> = Vec::new();
 | 
					        let mut headings: Vec<Heading> = Vec::new();
 | 
				
			||||||
        let mut used_ids: Set<String> = Set::new();
 | 
					        let mut used_ids: Set<String> = Set::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut blocks = blocks.peekable();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let mut attr_prev: Option<Range<usize>> = None;
 | 
					        let mut attr_prev: Option<Range<usize>> = None;
 | 
				
			||||||
        while let Some(e) = blocks.next() {
 | 
					        while let Some(e) = blocks.next() {
 | 
				
			||||||
            match e.kind {
 | 
					            match e.kind {
 | 
				
			||||||
                block::EventKind::Enter(block::Node::Leaf(block::Leaf::LinkDefinition {
 | 
					                block::EventKind::Enter(block::Node::Leaf(block::Leaf::LinkDefinition {
 | 
				
			||||||
                    label,
 | 
					                    label,
 | 
				
			||||||
                })) => {
 | 
					                })) => {
 | 
				
			||||||
                    fn next_is_inline(
 | 
					 | 
				
			||||||
                        bs: &mut std::iter::Peekable<std::slice::Iter<block::Event>>,
 | 
					 | 
				
			||||||
                    ) -> bool {
 | 
					 | 
				
			||||||
                        matches!(bs.peek().map(|e| &e.kind), Some(block::EventKind::Inline))
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    // All link definition tags have to be obtained initially, as references can
 | 
					                    // All link definition tags have to be obtained initially, as references can
 | 
				
			||||||
                    // appear before the definition.
 | 
					                    // appear before the definition.
 | 
				
			||||||
                    let attrs = attr_prev
 | 
					                    let attrs = attr_prev
 | 
				
			||||||
                        .as_ref()
 | 
					                        .as_ref()
 | 
				
			||||||
                        .map_or_else(Attributes::new, |sp| attr::parse(&src[sp.clone()]));
 | 
					                        .map_or_else(Attributes::new, |sp| attr::parse(&src[sp.clone()]));
 | 
				
			||||||
                    let url = if !next_is_inline(&mut blocks) {
 | 
					                    let url = if let Some(block::Event {
 | 
				
			||||||
                        "".into()
 | 
					                        kind: block::EventKind::Inline,
 | 
				
			||||||
                    } else {
 | 
					                        span,
 | 
				
			||||||
                        let start = src[blocks.next().as_ref().unwrap().span.clone()]
 | 
					                    }) = blocks.next()
 | 
				
			||||||
                            .trim_matches(|c: char| c.is_ascii_whitespace());
 | 
					                    {
 | 
				
			||||||
                        if !next_is_inline(&mut blocks) {
 | 
					                        let start =
 | 
				
			||||||
                            start.into()
 | 
					                            src[span.clone()].trim_matches(|c: char| c.is_ascii_whitespace());
 | 
				
			||||||
                        } else {
 | 
					                        if let Some(block::Event {
 | 
				
			||||||
 | 
					                            kind: block::EventKind::Inline,
 | 
				
			||||||
 | 
					                            span,
 | 
				
			||||||
 | 
					                        }) = blocks.next()
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
                            let mut url = start.to_string();
 | 
					                            let mut url = start.to_string();
 | 
				
			||||||
                            while next_is_inline(&mut blocks) {
 | 
					 | 
				
			||||||
                            url.push_str(
 | 
					                            url.push_str(
 | 
				
			||||||
                                    src[blocks.next().as_ref().unwrap().span.clone()]
 | 
					                                src[span.clone()].trim_matches(|c: char| c.is_ascii_whitespace()),
 | 
				
			||||||
 | 
					                            );
 | 
				
			||||||
 | 
					                            while let Some(block::Event {
 | 
				
			||||||
 | 
					                                kind: block::EventKind::Inline,
 | 
				
			||||||
 | 
					                                span,
 | 
				
			||||||
 | 
					                            }) = blocks.next()
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                url.push_str(
 | 
				
			||||||
 | 
					                                    src[span.clone()]
 | 
				
			||||||
                                        .trim_matches(|c: char| c.is_ascii_whitespace()),
 | 
					                                        .trim_matches(|c: char| c.is_ascii_whitespace()),
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            url.into()
 | 
					                            url.into() // owned
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            start.into() // borrowed
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        "".into() // static
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
                    link_definitions.insert(label, (url, attrs));
 | 
					                    link_definitions.insert(label, (url, attrs));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue