|
16 | 16 | 'enc(rot0|rot--10|rot100)': None, |
17 | 17 | 'enc(rot1|rot-1|rot_1)': {'this is a test': "uijt jt b uftu"}, |
18 | 18 | 'enc(rot3)': {'this is a test': "wklv lv d whvw"}, |
| 19 | + 'enc(rot47)': {'this is a test': "E9:D :D 2 E6DE"}, |
19 | 20 | } |
20 | 21 |
|
21 | 22 |
|
22 | | -def _rotn(text, n=13): |
23 | | - n = n % 26 |
24 | | - t = maketrans(LC + UC, LC[n:] + LC[:n] + UC[n:] + UC[:n]) |
| 23 | +ROT47 = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" |
| 24 | + |
| 25 | + |
| 26 | +def _rotn(text, n=13, a=LC+UC, l=26): |
| 27 | + n = n % l |
| 28 | + t = maketrans(a, "".join(a[i:i+l][n:] + a[i:i+l][:n] for i in range(0, len(a), l))) |
25 | 29 | return text.translate(t) |
26 | 30 |
|
27 | 31 |
|
28 | 32 | def rot_encode(i): |
29 | 33 | def encode(text, errors="strict"): |
30 | | - r = _rotn(ensure_str(text), i) |
| 34 | + t = ensure_str(text) |
| 35 | + r = _rotn(t, 47, ROT47, 94) if i == 47 else _rotn(t, i) |
31 | 36 | return r, len(r) |
32 | 37 | return encode |
33 | 38 |
|
34 | 39 |
|
35 | 40 | def rot_decode(i): |
36 | 41 | def decode(text, errors="strict"): |
37 | | - r = _rotn(ensure_str(text), -i) |
| 42 | + t = ensure_str(text) |
| 43 | + r = _rotn(t, -47, ROT47, 94) if i == 47 else _rotn(t, -i) |
38 | 44 | return r, len(r) |
39 | 45 | return decode |
40 | 46 |
|
41 | 47 |
|
42 | | -add("rot", rot_encode, rot_decode, r"rot[-_]?([1-9]|1[0-9]|2[0-5])$") |
| 48 | +add("rot", rot_encode, rot_decode, r"rot[-_]?([1-9]|1[0-9]|2[0-5]|47)$") |
43 | 49 |
|
0 commit comments