public SourceConverter() { ExtClassCollection classes = new ExtClassCollection(); CreateClassesFromDir(SourcePath, ref classes); //CreateClassesFromDir(@"..\..\ext-2-plugins\", ref classes); classes.AddRange( CreateCustomClasses("Ext.data.DataReader") ); // delete existing generated files string dir = OutputPath + @"Ext\"; // if(Directory.Exists(dir)) // Directory.Delete(dir, true); foreach (ExtClass ec in classes) { // exclude specific classes if (ec.Name == "Array" || ec.Name == "Date" || ec.Name == "Function" || ec.Name == "Number" || ec.Name == "String") { continue; } ec.Constructors.AddBaseOverloads(ec, classes); ec.Configs.CopyBaseConfigs(ec, classes); ec.SaveToDisk(dir); } CreateAdapterScripts(); }
/// <summary> /// Creates an empty class. This is needed for compilation /// </summary> /// <param name="types">An array of strings specifying the classes to create. Each string should bee the fully qulified class name (incl. Namespace)</param> public ExtClassCollection CreateCustomClasses(params string[] types) { ExtClassCollection classes = new ExtClassCollection(); foreach (string t in types) { if (String.IsNullOrEmpty(t)) continue; ExtClass ec = new ExtClass(); ec.Description = new ExtDescription(); ec.Constructors = new ExtConstructorCollection(); ec.Properties = new ExtPropertyCollection(); ec.Methods = new ExtMethodCollection(); ec.Events = new ExtEventCollection(); ec.Configs = new ExtConfigCollection(); ec.Name = t; if (ec.Name.Contains(".")) { int p = ec.Name.LastIndexOf('.'); ec.Namespace = ec.Name.Substring(0, p); ec.Name = ec.Name.Substring(p + 1); } ec.Constructors.AddDefault(ec); ec.SourceFile = "custom"; classes.Add(ec); } return classes; }
/// <summary> /// Parses a list of members and extracts the class definitions /// </summary> /// <param name="members">A list of members</param> /// <returns>The classes parsed</returns> public ExtClassCollection ExtractClasses(List<string> members) { ExtClassCollection ecs = new ExtClassCollection(); List<string> lines; for (int i = 0; i < members.Count; i++) { string m = members[i]; if (m.Contains("@class")) { lines = new List<string>(); do { // capture every line until the next @class definition or the end of the file lines.Add(m); i++; if (i < members.Count) m = members[i]; } while (!m.Contains("@class") && i < members.Count); i--; // step back to allow the next iteration to grab the @class line ExtClass cls = Parse(lines); ecs.Add(cls); } } return ecs; }
/// <summary> /// Recursively goes thru every file in the given folder and converts a javascript class to a C# class /// </summary> /// <param name="path">the path to look for js files in</param> /// <param name="allClasses">the collection of classes to add the found classes to</param> public void CreateClassesFromDir(string path, ref ExtClassCollection allClasses) { DirectoryInfo dir = new DirectoryInfo(path); FileInfo[] files = dir.GetFiles("*.js"); foreach (FileInfo file in files) { if (!file.Name.ToLower().EndsWith(".js")) continue; ExtClassCollection classes = LoadFromFile(File.ReadAllLines(file.FullName)); foreach (ExtClass cls in classes) { cls.SourceFile = file.FullName.Replace(SourcePath, String.Empty); allClasses.Add(cls); } } foreach (DirectoryInfo subdir in dir.GetDirectories()) { if (subdir.Name == ".svn") continue; if (subdir.Name == "yui") continue; if (subdir.Name == "adapter") continue; if (subdir.Name == "legacy") continue; CreateClassesFromDir(subdir.FullName, ref allClasses); } }