| import sys | |
| class TableEntry: | |
| def __init__(self): | |
| self.tamil = "" | |
| self.english = "" | |
| def is_d_v(character, d_v): | |
| return character in d_v | |
| def is_non_printable(character): | |
| return character in {'\n', '\r', '\t', ' '} | |
| def transliterate(token, tamil_map): | |
| for entry in tamil_map: | |
| if token == entry.tamil: | |
| return entry.english | |
| print(f"No English character in the map file for {token}") | |
| return None | |
| def main(): | |
| if len(sys.argv) == 2: | |
| map_file = open(sys.argv[1], "r") | |
| input_text = sys.stdin | |
| output_text = sys.stdout | |
| elif len(sys.argv) == 4: | |
| map_file = open(sys.argv[1], "r") | |
| input_text = open(sys.argv[2], "r") | |
| output_text = open(sys.argv[3], "w") | |
| else: | |
| print("./tamil_english map_file or\n./tamil_english map_file input output") | |
| return 3 | |
| tamil_map = [] | |
| n_characters = 0 | |
| for line in map_file: | |
| if line[0] == '#': | |
| continue | |
| tamil, english = line.split() | |
| entry = TableEntry() | |
| entry.tamil = tamil | |
| entry.english = english | |
| tamil_map.append(entry) | |
| n_characters += 1 | |
| d_v = ['\u0BBE', '\u0BBF', '\u0BC0', '\u0BC1', '\u0BC2', '\u0BC6', '\u0BC7', '\u0BC8', '\u0BCA', '\u0BCB', '\u0BCC'] | |
| vowels = ['\u0B85', '\u0B86', '\u0B87', '\u0B88', '\u0B89', '\u0B8A', '\u0B8E', '\u0B8F', '\u0B90', '\u0B92', '\u0B93', '\u0B94', '\u0B83'] | |
| character_previous = '' | |
| character = input_text.read(1) | |
| character_next = input_text.read(1) | |
| while character: | |
| pos = input_text.tell() | |
| if is_non_printable(character): | |
| print(f"\nNon Printable\tSS{character}SS") | |
| output_text.write(character) | |
| elif is_d_v(character, vowels): | |
| if character == '\u0B83' and character_next == '\u0BAA': | |
| token = character | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| output_text.write(character_transliterated) | |
| else: | |
| token = character | |
| input_text.seek(pos) | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| output_text.write(character_transliterated) | |
| else: | |
| if character_next == '\u0BCD': | |
| token = character + character_next | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| output_text.write(character_transliterated) | |
| elif is_d_v(character, d_v): | |
| token = character | |
| input_text.seek(pos) | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| output_text.write(character_transliterated) | |
| elif not is_d_v(character_next, d_v): | |
| token = character | |
| input_text.seek(pos) | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| if token == character_transliterated: | |
| output_text.write(character_transliterated) | |
| else: | |
| output_text.write(character_transliterated + "a") | |
| elif is_d_v(character_next, d_v): | |
| token = character | |
| input_text.seek(pos) | |
| character_transliterated = transliterate(token, tamil_map) | |
| if character_transliterated is not None: | |
| output_text.write(character_transliterated) | |
| character = character_next | |
| character_next = input_text.read(1) | |
| if __name__ == "__main__": | |
| main() | |