=== modified file 'source/speech.py'
--- source/speech.py	2008-03-18 10:57:22 +0000
+++ source/speech.py	2008-03-19 03:03:03 +0000
@@ -62,12 +62,17 @@
 def terminate():
 	setSynth(None)
 
+RE_REPEATED_CHARS = re.compile(r"(([\W_])\2{3,})")
+def _replaceRepeatedChars(m):
+	return _("%s %d times ") % (m.group(2), len(m.group(1)))
+
 def processTextSymbols(text,expandPunctuation=False):
 	if (text is None) or (len(text)==0) or (isinstance(text,basestring) and (set(text)<=set(characterSymbols.blankList))):
 		return _("blank") 
 	#Convert non-breaking spaces to spaces
 	if isinstance(text,basestring):
 		text=text.replace(u'\xa0',u' ')
+	text = RE_REPEATED_CHARS.sub(_replaceRepeatedChars, text)
 	text = userDictHandler.processText(text)
 	#expands ^ and ~ so they can be used as protector symbols
 	#Expands special sentence punctuation keeping the origional physical symbol but protected by ^ and ~

=== modified file 'source/userdicts/default.dic'
--- source/userdicts/default.dic	2007-12-18 01:06:17 +0000
+++ source/userdicts/default.dic	2008-03-19 03:07:19 +0000
@@ -1,8 +1,6 @@
 #General NVDA dictionary
 #syntax: record fields divided by tab character
 
-#Limit groups of the same character to 5 or less.
-([\W])\1{5,}	\1\1\1\1\1
 #break up words that use a capital letter to denote another word
 ([a-z])([A-Z])	\1 \2
 #Break away a word starting with a capital from a fully uppercase word


