diff options
Diffstat (limited to 'markdown/__init__.py')
-rw-r--r-- | markdown/__init__.py | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/markdown/__init__.py b/markdown/__init__.py index 5375b7d..57708fe 100644 --- a/markdown/__init__.py +++ b/markdown/__init__.py @@ -43,7 +43,7 @@ from blockprocessors import build_block_parser from treeprocessors import build_treeprocessors from inlinepatterns import build_inlinepatterns from postprocessors import build_postprocessors -from extensions import Extension, load_extension, load_extensions +from extensions import Extension import html4 # For backwards compatibility in the 2.0.x series @@ -136,7 +136,7 @@ class Markdown: """ for ext in extensions: if isinstance(ext, basestring): - ext = load_extension(ext, configs.get(ext, [])) + ext = self.build_extension(ext, configs.get(ext, [])) if isinstance(ext, Extension): try: ext.extendMarkdown(self, globals()) @@ -147,6 +147,47 @@ class Markdown: 'Extension "%s.%s" must be of type: "markdown.Extension".' \ % (ext.__class__.__module__, ext.__class__.__name__)) + def build_extension(self, ext_name, configs = []): + """Build extension by name, then return the module. + + The extension name may contain arguments as part of the string in the + following format: "extname(key1=value1,key2=value2)" + + """ + + # Parse extensions config params (ignore the order) + configs = dict(configs) + pos = ext_name.find("(") # find the first "(" + if pos > 0: + ext_args = ext_name[pos+1:-1] + ext_name = ext_name[:pos] + pairs = [x.split("=") for x in ext_args.split(",")] + configs.update([(x.strip(), y.strip()) for (x, y) in pairs]) + + # Setup the module names + ext_module = 'markdown.extensions' + module_name_new_style = '.'.join([ext_module, ext_name]) + module_name_old_style = '_'.join(['mdx', ext_name]) + + # Try loading the extention first from one place, then another + try: # New style (markdown.extensons.<extension>) + module = __import__(module_name_new_style, {}, {}, [ext_module]) + except ImportError: + try: # Old style (mdx_<extension>) + module = __import__(module_name_old_style) + except ImportError: + message(WARN, "Failed loading extension '%s' from '%s' or '%s'" + % (ext_name, module_name_new_style, module_name_old_style)) + # Return None so we don't try to initiate none-existant extension + return None + + # If the module is loaded successfully, we expect it to define a + # function called makeExtension() + try: + return module.makeExtension(configs.items()) + except AttributeError, e: + message(CRITICAL, "Failed to initiate extension '%s': %s" % (ext_name, e)) + def registerExtension(self, extension): """ This gets called by the extension """ self.registeredExtensions.append(extension) @@ -321,7 +362,7 @@ def markdown(text, Returns: An HTML document as a string. """ - md = Markdown(extensions=load_extensions(extensions), + md = Markdown(extensions=extensions, safe_mode=safe_mode, output_format=output_format) return md.convert(text) @@ -334,7 +375,7 @@ def markdownFromFile(input = None, safe_mode = False, output_format = 'xhtml1'): """Read markdown code from a file and write it to a file or a stream.""" - md = Markdown(extensions=load_extensions(extensions), + md = Markdown(extensions=extensions, safe_mode=safe_mode, output_format=output_format) md.convertFile(input, output, encoding) |