1 # Copyright 2013 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 from data_source_registry import CreateDataSources 6 from third_party.handlebar import Handlebar 7 from url_constants import GITHUB_BASE, EXTENSIONS_SAMPLES 8 9 10 class TemplateRenderer(object): 11 '''Renders templates with the server's available data sources. 12 ''' 13 14 def __init__(self, server_instance): 15 self._server_instance = server_instance 16 17 def Render(self, 18 template, 19 request, 20 data_sources=None, 21 additional_context=None): 22 '''Renders |template| using |request|. 23 24 Specify |data_sources| to only include the DataSources with the given names 25 when rendering the template. 26 27 Specify |additional_context| to inject additional template context when 28 rendering the template. 29 ''' 30 assert isinstance(template, Handlebar), type(template) 31 render_context = self._CreateDataSources(request) 32 if data_sources is not None: 33 render_context = dict((name, d) for name, d in render_context.iteritems() 34 if name in data_sources) 35 render_context.update({ 36 'apps_samples_url': GITHUB_BASE, 37 'base_path': self._server_instance.base_path, 38 'extensions_samples_url': EXTENSIONS_SAMPLES, 39 'static': self._server_instance.base_path + 'static', 40 }) 41 if additional_context: 42 render_context.update(additional_context) 43 render_data = template.Render(render_context) 44 return render_data.text, render_data.errors 45 46 def _CreateDataSources(self, request): 47 server_instance = self._server_instance 48 data_sources = CreateDataSources(server_instance, request=request) 49 data_sources.update({ 50 'api_list': server_instance.api_list_data_source_factory.Create(), 51 'apis': server_instance.api_data_source_factory.Create(request), 52 'samples': server_instance.samples_data_source_factory.Create(request), 53 }) 54 return data_sources 55