| 
143
 | 
     1 import re
 | 
| 
 | 
     2 comment = re.compile('/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/', re.MULTILINE)
 | 
| 
 | 
     3 
 | 
| 
 | 
     4 def read(filename):
 | 
| 
 | 
     5     token = '##//' # magical token
 | 
| 
 | 
     6     lines = [i.strip() for i in file(filename).readlines() if i.strip()]
 | 
| 
 | 
     7     retval = {}
 | 
| 
 | 
     8     _lines = []
 | 
| 
 | 
     9     for line in lines:
 | 
| 
 | 
    10         if line.startswith('#'):
 | 
| 
 | 
    11             continue
 | 
| 
 | 
    12         if '//' in line:
 | 
| 
 | 
    13             line = line.replace('//', token)
 | 
| 
 | 
    14         _lines.append(line)
 | 
| 
 | 
    15     string = '\n'.join(_lines)
 | 
| 
 | 
    16     string = re.sub(comment, '', string)
 | 
| 
 | 
    17     def pref(a, b):
 | 
| 
 | 
    18         retval[a] = b
 | 
| 
 | 
    19     lines = [i.strip().rstrip(';') for i in string.split('\n') if i.strip()]
 | 
| 
 | 
    20     for line in lines:
 | 
| 
 | 
    21         try:
 | 
| 
 | 
    22             _globals = {'retval': retval, 'pref': pref, 'user_pref': pref, 'true': True, 'false': False}
 | 
| 
 | 
    23             eval(line, _globals, {})
 | 
| 
 | 
    24         except SyntaxError:
 | 
| 
 | 
    25             print line
 | 
| 
 | 
    26             import pdb; pdb.set_trace()
 | 
| 
 | 
    27     for key in retval:
 | 
| 
 | 
    28         if isinstance(retval[key], basestring) and token in retval[key]:
 | 
| 
 | 
    29             retval[key] = retval[key].replace(token, '//')
 | 
| 
 | 
    30     return retval
 | 
| 
 | 
    31 
 | 
| 
 | 
    32 def write(filename, prefs, pref_string='user_pref("%s", %s);'):
 | 
| 
 | 
    33     f = file(filename, 'w')
 | 
| 
 | 
    34     for key, value in prefs.items():
 | 
| 
 | 
    35         if value is True:
 | 
| 
 | 
    36             print >> f, pref_string % (key, 'true')
 | 
| 
 | 
    37         elif value is False:
 | 
| 
 | 
    38             print >> f, pref_string % (key, 'true')
 | 
| 
 | 
    39         elif isinstance(value, basestring):
 | 
| 
 | 
    40             print >> f, pref_string % (key, repr(string(value)))
 | 
| 
 | 
    41         else:
 | 
| 
 | 
    42             print >> f, pref_string % (key, value) # should be numeric!
 | 
| 
 | 
    43     f.close()
 | 
| 
 | 
    44 
 | 
| 
 | 
    45 if __name__ == '__main__':
 | 
| 
 | 
    46     import sys
 | 
| 
 | 
    47     if not sys.argv[1:]:
 | 
| 
 | 
    48         sys.exit(1)
 | 
| 
 | 
    49     print read(sys.argv[1])
 |