| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 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 """Pretty-prints the histograms.xml file, alphabetizing tags, wrapping text | 6 """Pretty-prints the histograms.xml file, alphabetizing tags, wrapping text |
| 7 at 80 chars, enforcing standard attribute ordering, and standardizing | 7 at 80 chars, enforcing standard attribute ordering, and standardizing |
| 8 indentation. | 8 indentation. |
| 9 | 9 |
| 10 This is quite a bit more complicated than just calling tree.toprettyxml(); | 10 This is quite a bit more complicated than just calling tree.toprettyxml(); |
| 11 we need additional customization, like special attribute ordering in tags | 11 we need additional customization, like special attribute ordering in tags |
| 12 and wrapping text nodes, so we implement our own full custom XML pretty-printer. | 12 and wrapping text nodes, so we implement our own full custom XML pretty-printer. |
| 13 """ | 13 """ |
| 14 | 14 |
| 15 from __future__ import with_statement | 15 from __future__ import with_statement |
| 16 | 16 |
| 17 import logging | 17 import logging |
| 18 import os | 18 import os |
| 19 import shutil | 19 import shutil |
| 20 import sys | 20 import sys |
| 21 import xml.dom.minidom | 21 import xml.dom.minidom |
| 22 | 22 |
| 23 import print_style | 23 sys.path.append(os.path.join(os.path.dirname(__file__), '..')) # tools/metrics |
| 24 | 24 from common import diff_util |
| 25 sys.path.insert(1, os.path.join(sys.path[0], '..', '..', 'python')) | 25 from common import presubmit_util |
| 26 from google import path_utils | 26 from histograms import print_style |
| 27 | |
| 28 # Import the metrics/common module. | |
| 29 sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) | |
| 30 import diff_util | |
| 31 import presubmit_util | |
| 32 | 27 |
| 33 # Tags whose children we want to alphabetize. The key is the parent tag name, | 28 # Tags whose children we want to alphabetize. The key is the parent tag name, |
| 34 # and the value is a pair of the tag name of the children we want to sort, | 29 # and the value is a pair of the tag name of the children we want to sort, |
| 35 # and a key function that maps each child node to the desired sort key. | 30 # and a key function that maps each child node to the desired sort key. |
| 36 ALPHABETIZATION_RULES = { | 31 ALPHABETIZATION_RULES = { |
| 37 'histograms': ('histogram', lambda n: n.attributes['name'].value.lower()), | 32 'histograms': ('histogram', lambda n: n.attributes['name'].value.lower()), |
| 38 'enums': ('enum', lambda n: n.attributes['name'].value.lower()), | 33 'enums': ('enum', lambda n: n.attributes['name'].value.lower()), |
| 39 'enum': ('int', lambda n: int(n.attributes['value'].value)), | 34 'enum': ('int', lambda n: int(n.attributes['value'].value)), |
| 40 'histogram_suffixes_list': ( | 35 'histogram_suffixes_list': ( |
| 41 'histogram_suffixes', lambda n: n.attributes['name'].value.lower()), | 36 'histogram_suffixes', lambda n: n.attributes['name'].value.lower()), |
| (...skipping 24 matching lines...) Expand all Loading... |
| 66 | 61 |
| 67 Args: | 62 Args: |
| 68 node: The minidom node to transform. | 63 node: The minidom node to transform. |
| 69 | 64 |
| 70 Returns: | 65 Returns: |
| 71 The minidom node, with children appropriately alphabetized. Note that the | 66 The minidom node, with children appropriately alphabetized. Note that the |
| 72 transformation is done in-place, i.e. the original minidom tree is modified | 67 transformation is done in-place, i.e. the original minidom tree is modified |
| 73 directly. | 68 directly. |
| 74 """ | 69 """ |
| 75 if node.nodeType != xml.dom.minidom.Node.ELEMENT_NODE: | 70 if node.nodeType != xml.dom.minidom.Node.ELEMENT_NODE: |
| 76 for c in node.childNodes: TransformByAlphabetizing(c) | 71 for c in node.childNodes: |
| 72 TransformByAlphabetizing(c) |
| 77 return node | 73 return node |
| 78 | 74 |
| 79 # Element node with a tag name that we alphabetize the children of? | 75 # Element node with a tag name that we alphabetize the children of? |
| 80 if node.tagName in ALPHABETIZATION_RULES: | 76 if node.tagName in ALPHABETIZATION_RULES: |
| 81 # Put subnodes in a list of node,key pairs to allow for custom sorting. | 77 # Put subnodes in a list of node,key pairs to allow for custom sorting. |
| 82 subtag, key_function = ALPHABETIZATION_RULES[node.tagName] | 78 subtag, key_function = ALPHABETIZATION_RULES[node.tagName] |
| 83 subnodes = [] | 79 subnodes = [] |
| 84 sort_key = -1 | 80 sort_key = -1 |
| 85 pending_node_indices = [] | 81 pending_node_indices = [] |
| 86 for c in node.childNodes: | 82 for c in node.childNodes: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 107 subnodes.sort(key=lambda pair: pair[1]) | 103 subnodes.sort(key=lambda pair: pair[1]) |
| 108 | 104 |
| 109 # Re-add the subnodes, transforming each recursively. | 105 # Re-add the subnodes, transforming each recursively. |
| 110 while node.firstChild: | 106 while node.firstChild: |
| 111 node.removeChild(node.firstChild) | 107 node.removeChild(node.firstChild) |
| 112 for (c, _) in subnodes: | 108 for (c, _) in subnodes: |
| 113 unsafeAppendChild(node, TransformByAlphabetizing(c)) | 109 unsafeAppendChild(node, TransformByAlphabetizing(c)) |
| 114 return node | 110 return node |
| 115 | 111 |
| 116 # Recursively handle other element nodes and other node types. | 112 # Recursively handle other element nodes and other node types. |
| 117 for c in node.childNodes: TransformByAlphabetizing(c) | 113 for c in node.childNodes: |
| 114 TransformByAlphabetizing(c) |
| 118 return node | 115 return node |
| 119 | 116 |
| 120 | 117 |
| 121 def PrettyPrint(raw_xml): | 118 def PrettyPrint(raw_xml): |
| 122 """Pretty-print the given XML. | 119 """Pretty-print the given XML. |
| 123 | 120 |
| 124 Args: | 121 Args: |
| 125 raw_xml: The contents of the histograms XML file, as a string. | 122 raw_xml: The contents of the histograms XML file, as a string. |
| 126 | 123 |
| 127 Returns: | 124 Returns: |
| 128 The pretty-printed version. | 125 The pretty-printed version. |
| 129 """ | 126 """ |
| 130 tree = xml.dom.minidom.parseString(raw_xml) | 127 tree = xml.dom.minidom.parseString(raw_xml) |
| 131 tree = TransformByAlphabetizing(tree) | 128 tree = TransformByAlphabetizing(tree) |
| 132 return print_style.GetPrintStyle().PrettyPrintNode(tree) | 129 return print_style.GetPrintStyle().PrettyPrintNode(tree) |
| 133 | 130 |
| 131 |
| 134 def main(): | 132 def main(): |
| 135 presubmit_util.DoPresubmitMain(sys.argv, 'histograms.xml', | 133 presubmit_util.DoPresubmitMain(sys.argv, 'histograms.xml', |
| 136 'histograms.before.pretty-print.xml', | 134 'histograms.before.pretty-print.xml', |
| 137 'pretty_print.py', PrettyPrint) | 135 'pretty_print.py', PrettyPrint) |
| 138 | 136 |
| 139 if __name__ == '__main__': | 137 if __name__ == '__main__': |
| 140 main() | 138 main() |
| OLD | NEW |