mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
fold: Adding combining character support (#9328)
* Adding combining character support for fold * add fullwidth to the spell ignore list * addressing comments and cargo fmt fixes * clippy fixes for test files --------- Co-authored-by: Christopher Illarionova <drydench@amazon.com> Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
This commit is contained in:
co-authored by
Christopher Illarionova
Sylvestre Ledru
parent
6c44000d08
commit
2a314c7ff3
@@ -434,6 +434,15 @@ fn process_utf8_line<W: Write>(line: &str, ctx: &mut FoldContext<'_, W>) -> URes
|
||||
let mut iter = line.char_indices().peekable();
|
||||
|
||||
while let Some((byte_idx, ch)) = iter.next() {
|
||||
// Include combining characters with the base character
|
||||
while let Some(&(_, next_ch)) = iter.peek() {
|
||||
if unicode_width::UnicodeWidthChar::width(next_ch).unwrap_or(1) == 0 {
|
||||
iter.next();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let next_idx = iter.peek().map(|(idx, _)| *idx).unwrap_or(line_bytes.len());
|
||||
|
||||
if ch == '\n' {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
//
|
||||
// For the full copyright and license information, please view the LICENSE
|
||||
// file that was distributed with this source code.
|
||||
// spell-checker:ignore fullwidth
|
||||
|
||||
use uutests::new_ucmd;
|
||||
|
||||
#[test]
|
||||
@@ -597,3 +599,36 @@ fn test_all_tab_advances_at_non_utf8_character() {
|
||||
.succeeds()
|
||||
.stdout_is_fixture_bytes("non_utf8_tab_stops_w16.expected");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_combining_characters_nfc() {
|
||||
// e acute NFC form (single character)
|
||||
let e_acute_nfc = "\u{00E9}"; // é as single character
|
||||
new_ucmd!()
|
||||
.arg("-w2")
|
||||
.pipe_in(format!("{e_acute_nfc}{e_acute_nfc}{e_acute_nfc}"))
|
||||
.succeeds()
|
||||
.stdout_is(format!("{e_acute_nfc}{e_acute_nfc}\n{e_acute_nfc}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_combining_characters_nfd() {
|
||||
// e acute NFD form (base + combining acute)
|
||||
let e_acute_nfd = "e\u{0301}"; // e + combining acute accent
|
||||
new_ucmd!()
|
||||
.arg("-w2")
|
||||
.pipe_in(format!("{e_acute_nfd}{e_acute_nfd}{e_acute_nfd}"))
|
||||
.succeeds()
|
||||
.stdout_is(format!("{e_acute_nfd}{e_acute_nfd}\n{e_acute_nfd}"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_fullwidth_characters() {
|
||||
// e fullwidth (takes 2 columns)
|
||||
let e_fullwidth = "\u{FF45}"; // e
|
||||
new_ucmd!()
|
||||
.arg("-w2")
|
||||
.pipe_in(format!("{e_fullwidth}{e_fullwidth}"))
|
||||
.succeeds()
|
||||
.stdout_is(format!("{e_fullwidth}\n{e_fullwidth}"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user