def __addVerbalizedPunctuation(self, oldText): """Depending upon the users verbalized punctuation setting, adjust punctuation symbols in the given text to their pronounced equivalents. The pronounced text will either replace the punctuation symbol or be inserted before it. In the latter case, this is to retain spoken prosity. Arguments: - oldText: text to be parsed for punctuation. Returns a text string with the punctuation symbols adjusted accordingly. """ # Translators: we replace the ellipses (both manual and UTF-8) # with a spoken string. The extra space you see at the beginning # is because we need the speech synthesis engine to speak the # new string well. For example, "Open..." turns into # "Open dot dot dot". # spokenEllipsis = _(" dot dot dot") + " " newText = re.sub(ELLIPSIS, spokenEllipsis, oldText) try: newText = newText.decode("UTF-8") except UnicodeEncodeError: pass symbols = set(re.findall(PUNCTUATION, newText)) for symbol in symbols: try: level, action = punctuation_settings.getPunctuationInfo(symbol) except: continue if level != punctuation_settings.LEVEL_NONE: # Speech Dispatcher should handle it. # continue charName = " %s " % chnames.getCharacterName(symbol) if action == punctuation_settings.PUNCTUATION_INSERT: charName += symbol try: charName = charName.decode("UTF-8") except UnicodeEncodeError: pass newText = re.sub(symbol, charName, newText) if orca_state.activeScript: newText = orca_state.activeScript.utilities.adjustForDigits(newText) try: newText = newText.encode("UTF-8") except UnicodeDecodeError: pass return newText
def __addVerbalizedPunctuation(self, oldText): """Depending upon the users verbalized punctuation setting, adjust punctuation symbols in the given text to their pronounced equivalents. The pronounced text will either replace the punctuation symbol or be inserted before it. In the latter case, this is to retain spoken prosity. If we are moving around by single characters, then always speak the punctuation. We try to detect this by looking for just a single character being spoken. Arguments: - oldText: text to be parsed for punctuation. Returns a text string with the punctuation symbols adjusted accordingly. """ # Translators: we replace the ellipses (both manual and UTF-8) # with a spoken string. The extra space you see at the beginning # is because we need the speech synthesis engine to speak the # new string well. For example, "Open..." turns into # "Open dot dot dot". # oldText = oldText.replace("...", _(" dot dot dot"), 1) oldText = oldText.replace("\342\200\246", _(" dot dot dot"), 1) oldText = oldText.decode("UTF-8") ## Don't speak newlines unless the user is moving through text ## using a right or left arrow key. ## removeNewLines = True if orca_state.lastInputEvent and \ orca_state.lastInputEvent.__dict__.has_key("event_string"): lastKey = orca_state.lastInputEvent.event_string if lastKey == "Left" or lastKey == "Right": removeNewLines = False if removeNewLines: oldText = oldText.replace("\n", "", 1) # Used to keep a list of character offsets into the new text string, # once it has been converted to use verbalized punctuation, one for # each character in the original string. # self.textCharIndices = [] style = settings.verbalizePunctuationStyle newText = '' for i in range(0, len(oldText)): self.textCharIndices.append(len(newText)) try: level, action = \ punctuation_settings.getPunctuationInfo(oldText[i]) # Special case for punctuation in text like filenames or URL's: # isPrev = isNext = isSpecial = False if i > 0: isPrev = not (oldText[i - 1] in string.whitespace) if i < (len(oldText) - 1): isNext = not (oldText[i + 1] in string.whitespace) # If this is a period and there is a non-space character # on either side of it, then always speak it. # isSpecial = isPrev and isNext and (oldText[i] == ".") # If this is a dash and the users punctuation level is not # NONE and the previous character is a white space character, # and the next character is a dollar sign or a digit, then # always speak it. See bug #392939. # prevCharMatches = nextCharMatches = False if orca_state.activeScript: currencySymbols = \ orca_state.activeScript.getUnicodeCurrencySymbols() if i == 0: prevCharMatches = True if i > 0: prevCharMatches = (oldText[i - 1] in string.whitespace) if i < (len(oldText) - 1): nextCharMatches = (oldText[i + 1] in string.digits or \ oldText[i + 1] in currencySymbols) if oldText[i] == "-" and \ style != settings.PUNCTUATION_STYLE_NONE and \ prevCharMatches and nextCharMatches: if isPrev: newText += " " # Translators: this is to be sent to a speech synthesis # engine to prefix a negative number (e.g., "-56" turns # into "minus 56". We cannot always be sure of the type # of the number (floating point, integer, mixed with other # odd characters, etc.), so we need to unfortunately # build up the utterance in this manner. # newText += _("minus") elif (len(oldText) == 1) or isSpecial or (style <= level): if isPrev: newText += " " newText += chnames.getCharacterName(oldText[i]) if (action == punctuation_settings.PUNCTUATION_INSERT) \ and not isNext: newText += oldText[i].encode("UTF-8") if isNext: newText += " " else: newText += oldText[i].encode("UTF-8") except: if (len(oldText) == 1): newText += chnames.getCharacterName(oldText[i]) else: newText += oldText[i].encode("UTF-8") return newText