103 lines
3.2 KiB
Markdown
103 lines
3.2 KiB
Markdown
# 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.
|
|
|
|
## Base 4 Format
|
|
|
|
Using the original base4 format, it works like this. First off, each word is equal to a value in base 4:
|
|
|
|
| Value | Cat sound |
|
|
| ----- | --------- |
|
|
| 0 | meow |
|
|
| 1 | mrrp |
|
|
| 2 | mreow |
|
|
| 3 | mrow |
|
|
|
|
Then, the text is converted into lowercase, 96 is subtracted from its ASCII value (i.e. "a" (97) -> 1), and it's converted to base 4, which is then replaced by the cat sounds above; Each cat sound is separated by a space (" "), then each word is delimited by a semicolon and a space ("; ").
|
|
|
|
For example, "i love cats" is translated into:
|
|
|
|
> meow mreow mrrp; meow mrow meow meow mrow mrow mrrp mrrp mreow meow mrrp mrrp; meow meow mrow meow meow mrrp mrrp mrrp meow mrrp meow mrow
|
|
|
|
Separating out the letters and words:
|
|
|
|
> [
|
|
> ["meow mreow mrrp"],
|
|
> [
|
|
> "meow mrow meow",
|
|
> "meow mrow mrow",
|
|
> "mrrp mrrp mreow",
|
|
> "meow mrrp mrrp"
|
|
> ],
|
|
> [
|
|
> "meow meow mrow",
|
|
> "meow meow mrrp",
|
|
> "mrrp mrrp meow",
|
|
> "mrrp meow mrow"
|
|
> ]
|
|
> ]
|
|
|
|
## Library usage
|
|
|
|
To use the library, just import the relevant functions, and run it like this:
|
|
|
|
```rust
|
|
use cat2text::base4::{encode, decode};
|
|
|
|
let encoded = encode("i love cats".to_string());
|
|
assert_eq!(encoded, "meow mreow mrrp; meow mrow meow meow mrow mrow mrrp mrrp mreow meow mrrp mrrp; meow meow mrow meow meow mrrp mrrp mrrp meow mrrp meow mrow");
|
|
let decoded = decode(encoded);
|
|
assert_eq!(decoded, "i love cats");
|
|
```
|
|
|
|
Or to encode binary in cat2text's expanded base16 alphabet:
|
|
|
|
```rust
|
|
use cat2text::{anybase::bytes::encode, core::bytes::char_length};
|
|
|
|
let bytes = &[243, 10];
|
|
let base = 16;
|
|
let char_length = char_length(base);
|
|
|
|
assert_eq!("mrow~ mrow meow purrrr", encode(bytes, base, char_length));
|
|
```
|
|
|
|
You can use the library to encode anything up to base 16 - for details, see the [docs](https://docs.rs/cat2text/latest/cat2text/)
|
|
|
|
## Binary usage
|
|
|
|
```yaml
|
|
A port of Cat2Text to Rust, with extra functionality, better documentation, and support for using it as a library as well.
|
|
|
|
Usage: cat2text <COMMAND>
|
|
|
|
Commands:
|
|
gen-completion Generate shell completions
|
|
encode Encodes text/data to mrow~
|
|
decode Decodes mrow~ to text/data
|
|
benchmark
|
|
help Print this message or the help of the given subcommand(s)
|
|
|
|
Options:
|
|
-h, --help Print help
|
|
-V, --version Print version
|
|
```
|
|
|
|
For example, `cat2text encode 'i love cats'` to encode `i love cats` in text mode using the default of base 4.
|
|
|
|
### Encode/decode arguments
|
|
|
|
- `-b`, `--base` (integer): What base to encode/decode using - up to base 16
|
|
- `--bytes` (flag): Whether to use byte encoding or text encoding
|
|
- `-h`, `--help`: Print help
|
|
|
|
### Benchmark arguments
|
|
|
|
- `-b`, `--base` (integer): What base to encode/decode using - up to base 16
|
|
- `-i`, `--iterations`: How many iterations to run each benchmark for
|
|
- `--bytes` (flag): Whether to use byte encoding or text encoding
|
|
- `-h`, `--help`: Print help
|
|
|
|
### Shell completions
|
|
|
|
To generate shell completions, you can run `cat2text gen-completion $(basename $SHELL) | source` on *nix systems using bash, zsh, or fish.
|