diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 5d0b7ab..968803b 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -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 diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 957bc4a..601e391 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -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)?); }