rest.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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