from StringTree import * from jwutils.log import * def _cleanup_line(line): line = line.strip() r = '' in_quote = None for c in line: if c == in_quote: in_quote = None else: if c in [ '"', "'" ]: in_quote = c elif in_quote is None and c == '#': return r.strip() r += c return r def parse(s): # export slog(DEBUG, "parsing", s) root = StringTree('', content='root') sec = '' for line in s.splitlines(): slog(DEBUG, "line=", line) line = _cleanup_line(line) if not len(line): continue if line[0] == '[': if line[-1] == ']': sec = line[1:-1] elif line[-1] == '[': if len(sec): sec += '.' sec += line[1:-1] else: raise Exception("failed to parse section line", line) if root.get(sec) is None: root.add(sec) continue elif line[0] == ']': assert(len(sec) > 0) sec = '.'.join(sec.split('.')[0:-1]) continue lhs = '' rhs = None for c in line: if rhs is None: if c == '=': rhs = '' continue lhs += c continue rhs += c if rhs is None: raise Exception("failed to parse assignment", line) root.add(sec + '.' + cleanup_string(lhs), cleanup_string(rhs)) return root def read(path): # export with open(path, 'r') as infile: s = infile.read() return parse(s)