rmd_reader.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #-*- conding: utf-8 -*-
  2. import os
  3. import warnings
  4. from pelican import readers
  5. from pelican import signals
  6. from pelican import settings
  7. from pelican.utils import pelican_open
  8. from markdown import Markdown
  9. try:
  10. with warnings.catch_warnings():
  11. warnings.simplefilter("ignore")
  12. from rpy2.robjects.packages import importr
  13. knitr = importr('knitr')
  14. idx = knitr.opts_knit.names.index('set')
  15. knitr.opts_knit[idx](**{'base.dir': '{0}/content'.format(settings.DEFAULT_CONFIG.get('PATH'))})
  16. rmd = True
  17. except ImportError:
  18. rmd = False
  19. class RmdReader(readers.BaseReader):
  20. enabled = rmd
  21. file_extensions = ['Rmd', 'rmd']
  22. # You need to have a read method, which takes a filename and returns
  23. # some content and the associated metadata.
  24. def read(self, filename):
  25. """Parse content and metadata of markdown files"""
  26. # replace single backslashes with double backslashes
  27. filename = filename.replace('\\', '\\\\')
  28. # parse Rmd file - generate md file
  29. md_filename = filename.replace('.Rmd', '.aux').replace('.rmd', '.aux')
  30. knitr.knit(filename, md_filename, quiet=True, encoding='UTF-8')
  31. # read md file - create a MarkdownReader
  32. md_reader = readers.MarkdownReader(self.settings)
  33. content, metadata = md_reader.read(md_filename)
  34. # remove md file
  35. os.remove(md_filename)
  36. return content, metadata
  37. def add_reader(readers):
  38. readers.reader_classes['rmd'] = RmdReader
  39. def register():
  40. signals.readers_init.connect(add_reader)