package utils; import hxp.*; import lime.tools.HXProject; import lime.tools.ProjectHelper; import sys.FileSystem; @:access(lime.tools.HXProject) class CreateTemplate { public static function createExtension (words:Array, userDefines:Map):Void { var title = "SampleExtension"; if (words.length > 1) { title = words[1]; } var file = StringTools.replace (title, " ", ""); var extension = StringTools.replace (file, "-", "_"); var className = extension.substr (0, 1).toUpperCase () + extension.substr (1); var context:Dynamic = { }; context.file = file; context.extension = extension; context.className = className; context.extensionLowerCase = extension.toLowerCase (); context.extensionUpperCase = extension.toUpperCase (); context.ANDROID_TARGET_SDK_VERSION = "::ANDROID_TARGET_SDK_VERSION::"; context.ANDROID_MINIMUM_SDK_VERSION = "::ANDROID_MINIMUM_SDK_VERSION::"; context.META_BUILD_NUMBER = "::META_BUILD_NUMBER::"; context.META_VERSION = "::META_VERSION::"; context.ANDROID_GRADLE_PLUGIN = "::ANDROID_GRADLE_PLUGIN::"; System.mkdir (title); System.recursiveCopyTemplate ([ Haxelib.getPath (new Haxelib ("lime"), true) + "/templates" ], "extension", title, context); if (FileSystem.exists (title + "/Extension.hx")) { FileSystem.rename (title + "/Extension.hx", title + "/" + className + ".hx"); } if (FileSystem.exists (title + "/project/common/Extension.cpp")) { FileSystem.rename (title + "/project/common/Extension.cpp", title + "/project/common/" + file + ".cpp"); } if (FileSystem.exists (title + "/project/include/Extension.h")) { FileSystem.rename (title + "/project/include/Extension.h", title + "/project/include/" + file + ".h"); } if (FileSystem.exists (title + "/dependencies/android/src/main/java/org/haxe/extension/Extension.java")) { FileSystem.rename (title + "/dependencies/android/src/main/java/org/haxe/extension/Extension.java", title + "/dependencies/android/src/main/java/org/haxe/extension/" + file + ".java"); } if (FileSystem.exists (title)) { System.mkdir (title + "/ndll"); System.mkdir (title + "/ndll/Linux"); System.mkdir (title + "/ndll/Linux64"); System.mkdir (title + "/ndll/Mac"); System.mkdir (title + "/ndll/Mac64"); System.mkdir (title + "/ndll/Windows"); } } public static function createProject (words:Array, userDefines:Map, overrides:HXProject):Void { var colonIndex = words[0].indexOf (":"); var projectName = null; var sampleName = null; var outputName = "SampleProject"; if (colonIndex == -1) { projectName = words[0]; if (words.length > 1) { sampleName = words[1]; } if (words.length > 2) { outputName = words[2]; } } else { projectName = words[0].substring (0, colonIndex); sampleName = words[0].substr (colonIndex + 1); if (words.length > 1) { outputName = words[1]; } } if (projectName == "project") { projectName = CommandLineTools.defaultLibrary; if (sampleName != null) { outputName = sampleName; } } if (projectName == null || projectName == "") { projectName = CommandLineTools.defaultLibrary; } if (projectName != null && projectName != "") { var defines = new Map (); defines.set ("create", 1); var project = HXProject.fromHaxelib (new Haxelib (projectName), defines); if (project != null) { var company = "Company Name"; /*if (words.length > 2) { company = words[2]; }*/ var context:Dynamic = { }; var name = outputName; //var name = words[1].split (".").pop (); var alphaNumeric = new EReg ("[a-zA-Z0-9]", "g"); var title = ""; var capitalizeNext = true; for (i in 0...name.length) { if (alphaNumeric.match (name.charAt (i))) { if (capitalizeNext) { title += name.charAt (i).toUpperCase (); } else { title += name.charAt (i); } capitalizeNext = false; } else { capitalizeNext = true; } } var file = StringTools.replace (title, " ", ""); var id = [ "com", "sample", file.toLowerCase () ]; /*if (colonIndex != -1 && words.length > 1 || ) { var name = words[1]; name = new EReg ("[^a-zA-Z0-9.]", "g").replace (name, ""); id = name.split ("."); if (id.length < 3) { id = [ "com", "example" ].concat (id); } }*/ var packageName = id.join (".").toLowerCase (); var version = "1.0.0"; if (overrides != null) { if (overrides.meta.packageName != overrides.defaultMeta.packageName) { packageName = overrides.meta.packageName; } if (overrides.meta.title != overrides.defaultMeta.title) { title = overrides.meta.title; } if (overrides.meta.version != overrides.defaultMeta.version) { version = overrides.meta.version; } if (overrides.meta.company != overrides.defaultMeta.company) { company = overrides.meta.company; } if (overrides.app.file != overrides.defaultApp.file) { file = overrides.app.file; } } project.meta.title = title; project.meta.packageName = packageName; project.meta.version = version; project.meta.company = company; project.app.file = file; context.title = title; context.packageName = packageName; context.version = version; context.company = company; context.file = file; for (define in userDefines.keys ()) { Reflect.setField (context, define, userDefines.get (define)); } var folder = name; if (colonIndex > -1) { if (words.length > 1) { folder = Path.tryFullPath (words[1]); } } else { if (words.length > 2) { folder = Path.tryFullPath (words[2]); } } /*if (words.length > 2) { folder = Path.tryFullPath (words[2]); }*/ System.mkdir (folder); ProjectHelper.recursiveSmartCopyTemplate (project, "project", folder, context); try { if (FileSystem.exists (folder + "/Project.hxproj")) { if (FileSystem.exists (folder + "/" + title + ".hxproj")) { FileSystem.deleteFile (folder + "/" + title + ".hxproj"); } FileSystem.rename (folder + "/Project.hxproj", folder + "/" + title + ".hxproj"); } } catch (e:Dynamic) {} return; } } Log.error ("Could not find project \"" + projectName + "\""); } public static function createSample (words:Array, userDefines:Map) { var colonIndex = words[0].indexOf (":"); var projectName = null; var sampleName = null; var outputPath = null; if (colonIndex == -1 && words.length > 1) { projectName = words[0]; sampleName = words[1]; if (words.length > 2) { outputPath = words[2]; } } else { projectName = words[0].substring (0, colonIndex); sampleName = words[0].substr (colonIndex + 1); if (words.length > 1) { outputPath = words[1]; } } if (projectName == null || projectName == "") { projectName = CommandLineTools.defaultLibrary; } if (sampleName == null || sampleName == "") { Log.error ("You must specify a sample name to copy when using \"" + CommandLineTools.commandName + " create\""); return; } var defines = new Map (); defines.set ("create", 1); var project = HXProject.fromHaxelib (new Haxelib (projectName), defines); if (project == null && outputPath == null) { outputPath = sampleName; sampleName = projectName; projectName = CommandLineTools.defaultLibrary; project = HXProject.fromHaxelib (new Haxelib (projectName), defines); } if (project != null) { if (outputPath == null) { outputPath = sampleName; } var samplePaths = project.samplePaths.copy (); samplePaths.reverse (); for (samplePath in samplePaths) { var sourcePath = Path.combine (samplePath, sampleName); if (FileSystem.exists (sourcePath)) { System.mkdir (outputPath); System.recursiveCopy (sourcePath, Path.tryFullPath (outputPath)); return; } } } Log.error ("Could not find sample \"" + sampleName + "\" in project \"" + projectName + "\""); } public static function listSamples (projectName:String, userDefines:Map) { var templates = []; if (projectName != null && projectName != "") { var defines = new Map (); defines.set ("create", 1); var project = HXProject.fromHaxelib (new Haxelib (projectName), defines); if (project != null) { var samplePaths = project.samplePaths.copy (); if (samplePaths.length > 0) { samplePaths.reverse (); for (samplePath in samplePaths) { var path = Path.tryFullPath (samplePath); if (!FileSystem.exists (path)) continue; for (name in FileSystem.readDirectory (path)) { if (!StringTools.startsWith (name, ".") && FileSystem.isDirectory (path + "/" + name)) { templates.push (name); } } } } /*templates.push ("extension"); var projectTemplate = System.findTemplate (project.templatePaths, "project", false); if (projectTemplate != null) { templates.push ("project"); }*/ } } if (templates.length == 0) { projectName = CommandLineTools.defaultLibrary; } Log.println ("\x1b[1mYou must specify a template when using the 'create' command.\x1b[0m"); Log.println (""); if (projectName == CommandLineTools.commandName) { Log.println (" " + Log.accentColor + "Usage:\x1b[0m \x1b[1m" + CommandLineTools.commandName + "\x1b[0m create project (directory)"); Log.println (" " + Log.accentColor + "Usage:\x1b[0m \x1b[1m" + CommandLineTools.commandName + "\x1b[0m create extension (directory)"); } Log.println (" " + Log.accentColor + "Usage:\x1b[0m \x1b[1m" + CommandLineTools.commandName + "\x1b[0m create " + (projectName != CommandLineTools.commandName ? projectName + " " : "") + " (directory)"); if (templates.length > 0) { Log.println (""); Log.println (" " + Log.accentColor + "Available samples:\x1b[0m"); Log.println (""); for (template in templates) { Sys.println (" * " + template); } } Sys.println (""); } }