From e096eb2095ce279f5fd097d8e15905b7fb591c0e Mon Sep 17 00:00:00 2001 From: SeongChan Lee Date: Mon, 25 Apr 2022 11:43:42 +0900 Subject: [PATCH] fix: Fix misalignment in report highlight and indent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous method misaligns highlights when there are double width asian characters ``` 39 | 한글 eglish | ^^^^^^ ``` This commit fixes the highlight to have correct alignment. ``` 39 | 한글 eglish | ^^^^^^ ``` `unicode-rs` crate is used by the Rust compiler [1]. [1]: https://github.com/rust-lang/rust/blob/34a6c9f26e2ce32cad0d71f5e342365b09f4d12c/compiler/rustc_errors/src/emitter.rs#L861 --- Cargo.lock | 1 + Cargo.toml | 1 + src/bin/typos-cli/report.rs | 9 +++++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 563a70d..3fdc389 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1576,6 +1576,7 @@ dependencies = [ "typos-vars", "unicase", "unicode-segmentation", + "unicode-width", "varcon-core", "yansi", ] diff --git a/Cargo.toml b/Cargo.toml index 4756e6d..7b6c86c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,7 @@ encoding = "0.2" kstring = { version = "2.0.0", features = ["serde"] } typed-arena = "2.0.1" maplit = "1.0" +unicode-width = "0.1.9" [dev-dependencies] assert_fs = "1.0" diff --git a/src/bin/typos-cli/report.rs b/src/bin/typos-cli/report.rs index 1eb6318..87e7e75 100644 --- a/src/bin/typos-cli/report.rs +++ b/src/bin/typos-cli/report.rs @@ -3,6 +3,8 @@ use std::io::{self, Write}; use std::sync::atomic; +use unicode_width::UnicodeWidthStr; + use typos_cli::report::{Context, Message, Report, Typo}; #[derive(Copy, Clone, Debug)] @@ -218,8 +220,11 @@ fn print_long_correction(msg: &Typo, palette: Palette) -> Result<(), std::io::Er let line_num = context.line_num.to_string(); let line_indent: String = itertools::repeat_n(" ", line_num.len()).collect(); - let hl_indent: String = itertools::repeat_n(" ", column).collect(); - let hl: String = itertools::repeat_n("^", msg.typo.len()).collect(); + let visible_column = UnicodeWidthStr::width(start.as_ref()); + let visible_len = UnicodeWidthStr::width(msg.typo); + + let hl_indent: String = itertools::repeat_n(" ", visible_column).collect(); + let hl: String = itertools::repeat_n("^", visible_len).collect(); writeln!(handle, "{} |", line_indent)?; writeln!(