Skip to content

Commit c193f53

Browse files
committed
Initial implementation of the newline_to_br filter
1 parent 9d4c47f commit c193f53

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/filters.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,15 @@ pub fn modulo(input: &Value, args: &[Value]) -> FilterResult {
403403
}
404404
}
405405

406+
/// Replaces every newline (`\n`) with an HTML line break (`<br>`).
407+
pub fn newline_to_br(input: &Value, args: &[Value]) -> FilterResult {
408+
try!(check_args_len(args, 0));
409+
match *input {
410+
Str(ref x) => Ok(Str(x.replace("\n", "<br />"))),
411+
_ => Err(InvalidType("String expected".to_owned())),
412+
}
413+
}
414+
406415
/// Returns the number of already escaped characters.
407416
fn nr_escaped(text: &str) -> usize {
408417
for prefix in &["lt;", "gt;", "#39;", "quot;", "amp;"] {
@@ -875,6 +884,31 @@ mod tests {
875884
assert_eq!(unit!(modulo, Num(183.357), &[Num(12_f32)]), Num(3.3569946));
876885
}
877886

887+
#[test]
888+
fn unit_newline_to_br() {
889+
let input = &tos!("a\nb");
890+
let args = &[];
891+
let desired_result = tos!("a<br />b");
892+
assert_eq!(unit!(newline_to_br, input, args), desired_result);
893+
}
894+
895+
#[test]
896+
fn unit_newline_to_br_one_argument() {
897+
let input = &tos!("a\nb");
898+
let args = &[Num(0f32)];
899+
let desired_result = FilterError::InvalidArgumentCount("expected 0, 1 given".to_owned());
900+
assert_eq!(failed!(newline_to_br, input, args), desired_result);
901+
}
902+
903+
#[test]
904+
fn unit_newline_to_br_hello_world() {
905+
/// First example from https://shopify.github.io/liquid/filters/newline_to_br/
906+
let input = &tos!("\nHello\nWorld\n");
907+
let args = &[];
908+
let desired_result = tos!("<br />Hello<br />World<br />");
909+
assert_eq!(unit!(newline_to_br, input, args), desired_result);
910+
}
911+
878912
#[test]
879913
fn unit_escape() {
880914
assert_eq!(unit!(escape, tos!("Have you read 'James & the Giant Peach'?")),

src/template.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use context::Context;
33
use filters::{size, upcase, downcase, capitalize, minus, plus, times, divided_by, ceil, floor,
44
round, prepend, append, first, last, pluralize, replace_first, replace, date, sort,
55
slice, modulo, escape, escape_once, remove_first, remove, reverse, strip_html,
6-
truncatewords};
6+
truncatewords, newline_to_br};
77
use filters::split;
88
use filters::join;
99
use error::Result;
@@ -29,6 +29,7 @@ impl Renderable for Template {
2929
context.maybe_add_filter("last", Box::new(last));
3030
context.maybe_add_filter("minus", Box::new(minus));
3131
context.maybe_add_filter("modulo", Box::new(modulo));
32+
context.maybe_add_filter("newline_to_br", Box::new(newline_to_br));
3233
context.maybe_add_filter("pluralize", Box::new(pluralize));
3334
context.maybe_add_filter("plus", Box::new(plus));
3435
context.maybe_add_filter("prepend", Box::new(prepend));

0 commit comments

Comments
 (0)