Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 """Utility file for pretty printing xml file. | 5 """Utility file for pretty printing xml file. |
| 6 | 6 |
| 7 The function PrettyPrintXml will be used for formatting both histograms.xml | 7 The function PrettyPrintXml will be used for formatting both histograms.xml |
| 8 and actions.xml. | 8 and actions.xml. |
| 9 """ | 9 """ |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 paragraphs[-1].append(l) | 59 paragraphs[-1].append(l) |
| 60 # Remove trailing empty paragraph if present. | 60 # Remove trailing empty paragraph if present. |
| 61 if paragraphs and not paragraphs[-1]: | 61 if paragraphs and not paragraphs[-1]: |
| 62 paragraphs = paragraphs[:-1] | 62 paragraphs = paragraphs[:-1] |
| 63 return ['\n'.join(p) for p in paragraphs] | 63 return ['\n'.join(p) for p in paragraphs] |
| 64 | 64 |
| 65 | 65 |
| 66 class XmlStyle(object): | 66 class XmlStyle(object): |
| 67 """A class that stores all style specification for an output xml file.""" | 67 """A class that stores all style specification for an output xml file.""" |
| 68 | 68 |
| 69 def __init__(self, attribute_order, tags_that_have_extra_newline, | 69 def __init__(self, attribute_order, required_attributes, |
| 70 tags_that_dont_indent, tags_that_allow_single_line, | 70 tags_that_have_extra_newline, tags_that_dont_indent, |
| 71 tags_alphabetization_rules): | 71 tags_that_allow_single_line, tags_alphabetization_rules): |
| 72 self.attribute_order = attribute_order | 72 self.attribute_order = attribute_order |
| 73 self.required_attributes = required_attributes | |
| 73 self.tags_that_have_extra_newline = tags_that_have_extra_newline | 74 self.tags_that_have_extra_newline = tags_that_have_extra_newline |
| 74 self.tags_that_dont_indent = tags_that_dont_indent | 75 self.tags_that_dont_indent = tags_that_dont_indent |
| 75 self.tags_that_allow_single_line = tags_that_allow_single_line | 76 self.tags_that_allow_single_line = tags_that_allow_single_line |
| 76 self.tags_alphabetization_rules = tags_alphabetization_rules | 77 self.tags_alphabetization_rules = tags_alphabetization_rules |
| 77 | 78 |
| 78 def PrettyPrintXml(self, tree): | 79 def PrettyPrintXml(self, tree): |
| 79 tree = self._TransformByAlphabetizing(tree) | 80 tree = self._TransformByAlphabetizing(tree) |
| 80 tree = self.PrettyPrintNode(tree) | 81 tree = self.PrettyPrintNode(tree) |
| 81 return tree | 82 return tree |
| 82 | 83 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 newlines_after_open, newlines_before_close, newlines_after_close = ( | 193 newlines_after_open, newlines_before_close, newlines_after_close = ( |
| 193 self.tags_that_have_extra_newline.get(node.tagName, (1, 1, 0))) | 194 self.tags_that_have_extra_newline.get(node.tagName, (1, 1, 0))) |
| 194 # Open the tag. | 195 # Open the tag. |
| 195 s = ' ' * indent + '<' + node.tagName | 196 s = ' ' * indent + '<' + node.tagName |
| 196 | 197 |
| 197 # Calculate how much space to allow for the '>' or '/>'. | 198 # Calculate how much space to allow for the '>' or '/>'. |
| 198 closing_chars = 1 | 199 closing_chars = 1 |
| 199 if not node.childNodes: | 200 if not node.childNodes: |
| 200 closing_chars = 2 | 201 closing_chars = 2 |
| 201 | 202 |
| 203 attributes = node.attributes.keys() | |
| 204 required_attributes = [attribute for attribute in self.required_attributes | |
| 205 if attribute in self.attribute_order[node.tagName]] | |
| 206 missing_attributes = [attribute for attribute in required_attributes | |
| 207 if attribute not in attributes] | |
| 208 | |
| 209 for attribute in missing_attributes: | |
| 210 logging.error( | |
| 211 'Missing attribute "%s" in tag "%s"', attribute, node.tagName) | |
| 212 if missing_attributes: | |
| 213 raise Error( | |
| 214 'Missing attributes {0} in tag "{1}"'.format( | |
| 215 ', '.join('"{0}"'.format(a) for a in missing_attributes), | |
|
Alexei Svitkine (slow)
2017/05/19 20:05:28
Nit: I'd extract this inner statement into a var a
| |
| 216 node.tagName)) | |
| 217 | |
| 202 # Pretty-print the attributes. | 218 # Pretty-print the attributes. |
| 203 attributes = node.attributes.keys() | |
| 204 if attributes: | 219 if attributes: |
| 205 # Reorder the attributes. | 220 # Reorder the attributes. |
| 206 unrecognized_attributes = ( | 221 unrecognized_attributes = ( |
| 207 [a for a in attributes | 222 [a for a in attributes |
| 208 if a not in self.attribute_order[node.tagName]]) | 223 if a not in self.attribute_order[node.tagName]]) |
| 209 attributes = [a for a in self.attribute_order[node.tagName] | 224 attributes = [a for a in self.attribute_order[node.tagName] |
| 210 if a in attributes] | 225 if a in attributes] |
| 211 | 226 |
| 212 for a in unrecognized_attributes: | 227 for a in unrecognized_attributes: |
| 213 logging.error( | 228 logging.error( |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 | 292 |
| 278 # Handle comment nodes. | 293 # Handle comment nodes. |
| 279 if node.nodeType == xml.dom.minidom.Node.COMMENT_NODE: | 294 if node.nodeType == xml.dom.minidom.Node.COMMENT_NODE: |
| 280 return '<!--%s-->\n' % node.data | 295 return '<!--%s-->\n' % node.data |
| 281 | 296 |
| 282 # Ignore other node types. This could be a processing instruction | 297 # Ignore other node types. This could be a processing instruction |
| 283 # (<? ... ?>) or cdata section (<![CDATA[...]]!>), neither of which are | 298 # (<? ... ?>) or cdata section (<![CDATA[...]]!>), neither of which are |
| 284 # legal in the histograms XML at present. | 299 # legal in the histograms XML at present. |
| 285 logging.error('Ignoring unrecognized node data: %s', node.toxml()) | 300 logging.error('Ignoring unrecognized node data: %s', node.toxml()) |
| 286 raise Error('Ignoring unrecognized node data: {0}'.format(node.toxml())) | 301 raise Error('Ignoring unrecognized node data: {0}'.format(node.toxml())) |
| OLD | NEW |