|
@@ -0,0 +1,126 @@
|
|
|
+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
|