1 # vim: set et sw=4 sts=4 encoding=utf-8 :
3 from turbogears.validators import *
5 class ParseError(ValueError): pass
7 def params_to_list(params):
8 r"""Parsea un string de forma similar al bash, separando por espacios y
9 teniendo en cuenta comillas simples y dobles para agrupar. Para poner
10 comillas se puede usar el \ como caracter de escape (\' y \") y también
11 interpreta \n y \t. Devuelve una lista con los parámetros encontrados.
12 >>> param2seq('--prueba')
14 >>> params_to_list('--prueba larga "con espacios"')
15 ['--prueba', 'larga', 'con espacios']
16 >>> params_to_list(u'''"con enter\\nentre 'comillas \\"dobles\\"'" --unicode''')
17 [u'con enter\nentre \'comillas "dobles"\'', u'--unicode']
18 >>> params_to_list('"archivo\\tseparado\\tpor\\ttabs" -h')
19 ['archivo\tseparado\tpor\ttabs', '-h']
22 SEP, TOKEN, DQUOTE, SQUOTE = ' ', None, '"', "'"
27 if not params: return seq
29 # Es un caracter escapado
39 # Es una secuencia de escape
43 # Si está buscando espacios
48 state = TOKEN # Encontró
75 raise ParseError, 'Invalid syntax'
76 if state == DQUOTE or state == SQUOTE:
77 raise ParseError, 'Missing closing quote %s' % state
82 class ParamsValidator(UnicodeString):
83 def validate_python(self, value, state):
87 raise Invalid(str(e), value, state)