From 4f9cb199b1e13901bdf7d261ce21c9e756ea5bc6 Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 20:27:48 -0600 Subject: [PATCH 1/6] fix release optimization level --- Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index f707e29..0d6113f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" license = "GPL-3.0-or-later" repository = "https://git.askiiart.net/askiiart/cat2text-rs" +[profile.release] +opt-level = 3 + [lib] name = "cat2text" path = "src/lib.rs" From aa12db5ec74056028e7ce6f0a693bce4b03e540c Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 22:06:14 -0600 Subject: [PATCH 2/6] fix logic in char_length() --- src/anybase.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anybase.rs b/src/anybase.rs index 0e208dc..cb92caa 100644 --- a/src/anybase.rs +++ b/src/anybase.rs @@ -19,7 +19,7 @@ pub fn char_length(base: u32) -> u32 { for i in 1..base + 1 { let num = base.pow(i); if num > 26 { - return num; + return i; } } return u32::MAX; From 6c7563455fdc55af68f8ee6dc53d2eedc696494d Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 22:43:53 -0600 Subject: [PATCH 3/6] complete anybase --- src/anybase.rs | 44 ++++++++++++++++++++++++++++++++++++-------- src/core.rs | 1 - src/lib.rs | 2 +- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/anybase.rs b/src/anybase.rs index cb92caa..9fcd968 100644 --- a/src/anybase.rs +++ b/src/anybase.rs @@ -70,13 +70,41 @@ pub fn encode(text: String, base: u32, char_length: u32) -> String { return results; } +/// Decodes catspeak into text using any base up to [`max_base()`] +/// +/// `char_length` is set manually, but the minimum can be generated using [`char_length()`] +/// +/// ``` +/// use cat2text::anybase; +/// let text = "meow mewo; mrrp mreow mrrp nyaaaa~ mreow mreow meow nyaaaa~; meow mrow meow mrrp mreow meow mrrp mewo".to_string(); +/// let base = 10; +/// let char_length = anybase::char_length(base); -#[test] -fn test_anybase_encode() { - use crate::anybase; - let text = "i love cats".to_string(); - let base = 10; - let char_length = anybase::char_length(base); - - assert_eq!("", anybase::encode(text, base, char_length)); +/// assert_eq!("i love cats", anybase::decode(text, base, char_length)); +/// ``` +pub fn decode(text: String, base: u32, char_length: u32) -> String { + let catspeak_words: Vec = text.split("; ").map(|item| item.to_string()).collect(); + let mut output: String = String::new(); + let mut shortened_alphabet = alphabet(); + shortened_alphabet.truncate(base as usize); + for engl_word in catspeak_words { + let mut word = String::new(); + for engl_letter in core::split_every_x(engl_word, char_length as usize) { + let char_num = core::cat_to_num( + engl_letter + .split(" ") + .map(|item| item.to_string()) + .collect(), + shortened_alphabet.clone(), + char_length, + ); + word += String::from_utf8(vec![(char_num + 96) as u8]) + .unwrap() + .as_str(); + } + word += " "; + output += word.as_str(); + } + return output.trim().to_string(); } + diff --git a/src/core.rs b/src/core.rs index d5c0dba..1b75195 100644 --- a/src/core.rs +++ b/src/core.rs @@ -13,7 +13,6 @@ pub fn num_to_cat(num: u32, alphabet: Vec, char_length: u32) -> String { let base: u32 = alphabet.len() as u32; // base*n*-ifying logic - // FIXME: With base 10 this loops 100 times? see `anybase::test_anybase_encode()` let mut nums: Vec = Vec::new(); while (nums.len() as u32) < char_length { nums.push((num as u32) % base); diff --git a/src/lib.rs b/src/lib.rs index d5ac1ee..a5e9911 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ #![doc = include_str!("../README.md")] -//pub mod anybase; +pub mod anybase; pub mod base4; pub mod core; pub mod bytes; From 7e40f48064ab9c9ea06c77c7057857b276971eea Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 22:44:10 -0600 Subject: [PATCH 4/6] add tests --- src/lib.rs | 1 + src/tests.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/tests.rs diff --git a/src/lib.rs b/src/lib.rs index a5e9911..974d5ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,4 @@ pub mod anybase; pub mod base4; pub mod core; pub mod bytes; +mod tests; diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 0000000..daebda3 --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,30 @@ +#[test] +fn test_anybase_base4() { + use crate::{anybase, base4}; + let text = "i love cats".to_string(); + + let encoded = anybase::encode(text.clone(), 4, anybase::char_length(4)); + assert_eq!(base4::encode(text), encoded); + + let decoded = anybase::decode(encoded.clone(), 4, anybase::char_length(4)); + assert_eq!(base4::decode(encoded), decoded); +} + +#[test] +fn test_anybase_encode() { + use crate::anybase; + let text = "i love cats".to_string(); + let base = 10; + let char_length = anybase::char_length(base); + + assert_eq!("meow mewo; mrrp mreow mrrp nyaaaa~ mreow mreow meow nyaaaa~; meow mrow meow mrrp mreow meow mrrp mewo", anybase::encode(text, base, char_length)); +} + +#[test] +fn test_anybase_decode() { + use crate::anybase; + let text = "meow mewo; mrrp mreow mrrp nyaaaa~ mreow mreow meow nyaaaa~; meow mrow meow mrrp mreow meow mrrp mewo".to_string(); + let base = 10; + let char_length = anybase::char_length(base); + assert_eq!("i love cats", anybase::decode(text, base, char_length)); +} From 3d083c2e06ce7944dd112531edcd2c1798aa9478 Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 22:44:16 -0600 Subject: [PATCH 5/6] code cleanup --- src/base4.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/base4.rs b/src/base4.rs index 957df74..cbd0716 100644 --- a/src/base4.rs +++ b/src/base4.rs @@ -59,12 +59,11 @@ pub fn encode(text: String) -> String { pub fn decode(text: String) -> String { let catspeak_words: Vec = text .split("; ") - .into_iter() .map(|item| item.to_string()) .collect(); let mut output: String = String::new(); for engl_word in catspeak_words { - let mut word = "".to_string(); + let mut word = String::new(); for engl_letter in core::split_every_x(engl_word, 3) { let char_num = core::cat_to_num( engl_letter From aa903203cf5520c0ea91552c3c0c8cc5c40dd876 Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 23:03:07 -0600 Subject: [PATCH 6/6] fix release optimization level --- Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index f707e29..0d6113f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" license = "GPL-3.0-or-later" repository = "https://git.askiiart.net/askiiart/cat2text-rs" +[profile.release] +opt-level = 3 + [lib] name = "cat2text" path = "src/lib.rs"