#!/usr/bin/python # -*- coding: utf-8 -*- # ---------------------------------------------------------------------------- # Xcode 4 template generator for cocos2d project # (c) 2011 Ricardo Quesada # # LICENSE: Dual License: MIT & GNU GPL v2 Whatever suits you best. # # Given a directory, it generates the "Definitions" and "Nodes" elements # # Format taken from: http://blog.boreal-kiss.net/2011/03/11/a-minimal-project-template-for-xcode-4/ # ---------------------------------------------------------------------------- ''' Xcode 4 template generator ''' __docformat__ = 'restructuredtext' _template_open_body = """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!-- FILE AUTOGENERATED BY cocos2d-x/tools/template_generator.py DO NOT EDIT --> <plist version="1.0"> <dict> <key>Description</key> <string>This is a template description.</string> <key>Identifier</key> <string>org.cocos2d-x.%s</string> <key>Kind</key> <string>Xcode.Xcode3.ProjectTemplateUnitKind</string> """ _template_close_body = "</dict>\n</plist>" # python import sys import os import getopt import glob class Xcode4Template(object): def __init__( self, directory, group=0, identifier="XXX", prefix="libs", exclude=[], append="" ): self.directory = directory self.files_to_include = [] self.wildcard = '*' self.ignore_extensions = ['h','txt','html','patch'] self.prefix = prefix # self.ignore_keywords = ['win32','airplay','android','Android','wophone', 'CCImage.cpp', 'third_party'] self.group_start_index = group # eg: if 1 then libs/cocos2d/support -> ["cocos2d", "support"] ignoring "libs" self.output = [] self.identifier = identifier def scandirs(self, path): for currentFile in glob.glob( os.path.join(path, self.wildcard) ): bExclude = False for exclude_keyword in exclude: if currentFile.find(exclude_keyword) >= 0: bExclude = True break if bExclude is False: if os.path.isdir(currentFile): self.scandirs(currentFile) else: self.files_to_include.append( currentFile ) # # append the definitions # def append_definition( self, output_body, path, group, dont_index ): #add 'libs/' path = self.prefix + '/' + path group = [ self.prefix ] + group; output_body.append("\t\t<key>%s</key>" % path ) output_body.append("\t\t<dict>") if group: output_body.append("\t\t\t<key>Group</key>") output_body.append("\t\t\t<array>") for g in group: output_body.append("\t\t\t\t<string>%s</string>" % g ) output_body.append("\t\t\t</array>") output_body.append("\t\t\t<key>Path</key>\n\t\t\t<string>%s</string>" % path ) if dont_index: output_body.append("\t\t\t<key>TargetIndices</key>\n\t\t\t<array/>") output_body.append("\t\t</dict>") # # Generate the "Definitions" section # def generate_definitions( self ): output_header = "\t<key>Definitions</key>" output_dict_open = "\t<dict>" output_dict_close = "\t</dict>" output_body = [] for path in self.files_to_include: # group name group = [] # obtain group name from directory dirs = os.path.dirname(path) group = dirs.split('/') group = group[self.group_start_index:] # get the extension filename = os.path.basename(path) name_extension= filename.split('.') extension = None if len(name_extension) == 2: extension = name_extension[1] self.append_definition( output_body, path, group, extension in self.ignore_extensions ) self.output.append( output_header ) self.output.append( output_dict_open ) self.output.append( "\n".join( output_body ) ) self.output.append( output_dict_close ) # # Generates the "Nodes" section # def generate_nodes( self ): output_header = "\t<key>Nodes</key>" output_open = "\t<array>" output_close = "\t</array>" output_body = [] for path in self.files_to_include: path = self.prefix + '/' + path output_body.append("\t\t<string>%s</string>" % path ) self.output.append( output_header ) self.output.append( output_open ) self.output.append( "\n".join( output_body ) ) self.output.append( output_close ) # # Generates the plist. Send it to to stdout # def generate_xml( self ): self.output.append( _template_open_body % self.identifier ) if append != "": self.output.append( "".join(open(append, "r").readlines()) ) self.generate_definitions() self.generate_nodes() self.output.append( _template_close_body ) print "\n".join( self.output ) def generate( self ): self.scandirs( self.directory ) self.generate_xml() def help(): print "%s v1.0 - An utility to generate Xcode 4 templates" % sys.argv[0] print "Usage:" print "\t-d directory (directory to parse)" print "\t-g directory_used_as_starting_group (if 1, then 'libs/cocos2d/Support/' -> ['cocos2d','Support'] ignoring 'libs')" print "\t-i identifier (Xcode4 template identifier)" print "\nExample:" print "\t%s -d cocos2d -g 0 -i cocos2dlib" % sys.argv[0] sys.exit(-1) if __name__ == "__main__": if len( sys.argv ) == 1: help() directory = None group = None identifier = None prefix = "" exclude = [] append = "" argv = sys.argv[1:] try: opts, args = getopt.getopt(argv, "d:g:i:p:e:a:", ["directory=","group=","identifier=","prefix=", "exclude=", "append="]) for opt, arg in opts: if opt in ("-d","--directory"): directory = arg if opt in ("-g","--group"): group = int(arg) if opt in ("-i","--identifier"): identifier = arg if opt in ("-p","--prefix"): prefix = arg if opt in ("-e","--exclude"): exclude = arg.split() if opt in ("-a","--append"): append = arg except getopt.GetoptError,e: print e if directory == None: help() #generate libs/cocos2dx gen = Xcode4Template( directory=directory, group=group, identifier=identifier, prefix=prefix, exclude=exclude, append=append ) gen.generate()