1   
  2   
  3   
  4   
  5   
  6  """implementation details""" 
  7   
  8  import types 
  9   
 11      """implementation details""" 
 12 -    def __init__( self 
 13                    , pattern_char_begin 
 14                    , pattern_char_end 
 15                    , pattern_char_separator ): 
  16          self.__begin = pattern_char_begin 
 17          self.__end = pattern_char_end 
 18          self.__separator = pattern_char_separator 
 19           
 20          self.__text_qualifier = '"' 
 21          self.__char_qualifier = "'" 
 22          self.__escape = '\\' 
  23   
 28   
 29 -    def name( self, decl_string ): 
  36   
 38          """implementation details""" 
 39          bracket_depth = 0 
 40          for index, ch in enumerate( decl_string[start_pos:] ): 
 41              if ch not in ( self.__begin, self.__end, self.__separator ): 
 42                  continue  
 43              elif self.__separator == ch: 
 44                  if not bracket_depth: 
 45                      return index + start_pos 
 46              elif self.__begin == ch: 
 47                  bracket_depth += 1 
 48              elif not bracket_depth: 
 49                  return index + start_pos 
 50              else: 
 51                  bracket_depth -= 1 
 52          return -1 
  53   
 54 -    def args( self, decl_string ): 
  55          """implementation details""" 
 56          args_begin = decl_string.find( self.__begin ) 
 57          args_end = decl_string.rfind( self.__end ) 
 58          if -1 in ( args_begin, args_end ) or args_begin == args_end: 
 59              raise RuntimeError( "%s doesn't valid template instantiation string" % decl_string ) 
 60   
 61          args_only = decl_string[args_begin + 1: args_end ] 
 62          args = [] 
 63          previous_found, found = 0, 0 
 64          while True: 
 65              found = self.__find_args_separator( args_only, previous_found) 
 66              if -1 == found: 
 67                  args.append( args_only[ previous_found : ] ) 
 68                  break 
 69               
 70               
 71               
 72              else: 
 73                  args.append( args_only[ previous_found : found ] ) 
 74              previous_found = found + 1  
 75          return [ arg.strip() for arg in args ] 
  76   
 77      NOT_FOUND = ( -1, -1 ) 
 78      """implementation details""" 
 79   
 81          """implementation details""" 
 82          if start==None: 
 83              start = 0 
 84          first_occurance = text.find( self.__begin, start ) 
 85          if first_occurance == -1: 
 86              return self.NOT_FOUND 
 87          previous_found, found = first_occurance + 1, 0 
 88          while True: 
 89              found = self.__find_args_separator( text, previous_found) 
 90              if -1 == found: 
 91                  return self.NOT_FOUND 
 92              elif text[ found ] == self.__end: 
 93                  return ( first_occurance, found ) 
 94              else: 
 95                  previous_found = found + 1  
  96   
 97 -    def split( self, decl_string ): 
 101   
114   
115 -    def join( self, name, args, arg_separator=None ): 
 116          """implementation details""" 
117          if None is arg_separator: 
118              arg_separator = ', ' 
119          args = filter( None, args) 
120          args_str = '' 
121          if not args: 
122              args_str = ' ' 
123          elif 1 == len( args ): 
124              args_str = ' ' + args[0] + ' ' 
125          else: 
126              args_str = ' ' + arg_separator.join( args ) + ' ' 
127   
128          return ''.join( [ name, self.__begin, args_str, self.__end ] ) 
 129   
130 -    def normalize( self, decl_string, arg_separator=None ): 
  138