import sys def match(node, tag, attr=None, val=None): if not isinstance(node, tuple): return False if node[0] != tag: return False if attr is not None: attrs = dict(node[1]) if attr not in attrs: return False if attrs[attr] != val: return False return True def find(node, tag, attr=None, val=None): if isinstance(node, tuple): node = node[2] if not isinstance(node, list): raise ValueError('child not found') for child in node: if match(child, tag, attr, val): return child raise ValueError('child not found') def children(node): return node[2] def text(node): return children(node)[0] def _(s): return s # TODO def rest(root, f = sys.stdout): def write(text): f.write(text) def show(item, italic=False, bold=False): if isinstance(item, str): spc = '' # if item[-1] == '\n' else ' ' fmt = '**' if bold else ('*' if italic else '') write('%s%s%s%s' % (fmt, item, fmt, spc)) elif match(item, 'b'): for i in children(item): show(i, italic, True) elif match(item, 'i') or match(item, 'em'): for i in children(item): show(i, True, bold) html = find(root, 'html') title = text(find(find(html, 'head'), 'title')) rule = '=' * len(title) write('%s\n' % rule) write('%s\n' % title) write('%s\n' % rule) write('\n') write(".. figure:: grass_logo.png\n") write(" :align: center\n") write(" :alt: GRASS logo\n") write('\n') body = find(html, 'body') section = None for child in children(body): if match(child, 'h2'): section = text(child) rule = '-' * len(section) write("%s\n%s\n" % (section, rule)) elif section == _('NAME'): if match(child, 'em'): name = text(find(child, 'b')) write("**%s**" % name) section = 'desc' elif section == 'desc' and isinstance(child, str) and child[:4] == ' - ': write(' - ') write(child[4:]) if child[-1] != '\n': write('\n') write('\n') section = None elif section == _('KEYWORDS'): write(child.strip()) write('\n\n') section = None elif section == _('SYNOPSIS'): if match(child, 'div', 'id', 'name'): name = text(find(child, 'b')) write("**%s**\n\n" % name) write("**%s** help\n\n" % name) elif match(child, 'div', 'id', 'synopsis'): for item in children(child): show(item) write('\n') elif match(child, 'div', 'id', 'flags'): header = text(find(child, 'h3')) rule = '=' * len(header) write('%s\n%s\n' % (header, rule)) flags = find(child, 'dl') for flag in children(flags): if match(flag, 'dt'): item = text(find(flag, 'b')) write('**%s**\n' % item) elif match(flag, 'dd'): write(' %s\n' % text(flag)) write('\n\n') elif match(child, 'div', 'id', 'parameters'): header = text(find(child, 'h3')) rule = '=' * len(header) write('%s\n%s\n' % (header, rule)) params = find(child, 'dl') for param in children(params): if match(param, 'dt'): name = text(children(param)[0]) write('**%s** = ' % name) for item in children(param)[2:]: show(item) write('\n\n') elif match(param, 'dd'): write('\t') for item in children(param): show(item) write('\n\n') write('\n') return