def render(self, jinja_env=None): """Render the document using the render pool.""" timer = self.pod.profile.timer('RenderDocumentController.render', label='{} ({})'.format( self.doc.pod_path, self.doc.locale), meta={ 'path': self.doc.pod_path, 'locale': str(self.doc.locale) }).start_timer() # Validate the path with the config filters. self.validate_path() doc = self.doc template = jinja_env['env'].get_template(doc.view.lstrip('/')) track_dependency = doc_dependency.DocDependency(doc) local_tags = tags.create_builtin_tags( self.pod, doc, track_dependency=track_dependency) # NOTE: This should be done using get_template(... globals=...) # or passed as an argument into render but # it is not available included inside macros??? # See: https://github.com/pallets/jinja/issues/688 template.globals['g'] = local_tags # Track the message stats, including untranslated strings. if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS): template.globals['_'] = tags.make_doc_gettext(doc) try: serving_path = doc.get_serving_path() if serving_path.endswith('/'): serving_path = '{}{}'.format(serving_path, self.suffix) rendered_content = template.render({ 'doc': doc, 'env': self.pod.env, 'podspec': self.pod.podspec, '_track_dependency': track_dependency, }).lstrip() rendered_content = self.pod.extensions_controller.trigger( 'post_render', doc, rendered_content) rendered_doc = rendered_document.RenderedDocument( serving_path, rendered_content) timer.stop_timer() return rendered_doc except Exception as err: text = 'Error building {}: {}' if self.pod: self.pod.logger.exception(text.format(self, err)) exception = errors.BuildError(text.format(self, err)) exception.traceback = sys.exc_info()[2] exception.controller = self exception.exception = err raise exception
def render(self, jinja_env=None): """Render the document using the render pool.""" timer = self.pod.profile.timer( 'RenderDocumentController.render', label='{} ({})'.format(self.doc.pod_path, self.doc.locale), meta={ 'path': self.doc.pod_path, 'locale': str(self.doc.locale)} ).start_timer() # Validate the path with the config filters. self.validate_path() doc = self.doc template = jinja_env['env'].get_template(doc.view.lstrip('/')) track_dependency = doc_dependency.DocDependency(doc) local_tags = tags.create_builtin_tags( self.pod, doc, track_dependency=track_dependency) # NOTE: This should be done using get_template(... globals=...) # or passed as an argument into render but # it is not available included inside macros??? # See: https://github.com/pallets/jinja/issues/688 template.globals['g'] = local_tags # Track the message stats, including untranslated strings. if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS): template.globals['_'] = tags.make_doc_gettext(doc) try: doc.footnotes.reset() serving_path = doc.get_serving_path() if serving_path.endswith('/'): serving_path = '{}{}'.format(serving_path, self.suffix) content = self.pod.extensions_controller.trigger('pre_render', doc, doc.body) if content: doc.format.update(content=content.encode('utf-8')) rendered_content = template.render({ 'doc': doc, 'env': self.pod.env, 'podspec': self.pod.podspec, '_track_dependency': track_dependency, }).lstrip() rendered_content = self.pod.extensions_controller.trigger( 'post_render', doc, rendered_content) rendered_doc = rendered_document.RenderedDocument( serving_path, rendered_content) timer.stop_timer() return rendered_doc except Exception as err: exception = errors.BuildError(str(err)) exception.traceback = sys.exc_info()[2] exception.controller = self exception.exception = err raise exception
def render(self, jinja_env=None): """Render the document using the render pool.""" timer = self.pod.profile.timer('RenderErrorController.render', label='{} ({})'.format( self.route_info.meta['key'], self.route_info.meta['view']), meta={ 'key': self.route_info.meta['key'], 'view': self.route_info.meta['view'], }).start_timer() # Validate the path with the config filters. self.validate_path() with jinja_env['lock']: template = jinja_env['env'].get_template( self.route_info.meta['view'].lstrip('/')) local_tags = tags.create_builtin_tags(self.pod, doc=None) # NOTE: This should be done using get_template(... globals=...) # or passed as an argument into render but # it is not available included inside macros??? # See: https://github.com/pallets/jinja/issues/688 template.globals['g'] = local_tags try: serving_path = '/{}.html'.format(self.route_info.meta['key']) rendered_doc = rendered_document.RenderedDocument( serving_path, template.render({ 'doc': None, 'env': self.pod.env, 'podspec': self.pod.podspec, }).lstrip()) timer.stop_timer() return rendered_doc except Exception as err: text = 'Error building {}: {}' if self.pod: self.pod.logger.exception(text.format(self, err)) exception = errors.BuildError(text.format(self, err)) exception.traceback = sys.exc_info()[2] exception.controller = self exception.exception = err raise exception
def render(self, jinja_env=None): """Render the document using the render pool.""" timer = self.pod.profile.timer( 'RenderErrorController.render', label='{} ({})'.format( self.route_info.meta['key'], self.route_info.meta['view']), meta={ 'key': self.route_info.meta['key'], 'view': self.route_info.meta['view'], } ).start_timer() # Validate the path with the config filters. self.validate_path() with jinja_env['lock']: template = jinja_env['env'].get_template( self.route_info.meta['view'].lstrip('/')) local_tags = tags.create_builtin_tags(self.pod, doc=None) # NOTE: This should be done using get_template(... globals=...) # or passed as an argument into render but # it is not available included inside macros??? # See: https://github.com/pallets/jinja/issues/688 template.globals['g'] = local_tags try: serving_path = '/{}.html'.format(self.route_info.meta['key']) rendered_doc = rendered_document.RenderedDocument( serving_path, template.render({ 'doc': None, 'env': self.pod.env, 'podspec': self.pod.podspec, }).lstrip()) timer.stop_timer() return rendered_doc except Exception as err: text = 'Error building {}: {}' if self.pod: self.pod.logger.exception(text.format(self, err)) exception = errors.BuildError(text.format(self, err)) exception.traceback = sys.exc_info()[2] exception.controller = self exception.exception = err raise exception
def render(self, params, inject=True): doc = self.doc preprocessor = None translator = None if inject: preprocessor = self.pod.inject_preprocessors(doc=doc) translator = self.pod.inject_translators(doc=doc) jinja_env = self.pod.get_jinja_env(self.locale) template = jinja_env.get_template(self.view.lstrip('/')) track_dependency = doc_dependency.DocDependency(doc) local_tags = tags.create_builtin_tags( self.pod, doc, track_dependency=track_dependency) # NOTE: This should be done using get_template(... globals=...) # or passed as an argument into render but # it is not available included inside macros??? # See: https://github.com/pallets/jinja/issues/688 template.globals['g'] = local_tags # Track the message stats, including untranslated strings. if self.pod.is_enabled(self.pod.FEATURE_TRANSLATION_STATS): template.globals['_'] = tags.make_doc_gettext(doc) try: kwargs = { 'doc': doc, 'env': self.pod.env, 'podspec': self.pod.podspec, '_track_dependency': track_dependency, } content = template.render(kwargs).lstrip() if self.pod.is_enabled(self.pod.FEATURE_UI): content = self._inject_ui( content, preprocessor, translator) return content except Exception as e: text = 'Error building {}: {}' exception = errors.BuildError(text.format(self, e)) exception.traceback = sys.exc_info()[2] exception.controller = self exception.exception = e if self._pod: self._pod.logger.exception(text.format(self, e)) raise exception
def _render_template(self, doc, value, options): # Check if template exists template_path = '{}/{}'.format(self._pod.root, self.template) if os.path.exists(template_path): # Get pod's jinja2 environment for rendering jinja = self._pod.get_jinja_env() # Build context for rendering of template context = self.context context['value'] = value context['options'] = options # Bring default grow tags/variables into template context['doc'] = doc context['g'] = tags.create_builtin_tags(self._pod, doc) with open(template_path) as template: template = jinja.from_string(template.read()) return template.render(context)
def test_default_locale_versus_no_locale(self): pod = testing.create_pod() pod.write_yaml( '/podspec.yaml', { 'localization': { 'default_locale': 'en_US', 'locales': [ 'en_US', 'ja_JP', ], }, }) fields = { 'path': '/{locale}/{base}/', 'view': '/views/base.html', 'localization': { 'path': '/{locale}/{base}/', }, } pod.write_yaml('/content/pages/_blueprint.yaml', fields) pod.write_yaml('/content/pages/doc1.yaml', { '$localization': { 'default_locale': 'ja_JP', 'locales': [ 'ja_JP', ], } }) pod.write_yaml('/content/pages/doc2.yaml', {'$localization': { 'locales': [ 'en_US', ], }}) pod.write_yaml('/content/pages/doc3.yaml', {}) # Verify `docs` locale kwarg behavior, should default to calling # document's locale. Verify a calling en_US doc only gets en_US docs. doc = pod.get_doc('/content/pages/doc3.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages') self.assertItemsEqual([ '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) # Verify a calling ja_JP doc only gets ja_JP docs. doc = pod.get_doc('/content/pages/doc1.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages') self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) # Verify an explicit `locale=None` returns all docs regardless of the # calling document's locale. doc = pod.get_doc('/content/pages/doc1.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages', locale=None) self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) doc = pod.get_doc('/content/pages/doc2.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages', locale=None) self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs])
def test_default_locale_versus_no_locale(self): pod = testing.create_pod() pod.write_yaml('/podspec.yaml', { 'localization': { 'default_locale': 'en_US', 'locales': [ 'en_US', 'ja_JP', ], }, }) fields = { 'path': '/{locale}/{base}/', 'view': '/views/base.html', 'localization': { 'path': '/{locale}/{base}/', }, } pod.write_yaml('/content/pages/_blueprint.yaml', fields) pod.write_yaml('/content/pages/doc1.yaml', { '$localization': { 'default_locale': 'ja_JP', 'locales': [ 'ja_JP', ], } }) pod.write_yaml('/content/pages/doc2.yaml', { '$localization': { 'locales': [ 'en_US', ], } }) pod.write_yaml('/content/pages/doc3.yaml', {}) # Verify `docs` locale kwarg behavior, should default to calling # document's locale. Verify a calling en_US doc only gets en_US docs. doc = pod.get_doc('/content/pages/doc3.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages') self.assertItemsEqual([ '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) # Verify a calling ja_JP doc only gets ja_JP docs. doc = pod.get_doc('/content/pages/doc1.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages') self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) # Verify an explicit `locale=None` returns all docs regardless of the # calling document's locale. doc = pod.get_doc('/content/pages/doc1.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages', locale=None) self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs]) doc = pod.get_doc('/content/pages/doc2.yaml') tags_in_context = tags.create_builtin_tags(pod, doc) docs = tags_in_context['docs']('pages', locale=None) self.assertItemsEqual([ '/content/pages/doc1.yaml', '/content/pages/doc2.yaml', '/content/pages/doc3.yaml', ], [doc.pod_path for doc in docs])