aboutsummaryrefslogtreecommitdiff
path: root/src/terminal/title.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-13 03:26:03 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-13 03:30:13 +0300
commit5cfe5e5e730246948b0c9428ad876b6938590aad (patch)
tree53d4bbe1aff6887f63f279eed1b5e4e11e7331b7 /src/terminal/title.rs
parent7f3364a468f7dcfd8c9c84e5737fe5699f0e3a93 (diff)
feat: add configurable sidebar metadata tokens
Diffstat (limited to 'src/terminal/title.rs')
-rw-r--r--src/terminal/title.rs64
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);
+ }
+}