diff --git a/Cargo.lock b/Cargo.lock index e50f306..55deb2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,9 +46,9 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -136,15 +136,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" [[package]] name = "byteorder" @@ -176,9 +176,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.14" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -186,9 +186,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -327,9 +327,9 @@ dependencies = [ [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -432,20 +432,19 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", "num-traits", "png", ] @@ -499,9 +498,9 @@ checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libz-ng-sys" -version = "1.1.14" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81157dde2fd4ad2b45ea3a4bb47b8193b52a6346b678840d91d80d3c2cd166c5" +checksum = "c6409efc61b12687963e602df8ecf70e8ddacf95bc6576bcf16e3ac6328083c5" dependencies = [ "cmake", "libc", @@ -509,9 +508,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -633,17 +632,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -721,15 +709,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "png" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -740,9 +728,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -758,9 +746,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -768,9 +756,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -787,9 +775,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -799,9 +787,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -828,11 +816,11 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", @@ -917,9 +905,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "strsim" diff --git a/README.md b/README.md index 824b670..b857454 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,12 @@ All prefixes and filters are applied to the front and back text separately, but both the front and the back text will be shown in the popup when one of them matches. +Finally, `--sign-transform` allows to specify sed-style replacement patterns to +modify the text displayed on the map. This can be used if the text matched by +`--sign-prefix` or `--sign-filter` should not be displayed: +`--sign-filter 's/\[Map\]//'` would replace each occurence of "\[Map\]" with +the empty string. + ## Installation Binary builds of the map generator for Linux and Windows, as well as an archive diff --git a/src/core/common.rs b/src/core/common.rs index 92d0019..9a94496 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -8,7 +8,7 @@ use std::{ use anyhow::{Context, Result}; use indexmap::IndexSet; -use regex::RegexSet; +use regex::{Regex, RegexSet}; use serde::{Deserialize, Serialize}; use crate::{ @@ -130,6 +130,7 @@ pub enum TileKind { } /// Common configuration based on command line arguments +#[derive(Debug)] pub struct Config { /// Number of threads for parallel processing pub num_threads: usize, @@ -151,6 +152,8 @@ pub struct Config { pub viewer_entities_path: PathBuf, /// Sign text filter patterns pub sign_patterns: RegexSet, + /// Sign text transformation pattern + pub sign_transforms: Vec<(Regex, String)>, } impl Config { @@ -173,6 +176,8 @@ impl Config { .collect(); let sign_patterns = Self::sign_patterns(args).context("Failed to parse sign patterns")?; + let sign_transforms = + Self::sign_transforms(args).context("Failed to parse sign transforms")?; Ok(Config { num_threads, @@ -185,6 +190,7 @@ impl Config { viewer_info_path, viewer_entities_path, sign_patterns, + sign_transforms, }) } @@ -200,6 +206,28 @@ impl Config { )?) } + /// Parses the sign transform argument into a vector of [Regex] and + /// corresponding replacement strings + fn sign_transforms(args: &super::Args) -> Result> { + let splitter = Regex::new(r"^s/((?:[^\\/]|\\.)*)/((?:[^\\/]|\\.)*)/$").unwrap(); + + args.sign_transform + .iter() + .map(|t| Self::sign_transform(&splitter, t)) + .collect() + } + + /// Parses the sign transform argument into a [Regex] and its corresponding + /// replacement string + fn sign_transform(splitter: &Regex, transform: &str) -> Result<(Regex, String)> { + let captures = splitter + .captures(transform) + .with_context(|| format!("Invalid transform pattern '{}'", transform))?; + let regexp = Regex::new(&captures[1])?; + let replacement = captures[2].to_string(); + Ok((regexp, replacement)) + } + /// Constructs the path to an input region file pub fn region_path(&self, coords: TileCoords) -> PathBuf { let filename = coord_filename(coords, "mca"); diff --git a/src/core/metadata_writer.rs b/src/core/metadata_writer.rs index b051b69..0ea1f65 100644 --- a/src/core/metadata_writer.rs +++ b/src/core/metadata_writer.rs @@ -1,6 +1,7 @@ //! The [MetadataWriter] and related types use anyhow::{Context, Result}; +use regex::Regex; use serde::Serialize; use crate::{ @@ -8,7 +9,7 @@ use crate::{ io::{fs, storage}, world::{ block_entity::{self, BlockEntity, BlockEntityData}, - de, + de, sign, }, }; @@ -145,6 +146,28 @@ impl<'a> MetadataWriter<'a> { false } + /// Applies a single transform to a [sign::SignText] + /// + /// The regular expression is applied for each line of the sign text + /// separately (actually for each element when JSON text is used) + fn sign_text_transform(sign_text: &mut sign::SignText, transform: &(Regex, String)) { + let (regexp, replacement) = transform; + + for line in &mut sign_text.0 { + for text in &mut line.0 { + text.text = regexp.replace_all(&text.text, replacement).into_owned() + } + } + } + + /// Applies the configured transforms to the text of a sign + fn sign_transform(&self, sign: &mut block_entity::Sign) { + for transform in &self.config.sign_transforms { + Self::sign_text_transform(&mut sign.front_text, transform); + Self::sign_text_transform(&mut sign.back_text, transform); + } + } + /// Generates [Entities] data from collected entity lists fn entities(&self) -> Result { let data: ProcessedEntities = @@ -158,6 +181,12 @@ impl<'a> MetadataWriter<'a> { .filter(|entity| match &entity.data { BlockEntityData::Sign(sign) => self.sign_filter(sign), }) + .map(|mut entity| { + match &mut entity.data { + BlockEntityData::Sign(sign) => self.sign_transform(sign), + }; + entity + }) .collect(), }; diff --git a/src/core/mod.rs b/src/core/mod.rs index 274bae8..f552ffa 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -59,6 +59,12 @@ pub struct Args { /// To make all signs visible, pass an empty string to either option. #[arg(long)] pub sign_filter: Vec, + /// Regular expression replacement pattern for sign texts + /// + /// Accepts patterns of the form 's/regexp/replacement/'. Transforms + /// are applied to each line of sign texts separately. + #[arg(long)] + pub sign_transform: Vec, /// Minecraft save directory pub input_dir: PathBuf, /// MinedMap data directory