Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: tools/grit/grit/format/policy_templates/writers/plist_writer.py

Issue 3116027: Add Mac output for policy template generator (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: final nits Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698