/examples/web/wiki/macros/__init__.py

https://bitbucket.org/prologic/circuits/ · Python · 56 lines · 37 code · 15 blank · 4 comment · 12 complexity · 54a079e6b03a103fbe603d1a4c66a234 MD5 · raw file

  1. """Macro
  2. Macro support and dispatcher
  3. """
  4. import os
  5. from inspect import getmembers, getmodule, isfunction
  6. from creoleparser import parse_args
  7. class Macro(object):
  8. def __init__(self, name, arg_string, body, isblock):
  9. super(Macro, self).__init__()
  10. self.name = name
  11. self.arg_string = arg_string
  12. self.body = body
  13. self.isblock = isblock
  14. def dispatcher(name, arg_string, body, isblock, environ):
  15. if name in environ["macros"]:
  16. macro = Macro(name, arg_string, body, isblock)
  17. args, kwargs = parse_args(arg_string)
  18. try:
  19. return environ["macros"][name](macro, environ, *args, **kwargs)
  20. except Exception, e:
  21. return "ERROR: Error while executing macro %r (%s)" % (name, e)
  22. else:
  23. return "Macro not found!"
  24. def loadMacros():
  25. path = os.path.abspath(os.path.dirname(__file__))
  26. p = lambda x: os.path.splitext(x)[1] == ".py"
  27. modules = [x for x in os.listdir(path) if p(x) and not x == "__init__.py"]
  28. macros = {}
  29. for module in modules:
  30. name, _ = os.path.splitext(module)
  31. moduleName = "%s.%s" % (__package__, name)
  32. m = __import__(moduleName, globals(), locals(), __package__)
  33. p = lambda x: isfunction(x) and getmodule(x) is m
  34. for name, function in getmembers(m, p):
  35. name = name.replace("_", "-")
  36. try:
  37. macros[name] = function
  38. except Exception:
  39. continue
  40. return macros