Changeset 181


Ignore:
Timestamp:
09/17/10 14:09:46 (10 years ago)
Author:
dennis
Message:

AdvancedParser?:

  • Improved error handling
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/AdvancedParser.py

    r142 r181  
    1313import re
    1414import types
     15
     16__author__  = "Dennis Stam"
     17__version__ = ( 1, 1, 0 )
    1518
    1619class AdvancedParser(OptionParser):
     
    3639        """
    3740
     41        def parse_letters( self, chars ):
     42           
     43            if type( chars ) is not types.ListType and len( chars ) != 2:
     44                self.error( 'Could not parse range' )
     45
     46            start   = ord( chars[ 0 ] )
     47            end     = ord( chars[ 1 ] )
     48            out     = list()
     49
     50            if start > 96 and start < 122 and end > 97 and end < 123:
     51                lrange = range( start, end + 1 )
     52
     53                for ichar in lrange:
     54                    out.append( chr( ichar ) )
     55               
     56                return out
     57            else:
     58                self.error( 'AdvanedParser module only handles letters from a to z ( lower cased )' )
     59
    3860        def return_range(self, string):
    3961                """
     
    4567                The ranges will be return as lists
    4668                """
    47                 parts = string.split( ',' )
    4869                numbers_chars = list()
    4970                equal_width_length = 0
    5071
    51                 for part in parts:
    52                         part_range = part.split( '-' )
    53                         if len( part_range ) == 2:
    54                                 try:
    55                                         if part_range[0][0] == '0' or part_range[1][0] == '0':
    56                                                 if len( part_range[0] ) > len( part_range[1] ):
    57                                                         equal_width_length = len( part_range[0] )
    58                                                 else:
    59                                                         equal_width_length = len( part_range[1] )
     72                if string.find( ',' ) >= 0 and string.find( ',' ) < 1:
     73                    self.error( 'You cannot start a range with \',\'. Given range: %s' % string )
    6074
    61                                         numbers_chars += range( int( part_range[0] ), int( part_range[1] ) + 1 )
    62                                 except ValueError:
    63                                         begin = ord( part_range[0] )
    64                                         end = ord( part_range[1] )
    65                                         tmplist = list()
     75                if string.find( '-' ) >= 0 and string.find( '-' ) < 1:
     76                    self.error( 'You cannot start a range with \'-\'. Given range: %s' % string )
    6677
    67                                         if begin > 96 and end < 123:
    68                                                 tmplist = range( begin, end + 1)
     78                for section in string.split( ',' ):
     79                    if section.find( '-' ) > 0:
     80                        if len( section.split( '-' ) ) != 2:
     81                            self.error( 'A range must be consisted of two values' )
     82                       
     83                        chars = section.split( '-' )
    6984
    70                                                 for letter in tmplist:
    71                                                         numbers_chars.append( chr( letter ) )
    72                         else:
    73                                 if equal_width_length != 0 and len( part ) > equal_width_length:
    74                                         equal_width_length = len( part )
     85                        try:
     86                            if chars[ 0 ][ 0 ] == '0' or chars[ 1 ][ 0 ]:
     87                                if len( chars[ 0 ] ) > len( chars[ 1 ] ):
     88                                    equal_width_length = len( chars[ 0 ] )
     89                                else:
     90                                    equal_width_lenght = len( chars[ 1 ] )
    7591
    76                                 numbers_chars.append( part )
     92                            numbers_chars += range( int( chars[ 0 ] ), int( chars[ 1 ] ) + 1 )
     93                        except ValueError:
     94                            numbers_chars += self.parse_letters( chars )
    7795
    78                 if equal_width_length > 0:
    79                         tmplist = list()
    80 
    81                         for number_char in numbers_chars:
    82                                 try:
    83                                         nnum = int( number_char )
    84                                         tmplist.append( '%0*d' % (equal_width_length, nnum) )
    85                                 except ValueError:
    86                                         tmplist.append( number_char )
    87                        
    88                         numbers_chars = tmplist
     96                    else:
     97                        if equal_width_length != 0 and len( section ) > equal_width_lenght:
     98                            equal_width_lenght = len( section )
     99                        numbers_chars.append( section )
    89100
    90101                return numbers_chars
     
    152163if __name__ == "__main__":
    153164        import doctest
    154         print 'Starting doctest'
    155165        doctest.testmod()
Note: See TracChangeset for help on using the changeset viewer.