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 |