OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2017 The Chromium Authors. All rights reserved. | 2 # Copyright 2017 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 """A tool for interacting with .pak files. | 6 """A tool for interacting with .pak files. |
7 | 7 |
8 For details on the pak file format, see: | 8 For details on the pak file format, see: |
9 https://dev.chromium.org/developers/design-documents/linuxresourcesandlocalizeds
trings | 9 https://dev.chromium.org/developers/design-documents/linuxresourcesandlocalizeds
trings |
10 """ | 10 """ |
(...skipping 15 matching lines...) Expand all Loading... |
26 pak = data_pack.ReadDataPack(args.pak_file) | 26 pak = data_pack.ReadDataPack(args.pak_file) |
27 | 27 |
28 for resource_id, payload in pak.resources.iteritems(): | 28 for resource_id, payload in pak.resources.iteritems(): |
29 path = os.path.join(args.output_dir, str(resource_id)) | 29 path = os.path.join(args.output_dir, str(resource_id)) |
30 with open(path, 'w') as f: | 30 with open(path, 'w') as f: |
31 f.write(payload) | 31 f.write(payload) |
32 | 32 |
33 | 33 |
34 def _PrintMain(args): | 34 def _PrintMain(args): |
35 pak = data_pack.ReadDataPack(args.pak_file) | 35 pak = data_pack.ReadDataPack(args.pak_file) |
| 36 id_map = {id(v): k for k, v in sorted(pak.resources.items(), reverse=True)} |
36 encoding = 'binary' | 37 encoding = 'binary' |
37 if pak.encoding == 1: | 38 if pak.encoding == 1: |
38 encoding = 'utf-8' | 39 encoding = 'utf-8' |
39 elif pak.encoding == 2: | 40 elif pak.encoding == 2: |
40 encoding = 'utf-16' | 41 encoding = 'utf-16' |
41 else: | 42 else: |
42 encoding = '?' + str(pak.encoding) | 43 encoding = '?' + str(pak.encoding) |
43 print 'Encoding:', encoding | 44 print 'Encoding:', encoding |
44 | 45 |
45 try_decode = encoding.startswith('utf') | 46 try_decode = encoding.startswith('utf') |
46 # Print IDs in ascending order, since that's the order in which they appear in | 47 # Print IDs in ascending order, since that's the order in which they appear in |
47 # the file (order is lost by Python dict). | 48 # the file (order is lost by Python dict). |
48 for resource_id in sorted(pak.resources): | 49 for resource_id in sorted(pak.resources): |
49 data = pak.resources[resource_id] | 50 data = pak.resources[resource_id] |
50 desc = '<binary>' | 51 desc = '<binary>' |
51 if try_decode: | 52 if try_decode: |
52 try: | 53 try: |
53 desc = unicode(data, encoding) | 54 desc = unicode(data, encoding) |
54 if len(desc) > 60: | 55 if len(desc) > 60: |
55 desc = desc[:60] + u'...' | 56 desc = desc[:60] + u'...' |
56 desc = desc.replace('\n', '\\n') | 57 desc = desc.replace('\n', '\\n') |
57 except UnicodeDecodeError: | 58 except UnicodeDecodeError: |
58 pass | 59 pass |
59 sha1 = hashlib.sha1(data).hexdigest()[:10] | 60 sha1 = hashlib.sha1(data).hexdigest()[:10] |
60 line = u'Entry(id={}, len={}, sha1={}): {}'.format( | 61 canonical_id = id_map[id(data)] |
61 resource_id, len(data), sha1, desc) | 62 if resource_id == canonical_id: |
| 63 line = u'Entry(id={}, len={}, sha1={}): {}'.format( |
| 64 resource_id, len(data), sha1, desc) |
| 65 else: |
| 66 line = u'Entry(id={}, alias_of={}): {}'.format( |
| 67 resource_id, canonical_id, desc) |
62 print line.encode('utf-8') | 68 print line.encode('utf-8') |
63 | 69 |
64 | 70 |
65 def _ListMain(args): | 71 def _ListMain(args): |
66 resources, _ = data_pack.ReadDataPack(args.pak_file) | 72 resources, _ = data_pack.ReadDataPack(args.pak_file) |
67 for resource_id in sorted(resources.keys()): | 73 for resource_id in sorted(resources.keys()): |
68 args.output.write('%d\n' % resource_id) | 74 args.output.write('%d\n' % resource_id) |
69 | 75 |
70 | 76 |
71 def main(): | 77 def main(): |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 elif len(sys.argv) == 2 and sys.argv[1] in actions: | 115 elif len(sys.argv) == 2 and sys.argv[1] in actions: |
110 parser.parse_args(sys.argv[1:] + ['-h']) | 116 parser.parse_args(sys.argv[1:] + ['-h']) |
111 sys.exit(1) | 117 sys.exit(1) |
112 | 118 |
113 args = parser.parse_args() | 119 args = parser.parse_args() |
114 args.func(args) | 120 args.func(args) |
115 | 121 |
116 | 122 |
117 if __name__ == '__main__': | 123 if __name__ == '__main__': |
118 main() | 124 main() |
OLD | NEW |