Rev 297 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 297 | Rev 300 | ||
|---|---|---|---|
| Line 4... | Line 4... | ||
| 4 | Created on 2014-10-20
|
4 | Created on 2014-10-20
|
| 5 | 5 | ||
| 6 | @author: Thomas 'PointedEars' Lahn <mail@PointedEars.de>
|
6 | @author: Thomas 'PointedEars' Lahn <mail@PointedEars.de>
|
| 7 | '''
|
7 | '''
|
| 8 | from sys import argv, stderr |
8 | from sys import argv, stderr |
| 9 | from re import findall, DOTALL, match, sub, compile, \ |
9 | from re import findall, compile |
| 10 | escape, search
|
- | |
| 11 | from os.path import basename |
10 | from os.path import basename |
| 12 | from functools import cmp_to_key |
11 | from functools import cmp_to_key |
| 13 | from Dictionary import Dictionary, dmsg, \ |
12 | from Dictionary import dmsg, sort_dict_alnum_english_key |
| 14 | sort_dict_alnum_english_key |
13 | from VulcanDictionary import VulcanDictionary, Text |
| 15 | 14 | ||
| 16 | dictionary = {} |
15 | dictionary = {} |
| 17 | 16 | ||
| 18 | prepositions = { |
- | |
| 19 | "fi'": 'on', |
- | |
| 20 | "na'": 'at|to', |
- | |
| 21 | "t'": 'of' |
- | |
| 22 | }
|
- | |
| 23 | - | ||
| 24 | def cli_help(): |
17 | def cli_help(): |
| 25 | print('Usage: {0} TEXT...'.format(basename(argv[0]))) |
18 | print('Usage: {0} TEXT...'.format(basename(argv[0]))) |
| 26 | 19 | ||
| 27 | def get_sort_dict_alnum_vulcan_key (): |
20 | def get_sort_dict_alnum_vulcan_key (): |
| 28 | letters = list(map(str.lower, [ |
21 | letters = list(map(str.lower, [ |
| Line 52... | Line 45... | ||
| 52 | 45 | ||
| 53 | return 1 if len(b) < len(a) else 0 |
46 | return 1 if len(b) < len(a) else 0 |
| 54 | 47 | ||
| 55 | return cmp_to_key(sort_dict_alnum_vulcan) |
48 | return cmp_to_key(sort_dict_alnum_vulcan) |
| 56 | 49 | ||
| 57 | class VulcanDictionary (Dictionary): |
- | |
| 58 | """
|
- | |
| 59 |
|
- | |
| 60 | """
|
- | |
| 61 | def translate (self, phrase, search_prefix=True, search_plural=True): |
- | |
| 62 | """
|
- | |
| 63 |
|
- | |
| 64 | :param phrase:
|
- | |
| 65 | :type phrase:
|
- | |
| 66 | :param search_prefix:
|
- | |
| 67 | :type search_prefix:
|
- | |
| 68 | :param search_plural:
|
- | |
| 69 | :type search_plural:
|
- | |
| 70 | """
|
- | |
| 71 | translation = super().translate(phrase) |
- | |
| 72 | if translation is not None: |
- | |
| 73 | return translation
|
- | |
| 74 | else:
|
- | |
| 75 | expr_translation = self.translate_expression(phrase) |
- | |
| 76 | if expr_translation is not None: |
- | |
| 77 | return expr_translation
|
- | |
| 78 | - | ||
| 79 | if search_prefix:
|
- | |
| 80 | # find prefix
|
- | |
| 81 | for preposition in prepositions: |
- | |
| 82 | prefix = match(escape(preposition), phrase) |
- | |
| 83 | if prefix is not None: |
- | |
| 84 | prefix_translation = self.translate(prefix.group(0)) |
- | |
| 85 | if prefix_translation is not None: |
- | |
| 86 | tail = sub(preposition, '', phrase) |
- | |
| 87 | tail_translation = self.translate(tail, search_prefix=False) |
- | |
| 88 | if tail_translation is not None: |
- | |
| 89 | return [prefix_translation, tail_translation] |
- | |
| 90 | elif search_plural:
|
- | |
| 91 | # find plural
|
- | |
| 92 | suffix = search(r'lar$', phrase) |
- | |
| 93 | if suffix is not None: |
- | |
| 94 | head = sub(r'lar$', '', phrase) |
- | |
| 95 | head_translation = self.translate(head, search_prefix=False, search_plural=False) |
- | |
| 96 | if head_translation is not None: |
- | |
| 97 | head_translation = dict(head_translation) |
- | |
| 98 | head_translation['en'] += ' (pl.)' |
- | |
| 99 | return head_translation
|
- | |
| 100 | - | ||
| 101 | return None |
- | |
| 102 | - | ||
| 103 | def clean_entry(self, phrase): |
- | |
| 104 | """
|
- | |
| 105 | Replace GV Media Script parens with FSE parens
|
- | |
| 106 | :param phrase:
|
- | |
| 107 | :type phrase:
|
- | |
| 108 | """
|
- | |
| 109 | return sub( |
- | |
| 110 | r'(\([^)]*\))|\|([^|)]+)\|', |
- | |
| 111 | lambda m: '({0})'.format(m.group(2)) if m.group(2) else m.group(1), |
- | |
| 112 | phrase)
|
- | |
| 113 | 50 | ||
| 114 | if __name__ == '__main__': |
51 | if __name__ == '__main__': |
| 115 | if len(argv) < 2: |
52 | if len(argv) < 2: |
| 116 | print('Nothing to translate.', end='\n\n', file=stderr) |
53 | print('Nothing to translate.', end='\n\n', file=stderr) |
| 117 | cli_help() |
54 | cli_help() |
| Line 121... | Line 58... | ||
| 121 | 58 | ||
| 122 | dictionary = VulcanDictionary(dictionary) |
59 | dictionary = VulcanDictionary(dictionary) |
| 123 | dictionary.load('vuh-gol-en.dict.zdb.txt', 'vuh') |
60 | dictionary.load('vuh-gol-en.dict.zdb.txt', 'vuh') |
| 124 | dictionary.clean() |
61 | dictionary.clean() |
| 125 | 62 | ||
| 126 | # try:
|
63 | # try:
|
| 127 | # for phrase, data in OrderedDict(sorted(
|
64 | # for phrase, data in OrderedDict(sorted(
|
| 128 | # dictionary.items(),
|
65 | # dictionary.items(),
|
| 129 | # key=get_sort_dict_alnum_vulcan_key()
|
66 | # key=get_sort_dict_alnum_vulcan_key()
|
| 130 | # )).items():
|
67 | # )).items():
|
| 131 | # print(phrase, "=", data)
|
68 | # print(phrase, "=", data)
|
| 132 | # except BrokenPipeError:
|
69 | # except BrokenPipeError:
|
| 133 | # pass
|
70 | # pass
|
| - | 71 | ||
| - | 72 | text = Text(text) |
|
| 134 | 73 | ||
| 135 | dmsg("text:", text, min_level=2) |
74 | dmsg("text:", text, min_level=2) |
| 136 | sentences = findall(r'(?!\s+)(?:.+?\.{1,3}|.+$)', text, DOTALL) |
- | |
| 137 | dmsg("sentences:", sentences, min_level=2) |
75 | dmsg("text:", text.__repr__(), min_level=2) |
| 138 | for sentence in sentences: |
- | |
| 139 | dmsg("sentence:", sentence, min_level=2) |
- | |
| 140 | - | ||
| 141 | clauses = findall(r'(?!\s+)(?:.+?(?:\s+-\s*|\s*[–—]\s*|\.{1,3}|.+$))', sentence, DOTALL) |
- | |
| 142 | dmsg("clauses:", clauses, min_level=2) |
- | |
| 143 | for clause in clauses: |
- | |
| 144 | dmsg("clause:", clause, min_level=2) |
- | |
| 145 | - | ||
| 146 | words = findall(r'[^\s.]+', clause) |
- | |
| 147 | dmsg("words:", words, min_level=2) |
- | |
| 148 | 76 | ||
| 149 | offset = 0 |
- | |
| 150 | while offset < len(words): |
- | |
| 151 | translation = None |
77 | text.translate(dictionary) |
| 152 | - | ||
| 153 | for i in range(len(words), offset, -1): |
- | |
| 154 | dmsg("words[{0}:{1}] = {2}".format(offset, i, words[offset:i]), min_level=2) |
- | |
| 155 | phrase = ' '.join(words[offset:i]) |
- | |
| 156 | - | ||
| 157 | dmsg("phrase:", phrase, min_level=2) |
- | |
| 158 | - | ||
| 159 | translation = dictionary.translate(phrase) |
- | |
| 160 | - | ||
| 161 | if translation is not None: |
- | |
| 162 | dmsg("phrase-translation:", translation, min_level=2) |
- | |
| 163 | dmsg("words[{0}:{1}] = [\"{2}\"]".format(offset, i, translation), min_level=2) |
- | |
| 164 | words[offset:i] = [translation] |
- | |
| 165 | offset += i - offset
|
- | |
| 166 | break
|
- | |
| 167 | - | ||
| 168 | if translation is None: |
- | |
| 169 | dmsg("phrase-translation:", translation, min_level=2) |
- | |
| 170 | offset += 1 |
- | |
| 171 | 78 | ||
| 172 | dmsg("words-translation:", words, min_level=2) |
79 | # dmsg("words-translation:", words, min_level=2)
|
| 173 | dmsg("words-translation-reduced:", |
80 | # dmsg("words-translation-reduced:",
|
| 174 | list(map( |
81 | # list(map(
|
| 175 | lambda word:
|
82 | # lambda word:
|
| 176 | word['en'] |
83 | # word['en']
|
| 177 | if (hasattr(word, "get") and word.get('en', None) is not None) |
84 | # if (hasattr(word, "get") and word.get('en', None) is not None)
|
| 178 | else word, |
85 | # else word,
|
| 179 | words)), |
86 | # words)),
|
| 180 | min_level=2) |
87 | # min_level=2)
|
| 181 | # for key, value in dictionary._expressions.items():
|
88 | # for key, value in dictionary._expressions.items():
|
| 182 | # dmsg(key, value, min_level=3)
|
89 | # dmsg(key, value, min_level=3)
|