Mercurial > hg > config
comparison python/simpleini.py @ 112:e85298a35998
add a simpleini parser
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Thu, 02 Dec 2010 09:53:29 -0800 |
| parents | |
| children | 44534594f402 |
comparison
equal
deleted
inserted
replaced
| 111:2db73718f645 | 112:e85298a35998 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 import os | |
| 4 | |
| 5 def read(fp, comments=';#', separators=('=', ':')): | |
| 6 | |
| 7 if isinstance(fp, basestring): | |
| 8 fp = file(fp) | |
| 9 | |
| 10 sections = [] | |
| 11 key = value = None | |
| 12 | |
| 13 for line in fp.readlines(): | |
| 14 | |
| 15 stripped = line.strip() | |
| 16 | |
| 17 # ignore blank lines | |
| 18 if not stripped: | |
| 19 continue | |
| 20 | |
| 21 # ignore comment lines | |
| 22 if stripped[0] in comments: | |
| 23 continue | |
| 24 | |
| 25 # check for a new section | |
| 26 if len(stripped) > 2 and stripped[0] == '[' and stripped[-1] == ']': | |
| 27 section = stripped[1:-1].strip() | |
| 28 sections.append((section, {})) | |
| 29 key = value = None | |
| 30 # TODO: should probably make sure this section doesn't already exist | |
| 31 continue | |
| 32 | |
| 33 # if there aren't any sections yet, something bad happen | |
| 34 if not sections: | |
| 35 raise Exception('No sections yet :(') | |
| 36 | |
| 37 # (key, value) pair | |
| 38 for separator in separators: | |
| 39 if separator in stripped: | |
| 40 key, value = stripped.split(separator, 1) | |
| 41 key = key.strip() | |
| 42 value = value.strip() | |
| 43 sections[-1][1][key] = value | |
| 44 # TODO: should probably make sure this key isn't already in the section | |
| 45 break | |
| 46 else: | |
| 47 # continuation line ? | |
| 48 if line[0].isspace() and key: | |
| 49 value = '%s%s%s' % (value, os.linesep, stripped) | |
| 50 sections[-1][1][key] = value | |
| 51 else: | |
| 52 # something bad happen! | |
| 53 raise Exception("Not sure what you're trying to do") | |
| 54 | |
| 55 return sections | |
| 56 | |
| 57 if __name__ == '__main__': | |
| 58 import sys | |
| 59 for i in sys.argv[1:]: | |
| 60 print read(i) |
