#-*- conding: utf-8 -*-

import os

from pelican import readers
from pelican import signals
from pelican import settings
from pelican.utils import pelican_open
from markdown import Markdown
try:
    from rpy2 import robjects
    rmd = True
except ImportError:
    rmd = False

class RmdReader(readers.BaseReader):
    enabled = rmd

    file_extensions = ['Rmd', 'rmd']

    # You need to have a read method, which takes a filename and returns
    # some content and the associated metadata.
    def read(self, filename):
        """Parse content and metadata of markdown files"""
        # parse Rmd file - generate md file
        md_filename = filename.replace('.Rmd', '.aux').replace('.rmd', '.aux')
        robjects.r("""
require(knitr);
opts_knit$set(base.dir='{2}/content');
knit('{0}', '{1}', quiet=TRUE, encoding='UTF-8');
""".format(filename, md_filename, settings.DEFAULT_CONFIG.get('PATH')))
        # parse md file
        md = Markdown(extensions = ['meta', 'codehilite(css_class=highlight)', 'extra'])
        with pelican_open(md_filename) as text:
            content = md.convert(text)
        os.remove(md_filename)
        # find metadata
        metadata = {}
        for name, value in md.Meta.items():
            name = name.lower()
            meta = self.process_metadata(name, value[0])
            metadata[name] = meta
        return content, metadata

def add_reader(readers):
    readers.reader_classes['rmd'] = RmdReader

def register():
    signals.readers_init.connect(add_reader)