# nu_plugin_strutils

This is a [Nushell](https://nushell.sh/) plugin called "strutils".

## Available Commands

* `str compress` - Compress a string using brotli, flate, or zlib
* `str decompress` - Decompress a string using brotli, flate, or zlib
* `str dedent` - Remove common leading whitespace from text
* `str deunicode` - Replace unicode characters with ASCII counterparts
* `str indent` - Add leading spaces to each line of text
* `str similarity` - Calculate edit distance between strings using various algorithms
* `str slug` - Convert a string to a slug (URL/filename friendly)
* `str wrap` - Wrap text to a specified width

## Installing

```nushell
> cargo install --path .
```

## String utilities for nushell

This plugin implements a some string utilities that are not included in nushell.

### str deunicode
`str deunicode` replaces unicode accented characters with their ASCII counterparts based on the [deunicode crate](https://docs.rs/deunicode/latest/deunicode/).

#### Usage:

```nushell
> plugin add ~/.cargo/bin/nu_plugin_strutils
> plugin use strutils
> 'A…C' | str deunicode
A...C
```

### str similarity
`str similarity` is an older plugin that I thought fit here since this is a common plugin for string utilities.

This plugin uses the [textdistance.rs](https://crates.io/crates/textdistance) crate to calculate edit distance

#### Usage:

#### Single Algorithm Usage

```nushell
❯ "nushell" | str similarity "nutshell" --algorithm levenshtein
1
```

#### All Algorithms Usage

```nushell
❯ "nushell" | str similarity "nutshell" -all
```
```
╭────┬────────────────────────────┬──────────╮
│  # │         algorithm          │ distance │
├────┼────────────────────────────┼──────────┤
│  0 │ bag                        │        1 │
│  1 │ cosine                     │     0.94 │
│  2 │ damerau_levenshtein        │        1 │
│  3 │ entropy_ncd                │     0.05 │
│  4 │ hamming                    │        5 │
│  5 │ jaccard                    │     0.88 │
│  6 │ jaro                       │     0.96 │
│  7 │ jaro_winkler               │     0.97 │
│  8 │ levenshtein                │        1 │
│  9 │ longest_common_subsequence │        7 │
│ 10 │ longest_common_substring   │        5 │
│ 11 │ length                     │        1 │
│ 12 │ lig3                       │     0.86 │
│ 13 │ mlipns                     │        0 │
│ 14 │ overlap                    │        1 │
│ 15 │ prefix                     │        2 │
│ 16 │ ratcliff_obershelp         │     0.93 │
│ 17 │ roberts                    │     0.93 │
│ 18 │ sift4_common               │        1 │
│ 19 │ sift4_simple               │        1 │
│ 20 │ smith_waterman             │        6 │
│ 21 │ sorensen_dice              │     0.93 │
│ 22 │ suffix                     │        5 │
│ 23 │ tversky                    │     0.88 │
│ 24 │ yujian_bo                  │     0.12 │
├────┼────────────────────────────┼──────────┤
│  # │         algorithm          │ distance │
╰────┴────────────────────────────┴──────────╯
```

#### All Algorithms Normalized Usage

The output is normalized between 0 and 1

```nushell
❯ "nushell" | str similarity "nutshell" --all --normalize
```
```
╭────┬────────────────────────────┬──────────╮
│  # │         algorithm          │ distance │
├────┼────────────────────────────┼──────────┤
│  0 │ bag                        │     0.12 │
│  1 │ cosine                     │     0.94 │
│  2 │ damerau_levenshtein        │     0.12 │
│  3 │ entropy_ncd                │     0.05 │
│  4 │ hamming                    │     0.62 │
│  5 │ jaccard                    │     0.88 │
│  6 │ jaro                       │     0.96 │
│  7 │ jaro_winkler               │     0.97 │
│  8 │ levenshtein                │     0.12 │
│  9 │ longest_common_subsequence │     0.88 │
│ 10 │ longest_common_substring   │     0.62 │
│ 11 │ length                     │     0.12 │
│ 12 │ lig3                       │     0.86 │
│ 13 │ mlipns                     │        0 │
│ 14 │ overlap                    │        1 │
│ 15 │ prefix                     │     0.25 │
│ 16 │ ratcliff_obershelp         │     0.93 │
│ 17 │ roberts                    │     0.93 │
│ 18 │ sift4_common               │     0.12 │
│ 19 │ sift4_simple               │     0.12 │
│ 20 │ smith_waterman             │     0.75 │
│ 21 │ sorensen_dice              │     0.93 │
│ 22 │ suffix                     │     0.62 │
│ 23 │ tversky                    │     0.88 │
│ 24 │ yujian_bo                  │     0.12 │
├────┼────────────────────────────┼──────────┤
│  # │         algorithm          │ distance │
╰────┴────────────────────────────┴──────────╯
```

#### List the available algorithms and aliases

```nushell
❯ "nushell" | str similarity "nutshell" --list
╭────┬────────────────────────────┬──────────╮
│  # │         algorithm          │  alias   │
├────┼────────────────────────────┼──────────┤
│  0 │ bag                        │ bag      │
│  1 │ cosine                     │ cos      │
│  2 │ damerau_levenshtein        │ dlev     │
│  3 │ entropy_ncd                │ entncd   │
│  4 │ hamming                    │ ham      │
│  5 │ jaccard                    │ jac      │
│  6 │ jaro                       │ jar      │
│  7 │ jaro_winkler               │ jarw     │
│  8 │ levenshtein                │ lev      │
│  9 │ longest_common_subsequence │ lcsubseq │
│ 10 │ longest_common_substring   │ lcsubstr │
│ 11 │ length                     │ len      │
│ 12 │ lig3                       │ lig      │
│ 13 │ mlipns                     │ mli      │
│ 14 │ overlap                    │ olap     │
│ 15 │ prefix                     │ pre      │
│ 16 │ ratcliff_obershelp         │ rat      │
│ 17 │ roberts                    │ rob      │
│ 18 │ sift4_common               │ scom     │
│ 19 │ sift4_simple               │ ssim     │
│ 20 │ smith_waterman             │ smithw   │
│ 21 │ sorensen_dice              │ soredice │
│ 22 │ suffix                     │ suf      │
│ 23 │ tversky                    │ tv       │
│ 24 │ yujian_bo                  │ ybo      │
├────┼────────────────────────────┼──────────┤
│  # │         algorithm          │  alias   │
╰────┴────────────────────────────┴──────────╯
```

### str compress
`str compress` will convert nushell values to a string and then compress that string using the specified method with the parameters provided.

#### Usage:

##### Brotli

```nushell
❯ "ABCDEFG" | str compress --brotli
Length: 11 (0xb) bytes | printable whitespace ascii_other non_ascii
00000000:   07 03 80 41  42 43 44 45  46 47 03                   ••×ABCDEFG•
```

##### Flate

```nushell
❯ "ABCDEFG" | str compress --flate
Length: 13 (0xd) bytes | printable whitespace ascii_other non_ascii
00000000:   73 74 72 76  71 75 73 07  00                         strvqus•0
```

##### Zlib

```nushell
❯ "ABCDEFG" | str compress --zlib
Length: 15 (0xf) bytes | printable whitespace ascii_other non_ascii
00000000:   78 5e 73 74  72 76 71 75  73 07 00 07  5b 01 dd      x^strvqus•0•[•×
```

### str decompress
`str decompress` is meant to be the counterpart of `str compress` and decompress whatever it compresses.

#### Usage:

##### Brotli

```nushell
❯ "ABCDEFG" | str compress --brotli | str decompress --brotli
ABCDEFG
```

##### Flate

```nushell
❯ "ABCDEFG" | str compress --flate | str decompress --flate
ABCDEFG
```

##### Zlib

```nushell
❯ "ABCDEFG" | str compress --zlib | str decompress --zlib
ABCDEFG
```

### str dedent
`str dedent` removes common leading whitespace from every line in a text while preserving relative indentation.

#### Usage:

```nushell
❯ "    line 1\n    line 2\n    line 3" | str dedent
line 1
line 2
line 3
```

### str indent
`str indent` adds a specified number of leading spaces to each line in a text.

#### Usage:

```nushell
❯ "line 1\nline 2\nline 3" | str indent "    "
    line 1
    line 2
    line 3
```

### str slug
`str slug` converts a string to a URL or filename-friendly slug.

#### Usage:

```nushell
> "Hello, World!" | str slug
hello-world
```

```nushell
> "Æúű--cool?" | str slug
aeuu-cool
```

### str wrap
`str wrap` wraps each line in a text to a specified width.

#### Usage:

Wrap text at 10 columns
```nushell
> "now is the time for all good men to come to the aid of their country" | str wrap --width 10
now is the
time for
all good
men to
come to
the aid of
their
country
```

Wrap text at 10 columns using optimal-fit
```nushell
> "now is the time for all good men to come to the aid of their country" | str wrap --width 10 --optimal-fit
now is
the time
for all
good men
to come
to the aid
of their
country
```
