12bde8e466a4451c7319e3a072d118917957d6554Steve Block#!/usr/bin/env python 22bde8e466a4451c7319e3a072d118917957d6554Steve Block# 32bde8e466a4451c7319e3a072d118917957d6554Steve Block# Copyright (C) 2011 Google Inc. All rights reserved. 42bde8e466a4451c7319e3a072d118917957d6554Steve Block# 52bde8e466a4451c7319e3a072d118917957d6554Steve Block# Redistribution and use in source and binary forms, with or without 62bde8e466a4451c7319e3a072d118917957d6554Steve Block# modification, are permitted provided that the following conditions are 72bde8e466a4451c7319e3a072d118917957d6554Steve Block# met: 82bde8e466a4451c7319e3a072d118917957d6554Steve Block# 92bde8e466a4451c7319e3a072d118917957d6554Steve Block# * Redistributions of source code must retain the above copyright 102bde8e466a4451c7319e3a072d118917957d6554Steve Block# notice, this list of conditions and the following disclaimer. 112bde8e466a4451c7319e3a072d118917957d6554Steve Block# * Redistributions in binary form must reproduce the above 122bde8e466a4451c7319e3a072d118917957d6554Steve Block# copyright notice, this list of conditions and the following disclaimer 132bde8e466a4451c7319e3a072d118917957d6554Steve Block# in the documentation and/or other materials provided with the 142bde8e466a4451c7319e3a072d118917957d6554Steve Block# distribution. 152bde8e466a4451c7319e3a072d118917957d6554Steve Block# * Neither the name of Google Inc. nor the names of its 162bde8e466a4451c7319e3a072d118917957d6554Steve Block# contributors may be used to endorse or promote products derived from 172bde8e466a4451c7319e3a072d118917957d6554Steve Block# this software without specific prior written permission. 182bde8e466a4451c7319e3a072d118917957d6554Steve Block# 192bde8e466a4451c7319e3a072d118917957d6554Steve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 202bde8e466a4451c7319e3a072d118917957d6554Steve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 212bde8e466a4451c7319e3a072d118917957d6554Steve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 222bde8e466a4451c7319e3a072d118917957d6554Steve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 232bde8e466a4451c7319e3a072d118917957d6554Steve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 242bde8e466a4451c7319e3a072d118917957d6554Steve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 252bde8e466a4451c7319e3a072d118917957d6554Steve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 262bde8e466a4451c7319e3a072d118917957d6554Steve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 272bde8e466a4451c7319e3a072d118917957d6554Steve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 282bde8e466a4451c7319e3a072d118917957d6554Steve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 292bde8e466a4451c7319e3a072d118917957d6554Steve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 302bde8e466a4451c7319e3a072d118917957d6554Steve Block 312bde8e466a4451c7319e3a072d118917957d6554Steve Block"""Creates a grd file for packaging the inspector files.""" 322bde8e466a4451c7319e3a072d118917957d6554Steve Block 332bde8e466a4451c7319e3a072d118917957d6554Steve Blockfrom __future__ import with_statement 342bde8e466a4451c7319e3a072d118917957d6554Steve Block 352bde8e466a4451c7319e3a072d118917957d6554Steve Blockimport errno 362bde8e466a4451c7319e3a072d118917957d6554Steve Blockimport os 372bde8e466a4451c7319e3a072d118917957d6554Steve Blockimport shutil 382bde8e466a4451c7319e3a072d118917957d6554Steve Blockimport sys 392bde8e466a4451c7319e3a072d118917957d6554Steve Blockfrom xml.dom import minidom 402bde8e466a4451c7319e3a072d118917957d6554Steve Block 412bde8e466a4451c7319e3a072d118917957d6554Steve BlockkDevToolsResourcePrefix = 'IDR_DEVTOOLS_' 422bde8e466a4451c7319e3a072d118917957d6554Steve BlockkGrdTemplate = '''<?xml version="1.0" encoding="UTF-8"?> 432bde8e466a4451c7319e3a072d118917957d6554Steve Block<grit latest_public_release="0" current_release="1"> 442bde8e466a4451c7319e3a072d118917957d6554Steve Block <outputs> 452bde8e466a4451c7319e3a072d118917957d6554Steve Block <output filename="grit/devtools_resources.h" type="rc_header"> 462bde8e466a4451c7319e3a072d118917957d6554Steve Block <emit emit_type='prepend'></emit> 472bde8e466a4451c7319e3a072d118917957d6554Steve Block </output> 482bde8e466a4451c7319e3a072d118917957d6554Steve Block <output filename="grit/devtools_resources_map.cc" type="resource_file_map_source" /> 492bde8e466a4451c7319e3a072d118917957d6554Steve Block <output filename="grit/devtools_resources_map.h" type="resource_map_header" /> 502bde8e466a4451c7319e3a072d118917957d6554Steve Block 512bde8e466a4451c7319e3a072d118917957d6554Steve Block <output filename="devtools_resources.pak" type="data_package" /> 522bde8e466a4451c7319e3a072d118917957d6554Steve Block </outputs> 532bde8e466a4451c7319e3a072d118917957d6554Steve Block <release seq="1"> 542bde8e466a4451c7319e3a072d118917957d6554Steve Block <includes></includes> 552bde8e466a4451c7319e3a072d118917957d6554Steve Block </release> 562bde8e466a4451c7319e3a072d118917957d6554Steve Block</grit> 572bde8e466a4451c7319e3a072d118917957d6554Steve Block''' 582bde8e466a4451c7319e3a072d118917957d6554Steve Block 592bde8e466a4451c7319e3a072d118917957d6554Steve Block 602bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass ParsedArgs: 612bde8e466a4451c7319e3a072d118917957d6554Steve Block def __init__(self, source_files, image_dirs, output_filename): 622bde8e466a4451c7319e3a072d118917957d6554Steve Block self.source_files = source_files 632bde8e466a4451c7319e3a072d118917957d6554Steve Block self.image_dirs = image_dirs 642bde8e466a4451c7319e3a072d118917957d6554Steve Block self.output_filename = output_filename 652bde8e466a4451c7319e3a072d118917957d6554Steve Block 662bde8e466a4451c7319e3a072d118917957d6554Steve Block 672bde8e466a4451c7319e3a072d118917957d6554Steve Blockdef parse_args(argv): 682bde8e466a4451c7319e3a072d118917957d6554Steve Block images_position = argv.index('--images') 692bde8e466a4451c7319e3a072d118917957d6554Steve Block output_position = argv.index('--output') 702bde8e466a4451c7319e3a072d118917957d6554Steve Block source_files = argv[:images_position] 712bde8e466a4451c7319e3a072d118917957d6554Steve Block image_dirs = argv[images_position + 1:output_position] 722bde8e466a4451c7319e3a072d118917957d6554Steve Block return ParsedArgs(source_files, image_dirs, argv[output_position + 1]) 732bde8e466a4451c7319e3a072d118917957d6554Steve Block 742bde8e466a4451c7319e3a072d118917957d6554Steve Block 752bde8e466a4451c7319e3a072d118917957d6554Steve Blockdef make_name_from_filename(filename): 762bde8e466a4451c7319e3a072d118917957d6554Steve Block return (filename.replace('/', '_') 772bde8e466a4451c7319e3a072d118917957d6554Steve Block .replace('\\', '_') 782bde8e466a4451c7319e3a072d118917957d6554Steve Block .replace('.', '_')).upper() 792bde8e466a4451c7319e3a072d118917957d6554Steve Block 802bde8e466a4451c7319e3a072d118917957d6554Steve Block 812bde8e466a4451c7319e3a072d118917957d6554Steve Blockdef add_file_to_grd(grd_doc, filename): 822bde8e466a4451c7319e3a072d118917957d6554Steve Block includes_node = grd_doc.getElementsByTagName('includes')[0] 832bde8e466a4451c7319e3a072d118917957d6554Steve Block includes_node.appendChild(grd_doc.createTextNode('\n ')) 842bde8e466a4451c7319e3a072d118917957d6554Steve Block 852bde8e466a4451c7319e3a072d118917957d6554Steve Block new_include_node = grd_doc.createElement('include') 862bde8e466a4451c7319e3a072d118917957d6554Steve Block new_include_node.setAttribute('name', make_name_from_filename(filename)) 872bde8e466a4451c7319e3a072d118917957d6554Steve Block new_include_node.setAttribute('file', filename) 882bde8e466a4451c7319e3a072d118917957d6554Steve Block new_include_node.setAttribute('type', 'BINDATA') 892bde8e466a4451c7319e3a072d118917957d6554Steve Block includes_node.appendChild(new_include_node) 902bde8e466a4451c7319e3a072d118917957d6554Steve Block 912bde8e466a4451c7319e3a072d118917957d6554Steve Block 922bde8e466a4451c7319e3a072d118917957d6554Steve Blockdef main(argv): 932bde8e466a4451c7319e3a072d118917957d6554Steve Block parsed_args = parse_args(argv[1:]) 942bde8e466a4451c7319e3a072d118917957d6554Steve Block 952bde8e466a4451c7319e3a072d118917957d6554Steve Block doc = minidom.parseString(kGrdTemplate) 962bde8e466a4451c7319e3a072d118917957d6554Steve Block output_directory = os.path.dirname(parsed_args.output_filename) 972bde8e466a4451c7319e3a072d118917957d6554Steve Block 982bde8e466a4451c7319e3a072d118917957d6554Steve Block try: 992bde8e466a4451c7319e3a072d118917957d6554Steve Block os.makedirs(os.path.join(output_directory, 'Images')) 1002bde8e466a4451c7319e3a072d118917957d6554Steve Block except OSError, e: 1012bde8e466a4451c7319e3a072d118917957d6554Steve Block if e.errno != errno.EEXIST: 1022bde8e466a4451c7319e3a072d118917957d6554Steve Block raise e 1032bde8e466a4451c7319e3a072d118917957d6554Steve Block 1042bde8e466a4451c7319e3a072d118917957d6554Steve Block for filename in parsed_args.source_files: 1052bde8e466a4451c7319e3a072d118917957d6554Steve Block shutil.copy(filename, output_directory) 1062bde8e466a4451c7319e3a072d118917957d6554Steve Block add_file_to_grd(doc, os.path.basename(filename)) 1072bde8e466a4451c7319e3a072d118917957d6554Steve Block 1082bde8e466a4451c7319e3a072d118917957d6554Steve Block for dirname in parsed_args.image_dirs: 1092bde8e466a4451c7319e3a072d118917957d6554Steve Block for filename in os.listdir(dirname): 1102bde8e466a4451c7319e3a072d118917957d6554Steve Block if not filename.endswith('.png') and not filename.endswith('.gif'): 1112bde8e466a4451c7319e3a072d118917957d6554Steve Block continue 1122bde8e466a4451c7319e3a072d118917957d6554Steve Block shutil.copy(os.path.join(dirname, filename), 1132bde8e466a4451c7319e3a072d118917957d6554Steve Block os.path.join(output_directory, 'Images')) 1142bde8e466a4451c7319e3a072d118917957d6554Steve Block add_file_to_grd(doc, os.path.join('Images', filename)) 1152bde8e466a4451c7319e3a072d118917957d6554Steve Block 1162bde8e466a4451c7319e3a072d118917957d6554Steve Block with open(parsed_args.output_filename, 'w') as output_file: 1172bde8e466a4451c7319e3a072d118917957d6554Steve Block output_file.write(doc.toxml(encoding='UTF-8')) 1182bde8e466a4451c7319e3a072d118917957d6554Steve Block 1192bde8e466a4451c7319e3a072d118917957d6554Steve Block 1202bde8e466a4451c7319e3a072d118917957d6554Steve Blockif __name__ == '__main__': 1212bde8e466a4451c7319e3a072d118917957d6554Steve Block sys.exit(main(sys.argv)) 122