#!/usr/bin/env python f = open('../include/libtorrent/settings_pack.hpp') out = open('settings.rst', 'w+') def print_field(str, width): return '%s%s' % (str, ' ' * (width - len(str))) def render_section(names, description, type, default_values): max_name_len = max(len(max(names, key=len)), len('name')) max_type_len = max(len(type), len('type')) max_val_len = max(len(max(default_values, key=len)), len('default')) # add link targets for the rest of the manual to reference for n in names: print >>out, '.. _%s:\n' % n if len(names) > 0: print >>out, '.. raw:: html\n' for n in names: print >>out, '\t' % n print >>out, '' separator = '+-' + ('-' * max_name_len) + '-+-' + ('-' * max_type_len) + '-+-' + ('-' * max_val_len) + '-+' # build a table for the settings, their type and default value print >>out, separator print >>out, '| %s | %s | %s |' % (print_field('name', max_name_len), print_field('type', max_type_len), print_field('default', max_val_len)) print >>out, separator.replace('-', '=') for i in range(len(names)): print >>out, '| %s | %s | %s |' % (print_field(names[i], max_name_len), print_field(type, max_type_len), print_field(default_values[i], max_val_len)) print >>out, separator print >>out print >>out, description mode = '' # parse out default values for settings f2 = open('../src/settings_pack.cpp') def_map = {} for l in f2: l = l.strip() if not l.startswith('SET(') \ and not l.startswith('SET_NOPREV(') \ and not l.startswith('DEPRECATED_SET('): continue l = l.split('(')[1].split(',') def_map[l[0]] = l[1].strip() print '%s = %s' % (l[0], l[1].strip()) description = '' names = [] for l in f: if 'enum string_types' in l: mode = 'string' if 'enum bool_types' in l: mode = 'bool' if 'enum int_types' in l: mode = 'int' if '#if TORRENT_ABI_VERSION == 1' in l: mode += 'skip' if '#endif' in l: mode = mode[0:-4] if mode == '': continue if mode[-4:] == 'skip': continue l = l.lstrip() if l == '' and len(names) > 0: if description == '': for n in names: print 'WARNING: no description for "%s"' % n else: default_values = [] for n in names: default_values.append(def_map[n]) render_section(names, description, mode, default_values) description = '' names = [] if l.startswith('};'): mode = '' continue if l.startswith('//'): if l[2] == ' ': description += l[3:] else: description += l[2:] continue l = l.strip() if l.endswith(','): l = l[:-1] # strip trailing comma if '=' in l: l = l.split('=')[0].strip() if l.endswith('_internal'): continue names.append(l) out.close() f.close()