Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Side by Side Diff: chrome/common/extensions/docs/server2/document_renderer.py

Issue 344453003: Docserver: separate models for apps and extensions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 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 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 from document_parser import ParseDocument 7 from document_parser import ParseDocument
8 from platform_util import ExtractPlatformFromURL
8 from third_party.json_schema_compiler.model import UnixName 9 from third_party.json_schema_compiler.model import UnixName
9 10
10 11
11 class DocumentRenderer(object): 12 class DocumentRenderer(object):
12 '''Performs document-level rendering such as the title, references, 13 '''Performs document-level rendering such as the title, references,
13 and table of contents: pulling that data out of the document, then 14 and table of contents: pulling that data out of the document, then
14 replacing the $(title), $(ref:...) and $(table_of_contents) tokens with them. 15 replacing the $(title), $(ref:...) and $(table_of_contents) tokens with them.
15 16
16 This can be thought of as a parallel to TemplateRenderer; while 17 This can be thought of as a parallel to TemplateRenderer; while
17 TemplateRenderer is responsible for interpreting templates and rendering files 18 TemplateRenderer is responsible for interpreting templates and rendering files
18 within the template engine, DocumentRenderer is responsible for interpreting 19 within the template engine, DocumentRenderer is responsible for interpreting
19 higher-level document concepts like the title and TOC, then performing string 20 higher-level document concepts like the title and TOC, then performing string
20 replacement for them. The syntax for this replacement is $(...) where ... is 21 replacement for them. The syntax for this replacement is $(...) where ... is
21 the concept. Currently title and table_of_contents are supported. 22 the concept. Currently title and table_of_contents are supported.
22 ''' 23 '''
23 24
24 def __init__(self, table_of_contents_renderer, ref_resolver): 25 def __init__(self, table_of_contents_renderer, platform_bundle):
25 self._table_of_contents_renderer = table_of_contents_renderer 26 self._table_of_contents_renderer = table_of_contents_renderer
26 self._ref_resolver = ref_resolver 27 self._platform_bundle = platform_bundle
27 28
28 def _RenderLinks(self, document, path): 29 def _RenderLinks(self, document, path):
29 ''' Replaces all $(ref:...) references in |document| with html links. 30 ''' Replaces all $(ref:...) references in |document| with html links.
30 31
31 References have two forms: 32 References have two forms:
32 33
33 $(ref:api.node) - Replaces the reference with a link to node on the 34 $(ref:api.node) - Replaces the reference with a link to node on the
34 API page. The title is set to the name of the node. 35 API page. The title is set to the name of the node.
35 36
36 $(ref:api.node Title) - Same as the previous form, but title is set 37 $(ref:api.node Title) - Same as the previous form, but title is set
(...skipping 23 matching lines...) Expand all
60 new_document.append(document[cursor_index:end_ref_index + 1]) 61 new_document.append(document[cursor_index:end_ref_index + 1])
61 else: 62 else:
62 ref = document[start_ref_index:end_ref_index] 63 ref = document[start_ref_index:end_ref_index]
63 ref_parts = ref[len(START_REF):].split(None, 1) 64 ref_parts = ref[len(START_REF):].split(None, 1)
64 65
65 # Guess the api name from the html name, replacing '_' with '.' (e.g. 66 # Guess the api name from the html name, replacing '_' with '.' (e.g.
66 # if the page is app_window.html, guess the api name is app.window) 67 # if the page is app_window.html, guess the api name is app.window)
67 api_name = os.path.splitext(os.path.basename(path))[0].replace('_', '.') 68 api_name = os.path.splitext(os.path.basename(path))[0].replace('_', '.')
68 title = ref_parts[0] if len(ref_parts) == 1 else ref_parts[1] 69 title = ref_parts[0] if len(ref_parts) == 1 else ref_parts[1]
69 70
70 ref_dict = self._ref_resolver.SafeGetLink(ref_parts[0], 71 platform = ExtractPlatformFromURL(path)
71 namespace=api_name, 72 if platform is None:
72 title=title) 73 logging.error('Cannot resolve reference without a platform.')
74 continue
75 ref_dict = self._platform_bundle.GetReferenceResolver(
76 platform).SafeGetLink(ref_parts[0],
77 namespace=api_name,
78 title=title,
79 path=path)
73 80
74 new_document.append(document[cursor_index:start_ref_index]) 81 new_document.append(document[cursor_index:start_ref_index])
75 new_document.append('<a href=%s>%s</a>' % (ref_dict['href'], 82 new_document.append('<a href=%s>%s</a>' % (ref_dict['href'],
76 ref_dict['text'])) 83 ref_dict['text']))
77 84
78 cursor_index = end_ref_index + 1 85 cursor_index = end_ref_index + 1
79 start_ref_index = document.find(START_REF, cursor_index) 86 start_ref_index = document.find(START_REF, cursor_index)
80 87
81 new_document.append(document[cursor_index:]) 88 new_document.append(document[cursor_index:])
82 89
83 return ''.join(new_document) 90 return ''.join(new_document)
84 91
85 def Render(self, document, path, render_title=False): 92 def Render(self, document, path, render_title=False):
86 # Render links first so that parsing and later replacements aren't 93 # Render links first so that parsing and later replacements aren't
87 # affected by $(ref...) substitutions 94 # affected by $(ref...) substitutions
88 document = self._RenderLinks(document, path) 95 document = self._RenderLinks(document, path)
89 96
90 parsed_document = ParseDocument(document, expect_title=render_title) 97 parsed_document = ParseDocument(document, expect_title=render_title)
91 toc_text, toc_warnings = self._table_of_contents_renderer.Render( 98 toc_text, toc_warnings = self._table_of_contents_renderer.Render(
92 parsed_document.sections) 99 parsed_document.sections)
93 100
94 # Only 1 title and 1 table of contents substitution allowed; in the common 101 # Only 1 title and 1 table of contents substitution allowed; in the common
95 # case, save necessarily running over the entire file. 102 # case, save necessarily running over the entire file.
96 if parsed_document.title: 103 if parsed_document.title:
97 document = document.replace('$(title)', parsed_document.title, 1) 104 document = document.replace('$(title)', parsed_document.title, 1)
98 return (document.replace('$(table_of_contents)', toc_text, 1), 105 return (document.replace('$(table_of_contents)', toc_text, 1),
99 parsed_document.warnings + toc_warnings) 106 parsed_document.warnings + toc_warnings)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698