# Parser for Windows INI-style config files. Hopefully slightly less sucky than # the built-in ConfigParser module... # Copyright 2006 Adam Sampson import sys, re class Section: def __init__(self, name, super): self.values = {} self.name = name self.super = super def __contains__(self, key): if key in self.values: return True if self.super is not None: return key in self.super return False def getall(self, key): if self.values.has_key(key): return self.values[key] if self.super is not None: return self.super.getall(key) return [] def __getitem__(self, key): ls = self.getall(key) if ls == []: return None else: return ls[0] def get(self, key, default = None): if key in self: return self[key] else: return default def set(self, key, value): if not self.values.has_key(key): self.values[key] = [] self.values[key].append(value) class Config: def __init__(self, filename = None): self.default = Section("default", None) self.sections = {} if filename is not None: self.load(filename) def load(self, filename): f = open(filename, "r") section = self.default for l in f.readlines(): l = l.strip() if l == "" or l[0] == "#": continue elif l[0] == "[" and l[-1] == "]": section = Section(l[1:-1], self.default) self.sections[section.name] = section else: m = re.match(r'^([^=]+)\s+=\s+(.*)$', l) if m is None: sys.stderr.write("Ignoring bad line in config file " + filename + ": " + l) else: section.set(m.group(1), m.group(2)) f.close() def get(self, section, default = None): return self.sections.get(section, default) def keys(self): return self.sections.keys()