renderer_jinja2.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import jinja2
  2. import os
  3. from uuid import UUID
  4. THIS_DIR = os.path.dirname(__file__)
  5. from api.od import ODAPI
  6. from concrete_syntax import common
  7. from services.bottom.V0 import Bottom
  8. from util.module_to_dict import module_to_dict
  9. def render_od_jinja2(state, m, mm):
  10. bottom = Bottom(state)
  11. type_model_id = state.read_dict(state.read_root(), "SCD")
  12. scd_model = UUID(state.read_value(type_model_id))
  13. type_odapi = ODAPI(state, mm, scd_model)
  14. objects = []
  15. links = []
  16. to_add = bottom.read_keys(m)
  17. already_added = set()
  18. while len(to_add) > 0:
  19. next_round = []
  20. for obj_name in to_add:
  21. obj = state.read_dict(m, obj_name)
  22. src, tgt = state.read_edge(obj)
  23. if src == None:
  24. # not a link
  25. objects.append((obj_name, obj))
  26. already_added.add(obj)
  27. else:
  28. # A link can only be written out after its source and target have been written out
  29. if src in already_added and tgt in already_added:
  30. links.append((obj_name, obj))
  31. else:
  32. # try again later
  33. next_round.append(obj_name)
  34. if len(next_round) == len(to_add):
  35. raise Exception("We got stuck!", next_round)
  36. to_add = next_round
  37. loader = jinja2.FileSystemLoader(searchpath=THIS_DIR)
  38. environment = jinja2.Environment(
  39. loader=loader,
  40. # whitespace control:
  41. trim_blocks=True,
  42. lstrip_blocks=True,
  43. )
  44. template = environment.get_template("objectdiagrams.jinja2")
  45. return template.render({
  46. 'objects': objects,
  47. 'links': links,
  48. 'odapi': ODAPI(state, m, mm),
  49. **globals()['__builtins__'],
  50. **module_to_dict(common),
  51. })