Skip to content

Instantly share code, notes, and snippets.

@sonygod
Created March 28, 2013 09:40
Show Gist options
  • Save sonygod/5261980 to your computer and use it in GitHub Desktop.
Save sonygod/5261980 to your computer and use it in GitHub Desktop.
1.0.1
package;
import haxe.ds.IntMap;
import sys.db.Object;
import sys.FileSystem;
import neko.Lib;
//import neko.Sys;
using StringTools;
using As3ToHaxe;
import haxe.ds.ObjectMap;
//import Task;
//import User;
/**
* Simple Program which iterates -from folder, finds .mtt templates and compiles them to the -to folder
*
* as3 interface creater.1.0.1
*/
class As3ToHaxe
{
public static var keys = ["-from", "-to", "-remove", "-useSpaces"];
public var ext:String = "as";
var to:String;
var from:String;
var useSpaces:String;
var remove:String;
var sysargs:Array<String>;
var items:Array<String>;
public static var basePackage:String = "away3d";
private var nameSpaces:Map<String,Ns>;
private var maxLoop:Int;
static function main()
{
new As3ToHaxe();
}
public function new()
{
maxLoop = 1000;
if (parseArgs())
{
// trace("start1");
// make sure that the to directory exists
if (!FileSystem.exists(to)) FileSystem.createDirectory(to);
// delete old files
if (remove == "true")
removeDirectory(to);
items = [];
// fill items
trace("start1"+from);
recurse(from);
//trace("start2"+items);
// to remember namespaces
nameSpaces = new Map();
for (item in items)
{
// make sure we only work wtih AS fiels
var ext = getExt(item);
trace("file:"+ext);
switch(ext)
{
case ext:
doConversion(item);
}
}
// build namespace files
buildNameSpaces();
}
}
private function doConversion(file:String):Void
{
var fromFile = file;
var fileName:String = file.substr(from.length + 1, file.lastIndexOf(".") - (from.length));
var firstLetter:String = fileName.substr(0, 1);
firstLetter = firstLetter.toUpperCase();
fileName = firstLetter + fileName.substring(1);
var toFile = to + "/" + fileName+ "as";
var rF = "";
var rC = "";
var b = 0;
/* -----------------------------------------------------------*/
// create the folder if it doesn''t exist
var dir = toFile.substr(0, toFile.lastIndexOf("/"));
createFolder(dir);
var s = sys.io.File.getContent(fromFile);
//trace(s);
/* -----------------------------------------------------------*/
// space to tabs
var packName:String = quickRegM(s, "(package.*)").join("");//
packName = quickRegR(packName, "\\{", "")+"\n{\n";
var importString:String = quickRegM(s, "(import .+;)").join("\n") + "\n";
s = quickRegR(s, "public final class ", "public class ");
s = quickRegR(s, "public dynamic class ", "public class ");
var classNams:String = quickRegM(s, "(public (class|interface).*[a-zA-Z0-9]{1,}\\S)").join("") + "\n";
var ln = fileName.split("/");
var controutName:String = ln[ln.length - 1];
var _last:Array<String> = quickRegM(s, "(\\/\\*\\*[\\s\\S]*?\\*\\/\\s*.*|(override)? (public|private|protected|)\\s*(static)?\\s*(function|interface).+)");
_last.shift();
var last:String = _last.join("");
last = quickRegR(last, "(package.*)", "");// quickRegM(s, "(package.*)").join("");
last = quickRegR(last, "(public (class|interface).*[a-zA-Z0-9]{1,})", "");
last = quickRegR(last, "(package.*)", "");
s = packName +importString+ classNams+ last;// .join("");
s = quickRegR(s, "(public (class|interface).*[a-zA-Z0-9]{1,})", "$1 \n {");
s = quickRegR(s, "(\\)\\:[^void].*[a-zA-Z0-9\\*]{1,}\\})", "$1 {return null;}");
s = quickRegR(s, "(\\):[^void].[a-zA-Z0-9\\*]{1,})", "$1 {return null;}");
s = quickRegR(s, "(\\)\\:void)", "$1 {}");
s = quickRegR(s, "\\} \\{", "}");
s = quickRegR(s, "\\{import", "import");
s = quickRegR(s, "\\{ \\{", "");
s = quickRegR(s, "\\{return null;\\}return null;\\}", "{return null;}");
s = quickRegR(s, "\\{\\}return null;\\}", "{}");
s = quickRegR(s, "function " + controutName + "\\)", "function " + controutName + "(){}");
s = quickRegR(s, "\\.\\(", "(");
//s = quickRegR(s, "\\)\\:\\*.*", "):*{return null;}");
s = quickRegR(s, "\\)\\:int", "):int {return 1}");
if (~/public interface/.match(s)) {
s = quickRegR(s, "(\\):.*)(\\{.*\\}\\;)", "$1;");
s = quickRegR(s, "(void \\{\\})", "void ;");
//{return null;} ;
s = quickRegR(s, "\\{return.*", ";");
}s = quickRegR(s, "(package .+interfaces .*)\\{", "$1");
s = quickRegR(s, "function(\\s)*\\(\\).*\\}(\\S)*", "");
s = quickRegR(s, "\\*\\s\\{return null.*\\/", "*/");
s = quickRegR(s, "function \\(.*\\}", "");
s = quickRegR(s, "\\}\\{", "}");
//Vector {return null;}.<LoaderItem>
s=quickRegR(s,"(Vector) (\\{return null;\\})(\\.\\<LoaderItem\\>)","$1 $3 $2");
// s = quickRegR(s, "if .+", "");
s = quickRegR(s,"\\*{1,2}\\/[\\s|\\S]*\\*{2}\\/", "*/");//for tweenlite
s += "\n } \n}";
//s = quickRegR(s, "if .+", "");
var o = sys.io.File.write(toFile, true);
o.writeString(s);
o.close();
/* -----------------------------------------------------------*/
// use for testing on a single file
//Sys.exit(1);
}
private function logLoopError(type:String, file:String)
{
trace("ERROR: " + type + " - " + file);
}
private function buildNameSpaces()
{
// build friend namespaces!
trace(nameSpaces);
}
public static function quickRegR(str:String, reg:String, rep:String, ?regOpt:String = "g"):String
{
return new EReg(reg, regOpt).replace(str, rep);
}
public static function quickRegM(str:String, reg:String, ?regOpt:String = "g"):Array<String>
{
var rgx = new EReg(reg, regOpt);
var arr:Array<String> = [];
rgx.match(str);
while (rgx.match(str)) {
arr.push(rgx.matched(1));
str = rgx.matchedRight();
}
return arr;
}
private function createFolder(path:String):Void
{
var parts = path.split("/");
var folder = "";
for (part in parts)
{
if (folder == "") folder += part;
else folder += "/" + part;
if (!FileSystem.exists(folder)) FileSystem.createDirectory(folder);
}
}
private function parseArgs():Bool
{
trace("start");
// Parse args
var args = Sys.args();
for (i in 0...args.length)
if (Lambda.has(keys, args[i]))
Reflect.setField(this, args[i].substr(1), args[i + 1]);
// Check to see if argument is missing
if (to == null) { Lib.println("Missing argument '-to'"); return false; }
if (from == null) { Lib.println("Missing argument '-from'"); return false; }
return true;
}
public function recurse(path:String)
{
var dir = FileSystem.readDirectory(path);
for (item in dir)
{
var s = path + "/" + item;
if (FileSystem.isDirectory(s))
{
recurse(s);
}
else
{
var exts = [ext];
if(Lambda.has(exts, getExt(item)))
items.push(s);
}
}
}
public function getExt(s:String)
{
return s.substr(s.lastIndexOf(".") + 1).toLowerCase();
}
public function removeDirectory(d, p = null)
{
if (p == null) p = d;
var dir = FileSystem.readDirectory(d);
for (item in dir)
{
item = p + "/" + item;
if (FileSystem.isDirectory(item)) {
removeDirectory(item);
}else{
FileSystem.deleteFile(item);
}
}
FileSystem.deleteDirectory(d);
}
public static function fUpper(s:String)
{
return s.charAt(0).toUpperCase() + s.substr(1);
}
}
typedef Ns = {
var name:String;
var classDefs:Map<String,String>;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment