aboutsummaryrefslogtreecommitdiff
path: root/makespec.py
blob: 8e73cf4a271df057dafc47b66ef9e384edfb76f9 (plain)
  1. #!/usr/bin/env python3
  2. import re
  3. import sys
  4. from subprocess import *
  5. if len(sys.argv) == 3:
  6. specfile = sys.argv[1]
  7. specformat = sys.argv[2]
  8. if not (specformat in ["html", "markdown"]):
  9. sys.stderr.write("Format must be html or markdown\n")
  10. exit(1)
  11. else:
  12. sys.stderr.write("Usage: makespec.py SPECFILE [html|markdown]\n")
  13. exit(1)
  14. def pipe_through_prog(prog, text):
  15. p1 = Popen(prog.split(), stdout=PIPE, stdin=PIPE, stderr=PIPE)
  16. [result, err] = p1.communicate(input=text.encode('utf-8'))
  17. return [p1.returncode, result.decode('utf-8'), err]
  18. def replaceAnchor(match):
  19. refs.append("[{0}]: #{1}".format(match.group(1), match.group(2)))
  20. if specformat == "html":
  21. return '<a id="{1}" href="#{1}" class="definition">{0}</a>'.format(match.group(1), match.group(2))
  22. else:
  23. return match.group(0)
  24. stage = 0
  25. example = 0
  26. section = ""
  27. mdlines = []
  28. refs = []
  29. with open(specfile, 'r', encoding='utf-8') as spec:
  30. for ln in spec:
  31. if re.match(r'^\.$', ln):
  32. if stage == 0:
  33. example += 1
  34. mdlines.append("\n<div class=\"example\" id=\"example-{0}\" data-section=\"{1}\">\n".format(example, section))
  35. mdlines.append("<div class=\"examplenum\"><a href=\"#example-{0}\">Example {0}</a>&nbsp;&nbsp;<a class=\"dingus\" title=\"open in interactive dingus\">(interact)</a></div>\n\n".format(example))
  36. mdlines.append("````````````````````````````````````````````````````````` markdown\n")
  37. stage = 1
  38. elif stage == 1:
  39. mdlines.append("`````````````````````````````````````````````````````````\n\n")
  40. mdlines.append("````````````````````````````````````````````````````````` html\n")
  41. stage = 2
  42. elif stage == 2:
  43. mdlines.append("`````````````````````````````````````````````````````````\n\n")
  44. mdlines.append("</div>\n")
  45. stage = 0
  46. else:
  47. sys.stderr.out("Encountered unknown stage {0}\n".format(stage))
  48. sys.exit(1)
  49. else:
  50. if stage == 0:
  51. match = re.match(r'^#{1,6} *(.*)', ln)
  52. if match:
  53. section = match.group(1)
  54. else:
  55. ln = re.sub(r'\[([^]]*)\]\(@([^)]*)\)', replaceAnchor, ln)
  56. else:
  57. ln = re.sub(r' ', '␣', ln)
  58. mdlines.append(ln)
  59. mdtext = ''.join(mdlines) + '\n\n' + '\n'.join(refs) + '\n'
  60. if specformat == "markdown":
  61. sys.stdout.write(mdtext)
  62. elif specformat == "html":
  63. prog = "pandoc -s --toc -S --no-highlight --number-sections --template template.html"
  64. [retcode, result, err] = pipe_through_prog(prog, mdtext)
  65. if retcode == 0:
  66. result = re.sub(r'␣', '<span class="space"> </span>', result)
  67. sys.stdout.write(result)
  68. else:
  69. sys.stderr.write("Error converting markdown version of spec:\n")
  70. sys.stderr.write(err)
  71. exit(1)
  72. exit(0)