| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 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 | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 | |
| 7 from grit.format.policy_templates.writers import template_writer | |
| 8 | |
| 9 | |
| 10 class XMLFormattedWriter(template_writer.TemplateWriter): | |
| 11 '''Helper class for generating XML-based templates. | |
| 12 ''' | |
| 13 | |
| 14 def AddElement(self, parent, name, attrs=None, text=None): | |
| 15 ''' | |
| 16 Adds a new XML Element as a child to an existing element or the Document. | |
| 17 | |
| 18 Args: | |
| 19 parent: An XML element or the document, where the new element will be | |
| 20 added. | |
| 21 name: The name of the new element. | |
| 22 attrs: A dictionary of the attributes' names and values for the new | |
| 23 element. | |
| 24 text: Text content for the new element. | |
| 25 | |
| 26 Returns: | |
| 27 The created new element. | |
| 28 ''' | |
| 29 if attrs == None: | |
| 30 attrs = {} | |
| 31 | |
| 32 doc = parent.ownerDocument | |
| 33 element = doc.createElement(name) | |
| 34 for key, value in sorted(attrs.iteritems()): | |
| 35 element.setAttribute(key, value) | |
| 36 if text: | |
| 37 element.appendChild(doc.createTextNode(text)) | |
| 38 parent.appendChild(element) | |
| 39 return element | |
| 40 | |
| 41 def AddText(self, parent, text): | |
| 42 '''Adds text to a parent node. | |
| 43 ''' | |
| 44 doc = parent.ownerDocument | |
| 45 parent.appendChild(doc.createTextNode(text)) | |
| 46 | |
| 47 def AddAttribute(self, parent, name, value): | |
| 48 '''Adds a new attribute to the parent Element. If an attribute with the | |
| 49 given name already exists then it will be replaced. | |
| 50 ''' | |
| 51 doc = parent.ownerDocument | |
| 52 attribute = doc.createAttribute(name) | |
| 53 attribute.value = value | |
| 54 parent.setAttributeNode(attribute) | |
| 55 | |
| 56 def AddComment(self, parent, comment): | |
| 57 '''Adds a comment node.''' | |
| 58 parent.appendChild(parent.ownerDocument.createComment(comment)) | |
| 59 | |
| 60 def ToPrettyXml(self, doc, **kwargs): | |
| 61 # return doc.toprettyxml(indent=' ') | |
| 62 # The above pretty-printer does not print the doctype and adds spaces | |
| 63 # around texts, e.g.: | |
| 64 # <string> | |
| 65 # value of the string | |
| 66 # </string> | |
| 67 # This is problematic both for the OSX Workgroup Manager (plist files) and | |
| 68 # the Windows Group Policy Editor (admx files). What they need instead: | |
| 69 # <string>value of string</string> | |
| 70 # So we use the poor man's pretty printer here. It assumes that there are | |
| 71 # no mixed-content nodes. | |
| 72 # Get all the XML content in a one-line string. | |
| 73 xml = doc.toxml(**kwargs) | |
| 74 # Determine where the line breaks will be. (They will only be between tags.) | |
| 75 lines = xml[1:len(xml) - 1].split('><') | |
| 76 indent = '' | |
| 77 res = '' | |
| 78 # Determine indent for each line. | |
| 79 for i, line in enumerate(lines): | |
| 80 if line[0] == '/': | |
| 81 # If the current line starts with a closing tag, decrease indent before | |
| 82 # printing. | |
| 83 indent = indent[2:] | |
| 84 lines[i] = indent + '<' + line + '>' | |
| 85 if (line[0] not in ['/', '?', '!'] and '</' not in line and | |
| 86 line[len(line) - 1] != '/'): | |
| 87 # If the current line starts with an opening tag and does not conatin a | |
| 88 # closing tag, increase indent after the line is printed. | |
| 89 indent += ' ' | |
| 90 # Reconstruct XML text from the lines. | |
| 91 return '\n'.join(lines) | |
| OLD | NEW |