macros.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import os
  2. def define_env(env):
  3. """Custom filters and macros"""
  4. def format_attributes(*args, **kwargs):
  5. """Format HTML attributes"""
  6. if args:
  7. cls, id_ = [], None
  8. for arg in args:
  9. if arg[0] == ".":
  10. cls.append(arg[1:])
  11. elif arg[0] == "#":
  12. id_ = arg[1:]
  13. else:
  14. raise ValueError(f"Invalid attribute ({arg})")
  15. if cls:
  16. try:
  17. kwargs["class"] += " " + " ".join(cls)
  18. except KeyError:
  19. kwargs["class"] = " ".join(cls)
  20. if id_:
  21. kwargs["id"] = id_
  22. if kwargs:
  23. attr = []
  24. for k, v in kwargs.items():
  25. attr.append(f"{k} = \"{v}\"")
  26. attr = " ".join(attr)
  27. else:
  28. attr = ""
  29. return attr
  30. @env.filter
  31. def attr(text, *args, **kwargs):
  32. """Add HTML attributes to a text using a <span>"""
  33. attr = format_attributes(*args, **kwargs)
  34. return f"<span {attr} markdown=\"1\">{text}</span>"
  35. @env.filter
  36. def cls(text, *args):
  37. """Add HTML class(es) to a text using a <span>"""
  38. cls = " ".join(args)
  39. return f"<span class=\"{cls}\" marckdown=\"1\">{text}</span>"
  40. @env.filter
  41. def id(text, id_):
  42. """Add HTML id to a text using a <span>"""
  43. return f"<span id=\"{id_}\" markdown=\"1\">{text}</span>"
  44. @env.filter
  45. def url(raw):
  46. """Wrap a raw URL with a link"""
  47. return f"[{raw}]({raw})"
  48. @env.macro
  49. def begin(*args, **kwargs):
  50. """Start a new HTML <div>"""
  51. attr = format_attributes(*args, **kwargs)
  52. return f"<div {attr} markdown=\"1\">"
  53. @env.macro
  54. def end(comment=None):
  55. """End an HTML <div>"""
  56. return "</div>"
  57. @env.macro
  58. def importjs(name):
  59. """Import a JavaScript script"""
  60. current = "/" + env.page.url
  61. relpath = os.path.relpath("/js", start=current)
  62. return f"<script src=\"{relpath}/{name}.js\" defer></script>"