rmd_reader.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. #import pelicanconf
  10. knitr = None
  11. rmd = False
  12. def initsignal(pelicanobj):
  13. global knitr,rmd
  14. try:
  15. with warnings.catch_warnings():
  16. warnings.simplefilter("ignore")
  17. from rpy2.robjects.packages import importr
  18. knitr = importr('knitr')
  19. idx = knitr.opts_knit.names.index('set')
  20. PATH = pelicanobj.settings.get('PATH','%s/content' % settings.DEFAULT_CONFIG.get('PATH'))
  21. knitr.opts_knit[idx](**{'base.dir': PATH})
  22. idy = knitr.opts_chunk.names.index('set')
  23. knitroptschunk = pelicanobj.settings.get('KNITR_OPTS_CHUNK',None)
  24. if knitroptschunk is not None:
  25. knitr.opts_chunk[idy](**{str(k): v for k,v in knitroptschunk.iteritems()})
  26. rmd = True
  27. except ImportError:
  28. rmd = False
  29. class RmdReader(readers.BaseReader):
  30. enabled = rmd
  31. file_extensions = ['Rmd', 'rmd']
  32. # You need to have a read method, which takes a filename and returns
  33. # some content and the associated metadata.
  34. def read(self, filename):
  35. """Parse content and metadata of markdown files"""
  36. # replace single backslashes with double backslashes
  37. filename = filename.replace('\\', '\\\\')
  38. # parse Rmd file - generate md file
  39. md_filename = filename.replace('.Rmd', '.aux').replace('.rmd', '.aux')
  40. knitr.knit(filename, md_filename, quiet=True, encoding='UTF-8')
  41. # read md file - create a MarkdownReader
  42. md_reader = readers.MarkdownReader(self.settings)
  43. content, metadata = md_reader.read(md_filename)
  44. # remove md file
  45. os.remove(md_filename)
  46. return content, metadata
  47. def add_reader(readers):
  48. readers.reader_classes['rmd'] = RmdReader
  49. def register():
  50. signals.readers_init.connect(add_reader)
  51. signals.initialized.connect(initsignal)