template_renderer.py revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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
5from data_source_registry import CreateDataSources
6from third_party.handlebar import Handlebar
7from url_constants import GITHUB_BASE, EXTENSIONS_SAMPLES
8
9
10class 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      # TODO(kalman): Figure out where "pepperversion" comes from. It's used
40      # internally in pepper and unfortunately the syntax appears to be
41      # {{pepperversion}} for some reason.
42      'pepperversion': '',
43      'static': self._server_instance.base_path + 'static',
44    })
45    if additional_context:
46      render_context.update(additional_context)
47    render_data = template.Render(render_context)
48    return render_data.text, render_data.errors
49
50  def _CreateDataSources(self, request):
51    server_instance = self._server_instance
52    data_sources = CreateDataSources(server_instance, request=request)
53    data_sources.update({
54      'api_list': server_instance.api_list_data_source_factory.Create(),
55      'apis': server_instance.api_data_source_factory.Create(request),
56      'samples': server_instance.samples_data_source_factory.Create(request),
57    })
58    return data_sources
59