@@ -601,7 +601,27 @@ impl<'a> WrapIterImpl<'a> {
601
601
while let Some ( ( idx, ch) ) = self . char_indices . next ( ) {
602
602
let char_width = ch. width ( ) . unwrap_or ( 0 ) ;
603
603
let char_len = ch. len_utf8 ( ) ;
604
- if is_whitespace ( ch) {
604
+
605
+ if ch == '\n' {
606
+ self . split = idx;
607
+ self . split_len = char_len;
608
+ self . line_width_at_split = self . line_width ;
609
+ self . in_whitespace = false ;
610
+
611
+ // If this is not the final line, return the current line. Otherwise,
612
+ // we will return the line with its line break after exiting the loop
613
+ if self . split + self . split_len < self . source . len ( ) {
614
+ let mut line = self . create_result_line ( wrapper) ;
615
+ cow_add_assign ( & mut line, & self . source [ self . start ..self . split ] ) ;
616
+
617
+ self . start = self . split + self . split_len ;
618
+ self . line_width += wrapper. subsequent_indent . width ( ) ;
619
+ self . line_width -= self . line_width_at_split ;
620
+
621
+ return Some ( line) ;
622
+ }
623
+ }
624
+ else if is_whitespace ( ch) {
605
625
// Extend the previous split or create a new one.
606
626
if self . in_whitespace {
607
627
self . split_len += char_len;
@@ -1215,4 +1235,24 @@ mod tests {
1215
1235
" bar" ] ;
1216
1236
assert_eq ! ( dedent( & add_nl( & x) ) , add_nl( & y) ) ;
1217
1237
}
1238
+
1239
+ #[ test]
1240
+ fn multiline ( ) {
1241
+ assert_eq ! ( fill( "1 3 5 7\n 1 3 5 7" , 11 ) , "1 3 5 7\n 1 3 5 7" ) ;
1242
+ assert_eq ! ( fill( "1 3 5 7\n 1 3 5 7" , 5 ) , "1 3 5\n 7\n 1 3 5\n 7" ) ;
1243
+ assert_eq ! ( fill( "1 3 5 7\n 1 3 5 7" , 6 ) , "1 3 5\n 7\n 1 3 5\n 7" ) ;
1244
+ assert_eq ! ( fill( "1 3 5 7\n abcdefghi k" , 5 ) , "1 3 5\n 7\n abcde\n fghi\n k" ) ;
1245
+ assert_eq ! ( fill( "abcdefgh\n i k" , 5 ) , "abcde\n fgh\n i k" ) ;
1246
+ assert_eq ! ( fill( "abcdefgh\n ijklmnop" , 5 ) , "abcde\n fgh\n ijklm\n nop" ) ;
1247
+
1248
+ assert_eq ! ( fill( "test\n " , 11 ) , "test\n " ) ;
1249
+ assert_eq ! ( fill( "test\n a" , 11 ) , "test\n a" ) ;
1250
+ assert_eq ! ( fill( "test\n a\n " , 11 ) , "test\n a\n " ) ;
1251
+ assert_eq ! ( fill( "test\n \n a\n \n " , 11 ) , "test\n \n a\n \n " ) ;
1252
+ assert_eq ! ( fill( "test\n \n abcdefghijk\n \n abcdefghijkm" , 11 ) , "test\n \n abcdefghijk\n \n abcdefghijk\n m" ) ;
1253
+ assert_eq ! ( fill( "test\n abcdefghi\n " , 11 ) , "test\n abcdefghi\n " ) ;
1254
+ assert_eq ! ( fill( "test\n abcdefghi\n \n " , 11 ) , "test\n abcdefghi\n \n " ) ;
1255
+ assert_eq ! ( fill( "test\n abcdefghijklmnopq\n \n " , 11 ) , "test\n abcdefghijk\n lmnopq\n \n " ) ;
1256
+ assert_eq ! ( fill( "test\n abcdefghijklmnopq abcdefghijk\n \n " , 11 ) , "test\n abcdefghijk\n lmnopq\n abcdefghijk\n \n " ) ;
1257
+ }
1218
1258
}
0 commit comments