Revision: 6226 Author: russblau Date: 2009-01-05 21:51:09 +0000 (Mon, 05 Jan 2009)
Log Message: ----------- refactor, in hopes of better performance
Modified Paths: -------------- branches/rewrite/pywikibot/userinterfaces/terminal_interface.py
Modified: branches/rewrite/pywikibot/userinterfaces/terminal_interface.py =================================================================== --- branches/rewrite/pywikibot/userinterfaces/terminal_interface.py 2009-01-05 19:28:01 UTC (rev 6225) +++ branches/rewrite/pywikibot/userinterfaces/terminal_interface.py 2009-01-05 21:51:09 UTC (rev 6226) @@ -186,36 +186,47 @@ transliteration. """ if config.transliterate: - # Encode our unicode string in the encoding used by the user's console, + # Encode unicode string in the encoding used by the user's console, # and decode it back to unicode. Then we can see which characters # can't be represented in the console encoding. - codecedText = text.encode(config.console_encoding, 'replace').decode(config.console_encoding) - transliteratedText = '' - # Note: A transliteration replacement might be longer than the original - # character, e.g. ч is transliterated to ch. + codecedText = text.encode(config.console_encoding, 'replace' + ).decode(config.console_encoding) + transliteratedText = list(codecedText) + # Note: A transliteration replacement might be longer than the + # original character; e.g., ч is transliterated to ch. + # the resulting list will have as many elements as there are + # characters in the original text, but some list elements may + # contain multiple characters prev = "-" - for i in xrange(len(codecedText)): + prevchar = -1 + cursor = 0 + while cursor < len(codecedText): + char = codecedText.find(u"?", cursor) + if char == -1: + break + cursor = char + 1 # work on characters that couldn't be encoded, but not on # original question marks. - if codecedText[i] == '?' and text[i] != u'?': + if text[char] != u"?": + if char > 0 and prevchar != char - 1: + prev = transliteratedText[char-1] try: - transliterated = transliteration.trans(text[i], default = '?', prev = prev, next = text[i+1]) + transliterated = transliteration.trans( + text[char], default='?', + prev=prev, next=text[char+1]) except IndexError: - transliterated = transliteration.trans(text[i], default = '?', prev = prev, next = ' ') + transliterated = transliteration.trans( + text[char], default='?', + prev=prev, next=' ') # transliteration was successful. The replacement # could consist of multiple letters. # mark the transliterated letters in yellow. - transliteratedText += '\03{lightyellow}%s\03{default}' % transliterated - transLength = len(transliterated) - # memorize if we replaced a single letter by multiple letters. - if len(transliterated) > 0: - prev = transliterated[-1] - else: - # no need to try to transliterate. - transliteratedText += codecedText[i] - prev = codecedText[i] - text = transliteratedText - + transliteratedText[char] = u'\03{lightyellow}%s\03{default}' \ + % transliterated + # save the last transliterated character + prev = transliterated[-1:] + prevchar = char + text = u"".join(transliteratedText) self.printColorized(text, level)
def input(self, question, password = False):