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 def _AddTextWithLinks(self, parent, text): | 61 def _AddTextWithLinksAndParagraphs(self, parent, text): |
62 '''Parse a string for URLs and add it to a DOM node with the URLs replaced | 62 '''Parse a string for URLs and paragraphs and |
63 with <a> HTML links. | 63 add it to a DOM node with the URLs replaced |
64 with <a> HTML links and paragraphs replaced by <p>. | |
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 ''' |
69 # Iterate through all the URLs and replace them with links. | 70 |
70 out = [] | 71 # Open paragraph |
72 paragraph = self.AddElement(parent, 'p') | |
71 while True: | 73 while True: |
72 # Look for the first URL. | 74 # Look for the first URL or break line. |
73 res = self._url_matcher.search(text) | 75 res = self._url_matcher.search(text) |
74 if not res: | 76 if not res: |
75 break | 77 break |
76 # Calculate positions of the substring of the URL. | 78 # Calculate positions of the substring of the URL or new line. |
77 url = res.group(0) | 79 group = res.group(0) # Either "/n/n" or "http://some.url" |
78 start = res.start(0) | 80 start = res.start(0) |
79 end = res.end(0) | 81 end = res.end(0) |
80 # Add the text prior to the URL. | 82 # Add the text prior to the URL or break line. |
81 self.AddText(parent, text[:start]) | 83 self.AddText(paragraph, text[:start]) |
82 # Add a link for the URL. | 84 # Either add new paragraph or add a link for the URL. |
83 self.AddElement(parent, 'a', {'href': url}, url) | 85 if group == "\n\n": #have we found a break line? |
86 paragraph = self.AddElement(parent, 'p') | |
87 else: | |
88 self.AddElement(paragraph, 'a', {'href': group}, group) | |
84 # Drop the part of text that is added. | 89 # Drop the part of text that is added. |
85 text = text[end:] | 90 text = text[end:] |
86 self.AddText(parent, text) | 91 self.AddText(paragraph, text) |
87 | 92 |
88 | 93 |
89 def _AddStyledElement(self, parent, name, style_ids, attrs=None, text=None): | 94 def _AddStyledElement(self, parent, name, style_ids, attrs=None, text=None): |
90 '''Adds an XML element to a parent, with CSS style-sheets included. | 95 '''Adds an XML element to a parent, with CSS style-sheets included. |
91 | 96 |
92 Args: | 97 Args: |
93 parent: The parent DOM node. | 98 parent: The parent DOM node. |
94 name: Name of the element to add. | 99 name: Name of the element to add. |
95 style_ids: A list of CSS style strings from self._STYLE[]. | 100 style_ids: A list of CSS style strings from self._STYLE[]. |
96 attrs: Dictionary of attributes for the element. | 101 attrs: Dictionary of attributes for the element. |
(...skipping 10 matching lines...) Expand all Loading... | |
107 | 112 |
108 def _AddDescription(self, parent, policy): | 113 def _AddDescription(self, parent, policy): |
109 '''Adds a string containing the description of the policy. URLs are | 114 '''Adds a string containing the description of the policy. URLs are |
110 replaced with links and the possible choices are enumerated in case | 115 replaced with links and the possible choices are enumerated in case |
111 of 'string-enum' and 'int-enum' type policies. | 116 of 'string-enum' and 'int-enum' type policies. |
112 | 117 |
113 Args: | 118 Args: |
114 parent: The DOM node for which the feature list will be added. | 119 parent: The DOM node for which the feature list will be added. |
115 policy: The data structure of a policy. | 120 policy: The data structure of a policy. |
116 ''' | 121 ''' |
117 # Replace URLs with links in the description. | 122 |
118 self._AddTextWithLinks(parent, policy['desc']) | 123 # Replace URLs with links and /n with <p>...</p> in the description. |
124 self._AddTextWithLinksAndParagraphs(parent, policy['desc']) | |
119 # Add list of enum items. | 125 # Add list of enum items. |
120 if policy['type'] in ('string-enum', 'int-enum', 'string-enum-list'): | 126 if policy['type'] in ('string-enum', 'int-enum', 'string-enum-list'): |
121 ul = self.AddElement(parent, 'ul') | 127 ul = self.AddElement(parent, 'ul') |
122 for item in policy['items']: | 128 for item in policy['items']: |
123 if policy['type'] == 'int-enum': | 129 if policy['type'] == 'int-enum': |
124 value_string = str(item['value']) | 130 value_string = str(item['value']) |
125 else: | 131 else: |
126 value_string = '"%s"' % item['value'] | 132 value_string = '"%s"' % item['value'] |
127 self.AddElement( | 133 self.AddElement( |
128 ul, 'li', {}, '%s = %s' % (value_string, item['caption'])) | 134 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. | 507 a link for that page. |
502 | 508 |
503 Args: | 509 Args: |
504 policy: The data structure of the policy. | 510 policy: The data structure of the policy. |
505 ''' | 511 ''' |
506 if 'problem_href' not in policy: | 512 if 'problem_href' not in policy: |
507 return | 513 return |
508 problem_href = policy['problem_href'] | 514 problem_href = policy['problem_href'] |
509 div = self._AddStyledElement(parent, 'div', ['div.note']) | 515 div = self._AddStyledElement(parent, 'div', ['div.note']) |
510 note = self._GetLocalizedMessage('note').replace('$6', problem_href) | 516 note = self._GetLocalizedMessage('note').replace('$6', problem_href) |
511 self._AddTextWithLinks(div, note) | 517 self._AddTextWithLinksAndParagraphs(div, note) |
512 | 518 |
513 def _AddPolicyRow(self, parent, policy): | 519 def _AddPolicyRow(self, parent, policy): |
514 '''Adds a row for the policy in the summary table. | 520 '''Adds a row for the policy in the summary table. |
515 | 521 |
516 Args: | 522 Args: |
517 parent: The DOM node of the summary table. | 523 parent: The DOM node of the summary table. |
518 policy: The data structure of the policy. | 524 policy: The data structure of the policy. |
519 ''' | 525 ''' |
520 tr = self._AddStyledElement(parent, 'tr', ['tr']) | 526 tr = self._AddStyledElement(parent, 'tr', ['tr']) |
521 indent = 'padding-left: %dpx;' % (7 + self._indent_level * 14) | 527 indent = 'padding-left: %dpx;' % (7 + self._indent_level * 14) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
590 | 596 |
591 def BeginTemplate(self): | 597 def BeginTemplate(self): |
592 # Add a <div> for the summary section. | 598 # Add a <div> for the summary section. |
593 if self._GetChromiumVersionString() is not None: | 599 if self._GetChromiumVersionString() is not None: |
594 self.AddComment(self._main_div, self.config['build'] + \ | 600 self.AddComment(self._main_div, self.config['build'] + \ |
595 ' version: ' + self._GetChromiumVersionString()) | 601 ' version: ' + self._GetChromiumVersionString()) |
596 | 602 |
597 summary_div = self.AddElement(self._main_div, 'div') | 603 summary_div = self.AddElement(self._main_div, 'div') |
598 self.AddElement(summary_div, 'a', {'name': 'top'}) | 604 self.AddElement(summary_div, 'a', {'name': 'top'}) |
599 self.AddElement(summary_div, 'br') | 605 self.AddElement(summary_div, 'br') |
600 self._AddTextWithLinks( | 606 self._AddTextWithLinksAndParagraphs( |
601 summary_div, | 607 summary_div, |
602 self._GetLocalizedMessage('intro')) | 608 self._GetLocalizedMessage('intro')) |
603 self.AddElement(summary_div, 'br') | 609 self.AddElement(summary_div, 'br') |
604 self.AddElement(summary_div, 'br') | 610 self.AddElement(summary_div, 'br') |
605 self.AddElement(summary_div, 'br') | 611 self.AddElement(summary_div, 'br') |
606 # Add the summary table of policies. | 612 # Add the summary table of policies. |
607 summary_table = self._AddStyledElement(summary_div, 'table', ['table']) | 613 summary_table = self._AddStyledElement(summary_div, 'table', ['table']) |
608 # Add the first row. | 614 # Add the first row. |
609 thead = self.AddElement(summary_table, 'thead') | 615 thead = self.AddElement(summary_table, 'thead') |
610 tr = self._AddStyledElement(thead, 'tr', ['tr']) | 616 tr = self._AddStyledElement(thead, 'tr', ['tr']) |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
684 'dt': 'font-weight: bold;', | 690 'dt': 'font-weight: bold;', |
685 'dd dl': 'margin-top: 0px; margin-bottom: 0px;', | 691 'dd dl': 'margin-top: 0px; margin-bottom: 0px;', |
686 '.monospace': 'font-family: monospace;', | 692 '.monospace': 'font-family: monospace;', |
687 '.pre': 'white-space: pre;', | 693 '.pre': 'white-space: pre;', |
688 'div.note': 'border: 2px solid black; padding: 5px; margin: 5px;', | 694 'div.note': 'border: 2px solid black; padding: 5px; margin: 5px;', |
689 'div.group_desc': 'margin-top: 20px; margin-bottom: 20px;', | 695 'div.group_desc': 'margin-top: 20px; margin-bottom: 20px;', |
690 'ul': 'padding-left: 0px; margin-left: 0px;' | 696 'ul': 'padding-left: 0px; margin-left: 0px;' |
691 } | 697 } |
692 | 698 |
693 # A simple regexp to search for URLs. It is enough for now. | 699 # A simple regexp to search for URLs. It is enough for now. |
694 self._url_matcher = lazy_re.compile('(http://[^\\s]*[^\\s\\.])') | 700 self._url_matcher = lazy_re.compile('(http://[^\\s]*[^\\s\\.])|\n\n') |
Mattias Nissler (ping if slow)
2015/02/10 08:30:08
It's rather confusing to do both URL matching and
| |
695 | 701 |
696 def GetTemplateText(self): | 702 def GetTemplateText(self): |
697 # Return the text representation of the main <div> tag. | 703 # Return the text representation of the main <div> tag. |
698 return self._main_div.toxml() | 704 return self._main_div.toxml() |
699 # To get a complete HTML file, use the following. | 705 # To get a complete HTML file, use the following. |
700 # return self._doc.toxml() | 706 # return self._doc.toxml() |
OLD | NEW |