From e98ac74737c1f28ec730fa5c645062e0e0d5702b Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Wed, 27 Aug 2014 14:59:40 -0400 Subject: Allow named extensions to specify the Class Name If you were to import the class like this: from path.to.module import SomeExtensionClass Then the named extension would be the string: "path.to.module:SomeExtensionClass" This should simplify loading extensions from the command line or template filters -- expecially when multiple extensions are defined in a single python module. The docs still need updating. I'm waiting to update the docs after implementing #335 and #336 as that will require a major refactor of that section of the docs anyway. --- markdown/__init__.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'markdown') diff --git a/markdown/__init__.py b/markdown/__init__.py index 6190dd2..28f30c8 100644 --- a/markdown/__init__.py +++ b/markdown/__init__.py @@ -190,6 +190,9 @@ class Markdown(object): pairs = [x.split("=") for x in ext_args.split(",")] configs.update([(x.strip(), y.strip()) for (x, y) in pairs]) + # Get class name (if provided): `path.to.module:ClassName` + ext_name, class_name = ext_name.split(':', 1) if ':' in ext_name else (ext_name, '') + # Try loading the extension first from one place, then another try: # Assume string uses dot syntax (`path.to.some.module`) @@ -213,16 +216,19 @@ class Markdown(object): e.args = (message,) + e.args[1:] raise - # If the module is loaded successfully, we expect it to define a - # function called makeExtension() - try: - return module.makeExtension(configs.items()) - except AttributeError as e: - message = e.args[0] - message = "Failed to initiate extension " \ - "'%s': %s" % (ext_name, message) - e.args = (message,) + e.args[1:] - raise + if class_name: + # Load given class name from module. + return getattr(module, class_name)(configs.items()) + else: + # Expect makeExtension() function to return a class. + try: + return module.makeExtension(configs.items()) + except AttributeError as e: + message = e.args[0] + message = "Failed to initiate extension " \ + "'%s': %s" % (ext_name, message) + e.args = (message,) + e.args[1:] + raise def registerExtension(self, extension): """ This gets called by the extension """ -- cgit v1.2.3