Advertisement
Guest User

Nikola template plugin

a guest
Dec 19th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.32 KB | None | 0 0
  1. import os
  2.  
  3. from jinja2 import Template
  4. import yaml
  5. from docutils.parsers.rst import Directive, directives
  6. from nikola.plugin_categories import RestExtension
  7.  
  8. class TemplatePlugin(RestExtension):
  9.  
  10.     name = "render_template"
  11.  
  12.     def set_site(self, site):
  13.         """Set Nikola site."""
  14.         self.site = site
  15.         # Even though listings don't use CodeBlock anymore, I am
  16.         # leaving these to make the code directive work with
  17.         # docutils < 0.9
  18.         TemplateDirective.site = site
  19.         directives.register_directive('template', TemplateDirective)
  20.         Template.folders = 'data'  # site.config['DATA']
  21.         return super().set_site(site)
  22.  
  23.  
  24. class TemplateDirective(Directive):
  25.     required_arguments = 1
  26.     option_spec = {'name': directives.unchanged}
  27.     has_content = True
  28.  
  29.     def run(self):
  30.         """Run render template directive."""
  31.         self.assert_has_content()
  32.  
  33.         data_path = os.path.join('data', self.arguments.pop(0))
  34.         with open(data_path) as f:
  35.             data = yaml.load(f.read())
  36.         self.state.document.settings.record_dependencies.add(data_path)
  37.         template = Template('\n'.join(self.content))
  38.         self.state_machine.insert_input(template.render(data=data).splitlines(),
  39.                                         data_path)
  40.         return []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement