diff options
author | matthewsotoudeh <matthewsot@outlook.com> | 2015-01-24 11:55:40 -0800 |
---|---|---|
committer | matthewsotoudeh <matthewsot@outlook.com> | 2015-01-24 11:55:40 -0800 |
commit | 404e9c0949affe4cb601823aff969f0886f16dc3 (patch) | |
tree | ede8188d7ef451bba8804b1a7c8d6a3b1b5b346b | |
parent | c79b072f56dfffb9d5e7c9ae4bd357e59cac5b61 (diff) |
trying to fix the stubgen
-rw-r--r-- | StubGen/StubGen/Program.cs | 2 | ||||
-rw-r--r-- | StubGen/StubGen/ScrapeFramework.cs | 3 | ||||
-rw-r--r-- | StubGen/StubGen/Scraper.cs | 508 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/Extensions.cs | 81 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/ScrapedClass.cs | 75 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/ScrapedEnum.cs | 11 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/ScrapedMember.cs | 12 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/ScrapedNotification.cs | 1 | ||||
-rw-r--r-- | StubGen/StubGen/Scrapers/ScrapedParameter.cs | 44 | ||||
-rw-r--r-- | StubGen/StubGen/StubGen.csproj | 1 |
10 files changed, 121 insertions, 617 deletions
diff --git a/StubGen/StubGen/Program.cs b/StubGen/StubGen/Program.cs index b4bb6e08..e4bceeea 100644 --- a/StubGen/StubGen/Program.cs +++ b/StubGen/StubGen/Program.cs @@ -10,7 +10,7 @@ namespace StubGen { static void Main(string[] args) { - ScrapeFramework(new UIKitData()); + ScrapeFramework(new FoundationData()); Console.WriteLine("Done!"); Console.ReadLine(); diff --git a/StubGen/StubGen/ScrapeFramework.cs b/StubGen/StubGen/ScrapeFramework.cs index de708ff6..12115036 100644 --- a/StubGen/StubGen/ScrapeFramework.cs +++ b/StubGen/StubGen/ScrapeFramework.cs @@ -56,6 +56,9 @@ namespace StubGen public static void ScrapeFramework(IFrameworkURLData data) { + Directory.Delete(@"Output\"); + Directory.CreateDirectory(@"Output\"); + using (var client = new HttpClient()) { var resp = client.GetStringAsync(data.URL).Result; diff --git a/StubGen/StubGen/Scraper.cs b/StubGen/StubGen/Scraper.cs deleted file mode 100644 index d1cd1823..00000000 --- a/StubGen/StubGen/Scraper.cs +++ /dev/null @@ -1,508 +0,0 @@ -using HtmlAgilityPack; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Text.RegularExpressions; - -namespace StubGen -{ - partial class Scraper - { - public static void ParseFrameworkClasses() - { - - } - - public static void ParseFrameworkProtocols() - { - - } - - public static void ParseFrameworkDataTypes() - { - - } - - public static string ParseClass(string url, string @namespace, IEnumerable<string> extraUsings) - { - return ""; - } - - /* - var output = "using ;\r\nusing ;\r\nusing ;\r\nusing ;\r\nusing ;\r\nusing UIKit;\r\n\r\n"; - output += @namespace + " UIKit\r\n{\r\n"; - output += "//" + url + "\r\n"; - using (var client = new HttpClient()) - { - var data = client.GetStringAsync(url).Result; - var doc = new HtmlDocument - { - OptionFixNestedTags = true - }; - doc.LoadHtml(data); - //var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='z-class-description section']/p[@class='para']").InnerHtml).Trim(); - var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='z-protocol-description section']/p[@class='para']").InnerHtml).Trim(); - //var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='intro']/p[@class='para']").InnerHtml).Trim(); - //var desc = "The UIKit framework defines data types that are used in multiple places throughout the framework."; - desc = desc.Replace("More...", "").Trim(); - output += "/// <summary>\r\n/// " + desc + "\r\n/// </summary>\r\n"; - - var availability = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//div[@class='z-reference-info-availability half']/span").InnerHtml).Trim(); - - output += "[iOSVersion(" + Regex.Split(availability, "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - output += "public interface " + self + /*" : " + inherits +* "\r\n{\r\n"; - - output += ScrapeWithAgility(data).Replace("public ", "").Replace("private set; ", "");/*.Replace(" { get; private set; }", ";").Replace(" { get; set; }", ";").Replace("public ", "")* - } - - return output.TrimEnd().Replace("`", "").Replace(" ", " ").Replace("YEStrue", "true").Replace("NOfalse", "false").Replace("public Self Init(", "public Self(").Replace("void Init(", "Self(").Replace("Self", self).Replace("COMMAHERE123", ",").Replace("Int", "int") + "\r\n}\r\n}"; - }*/ - - public static string ParseEnum(HtmlNode section, HtmlNode declarationPara, string summary) - { - var declaration = RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Trim(); - var name = Regex.Split(declaration, "enum ")[1].Split(':')[0].Trim(); - var output = summary + "public enum " + name + "\r\n{"; - - var items = Regex.Split(declaration, "\n"); - - var descriptions = section.SelectNodes("./ul[@class='list-bullet']/li"); - - var keysAndTrivia = new Dictionary<string, string>(); - foreach (var desc in descriptions) - { - var keyName = RemoveHTMLTags(desc.SelectSingleNode("./p[@class='para Swift']").InnerHtml).Trim(); - var summarry = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").First().InnerHtml).Trim(); - var availableIn = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").Last().InnerHtml).Trim(); - - var trivia = "\r\n/// <summary>\r\n/// " + summarry + "\r\n/// </summary>\r\n"; - - if (availableIn.Contains("in iOS ")) - { - trivia += "[iOSVersion(" + Regex.Split(availableIn, "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - } - - keysAndTrivia.Add(keyName, trivia); - } - - foreach (var item in items) - { - if (item.Contains("case ")) - { - var itemName = Regex.Split(item, "case ").Last().Trim(); - var trivia = ""; - if (keysAndTrivia.ContainsKey(itemName)) - { - trivia = keysAndTrivia[itemName]; - } - output += trivia + itemName + ",\r\n"; - } - } - return output + "}\r\n"; - } - - public static string ParseStruct(HtmlNode section, HtmlNode declarationPara, string summary) - { - var declaration = RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Trim(); - var name = Regex.Split(declaration, "struct ")[1].Split(':')[0].Trim(); - var output = summary + "public enum " + name + "\r\n{"; - - var items = Regex.Split(declaration, "\n"); - - var descriptions = section.SelectNodes("./ul[@class='list-bullet']/li"); - - var keysAndTrivia = new Dictionary<string, string>(); - foreach (var desc in descriptions) - { - var keyName = RemoveHTMLTags(desc.SelectSingleNode("./p[@class='para Swift']").InnerHtml).Trim(); - var summarry = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").First().InnerHtml).Trim(); - var availableIn = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").Last().InnerHtml).Trim(); - - var trivia = "\r\n/// <summary>\r\n/// " + summarry + "\r\n/// </summary>\r\n"; - - if (availableIn.Contains("in iOS ")) - { - trivia += "[iOSVersion(" + Regex.Split(availableIn, "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - } - - keysAndTrivia.Add(keyName, trivia); - } - - foreach (var item in items) - { - if (item.Contains("var ") && !item.Contains("var value:")) - { - var itemName = item.Split(':')[0].Split(' ').Last(); - var trivia = ""; - if (keysAndTrivia.ContainsKey(itemName)) - { - trivia = keysAndTrivia[itemName]; - } - output += trivia + itemName + ",\r\n"; - } - } - return output + "}\r\n"; - } - - public static string ParseKeys(HtmlNode section, HtmlNode declarationPara, string summary) - { - var declaration = RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Trim(); - var keys = Regex.Split(declaration, "\n"); - - var descriptions = section.SelectNodes("./ul[@class='list-bullet']/li"); - var keysAndTrivia = new Dictionary<string, string>(); - foreach (var desc in descriptions) - { - var keyName = RemoveHTMLTags(desc.SelectSingleNode("./p[@class='para Swift']").InnerHtml).Trim(); - var summarry = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").First().InnerHtml).Trim(); - var availableIn = RemoveHTMLTags(desc.SelectNodes("./div[@class='definition']/p").Last().InnerHtml).Trim(); - - var trivia = "\r\n/// <summary>\r\n/// " + summarry + "\r\n/// </summary>\r\n"; - - if (availableIn.Contains("in iOS ")) - { - trivia += "[iOSVersion(" + Regex.Split(availableIn, "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - } - - keysAndTrivia.Add(keyName, trivia); - } - - var output = summary; - foreach (var key in keys) - { - var type = ParseType(key.Split(':')[1].Trim().Trim('!')); - var keyName = key.Split(':')[0].Split(' ')[1]; - var trivia = ""; - if (keysAndTrivia.ContainsKey(keyName)) - { - trivia = keysAndTrivia[keyName]; - } - output += trivia + key.Split(':')[0].Trim().Replace("var ", "public " + type + " ") + " { get;" + (trivia.Contains("read-write") ? "" : " private") + " set; }\r\n"; - } - return output + "\r\n"; - } - - public static string RemoveHTMLTags(string html) - { - return Regex.Replace(html, "<.*?>", ""); - } - - public static Tuple<string, Dictionary<string, string>> ParseDeclaration(string declaration) - { - var output = "public "; - if (declaration.StartsWith("@optional")) - { - output = "[Optional]\r\n" + output; - declaration = declaration.Substring(10); - } - - declaration = declaration.Replace(">", ">").Replace("<", "<").Trim(); - var argsToRename = new Dictionary<string, string>(); - if (declaration.StartsWith("class") || declaration.StartsWith("static")) - { - output += "static "; - } - if (declaration.StartsWith("class func") || declaration.StartsWith("func") || declaration.StartsWith("init") || declaration.StartsWith("convenience init")) - { - var typeOfMethod = "void"; - //method - if (declaration.Contains("->")) - { - typeOfMethod = ParseType(Regex.Split(declaration, Regex.Escape("->")).Last().Trim().TrimEnd('!', ')')); - output += typeOfMethod + " "; - } - else - { - output += "void "; - } - - string name; - if (declaration.Contains("init(")) - { - name = "init"; - } - else - { - name = Regex.Split(declaration, "func ")[1].Split('(')[0].Trim(); - } - if (name != "init") - { - output = "[Export(\"" + name + "\")]\r\n" + output; - } - output += name.ToUpper()[0] + name.Substring(1) + "("; - - var arguments = Regex.Match(declaration, "\\([\\s\\S]*\\)").Value; - arguments = arguments.Substring(1, arguments.Length - 2); - var funcArgs = Regex.Matches(arguments, "\\(\\([\\s\\S]*?\\)[\\s\\S]*?\\)"); - foreach (var funcArg in funcArgs) - { - var sides = Regex.Split(funcArg.ToString(), Regex.Escape("->")); - var retVal = ParseType(sides.Last().Trim().TrimEnd('!', ')')); - var parameters = sides.First().Trim().Trim('(', ')').Replace(",", "COMMAHERE123").Replace("!", ""); - - if (retVal == "void") - { - declaration = declaration.Replace(funcArg.ToString(), "Action<" + parameters + ">"); - } - else - { - declaration = declaration.Replace(funcArg.ToString(), "Func<" + parameters + "COMMAHERE123 " + retVal + ">"); - } - } - - var args = declaration.Split('(')[1].Split(')')[0].Split(','); - foreach(var arg in args) - { - if (arg.Trim() != "") - { - var argName = arg.Split(':')[0].Trim().Split(' ').First(); - if (argName == "_") - { - argName = arg.Split(':')[0].Trim().Split(' ').Last(); - } - else - { - var internalArgName = arg.Split(':')[0].Trim().Split(' ').Last(); - argsToRename.Add(internalArgName, argName); - } - if (argName == "object" || argName == "string" || argName == "delegate") - { - argName = "@" + argName; - } - var argType = ParseType(arg.Split(':')[1].Trim().Trim('!')); - output += argType + " " + argName + ", "; - } - } - output = output.TrimEnd(' ', ','); - - //output += ") { "; - output += ");"; - /*if (name != "init") - { - switch (typeOfMethod) - { - case "void": - output += ""; - break; - case "string": - output += "return \"\";"; - break; - case "int": - case "float": - case "double": - output += "return 0;"; - break; - case "bool": - output += "return false;"; - break; - default: - output += "return null;"; - break; - } - } - output += " }";*/ - } - else if (declaration.StartsWith("var")) - { - var type = ParseType(declaration.Split(':')[1].Trim().Split(' ')[0].TrimEnd('!')); - output += type + " "; - var name = Regex.Split(declaration, "var ")[1].Split(':')[0].Trim(); - output = "[Export(\"" + name + "\")]\r\n" + output; - output += name.ToUpper()[0] + name.Substring(1) + " "; - if (!declaration.Contains("set")) - { - output += "{ get; private set; }"; - } - else - { - output += "{ get; set; }"; - } - } - else - { - output += "\r\n//" + declaration; - } - return new Tuple<string, Dictionary<string, string>>(output + "\r\n\r\n", argsToRename); - } - - public static string ScrapeWithAgility(string data) - { - var output = ""; - var doc = new HtmlDocument - { - OptionFixNestedTags = true - }; - doc.LoadHtml(data); - //thanks http://stackoverflow.com/questions/846994/how-to-use-html-agility-pack - var sections = doc.DocumentNode.SelectNodes("/html/body//li[@class='item symbol']/div[@class='height-container']/section"); - if (sections == null) - { - return ""; - } - foreach(var section in sections) - { - try - { - var summary = "/// <summary>\r\n/// " + RemoveHTMLTags(section.ChildNodes.First(node => node.Attributes.Any(attr => attr.Name == "class" && attr.Value == "abstract")).InnerHtml.Trim()).Trim() + "\r\n/// </summary>\r\n"; - - var obsolete = ""; - if (summary.ToLower().Contains("deprecat")) - { - obsolete = "[Obsolete]\r\n"; - } - - var declarationPara = section.SelectSingleNode("./div[@class='declaration']/div[@class='Swift']/p[@class='para']"); - if (declarationPara == null) - { - continue; - } - if (RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Contains("struct ")) - { - output += ParseStruct(section, declarationPara, summary); - } - else if (RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Contains("enum ")) - { - output += ParseEnum(section, declarationPara, summary); - } - else if (Regex.Split(RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Trim(), "var ").Length > 2) - { - output += ParseKeys(section, declarationPara, summary); - } - else - { - var parsedDecl = ParseDeclaration(RemoveHTMLTags(declarationPara.InnerHtml.Trim()).Trim()); - - string declaration = parsedDecl.Item1; - var argsToRename = parsedDecl.Item2; - - var objcPara = section.SelectSingleNode("./div[@class='declaration']/div[@class='Objective-C']/p[@class='para']"); - if (objcPara != null) - { - var objcdecl = RemoveHTMLTags(objcPara.InnerHtml.Trim()).Trim(); - if (objcdecl.Contains("@property") && !objcdecl.Contains("readonly")) - { - declaration = declaration.Replace("private set", "set"); - } - else if (objcdecl.Contains("@property") && objcdecl.Contains("readonly")) - { - declaration = declaration.Replace("; set;", "; private set;"); - } - } - else - { - declaration = "[SwiftOnly]\r\n" + declaration; - } - - var parameters = ""; - var paramTable = section.SelectSingleNode("./div[@class='parameters']/table/tbody"); - if (paramTable != null) - { - var paramsInTable = paramTable.SelectNodes("./tr"); - foreach (var param in paramsInTable) - { - var name = ParseType(RemoveHTMLTags(param.SelectNodes("./td").First().InnerHtml.Trim()).Trim()); - var desc = RemoveHTMLTags(param.SelectNodes("./td").Last().InnerHtml.Trim()).Trim().Replace("\r\n", " ").Replace("\r", " ").Replace("\n", " "); - parameters += "/// <param name=\"" + name + "\">" + desc + "</param>\r\n"; - } - } - foreach (var argToRename in argsToRename) - { - parameters = parameters.Replace("<param name=\"" + argToRename.Key + "\"", - "<param name=\"" + argToRename.Value + "\""); - } - - var resultPara = section.SelectSingleNode("./div[@class='result-description']/p[@class='para']"); - string result = ""; - if (resultPara != null) - { - result = "/// <returns>" + RemoveHTMLTags(resultPara.InnerHtml).Trim() + "</returns>\r\n"; - } - - var availabilityDiv = section.SelectSingleNode("./div[@class='availability']/p[@class='para availability-item']"); - string availability = ""; - if (availabilityDiv != null) - { - availability = "[iOSVersion(" + Regex.Split(RemoveHTMLTags(availabilityDiv.InnerHtml).Trim(), "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - } - - var thisFinal = summary + parameters + result + obsolete + availability + declaration; - output += thisFinal; - } - } - catch - { - output += "\r\n\r\nWHAT\r\n\r\n"; - } - } - return output; - } - - public static string ParseType(string type) - { - switch (type) - { - case "Void": - return "void"; - case "NSString": - case "String": - return "string"; - case "Bool": - return "bool"; - case "Int": - case "Int32": - return "int"; - case "float": - return "float"; - default: - return type.Trim().Trim('_', '!').Trim(); - } - } - public static string GetDescOfParamWithName(string paramTable, string paramName) - { - try - { - var thing = Regex.Match(paramTable, "<em class=\"term\">.*?" + paramName.Replace("`", "") + ".*?</em>[\\s\\S]*?</div>[\\s\\S]*?</td>").Value; - var definition = Regex.Split(Regex.Split(thing, "<div class=\"definition\">[\\s\\S]*?<p class=\"para\">")[1], "</p>")[0]; - return Regex.Replace(definition, "<.*?>", "").Trim(); - } - catch - { - return "NEEDS DEFINITION"; - } - } - public static string ScrapeToCSFile(string url, string self, string inherits) - { - // try { - var output = "using ObjectiveC;\r\nusing System;\r\nusing SharpSwift.Attributes;\r\nusing Foundation;\r\n\r\n"; - output += "namespace UIKit\r\n{\r\n"; - output += "//" + url + "\r\n"; - using (var client = new HttpClient()) - { - var data = client.GetStringAsync(url).Result; - var doc = new HtmlDocument - { - OptionFixNestedTags = true - }; - doc.LoadHtml(data); - //var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='z-class-description section']/p[@class='para']").InnerHtml).Trim(); - var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='z-protocol-description section']/p[@class='para']").InnerHtml).Trim(); - //var desc = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//section[@class='intro']/p[@class='para']").InnerHtml).Trim(); - //var desc = "The UIKit framework defines data types that are used in multiple places throughout the framework."; - desc = desc.Replace("More...", "").Trim(); - output += "/// <summary>\r\n/// " + desc + "\r\n/// </summary>\r\n"; - - var availability = RemoveHTMLTags(doc.DocumentNode.SelectSingleNode("/html/body//div[@class='z-reference-info-availability half']/span").InnerHtml).Trim(); - - output += "[iOSVersion(" + Regex.Split(availability, "in iOS ")[1].Split(' ')[0].Trim('.', '0') + ")]\r\n"; - output += "public interface " + self + /*" : " + inherits +*/ "\r\n{\r\n"; - - output += ScrapeWithAgility(data).Replace("public ", "").Replace("private set; ", "");/*.Replace(" { get; private set; }", ";").Replace(" { get; set; }", ";").Replace("public ", "")*/ - } - - return output.TrimEnd().Replace("`", "").Replace(" ", " ").Replace("YEStrue", "true").Replace("NOfalse", "false").Replace("public Self Init(", "public Self(").Replace("void Init(", "Self(").Replace("Self", self).Replace("COMMAHERE123", ",").Replace("Int", "int") + "\r\n}\r\n}"; - //} - //catch { Console.WriteLine("Error parsing " + self); return ""; } - } - } -} diff --git a/StubGen/StubGen/Scrapers/Extensions.cs b/StubGen/StubGen/Scrapers/Extensions.cs new file mode 100644 index 00000000..ee1f4fc6 --- /dev/null +++ b/StubGen/StubGen/Scrapers/Extensions.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using HtmlAgilityPack; + +namespace StubGen +{ + public class Helpers + { + public static string ParseType(string type) + { + type = type.Trim().Trim('_', '!').Trim(); + var optional = type.EndsWith("?"); + type = type.Trim('?').Trim(); + + var finalType = type; + switch (type.ToLower()) + { + case "void": + finalType = "void"; + break; + case "nsstring": + case "string": + finalType = "string"; + break; + case "bool": + finalType = "bool"; + break; + case "int": + case "int32": + finalType = "int"; + break; + case "uint": + case "uint32": + finalType = "uint"; + break; + case "uint64": + finalType = "UInt64"; + break; + case "uint16": + finalType = "UInt16"; + break; + case "float": + finalType = "float"; + break; + } + + return optional ? "Optional<" + finalType + ">" : finalType; + } + } + + public static class Extensions + { + public static string RealInnerText(this HtmlNode node) + { + if (node == null) + { + return ""; + } + return Regex.Replace(node.InnerText, "<.*?>", "").Replace(">", ">").Replace("<", "<").Replace("NOfalse", "false").Replace("YEStrue", "true").Trim(); + } + + public static string[] Split(this string str, string splitAt) + { + return Regex.Split(str, Regex.Escape(splitAt)); + } + + public static string[] SplitAtFirstOccurrence(this string str, string splitAt) + { + return new[] { str.Split(splitAt)[0], str.Substring(str.IndexOf(splitAt) + 1) }; + } + + public static string[] SplitAtFirstOccurrence(this string str, char splitAt) + { + return new[] { str.Split(splitAt)[0], str.Substring(str.IndexOf(splitAt) + 1) }; + } + } +} diff --git a/StubGen/StubGen/Scrapers/ScrapedClass.cs b/StubGen/StubGen/Scrapers/ScrapedClass.cs index 210bb6c3..29875fd4 100644 --- a/StubGen/StubGen/Scrapers/ScrapedClass.cs +++ b/StubGen/StubGen/Scrapers/ScrapedClass.cs @@ -7,37 +7,12 @@ using HtmlAgilityPack; namespace StubGen { - public static class Extensions - { - public static string RealInnerText(this HtmlNode node) - { - if (node == null) - { - return ""; - } - return Regex.Replace(node.InnerText, "<.*?>", "").Replace(">", ">").Replace("<", "<").Replace("NOfalse", "false").Replace("YEStrue", "true").Trim(); - } - - public static string[] Split(this string str, string splitAt) - { - return Regex.Split(str, Regex.Escape(splitAt)); - } - - public static string[] SplitAtFirstOccurrence(this string str, string splitAt) - { - return new[] {str.Split(splitAt)[0], str.Substring(str.IndexOf(splitAt) + 1)}; - } - - public static string[] SplitAtFirstOccurrence(this string str, char splitAt) - { - return new[] { str.Split(splitAt)[0], str.Substring(str.IndexOf(splitAt) + 1) }; - } - } - public class ScrapedClass : ScrapedMember { - public static double? ParseAvailability(string text) + public static double? ParseAvailability(HtmlDocument doc) { + var text = doc.DocumentNode.SelectSingleNode("//div[@class='z-reference-info-availability half']").RealInnerText(); + if (text == null) return null; try @@ -69,12 +44,10 @@ namespace StubGen using (var client = new HttpClient()) { var data = client.GetStringAsync(url).Result; - var doc = new HtmlDocument - { - OptionFixNestedTags = true - }; + var doc = new HtmlDocument { OptionFixNestedTags = true }; doc.LoadHtml(data); - + + //Parses the inheritance tree var inheritanceTree = doc.DocumentNode.SelectNodes("//div[@class='inheritance']/ul[@class='Swift']/li/code"); if (inheritanceTree != null) { @@ -92,10 +65,24 @@ namespace StubGen Inherits = null; } + //Parses the conformance var conformsTo = doc.DocumentNode.SelectNodes("//div[@class='conforms-to']/ul/li[@class='Swift']/code"); ConformsTo = conformsTo == null ? new string[0] : conformsTo.Select(node => node.RealInnerText().Trim()); + //Parses the name + Name = doc.DocumentNode.SelectSingleNode("//h1[@class='chapter-name']").RealInnerText(); + + //Parses the namespace from the "Import Statement" section + var importStatement = + doc.DocumentNode.SelectSingleNode( + "//div[@class='z-module-import half']/code[@class='code-voice Swift']"); + if (importStatement != null) + { + Namespace = importStatement.RealInnerText().Split("import ")[1].Split(' ')[0].Trim(); + } + + //Parses the description var description = doc.DocumentNode.SelectSingleNode("//section[@class='z-class-description section']/p") .RealInnerText().Replace("More...", "").Trim(); @@ -110,33 +97,19 @@ namespace StubGen Description = desc ?? ""; } - var availability = - doc.DocumentNode.SelectSingleNode("//div[@class='z-reference-info-availability half']").RealInnerText(); - - iOSVersion = ParseAvailability(availability); + //Parses the iOSVersion + iOSVersion = ParseAvailability(doc); + //Parses the members within the class var members = doc.DocumentNode.SelectNodes("//section[@class='section task-group-section']//ul[@class='task-group-list']/li[@class='item symbol']"); - //var members = doc.DocumentNode.SelectNodes("//li[@class='item symbol']"); - //Members = members.Select(member => ScrapedMember.ScrapeMember(member)); Members = new List<ScrapedMember>(); if (members != null) { foreach (var member in members) { - var res = ScrapeMember(member); - ((List<ScrapedMember>) Members).Add(res); + Members.Add(ScrapeMember(member)); } } - - var import = - doc.DocumentNode.SelectSingleNode( - "//div[@class='z-module-import half']/code[@class='code-voice Swift']"); - if (import != null) - { - Namespace = import.RealInnerText().Split("import ")[1].Split(' ')[0].Trim(); - } - - Name = doc.DocumentNode.SelectSingleNode("//h1[@class='chapter-name']").RealInnerText(); } } } diff --git a/StubGen/StubGen/Scrapers/ScrapedEnum.cs b/StubGen/StubGen/Scrapers/ScrapedEnum.cs index 8a0f98b7..d630fbcf 100644 --- a/StubGen/StubGen/Scrapers/ScrapedEnum.cs +++ b/StubGen/StubGen/Scrapers/ScrapedEnum.cs @@ -31,17 +31,6 @@ namespace StubGen { Description = node.SelectSingleNode("./div[@class='abstract']/p").RealInnerText(); Deprecated = Description.ToLower().Contains("deprecat"); - try - { - iOSVersion = - double.Parse( - node.SelectSingleNode("./div[@class='availability']/p").RealInnerText().Split("in iOS ")[1] - .Split(' ')[0]); - } - catch - { - iOSVersion = null; - } if (Declaration.StartsWith("struct ")) { diff --git a/StubGen/StubGen/Scrapers/ScrapedMember.cs b/StubGen/StubGen/Scrapers/ScrapedMember.cs index 0d29bfa2..5e052b81 100644 --- a/StubGen/StubGen/Scrapers/ScrapedMember.cs +++ b/StubGen/StubGen/Scrapers/ScrapedMember.cs @@ -30,6 +30,10 @@ namespace StubGen Description = baseValues.Description; iOSVersion = baseValues.iOSVersion; Deprecated = baseValues.Deprecated; + Public = baseValues.Public; + Static = baseValues.Static; + RawName = baseValues.RawName; + CSharpName = baseValues.CSharpName; } public string GetTrivia() @@ -62,6 +66,13 @@ namespace StubGen if (!double.TryParse(availabilityNode, out availability)) { baseMember.iOSVersion = null; + + if (double.TryParse( + node.SelectSingleNode("./div[@class='availability']/p").RealInnerText().Split("in iOS ")[1] + .Split(' ')[0], out availability)) + { + baseMember.iOSVersion = availability; + } } else { @@ -74,6 +85,7 @@ namespace StubGen realNode.SelectSingleNode("./div[@class='declaration']/div[@class='Swift']/p[@class='para']"); baseMember.Declaration = declarationNode.RealInnerText().Trim(); + if ((baseMember.Declaration.StartsWith("struct ") && baseMember.Declaration.Contains("Option")) || (baseMember.Declaration.StartsWith("enum") && baseMember.Declaration.Contains("case"))) { return new ScrapedEnum(baseMember, realNode); diff --git a/StubGen/StubGen/Scrapers/ScrapedNotification.cs b/StubGen/StubGen/Scrapers/ScrapedNotification.cs index e4cf3af2..b00a1123 100644 --- a/StubGen/StubGen/Scrapers/ScrapedNotification.cs +++ b/StubGen/StubGen/Scrapers/ScrapedNotification.cs @@ -10,7 +10,6 @@ namespace StubGen { Description = node.SelectSingleNode("./div[@class='api-description']/p[@class='para']").RealInnerText(); Deprecated = Description.ToLower().Contains("deprecat"); - iOSVersion = double.Parse(node.SelectSingleNode("./div[@class='availability']/p").RealInnerText().Split("in iOS ")[1].Split(' ')[0]); Declaration = node.ParentNode.ParentNode.SelectSingleNode( "./div[@class='task-group-term']/code/a[@class='notification Swift']").RealInnerText(); diff --git a/StubGen/StubGen/Scrapers/ScrapedParameter.cs b/StubGen/StubGen/Scrapers/ScrapedParameter.cs index 3dc43750..905c1a1b 100644 --- a/StubGen/StubGen/Scrapers/ScrapedParameter.cs +++ b/StubGen/StubGen/Scrapers/ScrapedParameter.cs @@ -6,50 +6,6 @@ using System.Threading.Tasks; namespace StubGen { - public class Helpers - { - public static string ParseType(string type) - { - type = type.Trim().Trim('_', '!').Trim(); - var optional = type.EndsWith("?"); - type = type.Trim('?').Trim(); - - var finalType = type; - switch (type.ToLower()) - { - case "void": - finalType = "void"; - break; - case "nsstring": - case "string": - finalType = "string"; - break; - case "bool": - finalType = "bool"; - break; - case "int": - case "int32": - finalType = "int"; - break; - case "uint": - case "uint32": - finalType = "uint"; - break; - case "uint64": - finalType = "UInt64"; - break; - case "uint16": - finalType = "UInt16"; - break; - case "float": - finalType = "float"; - break; - } - - return optional ? "Optional<" + finalType + ">" : finalType; - } - } - public class ScrapedParameter { public string Description { get; set; } diff --git a/StubGen/StubGen/StubGen.csproj b/StubGen/StubGen/StubGen.csproj index 259bc06a..937d414d 100644 --- a/StubGen/StubGen/StubGen.csproj +++ b/StubGen/StubGen/StubGen.csproj @@ -65,7 +65,6 @@ <Compile Include="Scrapers\Finals\EnumFinal.cs" /> <Compile Include="Scrapers\Finals\PropertyFinal.cs" /> <Compile Include="Scrapers\ScrapedClass.cs" /> - <Compile Include="Scraper.cs" /> <Compile Include="Scrapers\ScrapedMember.cs" /> <Compile Include="Scrapers\ScrapedMethod.cs" /> <Compile Include="Scrapers\ScrapedParameter.cs" /> |