123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 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
|