Integrated the new span class
This commit is contained in:
		
							parent
							
								
									b8e8f19724
								
							
						
					
					
						commit
						f97bb25ca8
					
				@ -85,11 +85,6 @@ pub enum Filter {
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, PartialEq)]
 | 
			
		||||
pub struct Span<'a> {
 | 
			
		||||
    pub contents: &'a str,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone, Debug, PartialEq)]
 | 
			
		||||
pub struct NewSpan<'a> {
 | 
			
		||||
    pub contents: Vec<&'a str>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -500,24 +495,12 @@ fn span_line(i: &str) -> IResult<&str, &str> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Any text that is not a Dust element
 | 
			
		||||
fn new_span(i: &str) -> IResult<&str, NewSpan> {
 | 
			
		||||
fn span(i: &str) -> IResult<&str, Span> {
 | 
			
		||||
    let (remaining, lines) = preceded(
 | 
			
		||||
        opt(span_end_of_line),
 | 
			
		||||
        many1(terminated(span_line, opt(span_end_of_line))),
 | 
			
		||||
    )(i)?;
 | 
			
		||||
    Ok((remaining, NewSpan { contents: lines }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Any text that is not a Dust element
 | 
			
		||||
fn span(i: &str) -> IResult<&str, Span> {
 | 
			
		||||
    let (remaining, body) = verify(
 | 
			
		||||
        alt((
 | 
			
		||||
            take_until("{"),
 | 
			
		||||
            take_until_parser_matches(all_consuming(eof_whitespace)),
 | 
			
		||||
        )),
 | 
			
		||||
        |s: &str| s.len() > 0,
 | 
			
		||||
    )(i)?;
 | 
			
		||||
    Ok((remaining, Span { contents: body }))
 | 
			
		||||
    Ok((remaining, Span { contents: lines }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn body(i: &str) -> IResult<&str, Body> {
 | 
			
		||||
@ -627,32 +610,6 @@ mod tests {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_span() {
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::span("this is just some text"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "",
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: "this is just some text"
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::span("this is just some text {~lb}"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "{~lb}",
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: "this is just some text "
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::span("{~lb}"),
 | 
			
		||||
            Err(Error(("{~lb}", ErrorKind::Verify)))
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_span_end_of_line() {
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
@ -678,43 +635,43 @@ mod tests {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_new_span() {
 | 
			
		||||
    fn test_span() {
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::new_span("this is just some text"),
 | 
			
		||||
            super::span("this is just some text"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "",
 | 
			
		||||
                NewSpan {
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: vec!["this is just some text"]
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::new_span("this is just some text {~lb}"),
 | 
			
		||||
            super::span("this is just some text {~lb}"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "{~lb}",
 | 
			
		||||
                NewSpan {
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: vec!["this is just some text "]
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::new_span("{~lb}"),
 | 
			
		||||
            super::span("{~lb}"),
 | 
			
		||||
            Err(Error(("{~lb}", ErrorKind::Verify)))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::new_span("this is       \t   \n\n    \t \n   \t  multiline text\n     {foo}"),
 | 
			
		||||
            super::span("this is       \t   \n\n    \t \n   \t  multiline text\n     {foo}"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "{foo}",
 | 
			
		||||
                NewSpan {
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: vec!["this is       \t   ", "multiline text"]
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
        );
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            super::new_span("\n    leading whitespace"),
 | 
			
		||||
            super::span("\n    leading whitespace"),
 | 
			
		||||
            Ok((
 | 
			
		||||
                "",
 | 
			
		||||
                NewSpan {
 | 
			
		||||
                Span {
 | 
			
		||||
                    contents: vec!["leading whitespace"]
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
@ -775,7 +732,9 @@ mod tests {
 | 
			
		||||
                    },
 | 
			
		||||
                    contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span { contents: "hello " }),
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: vec!["hello "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
                                filters: Vec::new()
 | 
			
		||||
@ -800,7 +759,9 @@ mod tests {
 | 
			
		||||
                    },
 | 
			
		||||
                    contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span { contents: "hello " }),
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: vec!["hello "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
                                filters: Vec::new()
 | 
			
		||||
@ -810,7 +771,7 @@ mod tests {
 | 
			
		||||
                    else_contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: "goodbye "
 | 
			
		||||
                                contents: vec!["goodbye "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
@ -847,7 +808,9 @@ mod tests {
 | 
			
		||||
                    name: "foo",
 | 
			
		||||
                    contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span { contents: "hello " }),
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: vec!["hello "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
                                filters: Vec::new()
 | 
			
		||||
@ -883,7 +846,9 @@ mod tests {
 | 
			
		||||
                    name: "foo",
 | 
			
		||||
                    contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span { contents: "hello " }),
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: vec!["hello "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
                                filters: Vec::new()
 | 
			
		||||
@ -970,13 +935,15 @@ mod tests {
 | 
			
		||||
                    contents: Some(Body {
 | 
			
		||||
                        elements: vec![
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: "Pet the "
 | 
			
		||||
                                contents: vec!["Pet the "]
 | 
			
		||||
                            }),
 | 
			
		||||
                            TemplateElement::TETag(DustTag::DTReference(Reference {
 | 
			
		||||
                                path: Path { keys: vec!["name"] },
 | 
			
		||||
                                filters: Vec::new()
 | 
			
		||||
                            })),
 | 
			
		||||
                            TemplateElement::TESpan(Span { contents: "!" })
 | 
			
		||||
                            TemplateElement::TESpan(Span {
 | 
			
		||||
                                contents: vec!["!"]
 | 
			
		||||
                            })
 | 
			
		||||
                        ]
 | 
			
		||||
                    }),
 | 
			
		||||
                    else_contents: None
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,10 @@ impl<'a> DustRenderer<'a> {
 | 
			
		||||
        let mut output = String::new();
 | 
			
		||||
        for elem in &body.elements {
 | 
			
		||||
            match elem {
 | 
			
		||||
                TemplateElement::TESpan(span) => output.push_str(span.contents),
 | 
			
		||||
                TemplateElement::TESpan(span) => span
 | 
			
		||||
                    .contents
 | 
			
		||||
                    .iter()
 | 
			
		||||
                    .for_each(|line: &&str| output.push_str(line)),
 | 
			
		||||
                TemplateElement::TETag(dt) => {
 | 
			
		||||
                    output.push_str(&self.render_tag(dt, context)?);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user