half-functional prototype
This commit is contained in:
commit
91dbec05d3
8 changed files with 175 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cat2text"
|
||||||
|
version = "0.1.0"
|
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "cat2text"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
license = "GPL-3.0-or-later"
|
||||||
|
repository = "https://git.askiiart.net/askiiart/cat2text-rs"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "cat2text"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "cat2text"
|
||||||
|
path = "src/main.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Cat2Text-rs
|
||||||
|
|
||||||
|
This is a port of [Cat2Text](https://github.com/askiiart/Cat2Text) to Rust, with extra functionality, better documentation, and support for using it as a library as well.
|
49
src/base4.rs
Normal file
49
src/base4.rs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
def decode(string):
|
||||||
|
"""Decode a Base 4 encoded string into the number
|
||||||
|
Arguments:
|
||||||
|
- `string`: The encoded string
|
||||||
|
- `alphabet`: The alphabet to use for decoding
|
||||||
|
"""
|
||||||
|
base = len(alphabet)
|
||||||
|
strlen = len(string)
|
||||||
|
num = 0
|
||||||
|
|
||||||
|
idx = 0
|
||||||
|
for char in string:
|
||||||
|
power = (strlen - (idx + 1))
|
||||||
|
num += alphabet.index(char) * (base ** power)
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
return num
|
||||||
|
*/
|
||||||
|
|
||||||
|
pub fn alphabet() -> Vec<String> {
|
||||||
|
return vec!["meow", "mrrp", "mreow", "mrow"]
|
||||||
|
.into_iter()
|
||||||
|
.map(|a| a.to_string())
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// How many words long a character is when translated to catspeak
|
||||||
|
pub fn char_length() -> u32 {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Add uppercase support, maybe possible?
|
||||||
|
pub fn encode(text: String) {
|
||||||
|
// makes it lowercase and split by spaces
|
||||||
|
let words: Vec<String> = text
|
||||||
|
.to_ascii_lowercase()
|
||||||
|
.split(" ")
|
||||||
|
.map(|item| return item.to_string())
|
||||||
|
.collect();
|
||||||
|
let mut words_as_bytes: Vec<Vec<u8>> = Vec::new();
|
||||||
|
for word in words {
|
||||||
|
// convert to bytes then subtract by 96
|
||||||
|
words_as_bytes.push(word.as_bytes().into_iter().map(|item| item - 96).collect());
|
||||||
|
}
|
||||||
|
|
||||||
|
let translation: String = "".to_string();
|
||||||
|
for word in words_as_bytes {}
|
||||||
|
}
|
50
src/core.rs
Normal file
50
src/core.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
//! Handles conversion one word at a time for any base
|
||||||
|
|
||||||
|
use std::ops::Index;
|
||||||
|
|
||||||
|
use crate::base4::alphabet;
|
||||||
|
|
||||||
|
pub fn num_to_cat(num: u32, alphabet: Vec<String>, char_length: u32) -> String {
|
||||||
|
let mut num: u32 = num.clone();
|
||||||
|
let base: u32 = alphabet.len() as u32;
|
||||||
|
|
||||||
|
// base*n*-ifying logic
|
||||||
|
let mut nums: Vec<u32> = Vec::new();
|
||||||
|
while (nums.len() as u32) < char_length {
|
||||||
|
nums.push((num as u32) % base);
|
||||||
|
num /= base;
|
||||||
|
}
|
||||||
|
nums.reverse();
|
||||||
|
|
||||||
|
let mut result = "".to_string();
|
||||||
|
for i in nums.clone() {
|
||||||
|
result += alphabet[i as usize].as_str();
|
||||||
|
// put a space in between if it's not the last one
|
||||||
|
if i != nums.len() as u32 - 1 {
|
||||||
|
result += " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Converts catspeak to a [`u32`]
|
||||||
|
pub fn cat_to_num(text: Vec<String>, alphabet: Vec<String>, char_length: u32) -> u32 {
|
||||||
|
let mut nums: Vec<u32> = Vec::new();
|
||||||
|
for word in text.clone() {
|
||||||
|
for i in 0..alphabet.len() {
|
||||||
|
if word == alphabet[i] {
|
||||||
|
nums.push(i as u32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let base = alphabet.len();
|
||||||
|
let idx = 0;
|
||||||
|
let mut num = 0 as u32;
|
||||||
|
for n in nums {
|
||||||
|
let power = (text.len() - (idx + 1)) as u32;
|
||||||
|
num += n * (base as u32).pow(power);
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
5
src/lib.rs
Normal file
5
src/lib.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
//! # Cat2Text-rs
|
||||||
|
//!
|
||||||
|
//! This is a port of [Cat2Text](https://github.com/askiiart/Cat2Text) to Rust, with extra functionality, better documentation, and support for using it as a library as well.
|
||||||
|
pub mod base4;
|
||||||
|
pub mod core;
|
44
src/main.rs
Normal file
44
src/main.rs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
extern crate cat2text;
|
||||||
|
use cat2text::{base4, core};
|
||||||
|
use std::{io, process::exit};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let stdin = io::stdin();
|
||||||
|
let mut input = String::new();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
println!("Pick your translation:");
|
||||||
|
println!("1) cat to text");
|
||||||
|
println!("2) text to cat");
|
||||||
|
input = "".to_string();
|
||||||
|
stdin.read_line(&mut input).unwrap();
|
||||||
|
let trimmed = input.trim();
|
||||||
|
if trimmed == "1".to_string() {
|
||||||
|
input = "".to_string();
|
||||||
|
stdin.read_line(&mut input).unwrap();
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
core::cat_to_num(
|
||||||
|
input.trim().to_string().split(" ").into_iter().map(|item| item.to_string()).collect(),
|
||||||
|
base4::alphabet(),
|
||||||
|
base4::char_length()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else if trimmed == "2".to_string() {
|
||||||
|
input = "".to_string();
|
||||||
|
stdin.read_line(&mut input).unwrap();
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
core::num_to_cat(
|
||||||
|
input.trim().parse().unwrap(),
|
||||||
|
base4::alphabet(),
|
||||||
|
base4::char_length()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
println!("Invalid input, exiting...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue