summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatthewsotoudeh <matthewsot@outlook.com>2015-01-24 11:55:40 -0800
committermatthewsotoudeh <matthewsot@outlook.com>2015-01-24 11:55:40 -0800
commit404e9c0949affe4cb601823aff969f0886f16dc3 (patch)
treeede8188d7ef451bba8804b1a7c8d6a3b1b5b346b
parentc79b072f56dfffb9d5e7c9ae4bd357e59cac5b61 (diff)
trying to fix the stubgen
-rw-r--r--StubGen/StubGen/Program.cs2
-rw-r--r--StubGen/StubGen/ScrapeFramework.cs3
-rw-r--r--StubGen/StubGen/Scraper.cs508
-rw-r--r--StubGen/StubGen/Scrapers/Extensions.cs81
-rw-r--r--StubGen/StubGen/Scrapers/ScrapedClass.cs75
-rw-r--r--StubGen/StubGen/Scrapers/ScrapedEnum.cs11
-rw-r--r--StubGen/StubGen/Scrapers/ScrapedMember.cs12
-rw-r--r--StubGen/StubGen/Scrapers/ScrapedNotification.cs1
-rw-r--r--StubGen/StubGen/Scrapers/ScrapedParameter.cs44
-rw-r--r--StubGen/StubGen/StubGen.csproj1
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("&gt;", ">").Replace("&lt;", "<").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("&gt;", ">").Replace("&lt;", "<").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("&gt;", ">").Replace("&lt;", "<").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" />
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback