diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-13 03:26:03 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-13 03:30:13 +0300 |
| commit | 5cfe5e5e730246948b0c9428ad876b6938590aad (patch) | |
| tree | 53d4bbe1aff6887f63f279eed1b5e4e11e7331b7 /src/terminal/title.rs | |
| parent | 7f3364a468f7dcfd8c9c84e5737fe5699f0e3a93 (diff) | |
feat: add configurable sidebar metadata tokens
Diffstat (limited to 'src/terminal/title.rs')
| -rw-r--r-- | src/terminal/title.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/terminal/title.rs b/src/terminal/title.rs new file mode 100644 index 00000000..32ba19c4 --- /dev/null +++ b/src/terminal/title.rs @@ -0,0 +1,64 @@ +const CLAUDE_ACTIVITY_GLYPHS: &str = "·✢✳✶✻✽"; + +pub(crate) fn stripped_terminal_title(title: &str) -> Option<String> { + let title = title.trim(); + if title.is_empty() { + return None; + } + + let mut chars = title.char_indices(); + let (_, first) = chars.next()?; + let after_first = &title[first.len_utf8()..]; + let recognized = + matches!(first, '\u{2800}'..='\u{28ff}') || CLAUDE_ACTIVITY_GLYPHS.contains(first); + let stripped = if recognized + && (after_first.is_empty() || after_first.chars().next().is_some_and(char::is_whitespace)) + { + after_first.trim() + } else { + title + }; + + (!stripped.is_empty()).then(|| stripped.to_string()) +} + +#[cfg(test)] +mod tests { + use super::stripped_terminal_title; + + #[test] + fn strips_one_recognized_leading_activity_glyph() { + for title in ["⠋ task", "✳ task", " ⠙ task ", "✢ task", "✻ task"] { + assert_eq!(stripped_terminal_title(title).as_deref(), Some("task")); + } + assert_eq!( + stripped_terminal_title("⠋ ⠙ task").as_deref(), + Some("⠙ task") + ); + } + + #[test] + fn preserves_unrecognized_or_unbounded_symbols() { + for (title, expected) in [ + ("★task", "★task"), + ("★ production", "★ production"), + ("✨ task", "✨ task"), + ("☼ status", "☼ status"), + ("@ task", "@ task"), + ("task ⠋ detail", "task ⠋ detail"), + ("[prod] task", "[prod] task"), + ] { + assert_eq!(stripped_terminal_title(title).as_deref(), Some(expected)); + } + } + + #[test] + fn preserves_unicode_text_and_elides_empty_results() { + assert_eq!( + stripped_terminal_title(" ⠋ 修复🙂标题 ").as_deref(), + Some("修复🙂标题") + ); + assert_eq!(stripped_terminal_title(" "), None); + assert_eq!(stripped_terminal_title("⠋ "), None); + } +} |
