From a78cb626202104e24b971fc9b19ebe09867b26b9 Mon Sep 17 00:00:00 2001 From: chrys87 Date: Tue, 20 Dec 2016 16:17:16 +0100 Subject: [PATCH] initial "new" wordWrap --- src/fenrir/utils/word_utils.py | 105 +++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 13 deletions(-) diff --git a/src/fenrir/utils/word_utils.py b/src/fenrir/utils/word_utils.py index 0b9432d6..ef8a9d7e 100644 --- a/src/fenrir/utils/word_utils.py +++ b/src/fenrir/utils/word_utils.py @@ -5,18 +5,35 @@ # By Chrys, Storm Dragon, and contributers. from core import debug -# X Y Word END BREAK -# -1, -1, '', True False +import string + def getPrevWord(currX,currY, currText): lineBreak = False endOfScreen = False if currText == '': return -1, -1, '', endOfScreen, lineBreak - x, y, currWord, endOfScreen, lineBreak = getCurrentWord(currX,currY,currText) + if currText.strip(string.punctuation +"§ " + string.whitespace) == '': + return currX, currY, '', endOfScreen, lineBreak + x, y, currWord, endOfScreen, lineBreakCurrWord = getCurrentWord(currX,currY,currText) if endOfScreen: return x, y, currWord, endOfScreen, lineBreak - wrappedLines = currText.split('\n') - currLine = wrappedLines[y].replace("\t"," ") + wrappedLines = currText.split('\n') + currLine = wrappedLines[y] + if x - 1 < 0: + if y - 1 < 0: + lineBreak = False + endOfScreen = True + return currX, currY, '', endOfScreen, lineBreak + else: + y -= 1 + currLine = wrappedLines[y] + x = len( wrappedLines[y]) - 1 + lineBreak = True + else: + x -= 1 + lineBreakCurrWord = lineBreak or lineBreakCurrWord + x, y, currWord, endOfScreen, lineBreak = getCurrentWord(x,y,currText) + lineBreak = lineBreak or lineBreakCurrWord return x, y, currWord, endOfScreen, lineBreak def getCurrentWord(currX,currY, currText): @@ -24,21 +41,83 @@ def getCurrentWord(currX,currY, currText): endOfScreen = False if currText == '': return -1, -1, '', endOfScreen, lineBreak + if currText.strip(string.punctuation +"§ " + string.whitespace) == '': + return currX, currY, '', endOfScreen, lineBreak x = currX y = currY currWord = '' wrappedLines = currText.split('\n') - currLine = wrappedLines[y].replace("\t"," ") - return x, y, currWord, endOfScreen, lineBreak + currLine = wrappedLines[y] + Found = False + while(not Found): + if not currLine[x] in string.whitespace: + if x == 0: + Found = True + else: + if currLine[x - 1] in string.whitespace: + Found = True + if not Found: + if x - 1 < 0: + if y - 1 < 0: + lineBreak = False + endOfScreen = True + return currX, currY, '', endOfScreen, lineBreak + else: + y -= 1 + currLine = wrappedLines[y] + x = len( wrappedLines[y]) - 1 + lineBreak = True + else: + x -= 1 + if Found: + currWord = currLine[x:] + for d in string.whitespace: + delimiterPos = currWord.find(d) + if delimiterPos != -1: + currWord = currWord[:delimiterPos] + + return x, y, currWord, endOfScreen, lineBreak + return currX, currY, '', False, False def getNextWord(currX,currY, currText): - lineBreak = False + lineBreak = False endOfScreen = False if currText == '': return -1, -1, '', endOfScreen, lineBreak - x, y, currWord, endOfScreen, lineBreak = getCurrentWord(currX,currY,currText) - if endOfScreen: - return x, y, currWord, endOfScreen, lineBreak + if currText.strip(string.punctuation +"§ " + string.whitespace) == '': + return currX, currY, '', endOfScreen, lineBreak + x = currX + y = currY + currWord = '' wrappedLines = currText.split('\n') - currLine = wrappedLines[y].replace("\t"," ") - return x, y, currWord, endOfScreen, lineBreak + currLine = wrappedLines[y] + Found = False + while(not Found): + if not Found: + if x + 1 > len( currLine ) - 1: + if y + 1 > len( wrappedLines ) - 1: + lineBreak = False + endOfScreen = True + return currX, currY, '', endOfScreen, lineBreak + else: + y += 1 + currLine = wrappedLines[y] + x = 0 + lineBreak = True + else: + x += 1 + if not currLine[x] in string.whitespace: + if x == 0: + Found = True + else: + if currLine[x - 1] in string.whitespace: + Found = True + if Found: + currWord = currLine[x:] + for d in string.whitespace: + delimiterPos = currWord.find(d) + if delimiterPos != -1: + currWord = currWord[:delimiterPos] + return x, y, currWord, endOfScreen, lineBreak + return currX, currY, '', False, False +