15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/env python 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2011 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"""Creates a grd file for packaging the inspector files.""" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from __future__ import with_statement 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import errno 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import os 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import shutil 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import sys 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from xml.dom import minidom 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)kDevToolsResourcePrefix = 'IDR_DEVTOOLS_' 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)kGrdTemplate = '''<?xml version="1.0" encoding="UTF-8"?> 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)<grit latest_public_release="0" current_release="1"> 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <outputs> 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <output filename="grit/devtools_resources.h" type="rc_header"> 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <emit emit_type='prepend'></emit> 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) </output> 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <output filename="grit/devtools_resources_map.cc" type="resource_file_map_source" /> 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <output filename="grit/devtools_resources_map.h" type="resource_map_header" /> 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <output filename="devtools_resources.pak" type="data_package" /> 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) </outputs> 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <release seq="1"> 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) <includes></includes> 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) </release> 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)</grit> 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)''' 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ParsedArgs: 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) def __init__(self, source_files, image_dirs, output_filename): 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) self.source_files = source_files 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) self.image_dirs = image_dirs 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) self.output_filename = output_filename 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def parse_args(argv): 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) images_position = argv.index('--images') 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_position = argv.index('--output') 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) source_files = argv[:images_position] 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) image_dirs = argv[images_position + 1:output_position] 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ParsedArgs(source_files, image_dirs, argv[output_position + 1]) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def make_name_from_filename(filename): 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (filename.replace('/', '_') 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .replace('\\', '_') 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .replace('.', '_')).upper() 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def add_file_to_grd(grd_doc, filename): 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) includes_node = grd_doc.getElementsByTagName('includes')[0] 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) includes_node.appendChild(grd_doc.createTextNode('\n ')) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new_include_node = grd_doc.createElement('include') 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new_include_node.setAttribute('name', make_name_from_filename(filename)) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new_include_node.setAttribute('file', filename) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new_include_node.setAttribute('type', 'BINDATA') 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) includes_node.appendChild(new_include_node) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def main(argv): 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parsed_args = parse_args(argv[1:]) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc = minidom.parseString(kGrdTemplate) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_directory = os.path.dirname(parsed_args.output_filename) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try: 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) os.makedirs(os.path.join(output_directory, 'Images')) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) except OSError, e: 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if e.errno != errno.EEXIST: 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) raise e 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for filename in parsed_args.source_files: 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) shutil.copy(filename, output_directory) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add_file_to_grd(doc, os.path.basename(filename)) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for dirname in parsed_args.image_dirs: 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for filename in os.listdir(dirname): 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if not filename.endswith('.png') and not filename.endswith('.gif'): 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) shutil.copy(os.path.join(dirname, filename), 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) os.path.join(output_directory, 'Images')) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) add_file_to_grd(doc, os.path.join('Images', filename)) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) with open(parsed_args.output_filename, 'w') as output_file: 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_file.write(doc.toxml(encoding='UTF-8')) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if __name__ == '__main__': 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sys.exit(main(sys.argv)) 122