about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libextra/getopts.rs37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/libextra/getopts.rs b/src/libextra/getopts.rs
index 000520fe41e..a21d9dc605f 100644
--- a/src/libextra/getopts.rs
+++ b/src/libextra/getopts.rs
@@ -689,9 +689,9 @@ pub mod groups {
                 }
             }
 
-            // FIXME: #5516
+            // FIXME: #5516 should be graphemes not codepoints
             // here we just need to indent the start of the description
-            let rowlen = row.len();
+            let rowlen = row.char_len();
             if rowlen < 24 {
                 do (24 - rowlen).times {
                     row.push_char(' ')
@@ -707,14 +707,14 @@ pub mod groups {
                 desc_normalized_whitespace.push_char(' ');
             }
 
-            // FIXME: #5516
+            // FIXME: #5516 should be graphemes not codepoints
             let mut desc_rows = ~[];
             do each_split_within(desc_normalized_whitespace, 54) |substr| {
                 desc_rows.push(substr.to_owned());
                 true
             };
 
-            // FIXME: #5516
+            // FIXME: #5516 should be graphemes not codepoints
             // wrapped description
             row.push_str(desc_rows.connect(desc_sep));
 
@@ -798,7 +798,7 @@ pub mod groups {
             cont
         };
 
-        ss.iter().enumerate().advance(|x| machine(x));
+        ss.char_offset_iter().advance(|x| machine(x));
 
         // Let the automaton 'run out' by supplying trailing whitespace
         while cont && match state { B | C => true, A => false } {
@@ -1580,4 +1580,31 @@ Options:
         debug!("generated: <<%s>>", usage);
         assert!(usage == expected)
     }
+
+    #[test]
+    fn test_groups_usage_description_multibyte_handling() {
+        let optgroups = ~[
+            groups::optflag("k", "k\u2013w\u2013",
+                "The word kiwi is normally spelled with two i's"),
+            groups::optflag("a", "apple",
+                "This \u201Cdescription\u201D has some characters that could \
+confuse the line wrapping; an apple costs 0.51€ in some parts of Europe."),
+        ];
+
+        let expected =
+~"Usage: fruits
+
+Options:
+    -k --k–w–           The word kiwi is normally spelled with two i's
+    -a --apple          This “description” has some characters that could
+                        confuse the line wrapping; an apple costs 0.51€ in
+                        some parts of Europe.
+";
+
+        let usage = groups::usage("Usage: fruits", optgroups);
+
+        debug!("expected: <<%s>>", expected);
+        debug!("generated: <<%s>>", usage);
+        assert!(usage == expected)
+    }
 }