Ticket #2062: 0001-Make-sure-Screen.add_line.get_line_chunks-does-not-d.2.patch

File 0001-Make-sure-Screen.add_line.get_line_chunks-does-not-d.2.patch, 2.7 KB (added by eirikba, 15 years ago)
  • deluge/ui/console/screen.py

    From af629add58e0148eae11c77da712a8240b22fe49 Mon Sep 17 00:00:00 2001
    From: Eirik Byrkjeflot Anonsen <eirik@eirikba.org>
    Date: Sat, 24 Mar 2012 16:28:06 +0100
    Subject: [PATCH] Make sure Screen.add_line.get_line_chunks() does not discard beginning of line.
    
    The old version would discard everything before the first '{!'.
    
    Also, this version is less magic and all over easier to understand.
    ---
     deluge/ui/console/screen.py |   42 +++++++++++++++++++++++-------------------
     1 files changed, 23 insertions(+), 19 deletions(-)
    
    diff --git a/deluge/ui/console/screen.py b/deluge/ui/console/screen.py
    index 1a05c45..26327f6 100644
    a b def add_line(self, text, refresh=True):  
    163163        def get_line_chunks(line):
    164164            """
    165165            Returns a list of 2-tuples (color string, text)
     166            First tuple may have empty color string.
    166167
    167168            """
     169            if not line:
     170                return []
    168171            chunks = []
    169             num_chunks = line.count("{!")
    170             for i in range(num_chunks):
    171                 # Find the beginning and end of the color tag
    172                 beg = line.find("{!")
    173                 end = line.find("!}") + 2
    174                 color = line[beg:end]
    175                 line = line[end:]
    176 
    177                 # Check to see if this is the last chunk
    178                 if i + 1 == num_chunks:
    179                     text = line
    180                 else:
    181                     # Not the last chunk so get the text up to the next tag
    182                     # and remove the text from line
    183                     text = line[:line.find("{!")]
    184                     line = line[line.find("{!"):]
    185 
    186                 chunks.append((color, text))
    187 
     172            if not line.startswith('{!'):
     173                begin = line.find('{!')
     174                if begin < 0:
     175                    begin = len(line)
     176                chunks.append( ('', line[:begin]) )
     177                line = line[begin:]
     178            while line:
     179                # We know the line starts with '{!' here
     180                end_color = line.find('!}')
     181                if end_color < 0:
     182                    # Could raise an exception here, but it may be better to
     183                    # pass along what we've got to the real parser and see
     184                    # what happens.
     185                    chunks.append( (line, '') )
     186                    return chunks
     187                next_color = line.find('{!', end_color)
     188                if next_color < 0:
     189                    next_color = len(line)
     190                chunks.append( (line[:end_color+2], line[end_color+2:next_color]) )
     191                line = line[next_color:]
    188192            return chunks
    189193
    190194        for line in text.splitlines():