rest.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import sys
  2. def match(node, tag, attr=None, val=None):
  3. if not isinstance(node, tuple):
  4. return False
  5. if node[0] != tag:
  6. return False
  7. if attr is not None:
  8. attrs = dict(node[1])
  9. if attr not in attrs:
  10. return False
  11. if attrs[attr] != val:
  12. return False
  13. return True
  14. def find(node, tag, attr=None, val=None):
  15. if isinstance(node, tuple):
  16. node = node[2]
  17. if not isinstance(node, list):
  18. raise ValueError('child not found')
  19. for child in node:
  20. if match(child, tag, attr, val):
  21. return child
  22. raise ValueError('child not found')
  23. def children(node):
  24. return node[2]
  25. def text(node):
  26. return children(node)[0]
  27. def _(s):
  28. return s # TODO
  29. def rest(root, f = sys.stdout):
  30. def write(text):
  31. f.write(text)
  32. def show(item, italic=False, bold=False):
  33. if isinstance(item, str):
  34. spc = '' # if item[-1] == '\n' else ' '
  35. fmt = '**' if bold else ('*' if italic else '')
  36. write('%s%s%s%s' % (fmt, item, fmt, spc))
  37. elif match(item, 'b'):
  38. for i in children(item):
  39. show(i, italic, True)
  40. elif match(item, 'i') or match(item, 'em'):
  41. for i in children(item):
  42. show(i, True, bold)
  43. html = find(root, 'html')
  44. title = text(find(find(html, 'head'), 'title'))
  45. rule = '=' * len(title)
  46. write('%s\n' % rule)
  47. write('%s\n' % title)
  48. write('%s\n' % rule)
  49. write('\n')
  50. write(".. figure:: grass_logo.png\n")
  51. write(" :align: center\n")
  52. write(" :alt: GRASS logo\n")
  53. write('\n')
  54. body = find(html, 'body')
  55. section = None
  56. for child in children(body):
  57. if match(child, 'h2'):
  58. section = text(child)
  59. rule = '-' * len(section)
  60. write("%s\n%s\n" % (section, rule))
  61. elif section == _('NAME'):
  62. if match(child, 'em'):
  63. name = text(find(child, 'b'))
  64. write("**%s**" % name)
  65. section = 'desc'
  66. elif section == 'desc' and isinstance(child, str) and child[:4] == ' - ':
  67. write(' - ')
  68. write(child[4:])
  69. if child[-1] != '\n':
  70. write('\n')
  71. write('\n')
  72. section = None
  73. elif section == _('KEYWORDS'):
  74. write(child.strip())
  75. write('\n\n')
  76. section = None
  77. elif section == _('SYNOPSIS'):
  78. if match(child, 'div', 'id', 'name'):
  79. name = text(find(child, 'b'))
  80. write("**%s**\n\n" % name)
  81. write("**%s** help\n\n" % name)
  82. elif match(child, 'div', 'id', 'synopsis'):
  83. for item in children(child):
  84. show(item)
  85. write('\n')
  86. elif match(child, 'div', 'id', 'flags'):
  87. header = text(find(child, 'h3'))
  88. rule = '=' * len(header)
  89. write('%s\n%s\n' % (header, rule))
  90. flags = find(child, 'dl')
  91. for flag in children(flags):
  92. if match(flag, 'dt'):
  93. item = text(find(flag, 'b'))
  94. write('**%s**\n' % item)
  95. elif match(flag, 'dd'):
  96. write(' %s\n' % text(flag))
  97. write('\n\n')
  98. elif match(child, 'div', 'id', 'parameters'):
  99. header = text(find(child, 'h3'))
  100. rule = '=' * len(header)
  101. write('%s\n%s\n' % (header, rule))
  102. params = find(child, 'dl')
  103. for param in children(params):
  104. if match(param, 'dt'):
  105. name = text(children(param)[0])
  106. write('**%s** = ' % name)
  107. for item in children(param)[2:]:
  108. show(item)
  109. write('\n\n')
  110. elif match(param, 'dd'):
  111. write('\t')
  112. for item in children(param):
  113. show(item)
  114. write('\n\n')
  115. write('\n')
  116. return