# -*- coding: iso-8859-1 -*- """ MoinMoin macro parameter parser parses a given parameter string and seperates the single parameters and detects their type Possible parameterstypes are: Name | short | example ---------------------------- Integer | i | -374 Float | f | 234.234 23.345E-23 String | s | 'Stri\'ng' Boolean | b | 0 1 True false Name | | case_sensitive | converted to string @copyright: 2004 by Florian Festi @license: GNU GPL, see COPYING for details. """ import re, types class ParameterParser: def __init__(self, pattern): #parameter_re = "([^\"',]*(\"[^\"]*\"|'[^']*')?[^\"',]*)[,)]" name = "(?P<%s>[a-zA-Z_][a-zA-Z0-9_]*)" int_re = r"(?P-?\d+)" float_re = r"(?P-?\d+\.\d+([eE][+-]?\d+)?)" string_re = (r"(?P('([^']|(\'))*?')|" + r'("([^"]|(\"))*?"))') name_re = name % "name" name_param_re = name % "name_param" param_re = r"\s*(\s*%s\s*=\s*)?(%s|%s|%s|%s)\s*(,|$)" % (name_re, float_re, int_re, string_re, name_param_re) self.param_re = re.compile(param_re, re.U) self._parse_pattern(pattern) def _parse_pattern(self, pattern): param_re = r"(%(?P\(.*?\))?(?P[ifs]{1,3}))|\|" i = 0 self.optional = -1 named = False self.param_list = [] self.param_dict = {} for match in re.finditer(param_re, pattern): if match.group() == "|": self.optional = i continue self.param_list.append(match.group('type')) if match.group('name'): named = True self.param_dict[match.group('name')[1:-1]] = i elif named: raise ValueError, "Named parameter expected" i += 1 def __str__(self): return "%s, %s, optional:%s" % (self.param_list, self.param_dict, self.optional) def parse_parameters(self, input): """ (4, 2) """ parameter_list = [None] * len(self.param_list) parameter_dict = {} check_list = [0] * len(self.param_list) i = 0 start = 0 named = False while start x if type == 'i': if 'f' in format: return float(value) # i -> f elif 'b' in format: return value # i -> b elif type == 'f': if 'b' in format: return value # f -> b elif type == 's': if 'b' in format: return value.lower() != 'false' # s-> b if 's' in format: # * -> s return str(value) else: pass # XXX error def main(): pattern = "%i%sf%s%ifs%(a)s|%(b)s" param = ' 4,"DI\'NG", b=retry, a="DING"' #p_list, p_dict = parse_parameters(param) print 'Pattern :', pattern print 'Param :', param P = ParameterParser(pattern) print P print P.parse_parameters(param) if __name__=="__main__": main()