# -*- coding: utf-8 -*-
"""
Pelican Inline Markdown Extension
==================================
An extension for the Python Markdown module that enables
the Pelican Python static site generator to add inline patterns.
"""

import markdown
import re

from markdown.util import etree
from markdown.util import AtomicString

class PelicanInlineMarkdownExtensionPattern(markdown.inlinepatterns.Pattern):
    """Inline Markdown processing"""

    def __init__(self, pelican_markdown_extension, tag, pattern):
        super(PelicanInlineMarkdownExtensionPattern,self).__init__(pattern)
        self.tag = tag
        self.config = pelican_markdown_extension.getConfig('config')

    def handleMatch(self, m):
        node = markdown.util.etree.Element(self.tag)
        tag_attributes = self.config.get(m.group('prefix'), ('', 'pelican-inline'))
        tag_class = 'pelican-inline'  # default class
        tag_style = ''  # default is for no styling

        if isinstance(tag_attributes, tuple):
            tag_style = tag_attributes[0]
            tag_class = tag_attributes[1] if len(tag_attributes) > 1 else ''
        elif isinstance(tag_attributes, basestring):
            tag_class = tag_attributes

        if tag_class != '':
            node.set('class', tag_class)
        if tag_style!= '':
            node.set('style', tag_style)

        node.text = markdown.util.AtomicString(m.group('text'))

        return node

class PelicanInlineMarkdownExtension(markdown.Extension):
    """A Markdown extension enabling processing in Markdown for Pelican"""
    def __init__(self, config):

        try:
            # Needed for Markdown versions >= 2.5
            self.config['config'] = ['{}', 'config for markdown extension']
            super(PelicanInlineMarkdownExtension,self).__init__(**config)
        except AttributeError:
            # Markdown versions < 2.5
            config['config'] = [config['config'], 'config for markdown extension']
            super(PelicanInlineMarkdownExtension, self).__init__(config)

    def extendMarkdown(self, md, md_globals):
        # Regex to detect mathjax
        config = self.getConfig('config')
        patterns = []

        # The following mathjax settings can be set via the settings dictionary
        for key in config:
            patterns.append(re.escape(key))

        inline_regex = r'(?P<prefix>%s)(?P<text>.+?)\2' % ('|'.join(patterns))

        # Process after escapes
        md.inlinePatterns.add('texthighlight_inlined', PelicanInlineMarkdownExtensionPattern(self, 'span', inline_regex), '>emphasis2')