OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 | 6 |
7 import json | 7 import json |
8 from xml.dom import minidom | 8 from xml.dom import minidom |
9 from grit import lazy_re | 9 from grit import lazy_re |
10 from grit.format.policy_templates.writers import xml_formatted_writer | 10 from grit.format.policy_templates.writers import xml_formatted_writer |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
51 item_map: A dictionary containing all the elements of 'items' as | 51 item_map: A dictionary containing all the elements of 'items' as |
52 keys. | 52 keys. |
53 items: A list of arbitrary items. | 53 items: A list of arbitrary items. |
54 | 54 |
55 Returns: | 55 Returns: |
56 Looks up each item of 'items' in 'item_maps' and concatenates the | 56 Looks up each item of 'items' in 'item_maps' and concatenates the |
57 resulting items into a comma-separated list. | 57 resulting items into a comma-separated list. |
58 ''' | 58 ''' |
59 return ', '.join([item_map[x] for x in items]) | 59 return ', '.join([item_map[x] for x in items]) |
60 | 60 |
61 | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
Nit: Don't introduce a blank line here (two blank
| |
61 def _AddTextWithLinks(self, parent, text): | 62 def _AddTextWithLinks(self, parent, text): |
62 '''Parse a string for URLs and add it to a DOM node with the URLs replaced | 63 '''Parse a string for URLs and add it to a DOM node with the URLs replaced |
63 with <a> HTML links. | 64 with <a> HTML links. |
64 | 65 |
65 Args: | 66 Args: |
66 parent: The DOM node to which the text will be added. | 67 parent: The DOM node to which the text will be added. |
67 text: The string to be added. | 68 text: The string to be added. |
68 ''' | 69 ''' |
70 # A simple regexp to search for URLs. It is enough for now. | |
71 url_matcher = lazy_re.compile('(http://[^\\s]*[^\\s\\.])') | |
72 | |
69 # Iterate through all the URLs and replace them with links. | 73 # Iterate through all the URLs and replace them with links. |
70 out = [] | |
71 while True: | 74 while True: |
72 # Look for the first URL. | 75 # Look for the first URL. |
73 res = self._url_matcher.search(text) | 76 res = url_matcher.search(text) |
74 if not res: | 77 if not res: |
75 break | 78 break |
76 # Calculate positions of the substring of the URL. | 79 # Calculate positions of the substring of the URL. |
77 url = res.group(0) | 80 url = res.group(0) |
78 start = res.start(0) | 81 start = res.start(0) |
79 end = res.end(0) | 82 end = res.end(0) |
80 # Add the text prior to the URL. | 83 # Add the text prior to the URL. |
81 self.AddText(parent, text[:start]) | 84 self.AddText(parent, text[:start]) |
82 # Add a link for the URL. | 85 # Add a link for the URL. |
83 self.AddElement(parent, 'a', {'href': url}, url) | 86 self.AddElement(parent, 'a', {'href': url}, url) |
84 # Drop the part of text that is added. | 87 # Drop the part of text that is added. |
85 text = text[end:] | 88 text = text[end:] |
86 self.AddText(parent, text) | 89 self.AddText(parent, text) |
87 | 90 |
91 def _AddParagraphs(self, parent, text): | |
92 '''Parse a string for paragraphs (/n/n) and add them to a DOM node with | |
93 the URLs replaced with <a> HTML links (done by _AddTextWithLinks). | |
94 | |
95 Args: | |
96 parent: The DOM node to which the text will be added. | |
97 text: The string to be added.''' | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: Other docstrings in this file place a newline
| |
98 if len(text) == 0: | |
99 return | |
100 | |
101 # A regexp to search for line breaks. | |
102 new_line_matcher = lazy_re.compile('\n\n') | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
You can simplify this a lot by just doing text.spl
| |
103 | |
104 # Open paragraph | |
105 paragraph = self.AddElement(parent, 'p') | |
106 while True: | |
107 # Look for the first break line. | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: s/break line/line break/.
| |
108 res = new_line_matcher.search(text) | |
109 if not res: | |
110 break | |
111 # Get postiotons of begin and end of new line charecters. | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: spelling
| |
112 start = res.start(0) | |
113 end = res.end(0) | |
114 # Insert text to the paragraph with processing the urls | |
115 self._AddTextWithLinks(paragraph, text[:start]) | |
116 #Create a new paragraph. The old one will be automatically closed. | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: space after #
| |
117 paragraph = self.AddElement(parent, 'p') | |
118 # Drop the part of text that is added. | |
119 text = text[end:] | |
120 self._AddTextWithLinks(paragraph, text) # Adding the rest of the text | |
121 | |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: remove extra blank line.
| |
88 | 122 |
89 def _AddStyledElement(self, parent, name, style_ids, attrs=None, text=None): | 123 def _AddStyledElement(self, parent, name, style_ids, attrs=None, text=None): |
90 '''Adds an XML element to a parent, with CSS style-sheets included. | 124 '''Adds an XML element to a parent, with CSS style-sheets included. |
91 | 125 |
92 Args: | 126 Args: |
93 parent: The parent DOM node. | 127 parent: The parent DOM node. |
94 name: Name of the element to add. | 128 name: Name of the element to add. |
95 style_ids: A list of CSS style strings from self._STYLE[]. | 129 style_ids: A list of CSS style strings from self._STYLE[]. |
96 attrs: Dictionary of attributes for the element. | 130 attrs: Dictionary of attributes for the element. |
97 text: Text content for the element. | 131 text: Text content for the element. |
98 ''' | 132 ''' |
99 if attrs == None: | 133 if attrs == None: |
100 attrs = {} | 134 attrs = {} |
101 | 135 |
102 style = ''.join([self._STYLE[x] for x in style_ids]) | 136 style = ''.join([self._STYLE[x] for x in style_ids]) |
103 if style != '': | 137 if style != '': |
104 # Apply the style specified by style_ids. | 138 # Apply the style specified by style_ids. |
105 attrs['style'] = style + attrs.get('style', '') | 139 attrs['style'] = style + attrs.get('style', '') |
106 return self.AddElement(parent, name, attrs, text) | 140 return self.AddElement(parent, name, attrs, text) |
107 | 141 |
108 def _AddDescription(self, parent, policy): | 142 def _AddDescription(self, parent, policy): |
109 '''Adds a string containing the description of the policy. URLs are | 143 '''Adds a string containing the description of the policy. URLs are |
110 replaced with links and the possible choices are enumerated in case | 144 replaced with links and the possible choices are enumerated in case |
111 of 'string-enum' and 'int-enum' type policies. | 145 of 'string-enum' and 'int-enum' type policies. |
112 | 146 |
113 Args: | 147 Args: |
114 parent: The DOM node for which the feature list will be added. | 148 parent: The DOM node for which the feature list will be added. |
115 policy: The data structure of a policy. | 149 policy: The data structure of a policy. |
116 ''' | 150 ''' |
117 # Replace URLs with links in the description. | 151 |
118 self._AddTextWithLinks(parent, policy['desc']) | 152 # Replace URLs with links and /n with <p>...</p> in the description. |
Mattias Nissler (ping if slow)
2015/02/10 12:54:13
nit: I think "Break description into paragraphs an
| |
153 self._AddParagraphs(parent, policy['desc']) | |
119 # Add list of enum items. | 154 # Add list of enum items. |
120 if policy['type'] in ('string-enum', 'int-enum', 'string-enum-list'): | 155 if policy['type'] in ('string-enum', 'int-enum', 'string-enum-list'): |
121 ul = self.AddElement(parent, 'ul') | 156 ul = self.AddElement(parent, 'ul') |
122 for item in policy['items']: | 157 for item in policy['items']: |
123 if policy['type'] == 'int-enum': | 158 if policy['type'] == 'int-enum': |
124 value_string = str(item['value']) | 159 value_string = str(item['value']) |
125 else: | 160 else: |
126 value_string = '"%s"' % item['value'] | 161 value_string = '"%s"' % item['value'] |
127 self.AddElement( | 162 self.AddElement( |
128 ul, 'li', {}, '%s = %s' % (value_string, item['caption'])) | 163 ul, 'li', {}, '%s = %s' % (value_string, item['caption'])) |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
501 a link for that page. | 536 a link for that page. |
502 | 537 |
503 Args: | 538 Args: |
504 policy: The data structure of the policy. | 539 policy: The data structure of the policy. |
505 ''' | 540 ''' |
506 if 'problem_href' not in policy: | 541 if 'problem_href' not in policy: |
507 return | 542 return |
508 problem_href = policy['problem_href'] | 543 problem_href = policy['problem_href'] |
509 div = self._AddStyledElement(parent, 'div', ['div.note']) | 544 div = self._AddStyledElement(parent, 'div', ['div.note']) |
510 note = self._GetLocalizedMessage('note').replace('$6', problem_href) | 545 note = self._GetLocalizedMessage('note').replace('$6', problem_href) |
511 self._AddTextWithLinks(div, note) | 546 self._AddParagraphs(div, note) |
512 | 547 |
513 def _AddPolicyRow(self, parent, policy): | 548 def _AddPolicyRow(self, parent, policy): |
514 '''Adds a row for the policy in the summary table. | 549 '''Adds a row for the policy in the summary table. |
515 | 550 |
516 Args: | 551 Args: |
517 parent: The DOM node of the summary table. | 552 parent: The DOM node of the summary table. |
518 policy: The data structure of the policy. | 553 policy: The data structure of the policy. |
519 ''' | 554 ''' |
520 tr = self._AddStyledElement(parent, 'tr', ['tr']) | 555 tr = self._AddStyledElement(parent, 'tr', ['tr']) |
521 indent = 'padding-left: %dpx;' % (7 + self._indent_level * 14) | 556 indent = 'padding-left: %dpx;' % (7 + self._indent_level * 14) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
590 | 625 |
591 def BeginTemplate(self): | 626 def BeginTemplate(self): |
592 # Add a <div> for the summary section. | 627 # Add a <div> for the summary section. |
593 if self._GetChromiumVersionString() is not None: | 628 if self._GetChromiumVersionString() is not None: |
594 self.AddComment(self._main_div, self.config['build'] + \ | 629 self.AddComment(self._main_div, self.config['build'] + \ |
595 ' version: ' + self._GetChromiumVersionString()) | 630 ' version: ' + self._GetChromiumVersionString()) |
596 | 631 |
597 summary_div = self.AddElement(self._main_div, 'div') | 632 summary_div = self.AddElement(self._main_div, 'div') |
598 self.AddElement(summary_div, 'a', {'name': 'top'}) | 633 self.AddElement(summary_div, 'a', {'name': 'top'}) |
599 self.AddElement(summary_div, 'br') | 634 self.AddElement(summary_div, 'br') |
600 self._AddTextWithLinks( | 635 self._AddParagraphs( |
601 summary_div, | 636 summary_div, |
602 self._GetLocalizedMessage('intro')) | 637 self._GetLocalizedMessage('intro')) |
603 self.AddElement(summary_div, 'br') | 638 self.AddElement(summary_div, 'br') |
604 self.AddElement(summary_div, 'br') | 639 self.AddElement(summary_div, 'br') |
605 self.AddElement(summary_div, 'br') | 640 self.AddElement(summary_div, 'br') |
606 # Add the summary table of policies. | 641 # Add the summary table of policies. |
607 summary_table = self._AddStyledElement(summary_div, 'table', ['table']) | 642 summary_table = self._AddStyledElement(summary_div, 'table', ['table']) |
608 # Add the first row. | 643 # Add the first row. |
609 thead = self.AddElement(summary_table, 'thead') | 644 thead = self.AddElement(summary_table, 'thead') |
610 tr = self._AddStyledElement(thead, 'tr', ['tr']) | 645 tr = self._AddStyledElement(thead, 'tr', ['tr']) |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
683 'td.right': 'width: 100%;', | 718 'td.right': 'width: 100%;', |
684 'dt': 'font-weight: bold;', | 719 'dt': 'font-weight: bold;', |
685 'dd dl': 'margin-top: 0px; margin-bottom: 0px;', | 720 'dd dl': 'margin-top: 0px; margin-bottom: 0px;', |
686 '.monospace': 'font-family: monospace;', | 721 '.monospace': 'font-family: monospace;', |
687 '.pre': 'white-space: pre;', | 722 '.pre': 'white-space: pre;', |
688 'div.note': 'border: 2px solid black; padding: 5px; margin: 5px;', | 723 'div.note': 'border: 2px solid black; padding: 5px; margin: 5px;', |
689 'div.group_desc': 'margin-top: 20px; margin-bottom: 20px;', | 724 'div.group_desc': 'margin-top: 20px; margin-bottom: 20px;', |
690 'ul': 'padding-left: 0px; margin-left: 0px;' | 725 'ul': 'padding-left: 0px; margin-left: 0px;' |
691 } | 726 } |
692 | 727 |
693 # A simple regexp to search for URLs. It is enough for now. | |
694 self._url_matcher = lazy_re.compile('(http://[^\\s]*[^\\s\\.])') | |
695 | 728 |
696 def GetTemplateText(self): | 729 def GetTemplateText(self): |
697 # Return the text representation of the main <div> tag. | 730 # Return the text representation of the main <div> tag. |
698 return self._main_div.toxml() | 731 return self._main_div.toxml() |
699 # To get a complete HTML file, use the following. | 732 # To get a complete HTML file, use the following. |
700 # return self._doc.toxml() | 733 # return self._doc.toxml() |
OLD | NEW |