table_of_contents_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 extensions_paths import PRIVATE_TEMPLATES
6from file_system import FileNotFoundError
7
8
9class TableOfContentsRenderer(object):
10  '''Renders a table of contents pulled from a list of DocumentSections
11  returned from document_parser.ParseDocument.
12
13  This performs key functionality of DocumentRenderer, pulled into its own
14  class for testability.
15  '''
16
17  def __init__(self,
18               host_file_system,
19               compiled_fs_factory,
20               template_renderer):
21    self._templates = compiled_fs_factory.ForTemplates(host_file_system)
22    self._template_renderer = template_renderer
23
24  def Render(self, sections):
25    '''Renders a list of DocumentSections |sections| and returns a tuple
26    (text, warnings).
27    '''
28    path = '%stable_of_contents.html' % PRIVATE_TEMPLATES
29    try:
30      table_of_contents_template = self._templates.GetFromFile(path).Get()
31    except FileNotFoundError:
32      return '', ['%s not found' % path]
33
34    def make_toc_items(entries):
35      return [{
36        'attributes':  [{'key': key, 'value': val}
37                        for key, val in entry.attributes.iteritems()
38                        if key != 'id'],
39        'link':        entry.attributes.get('id', ''),
40        'subheadings': make_toc_items(entry.entries),
41        'title':       entry.name,
42      } for entry in entries]
43
44    toc_items = []
45    for section in sections:
46      items_for_section = make_toc_items(section.structure)
47      if toc_items and items_for_section:
48        items_for_section[0]['separator'] = True
49      toc_items.extend(items_for_section)
50
51    return self._template_renderer.Render(
52        self._templates.GetFromFile(
53            '%stable_of_contents.html' % PRIVATE_TEMPLATES).Get(),
54        None,  # no request
55        data_sources=('partials'),
56        additional_context={'items': toc_items})
57