OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 '''Support for formatting a data pack file used for platform agnostic resource | 6 '''Support for formatting a data pack file used for platform agnostic resource |
7 files. | 7 files. |
8 ''' | 8 ''' |
9 | 9 |
10 import exceptions | 10 import exceptions |
11 import os | 11 import os |
12 import struct | 12 import struct |
13 import sys | 13 import sys |
14 | 14 |
15 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) | 15 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) |
16 from grit.format import interface | 16 from grit.format import interface |
17 from grit.node import include | 17 from grit.node import include |
18 from grit.node import message | 18 from grit.node import message |
| 19 from grit.node import structure |
19 from grit.node import misc | 20 from grit.node import misc |
20 | 21 |
21 | 22 |
22 PACK_FILE_VERSION = 4 | 23 PACK_FILE_VERSION = 4 |
23 HEADER_LENGTH = 2 * 4 + 1 # Two uint32s. (file version, number of entries) and | 24 HEADER_LENGTH = 2 * 4 + 1 # Two uint32s. (file version, number of entries) and |
24 # one uint8 (encoding of text resources) | 25 # one uint8 (encoding of text resources) |
25 BINARY, UTF8, UTF16 = range(3) | 26 BINARY, UTF8, UTF16 = range(3) |
26 | 27 |
27 class WrongFileVersion(Exception): | 28 class WrongFileVersion(Exception): |
28 pass | 29 pass |
29 | 30 |
30 class DataPackContents: | 31 class DataPackContents: |
31 def __init__(self, resources, encoding): | 32 def __init__(self, resources, encoding): |
32 self.resources = resources | 33 self.resources = resources |
33 self.encoding = encoding | 34 self.encoding = encoding |
34 | 35 |
35 class DataPack(interface.ItemFormatter): | 36 class DataPack(interface.ItemFormatter): |
36 '''Writes out the data pack file format (platform agnostic resource file).''' | 37 '''Writes out the data pack file format (platform agnostic resource file).''' |
37 def Format(self, item, lang='en', output_dir='.'): | 38 def Format(self, item, lang='en', output_dir='.'): |
38 assert isinstance(item, misc.ReleaseNode) | 39 assert isinstance(item, misc.ReleaseNode) |
39 | 40 |
40 nodes = DataPack.GetDataNodes(item) | 41 nodes = DataPack.GetDataNodes(item) |
41 data = {} | 42 data = {} |
42 for node in nodes: | 43 for node in nodes: |
43 id, value = node.GetDataPackPair(lang, UTF8) | 44 id, value = node.GetDataPackPair(lang, UTF8) |
44 data[id] = value | 45 if value is not None: |
| 46 data[id] = value |
45 return DataPack.WriteDataPackToString(data, UTF8) | 47 return DataPack.WriteDataPackToString(data, UTF8) |
46 | 48 |
47 @staticmethod | 49 @staticmethod |
48 def GetDataNodes(item): | 50 def GetDataNodes(item): |
49 '''Returns a list of nodes that can be packed into the data pack file.''' | 51 '''Returns a list of nodes that can be packed into the data pack file.''' |
50 nodes = [] | 52 nodes = [] |
51 if (isinstance(item, misc.IfNode) and not item.IsConditionSatisfied()): | 53 if (isinstance(item, misc.IfNode) and not item.IsConditionSatisfied()): |
52 return nodes | 54 return nodes |
53 if (isinstance(item, include.IncludeNode) or | 55 if (isinstance(item, include.IncludeNode) or |
54 isinstance(item, message.MessageNode)): | 56 isinstance(item, message.MessageNode) or |
| 57 isinstance(item, structure.StructureNode)): |
55 # Include this node if it wasn't marked as skipped by a whitelist. | 58 # Include this node if it wasn't marked as skipped by a whitelist. |
56 if not item.WhitelistMarkedAsSkip(): | 59 if not item.WhitelistMarkedAsSkip(): |
57 return [item] | 60 return [item] |
58 return nodes | 61 return nodes |
59 for child in item.children: | 62 for child in item.children: |
60 nodes.extend(DataPack.GetDataNodes(child)) | 63 nodes.extend(DataPack.GetDataNodes(child)) |
61 return nodes | 64 return nodes |
62 | 65 |
63 @staticmethod | 66 @staticmethod |
64 def ReadDataPack(input_file): | 67 def ReadDataPack(input_file): |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 else: | 167 else: |
165 # Just write a simple file. | 168 # Just write a simple file. |
166 data = { 1: "", 4: "this is id 4", 6: "this is id 6", 10: "" } | 169 data = { 1: "", 4: "this is id 4", 6: "this is id 6", 10: "" } |
167 DataPack.WriteDataPack(data, "datapack1.pak", UTF8) | 170 DataPack.WriteDataPack(data, "datapack1.pak", UTF8) |
168 data2 = { 1000: "test", 5: "five" } | 171 data2 = { 1000: "test", 5: "five" } |
169 DataPack.WriteDataPack(data2, "datapack2.pak", UTF8) | 172 DataPack.WriteDataPack(data2, "datapack2.pak", UTF8) |
170 print "wrote datapack1 and datapack2 to current directory." | 173 print "wrote datapack1 and datapack2 to current directory." |
171 | 174 |
172 if __name__ == '__main__': | 175 if __name__ == '__main__': |
173 main() | 176 main() |
OLD | NEW |