2020-03-05 11:31:11 +00:00
|
|
|
import logging
|
|
|
|
|
|
|
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
|
|
|
|
|
|
|
|
|
|
|
class DectUtils:
|
|
|
|
"""
|
|
|
|
This class contains dect number <> letter related utilities
|
|
|
|
"""
|
|
|
|
|
|
|
|
DECT_MATRIX = {
|
2020-03-10 18:08:28 +00:00
|
|
|
"0": ["0"],
|
|
|
|
"1": ["1"],
|
|
|
|
"2": ["2", "A", "B", "C"],
|
|
|
|
"3": ["3", "D", "E", "F"],
|
|
|
|
"4": ["4", "G", "H", "I"],
|
|
|
|
"5": ["5", "J", "K", "L"],
|
|
|
|
"6": ["6", "M", "N", "O"],
|
|
|
|
"7": ["7", "P", "Q", "R", "S"],
|
|
|
|
"8": ["8", "T", "U", "V"],
|
|
|
|
"9": ["9", "W", "X", "Y", "Z"],
|
2020-03-05 11:31:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
"""
|
|
|
|
Build a reverse lookup matrix based on self.DECT_MATRIX
|
|
|
|
"""
|
|
|
|
self.REVERSE_DECT_MATRIX = {}
|
|
|
|
for digit in self.DECT_MATRIX.keys():
|
|
|
|
for letter in self.DECT_MATRIX[digit]:
|
|
|
|
self.REVERSE_DECT_MATRIX[letter] = digit
|
|
|
|
|
|
|
|
def get_dect_letter_combinations(self, numbers):
|
|
|
|
"""
|
|
|
|
Generator to recursively get all combinations of letters for this number
|
|
|
|
"""
|
|
|
|
# loop over the possible letters for the first digit
|
|
|
|
for letter in self.DECT_MATRIX[numbers[0]]:
|
|
|
|
# if we have more digits..
|
|
|
|
if len(numbers) > 1:
|
|
|
|
# call recursively with the remaining digits, and loop over the result
|
|
|
|
for nextletter in self.get_dect_letter_combinations(numbers[1:]):
|
|
|
|
yield letter + nextletter
|
|
|
|
else:
|
|
|
|
# no more digits left, just yield the current letter
|
|
|
|
yield letter
|
|
|
|
|
|
|
|
def letters_to_number(self, letters):
|
|
|
|
"""
|
|
|
|
Coverts "TYKL" to "8955"
|
|
|
|
"""
|
|
|
|
result = ""
|
|
|
|
for letter in letters:
|
2020-03-10 18:45:23 +00:00
|
|
|
result += self.REVERSE_DECT_MATRIX[letter.upper()]
|
2020-03-05 11:31:11 +00:00
|
|
|
return result
|