| Index: tools/grit/grit/format/policy_templates/writers/plist_writer.py
|
| diff --git a/tools/grit/grit/format/policy_templates/writers/plist_writer.py b/tools/grit/grit/format/policy_templates/writers/plist_writer.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3399fceebfdc9be6e92fe3eb6f3db5d176264f71
|
| --- /dev/null
|
| +++ b/tools/grit/grit/format/policy_templates/writers/plist_writer.py
|
| @@ -0,0 +1,148 @@
|
| +# Copyright (c) 2010 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 xml_formatted_writer
|
| +
|
| +
|
| +def GetWriter(info, messages):
|
| + '''Factory method for creating PListWriter objects.
|
| + See the constructor of TemplateWriter for description of
|
| + arguments.
|
| + '''
|
| + return PListWriter(info, messages)
|
| +
|
| +
|
| +class PListWriter(xml_formatted_writer.XMLFormattedWriter):
|
| + '''Class for generating policy templates in Mac plist format.
|
| + It is used by PolicyTemplateGenerator to write plist files.
|
| + '''
|
| +
|
| + STRING_TABLE = 'Localizable.strings'
|
| + TYPE_TO_INPUT = {
|
| + 'string': 'string',
|
| + 'enum': 'integer',
|
| + 'main': 'boolean',
|
| + 'list': 'array',
|
| + }
|
| +
|
| + def _AddKeyValuePair(self, parent, key_string, value_tag):
|
| + '''Adds a plist key-value pair to a parent XML element.
|
| +
|
| + A key-value pair in plist consists of two XML elements next two each other:
|
| + <key>key_string</key>
|
| + <value_tag>...</value_tag>
|
| +
|
| + Args:
|
| + key_string: The content of the key tag.
|
| + value_tag: The name of the value element.
|
| +
|
| + Returns:
|
| + The XML element of the value tag.
|
| + '''
|
| + self.AddElement(parent, 'key', {}, key_string)
|
| + return self.AddElement(parent, value_tag)
|
| +
|
| + def _AddStringKeyValuePair(self, parent, key_string, value_string):
|
| + '''Adds a plist key-value pair to a parent XML element, where the
|
| + value element contains a string. The name of the value element will be
|
| + <string>.
|
| +
|
| + Args:
|
| + key_string: The content of the key tag.
|
| + value_string: The content of the value tag.
|
| + '''
|
| + self.AddElement(parent, 'key', {}, key_string)
|
| + self.AddElement(parent, 'string', {}, value_string)
|
| +
|
| + def _AddTargets(self, parent):
|
| + '''Adds the following XML snippet to an XML element:
|
| + <key>pfm_targets</key>
|
| + <array>
|
| + <string>user-managed</string>
|
| + </array>
|
| +
|
| + Args:
|
| + parent: The parent XML element where the snippet will be added.
|
| + '''
|
| + array = self._AddKeyValuePair(parent, 'pfm_targets', 'array')
|
| + self.AddElement(array, 'string', {}, 'user-managed')
|
| +
|
| + def WritePolicy(self, policy):
|
| + policy_name = policy['name']
|
| + policy_type = policy['type']
|
| +
|
| + dict = self.AddElement(self._array, 'dict')
|
| + self._AddStringKeyValuePair(dict, 'pfm_name', policy_name)
|
| + # Set empty strings for title and description. They will be taken by the
|
| + # OSX Workgroup Manager from the string table in a Localizable.strings file.
|
| + # Those files are generated by plist_strings_writer.
|
| + self._AddStringKeyValuePair(dict, 'pfm_description', '')
|
| + self._AddStringKeyValuePair(dict, 'pfm_title', '')
|
| + self._AddTargets(dict)
|
| + self._AddStringKeyValuePair(dict, 'pfm_type',
|
| + self.TYPE_TO_INPUT[policy_type])
|
| + if (policy_type == 'enum'):
|
| + range_list = self._AddKeyValuePair(dict, 'pfm_range_list', 'array')
|
| + for item in policy['items']:
|
| + self.AddElement(range_list, 'integer', {}, item['value'])
|
| +
|
| + def BeginPolicyGroup(self, group):
|
| + pass
|
| +
|
| + def EndPolicyGroup(self):
|
| + pass
|
| +
|
| + def BeginTemplate(self):
|
| + self._plist.attributes['version'] = '1'
|
| + dict = self.AddElement(self._plist, 'dict')
|
| +
|
| + self._AddStringKeyValuePair(dict, 'pfm_name', self.info['app_name'])
|
| + self._AddStringKeyValuePair(dict, 'pfm_description', '')
|
| + self._AddStringKeyValuePair(dict, 'pfm_title', '')
|
| + self._AddStringKeyValuePair(dict, 'pfm_version', '1')
|
| + self._AddStringKeyValuePair(dict, 'pfm_domain', self.info['mac_bundle_id'])
|
| +
|
| + self._array = self._AddKeyValuePair(dict, 'pfm_subkeys', 'array')
|
| +
|
| + def EndTemplate(self):
|
| + pass
|
| +
|
| + def Prepare(self):
|
| + dom_impl = minidom.getDOMImplementation('')
|
| + doctype = dom_impl.createDocumentType(
|
| + 'plist',
|
| + '-//Apple//DTD PLIST 1.0//EN',
|
| + 'http://www.apple.com/DTDs/PropertyList-1.0.dtd')
|
| + self._doc = dom_impl.createDocument(None, 'plist', doctype)
|
| + self._plist = self._doc.documentElement
|
| +
|
| + def GetTemplateText(self):
|
| + # return self.plist_doc.toprettyxml(indent=' ')
|
| + # The above pretty-printer does not print the doctype and adds spaces
|
| + # around texts, which the OSX Workgroup Manager does not like. So we use
|
| + # the poor man's pretty printer. It assumes that there are no mixed-content
|
| + # nodes.
|
| + # Get all the XML content in a one-line string.
|
| + xml = self._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)
|
|
|