r'\]' # ]
)
OPTCRE = re.compile(
- r'(?P<option>[^:=\s]+)' # very permissive!
+ r'(?P<option>[^:=\s][^:=]*)' # very permissive!
r'\s*(?P<vi>[:=])\s*' # any number of space/tab,
# followed by separator
# (either : or =), followed
# comment or blank line?
if line.strip() == '' or line[0] in '#;':
continue
- if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR": # no leading whitespace
+ if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
+ # no leading whitespace
continue
# continuation line?
if line[0].isspace() and cursect is not None and optname:
# allow empty values
if optval == '""':
optval = ''
- optname = self.optionxform(optname)
+ optname = self.optionxform(optname.rstrip())
cursect[optname] = optval
else:
# a non-fatal parsing error occurred. set up the
r'Internationalized Stuff',
r'Long Line',
r'Section\with$weird%characters[' '\t',
+ r'Spaces',
r'Spacey Bar',
],
"unexpected list of section names")
verify(cf.get('Foo Bar', 'foo', raw=1) == 'bar')
verify(cf.get('Spacey Bar', 'foo', raw=1) == 'bar')
verify(cf.get('Commented Bar', 'foo', raw=1) == 'bar')
+ verify(cf.get('Spaces', 'key with spaces', raw=1) == 'value')
+ verify(cf.get('Spaces', 'another with spaces', raw=1) == 'splat!')
verify('__name__' not in cf.options("Foo Bar"),
'__name__ "option" should not be exposed by the API!')
foo=Default
foo[en]=English
foo[de]=Deutsch
+[Spaces]
+key with spaces : value
+another with spaces = splat!
""")
write("""[Long Line]
foo: this line is much, much longer than my editor