| Index: grit/format/policy_templates/writers/xml_formatted_writer.py
|
| ===================================================================
|
| --- grit/format/policy_templates/writers/xml_formatted_writer.py (revision 0)
|
| +++ grit/format/policy_templates/writers/xml_formatted_writer.py (revision 0)
|
| @@ -0,0 +1,88 @@
|
| +# Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +
|
| +from xml.dom import minidom
|
| +from grit.format.policy_templates.writers import template_writer
|
| +
|
| +
|
| +class XMLFormattedWriter(template_writer.TemplateWriter):
|
| + '''Helper class for generating XML-based templates.
|
| + '''
|
| +
|
| + def AddElement(self, parent, name, attrs=None, text=None):
|
| + '''
|
| + Adds a new XML Element as a child to an existing element or the Document.
|
| +
|
| + Args:
|
| + parent: An XML element or the document, where the new element will be
|
| + added.
|
| + name: The name of the new element.
|
| + attrs: A dictionary of the attributes' names and values for the new
|
| + element.
|
| + text: Text content for the new element.
|
| +
|
| + Returns:
|
| + The created new element.
|
| + '''
|
| + if attrs == None:
|
| + attrs = {}
|
| +
|
| + doc = parent.ownerDocument
|
| + element = doc.createElement(name)
|
| + for key, value in attrs.iteritems():
|
| + element.setAttribute(key, value)
|
| + if text:
|
| + element.appendChild(doc.createTextNode(text))
|
| + parent.appendChild(element)
|
| + return element
|
| +
|
| + def AddText(self, parent, text):
|
| + '''Adds text to a parent node.
|
| + '''
|
| + doc = parent.ownerDocument
|
| + parent.appendChild(doc.createTextNode(text))
|
| +
|
| + def AddAttribute(self, parent, name, value):
|
| + '''Adds a new attribute to the parent Element. If an attribute with the
|
| + given name already exists then it will be replaced.
|
| + '''
|
| + doc = parent.ownerDocument
|
| + attribute = doc.createAttribute(name)
|
| + attribute.value = value
|
| + parent.setAttributeNode(attribute)
|
| +
|
| + def ToPrettyXml(self, doc):
|
| + # return doc.toprettyxml(indent=' ')
|
| + # The above pretty-printer does not print the doctype and adds spaces
|
| + # around texts, e.g.:
|
| + # <string>
|
| + # value of the string
|
| + # </string>
|
| + # This is problematic both for the OSX Workgroup Manager (plist files) and
|
| + # the Windows Group Policy Editor (admx files). What they need instead:
|
| + # <string>value of string</string>
|
| + # So we use the poor man's pretty printer here. It assumes that there are
|
| + # no mixed-content nodes.
|
| + # Get all the XML content in a one-line string.
|
| + xml = doc.toxml()
|
| + # Determine where the line breaks will be. (They will only be between tags.)
|
| + lines = xml[1:len(xml) - 1].split('><')
|
| + indent = ''
|
| + res = ''
|
| + # Determine indent for each line.
|
| + for i in range(len(lines)):
|
| + line = lines[i]
|
| + if line[0] == '/':
|
| + # If the current line starts with a closing tag, decrease indent before
|
| + # printing.
|
| + indent = indent[2:]
|
| + lines[i] = indent + '<' + line + '>'
|
| + if (line[0] not in ['/', '?', '!'] and '</' not in line and
|
| + line[len(line) - 1] != '/'):
|
| + # If the current line starts with an opening tag and does not conatin a
|
| + # closing tag, increase indent after the line is printed.
|
| + indent += ' '
|
| + # Reconstruct XML text from the lines.
|
| + return '\n'.join(lines)
|
|
|
| Property changes on: grit/format/policy_templates/writers/xml_formatted_writer.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|