diff --git a/lib/underscore.string.js b/lib/underscore.string.js
index f9a2e29a..2ae27621 100644
--- a/lib/underscore.string.js
+++ b/lib/underscore.string.js
@@ -622,6 +622,11 @@
str = _s.trim(str);
if (boolMatch(str, trueValues || ["true", "1"])) return true;
if (boolMatch(str, falseValues || ["false", "0"])) return false;
+ },
+
+ ln2br: function(str, isXhtml){
+ var breakTag = (isXhtml || typeof isXhtml === 'undefined') ? '
' : '
';
+ return makeString(str).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
}
};
diff --git a/test/strings.js b/test/strings.js
index 446d56f0..8ef7a83e 100644
--- a/test/strings.js
+++ b/test/strings.js
@@ -778,4 +778,15 @@ $(document).ready(function() {
strictEqual(_.toBoolean(" true "), true);
});
+ test('String: ln2br', function() {
+ equal(_.ln2br('foo\nbar', false), 'foo
\nbar');
+ equal(_.ln2br('foo\n\nbar', false), 'foo
\n
\nbar');
+ equal(_.ln2br('\nfoo\n\nbar\n', false), '
\nfoo
\n
\nbar
\n');
+ equal(_.ln2br('\n\nfoo\n\nbar\n\n', false), '
\n
\nfoo
\n
\nbar
\n
\n');
+ equal(_.ln2br('foo\nbar'), 'foo
\nbar');
+ equal(_.ln2br('foo\n\nbar'), 'foo
\n
\nbar');
+ equal(_.ln2br('\nfoo\n\nbar\n'), '
\nfoo
\n
\nbar
\n');
+ equal(_.ln2br('foo\nbar\nfoo\nbar'), 'foo
\nbar
\nfoo
\nbar');
+ equal(_.ln2br('\n\nfoo\n\nbar\n\n'), '
\n
\nfoo
\n
\nbar
\n
\n');
+ });
});