def _read(self, fp, fpname): """Parse a sectioned setup file. The sections in setup file contains a title line at the top, indicated by a name in square brackets (`[]'), plus key/value options lines, indicated by `name: value' format lines. Continuations are represented by an embedded newline then leading whitespace. Blank lines, lines beginning with a '#', and just about everything else are ignored. """ in_section = False matching_section = False optname = None lineno = 0 e = None # None, or an exception while True: line = fp.readline() if not line: break if lineno == 0 and line.startswith(u('\ufeff')): line = line[1:] # Strip UTF-8 BOM lineno = lineno + 1 # comment or blank line? if line.strip() == '' or line[0] in '#;': continue # a section header or option header? else: # is it a section header? mo = self.SECTCRE.match(line) if mo: sectname = mo.group('header') in_section = True matching_section = self.matches_filename(fpname, sectname) # So sections can't start with a continuation line optname = None # an option line? else: mo = self.OPTCRE.match(line) if mo: optname, vi, optval = mo.group('option', 'vi', 'value') if ';' in optval or '#' in optval: # ';' and '#' are comment delimiters only if # preceeded by a spacing character m = re.search('(.*?) [;#]', optval) if m: optval = m.group(1) optval = optval.strip() # allow empty values if optval == '""': optval = '' optname = self.optionxform(optname.rstrip()) if not in_section and optname == 'root': self.root_file = (optval.lower() == 'true') if matching_section: self.options[optname] = optval else: # a non-fatal parsing error occurred. set up the # exception but keep going. the exception will be # raised at the end of the file and will contain a # list of all bogus lines if not e: e = ParsingError(fpname) e.append(lineno, repr(line)) # if any parsing errors occurred, raise an exception if e: raise e
def _read(self, fp, fpname): """Parse a sectioned setup file. The sections in setup file contains a title line at the top, indicated by a name in square brackets (`[]'), plus key/value options lines, indicated by `name: value' format lines. Continuations are represented by an embedded newline then leading whitespace. Blank lines, lines beginning with a '#', and just about everything else are ignored. """ in_section = False matching_section = False optname = None lineno = 0 e = None # None, or an exception while True: line = fp.readline() if not line: break if lineno == 0 and line.startswith(u('\ufeff')): line = line[1:] # Strip UTF-8 BOM lineno = lineno + 1 # comment or blank line? if line.strip() == '' or line[0] in '#;': continue # a section header or option header? else: # is it a section header? mo = self.SECTCRE.match(line) if mo: sectname = mo.group('header') in_section = True matching_section = self.matches_filename(fpname, sectname) # So sections can't start with a continuation line optname = None # an option line? else: mo = self.OPTCRE.match(line) if mo: optname, vi, optval = mo.group('option', 'vi', 'value') if ';' in optval or '#' in optval: # ';' and '#' are comment delimiters only if # preceded by a spacing character m = re.search('(.*?) [;#]', optval) if m: optval = m.group(1) optval = optval.strip() # allow empty values if optval == '""': optval = '' optname = self.optionxform(optname.rstrip()) if not in_section and optname == 'root': self.root_file = (optval.lower() == 'true') if matching_section: self.options[optname] = optval else: # a non-fatal parsing error occurred. set up the # exception but keep going. the exception will be # raised at the end of the file and will contain a # list of all bogus lines if not e: e = ParsingError(fpname) e.append(lineno, repr(line)) # if any parsing errors occurred, raise an exception if e: raise e