mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Switch from ansi-parser to cansi, down to a single version of nom!
This commit is contained in:
parent
6ed75fa3aa
commit
9dd1b6c785
117
Cargo.lock
generated
117
Cargo.lock
generated
@ -62,7 +62,7 @@ checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
||||
dependencies = [
|
||||
"getrandom 0.2.7",
|
||||
"once_cell",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -74,7 +74,7 @@ dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"getrandom 0.2.7",
|
||||
"once_cell",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -130,16 +130,6 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi-parser"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bcb2392079bf27198570d6af79ecbd9ec7d8f16d3ec6b60933922fdb66287127"
|
||||
dependencies = [
|
||||
"heapless 0.5.6",
|
||||
"nom 4.2.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.12.1"
|
||||
@ -236,18 +226,6 @@ version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
|
||||
|
||||
[[package]]
|
||||
name = "as-slice"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0"
|
||||
dependencies = [
|
||||
"generic-array 0.12.4",
|
||||
"generic-array 0.13.3",
|
||||
"generic-array 0.14.6",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ash"
|
||||
version = "0.32.1"
|
||||
@ -504,7 +482,7 @@ version = "0.10.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
|
||||
dependencies = [
|
||||
"generic-array 0.14.6",
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -594,6 +572,12 @@ dependencies = [
|
||||
"nix 0.18.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cansi"
|
||||
version = "2.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4bdcae87153686017415ce77e48c53e6818a0a058f0e21b56640d1e944967ef8"
|
||||
|
||||
[[package]]
|
||||
name = "cassowary"
|
||||
version = "0.3.0"
|
||||
@ -645,7 +629,7 @@ version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
||||
dependencies = [
|
||||
"nom 7.1.3",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1460,7 +1444,7 @@ version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
|
||||
dependencies = [
|
||||
"generic-array 0.14.6",
|
||||
"generic-array",
|
||||
"typenum",
|
||||
]
|
||||
|
||||
@ -1731,7 +1715,7 @@ dependencies = [
|
||||
"ahash 0.8.0",
|
||||
"lazy_static",
|
||||
"log",
|
||||
"nom 7.1.3",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2256,24 +2240,6 @@ dependencies = [
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.12.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.13.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.14.6"
|
||||
@ -2281,7 +2247,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2518,7 +2484,7 @@ version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15"
|
||||
dependencies = [
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2652,15 +2618,6 @@ version = "1.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
|
||||
|
||||
[[package]]
|
||||
name = "hash32"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hash32"
|
||||
version = "0.2.1"
|
||||
@ -2708,18 +2665,6 @@ dependencies = [
|
||||
"hashbrown 0.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heapless"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1"
|
||||
dependencies = [
|
||||
"as-slice",
|
||||
"generic-array 0.13.3",
|
||||
"hash32 0.1.1",
|
||||
"stable_deref_trait",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heapless"
|
||||
version = "0.7.16"
|
||||
@ -2727,7 +2672,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
|
||||
dependencies = [
|
||||
"atomic-polyfill",
|
||||
"hash32 0.2.1",
|
||||
"hash32",
|
||||
"rustc_version 0.4.0",
|
||||
"spin 0.9.4",
|
||||
"stable_deref_trait",
|
||||
@ -3867,16 +3812,6 @@ dependencies = [
|
||||
"rand_xorshift",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "4.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"version_check 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
@ -4574,7 +4509,7 @@ dependencies = [
|
||||
"proc-macro2 1.0.43",
|
||||
"quote 1.0.21",
|
||||
"syn 1.0.100",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4585,7 +4520,7 @@ checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.43",
|
||||
"quote 1.0.21",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5207,7 +5142,7 @@ version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b40f1bfe5acdab44bc63e6699c28b74f75ec43afb59f3eda01e145aff86a25fa"
|
||||
dependencies = [
|
||||
"heapless 0.7.16",
|
||||
"heapless",
|
||||
"num-traits",
|
||||
"smallvec",
|
||||
]
|
||||
@ -5774,7 +5709,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -6473,7 +6408,7 @@ version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd59ecde1e694c0495c8b92bdd0f9a70e3b489cd8180fc6a18f6ea1c1026f3b2"
|
||||
dependencies = [
|
||||
"nom 7.1.3",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -6497,7 +6432,7 @@ version = "0.9.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622"
|
||||
dependencies = [
|
||||
"version_check 0.9.4",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -7016,7 +6951,7 @@ dependencies = [
|
||||
name = "veloren-server-cli"
|
||||
version = "0.14.0"
|
||||
dependencies = [
|
||||
"ansi-parser",
|
||||
"cansi",
|
||||
"clap 3.2.22",
|
||||
"crossterm 0.25.0",
|
||||
"lazy_static",
|
||||
@ -7209,12 +7144,6 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.4"
|
||||
@ -8256,7 +8185,7 @@ version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
|
||||
dependencies = [
|
||||
"nom 7.1.3",
|
||||
"nom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -37,7 +37,7 @@ world = { package = "veloren-world", path = "../world", optional = true }
|
||||
|
||||
tokio = { version = "1.14", default-features = false, features = ["rt-multi-thread"] }
|
||||
num_cpus = "1.0"
|
||||
ansi-parser = "0.8"
|
||||
cansi = "2.2.1"
|
||||
clap = { version = "3.1.8", features = ["derive"] }
|
||||
crossterm = "0.25"
|
||||
lazy_static = "1"
|
||||
|
@ -21,81 +21,70 @@ impl<'a> TuiLog<'a> {
|
||||
|
||||
impl<'a> Write for TuiLog<'a> {
|
||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||
use ansi_parser::{AnsiParser, AnsiSequence, Output};
|
||||
// TODO: this processing can probably occur in the consumer of the log lines
|
||||
// (and instead of having a TuiLog::resize the consumer can take
|
||||
// ownership of the lines and manage them itself).
|
||||
|
||||
// Not super confident this is the ideal parser but it works for now and doesn't
|
||||
// depend on an old version of nom. Alternatives to consider may include
|
||||
// `vte`, `anstyle-parse`, `vt100`, or others.
|
||||
use cansi::v3::categorise_text;
|
||||
use tui::{
|
||||
style::{Color, Modifier},
|
||||
text::{Span, Spans},
|
||||
};
|
||||
|
||||
let line = String::from_utf8(buf.into())
|
||||
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
||||
let line =
|
||||
core::str::from_utf8(buf).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
||||
|
||||
let mut spans = Vec::new();
|
||||
let mut span = Span::raw("");
|
||||
let mut lines = Vec::new();
|
||||
|
||||
for out in line.ansi_parse() {
|
||||
match out {
|
||||
Output::TextBlock(text) => {
|
||||
// search for newlines
|
||||
for t in text.split_inclusive('\n') {
|
||||
span.content.to_mut().push_str(t);
|
||||
if t.ends_with('\n') && span.content.len() != 0 {
|
||||
spans.push(std::mem::replace(&mut span, Span::raw("")));
|
||||
lines.push(std::mem::take(&mut spans));
|
||||
}
|
||||
}
|
||||
for out in categorise_text(line) {
|
||||
let mut style = tui::style::Style::default();
|
||||
// NOTE: There are other values returned from cansi that we don't bother to use
|
||||
// for now including background color, italics, blinking, etc.
|
||||
style.fg = match out.fg {
|
||||
Some(cansi::Color::Black) => Some(Color::Black),
|
||||
Some(cansi::Color::Red) => Some(Color::Red),
|
||||
Some(cansi::Color::Green) => Some(Color::Green),
|
||||
Some(cansi::Color::Yellow) => Some(Color::Yellow),
|
||||
Some(cansi::Color::Blue) => Some(Color::Blue),
|
||||
Some(cansi::Color::Magenta) => Some(Color::Magenta),
|
||||
Some(cansi::Color::Cyan) => Some(Color::Cyan),
|
||||
Some(cansi::Color::White) => Some(Color::White),
|
||||
// "Bright" versions currently not handled
|
||||
Some(c) => {
|
||||
warn!("Unknown color {:#?}", c);
|
||||
style.fg
|
||||
},
|
||||
Output::Escape(seq) => {
|
||||
if span.content.len() != 0 {
|
||||
spans.push(span);
|
||||
None => style.fg,
|
||||
};
|
||||
match out.intensity {
|
||||
Some(cansi::Intensity::Normal) | None => {},
|
||||
Some(cansi::Intensity::Bold) => style.add_modifier = Modifier::BOLD,
|
||||
Some(cansi::Intensity::Faint) => style.add_modifier = Modifier::DIM,
|
||||
}
|
||||
|
||||
span = Span::raw("");
|
||||
}
|
||||
|
||||
match seq {
|
||||
AnsiSequence::SetGraphicsMode(values) => {
|
||||
const COLOR_TABLE: [Color; 8] = [
|
||||
Color::Black,
|
||||
Color::Red,
|
||||
Color::Green,
|
||||
Color::Yellow,
|
||||
Color::Blue,
|
||||
Color::Magenta,
|
||||
Color::Cyan,
|
||||
Color::White,
|
||||
];
|
||||
|
||||
let mut iter = values.iter();
|
||||
|
||||
match iter.next().unwrap() {
|
||||
0 => {},
|
||||
1 => span.style.add_modifier = Modifier::BOLD,
|
||||
2 => span.style.add_modifier = Modifier::DIM,
|
||||
idx @ 30..=37 => {
|
||||
span.style.fg = Some(COLOR_TABLE[(idx - 30) as usize])
|
||||
},
|
||||
_ => warn!("Unknown color {:#?}", values),
|
||||
}
|
||||
},
|
||||
_ => warn!("Unknown sequence {:#?}", seq),
|
||||
}
|
||||
},
|
||||
// search for newlines
|
||||
for t in out.text.split_inclusive('\n') {
|
||||
if !t.is_empty() {
|
||||
spans.push(Span::styled(t.to_owned(), style));
|
||||
}
|
||||
if t.ends_with('\n') {
|
||||
lines.push(Spans(core::mem::take(&mut spans)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if span.content.len() != 0 {
|
||||
spans.push(span);
|
||||
}
|
||||
if !spans.is_empty() {
|
||||
lines.push(spans);
|
||||
lines.push(Spans(spans));
|
||||
}
|
||||
|
||||
let mut lines = lines.into_iter().map(Spans).collect::<Vec<_>>();
|
||||
self.inner.lock().unwrap().lines.append(&mut lines);
|
||||
|
||||
Ok(buf.len())
|
||||
}
|
||||
|
||||
// We can potentially use this to reduce locking frequency?
|
||||
fn flush(&mut self) -> io::Result<()> { Ok(()) }
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user