forked from dhondta/python-codext
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathletters.py
More file actions
executable file
·91 lines (76 loc) · 3.01 KB
/
Copy pathletters.py
File metadata and controls
executable file
·91 lines (76 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# -*- coding: UTF-8 -*-
"""Letters Codec - letter indices-related content encoding.
This codec:
- en/decodes strings from str to str
- en/decodes strings from bytes to bytes
- decodes file content to str (read)
- encodes file content from str to bytes (write)
"""
from string import ascii_uppercase
from ..__common__ import *
__examples__ = {
'enc(consonant-index|consonants_indices)': {
'This is a test': "166I15I15A16E1516",
'\x00': None,
'\xff': None,
},
'dec(consonant-index|consonants_indices)': {
'166I15I15A16E1516': "THISISATEST",
'\x00': None,
'\xff': None,
},
'enc(vowel-index|vowels_indices)': {'This is a test': "TH3S3S1T2ST"},
'dec(vowel-index|vowels_indices)': {'TH3S3S1T2ST': "THISISATEST"},
'enc(consonant-vowel_indices)': {'This is a test': "C16C6V3C15V3C15V1C16V2C15C16"},
'dec(consonants_vowels-index)': {'C16C6V3C15V3C15V1C16V2C15C16': "THISISATEST"},
}
__guess__ = ["consonant-index", "vowel-index", "consonants_vowels-index"]
VOWELS = "AEIOUY"
def __get_encmap(letters):
if re.match(r"^consonants?$", letters):
encmap = {c: str(i+1) for i, c in enumerate(sorted(set(ascii_uppercase) - set(VOWELS)))}
for c in VOWELS:
encmap[c] = c
elif re.match(r"^vowels?$", letters):
encmap = {c: c for c in ascii_uppercase}
for i, c in enumerate(VOWELS):
encmap[c] = str(i+1)
elif re.match(r"^consonants?[-_]vowels?$", letters):
encmap = {c: "C" + str(i+1) for i, c in enumerate(sorted(set(ascii_uppercase) - set(VOWELS)))}
for i, c in enumerate(VOWELS):
encmap[c] = "V" + str(i+1)
for c in " ":
encmap[c] = ""
return encmap
def letters_encode(letters):
encmap = __get_encmap(letters)
def encode(text, errors="strict"):
s = ""
for i, c in enumerate(text.upper()):
try:
s += encmap[c]
except KeyError:
s += handle_error("letter-indices", errors)(c, i)
return "".join(encmap.get(c.upper(), c) for c in text), len(text)
return encode
def letters_decode(letters):
decmap = {v: k for k, v in __get_encmap(letters).items()}
maxlen = max(len(x) for x in decmap.keys())
def decode(text, errors="strict"):
s, i = "", 0
while i < len(text):
err = True
for j in range(maxlen, 0, -1):
try:
s += decmap[text[i:i+j]]
i += j
err = False
break
except (IndexError, KeyError):
pass
if err:
s += handle_error("letter-indices", errors, decode=True)(text[i], i)
return s, len(text)
return decode
add("letter-indices", letters_encode, letters_decode, printables_rate=1., expansion_factor=None,
pattern=r"^(consonants?|vowels?|consonants?[-_]vowels?)[-_]ind(?:ex|ices)$")