diff --git a/crates/anstyle-svg/src/lib.rs b/crates/anstyle-svg/src/lib.rs index 022783ca..8f8a94b9 100644 --- a/crates/anstyle-svg/src/lib.rs +++ b/crates/anstyle-svg/src/lib.rs @@ -88,7 +88,11 @@ impl Term { writeln!(&mut buffer, r#" .{name} {{ fill: {rgb} }}"#).unwrap(); } if name.starts_with(BG_PREFIX) { - writeln!(&mut buffer, r#" .{name} {{ background: {rgb} }}"#).unwrap(); + writeln!( + &mut buffer, + r#" .{name} {{ stroke: {rgb}; fill: {rgb}; user-select: none; }}"# + ) + .unwrap(); } if name.starts_with(UNDERLINE_PREFIX) { writeln!( @@ -149,8 +153,11 @@ impl Term { ) .unwrap(); } + writeln!(&mut buffer).unwrap(); + let mut text_y = line_height; - write!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer, r#" "#).unwrap(); write!(&mut buffer, r#" "#).unwrap(); for (style, string) in &styled { if string.is_empty() { @@ -158,7 +165,7 @@ impl Term { } let mut remaining = string.as_str(); while let Some((fragment, remains)) = remaining.split_once('\n') { - write_span(&mut buffer, style, fragment); + write_bg_span(&mut buffer, style, fragment); text_y += line_height; // HACK: must close tspan on newline to include them in copy/paste writeln!(&mut buffer).unwrap(); @@ -166,10 +173,36 @@ impl Term { write!(&mut buffer, r#" "#).unwrap(); remaining = remains; } - write_span(&mut buffer, style, remaining) + write_bg_span(&mut buffer, style, remaining) } writeln!(&mut buffer, r#" "#).unwrap(); writeln!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer).unwrap(); + + let mut text_y = line_height; + writeln!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer, r#" "#).unwrap(); + write!(&mut buffer, r#" "#).unwrap(); + for (style, string) in &styled { + if string.is_empty() { + continue; + } + let mut remaining = string.as_str(); + while let Some((fragment, remains)) = remaining.split_once('\n') { + write_fg_span(&mut buffer, style, fragment); + text_y += line_height; + // HACK: must close tspan on newline to include them in copy/paste + writeln!(&mut buffer).unwrap(); + writeln!(&mut buffer, r#""#).unwrap(); + write!(&mut buffer, r#" "#).unwrap(); + remaining = remains; + } + write_fg_span(&mut buffer, style, remaining) + } + writeln!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer, r#" "#).unwrap(); + writeln!(&mut buffer).unwrap(); + writeln!(&mut buffer, r#""#).unwrap(); buffer } @@ -178,9 +211,8 @@ impl Term { const FG_COLOR: anstyle::Color = anstyle::Color::Ansi(anstyle::AnsiColor::White); const BG_COLOR: anstyle::Color = anstyle::Color::Ansi(anstyle::AnsiColor::Black); -fn write_span(buffer: &mut String, style: &anstyle::Style, fragment: &str) { +fn write_fg_span(buffer: &mut String, style: &anstyle::Style, fragment: &str) { let fg_color = style.get_fg_color().map(|c| color_name(FG_PREFIX, c)); - let bg_color = style.get_bg_color().map(|c| color_name(BG_PREFIX, c)); let underline_color = style .get_underline_color() .map(|c| color_name(UNDERLINE_PREFIX, c)); @@ -202,9 +234,6 @@ fn write_span(buffer: &mut String, style: &anstyle::Style, fragment: &str) { if let Some(class) = fg_color.as_deref() { classes.push(class); } - if let Some(class) = bg_color.as_deref() { - classes.push(class); - } if let Some(class) = underline_color.as_deref() { classes.push(class); } @@ -250,6 +279,31 @@ fn write_span(buffer: &mut String, style: &anstyle::Style, fragment: &str) { write!(buffer, r#""#).unwrap(); } +fn write_bg_span(buffer: &mut String, style: &anstyle::Style, fragment: &str) { + use unicode_width::UnicodeWidthStr; + + let bg_color = style.get_bg_color().map(|c| color_name(BG_PREFIX, c)); + + let fill = if bg_color.is_some() { "█" } else { " " }; + + let fragment = html_escape::encode_text(fragment); + let width = fragment.width(); + let fragment = fill.repeat(width); + let mut classes = Vec::new(); + if let Some(class) = bg_color.as_deref() { + classes.push(class); + } + use std::fmt::Write as _; + write!(buffer, r#""#).unwrap(); + write!(buffer, "{fragment}").unwrap(); + write!(buffer, r#""#).unwrap(); +} + impl Default for Term { fn default() -> Self { Self::new() diff --git a/crates/anstyle-svg/tests/rainbow.svg b/crates/anstyle-svg/tests/rainbow.svg index ede468bc..3ca22e77 100644 --- a/crates/anstyle-svg/tests/rainbow.svg +++ b/crates/anstyle-svg/tests/rainbow.svg @@ -2,262 +2,262 @@ - color: foreground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ████████████████████████ + + ████████████████████████ + + + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + + + ████████████████████████████████████████████████████████████████████████ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ████████████████████████ + + ████████████████████████ + + + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + ████████████████████████████████████████████████████████████████████████████████████████████████████████████ + + + + ████████████████████████████████████████████████████████████████████████ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + color: foreground 0 1 2 3 4 5 6 7 @@ -819,27 +1215,27 @@ color: background - 0 1 2 3 4 5 6 7 + 0 1 2 3 4 5 6 7 - 8 9 A B C D E F + 8 9 A B C D E F - 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 - 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 + 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 - 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B + 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B - 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F - A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 - C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 + C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 - E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF @@ -1105,27 +1501,27 @@ invert - 0 1 2 3 4 5 6 7 + 0 1 2 3 4 5 6 7 - 8 9 A B C D E F + 8 9 A B C D E F - 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 - 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 + 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 - 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B + 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B - 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F - A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 - C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 + C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 - E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF @@ -1181,4 +1577,5 @@ + diff --git a/crates/anstyle-svg/tests/rg_linus.svg b/crates/anstyle-svg/tests/rg_linus.svg index 718a72ce..a52f7451 100644 --- a/crates/anstyle-svg/tests/rg_linus.svg +++ b/crates/anstyle-svg/tests/rg_linus.svg @@ -25,7 +25,2333 @@ } - kernel/sys.c: * Copyright (C) 1991, 1992 Linus Torvalds + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + kernel/sys.c: * Copyright (C) 1991, 1992 Linus Torvalds kernel/fork.c: * Copyright (C) 1991, 1992 Linus Torvalds @@ -2345,4 +4671,5 @@ +