diff --git a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Nodes/HtmlNode.cs b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Nodes/HtmlNode.cs index 5e052fa..e81ed46 100644 --- a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Nodes/HtmlNode.cs +++ b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Nodes/HtmlNode.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Xna.Framework.Graphics; +using PlanB.Html.Utility; namespace PlanB.Html.Nodes { @@ -180,7 +182,24 @@ namespace PlanB.Html.Nodes public void AddStyle(KeyValuePair style) { - KeyValuePair newStyle = new KeyValuePair(style.Key.ToLower(), style.Value); + string key = style.Key.ToLower(); + string value = style.Value; + + if (key == "color") + { + Color color = ColorHelper.FromCss(value); + + if (color.A == 0xff) + { + value = String.Format("rgb({0}, {1}, {2})", color.R, color.G, color.B); + } + else + { + value = String.Format("rgba({0}, {1}, {2}, {3})", color.R, color.G, color.B, color.A); + } + } + + KeyValuePair newStyle = new KeyValuePair(key, value); Styles.RemoveAll(i => i.Key == newStyle.Key); Styles.Add(newStyle); diff --git a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Plan B Html Parser.csproj b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Plan B Html Parser.csproj index 37b82f4..80732a8 100644 --- a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Plan B Html Parser.csproj +++ b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Plan B Html Parser.csproj @@ -103,6 +103,7 @@ + diff --git a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Properties/AssemblyInfo.cs b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Properties/AssemblyInfo.cs index 4b3dcc0..04e9295 100644 --- a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Properties/AssemblyInfo.cs +++ b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Properties/AssemblyInfo.cs @@ -8,8 +8,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("Plan B Html Parser")] [assembly: AssemblyProduct("Plan B Html Parser")] [assembly: AssemblyDescription("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] +[assembly: AssemblyCompany("Plan B Game Studios Inc.")] +[assembly: AssemblyCopyright("Copyright © Plan B Game Studios Inc. 2010")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -19,7 +19,7 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b8545a1e-c024-4eec-9d5e-a3e470e43671")] +[assembly: Guid("25b75844-05a1-4b9c-b054-a3835cbda08c")] // Version information for an assembly consists of the following four values: // @@ -28,4 +28,4 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.0.0")] diff --git a/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Utility/ColorHelper.cs b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Utility/ColorHelper.cs new file mode 100644 index 0000000..ed784b9 --- /dev/null +++ b/Plan B Html Parser (XNA 3.1)/Plan B Html Parser/Utility/ColorHelper.cs @@ -0,0 +1,614 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace PlanB.Html.Utility +{ + internal class ColorHelper + { + internal static Color FromHtml(string htmlColorString) + { + Regex htmlColorRegex = new Regex("^#(?[0-9A-Fa-f]{6})(?[0-9A-Fa-f]{2})?$"); + + Match match = htmlColorRegex.Match(htmlColorString); + + if (match.Success) + { + string strColor = match.Groups["color"].Value; + string strAlpha = match.Groups["alpha"].Value; + + int red = int.Parse(strColor.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); + int green = int.Parse(strColor.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); + int blue = int.Parse(strColor.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); + int alpha = 255; + if (!String.IsNullOrEmpty(strAlpha)) + { + alpha = int.Parse(strAlpha, System.Globalization.NumberStyles.HexNumber); + } + + Vector4 v = new Vector4(); + v.W = alpha / 255.0f; + v.X = red / 255.0f; + v.Y = green / 255.0f; + v.Z = blue / 255.0f; + + return new Color(v); + } + else + { + throw new NotImplementedException(); + } + } + + internal static Color FromCssName(string cssName) + { + cssName = cssName.ToLower(); + if (cssName == "aliceblue") + { + return FromHtml("#F0F8FF"); + } + else if (cssName == "antiquewhite") + { + return FromHtml("#FAEBD7"); + } + else if (cssName == "aqua") + { + return FromHtml("#00FFFF"); + } + else if (cssName == "aquamarine") + { + return FromHtml("#7FFFD4"); + } + else if (cssName == "azure") + { + return FromHtml("#F0FFFF"); + } + else if (cssName == "beige") + { + return FromHtml("#F5F5DC"); + } + else if (cssName == "bisque") + { + return FromHtml("#FFE4C4"); + } + else if (cssName == "black") + { + return FromHtml("#000000"); + } + else if (cssName == "blanchedalmond") + { + return FromHtml("#FFEBCD"); + } + else if (cssName == "blue") + { + return FromHtml("#0000FF"); + } + else if (cssName == "blueviolet") + { + return FromHtml("#8A2BE2"); + } + else if (cssName == "brown") + { + return FromHtml("#A52A2A"); + } + else if (cssName == "burlywood") + { + return FromHtml("#DEB887"); + } + else if (cssName == "cadetblue") + { + return FromHtml("#5F9EA0"); + } + else if (cssName == "chartreuse") + { + return FromHtml("#7FFF00"); + } + else if (cssName == "chocolate") + { + return FromHtml("#D2691E"); + } + else if (cssName == "coral") + { + return FromHtml("#FF7F50"); + } + else if (cssName == "cornflowerblue") + { + return FromHtml("#6495ED"); + } + else if (cssName == "cornsilk") + { + return FromHtml("#FFF8DC"); + } + else if (cssName == "crimson") + { + return FromHtml("#DC143C"); + } + else if (cssName == "cyan") + { + return FromHtml("#00FFFF"); + } + else if (cssName == "darkblue") + { + return FromHtml("#00008B"); + } + else if (cssName == "darkvyan") + { + return FromHtml("#008B8B"); + } + else if (cssName == "darkgoldenrod") + { + return FromHtml("#B8860B"); + } + else if (cssName == "darkgray") + { + return FromHtml("#A9A9A9"); + } + else if (cssName == "darkgreen") + { + return FromHtml("#006400"); + } + else if (cssName == "darkkhaki") + { + return FromHtml("#BDB76B"); + } + else if (cssName == "darkmagenta") + { + return FromHtml("#8B008B"); + } + else if (cssName == "darkolivegreen") + { + return FromHtml("#556B2F"); + } + else if (cssName == "darkorange") + { + return FromHtml("#FF8C00"); + } + else if (cssName == "darkorchid") + { + return FromHtml("#9932CC"); + } + else if (cssName == "darkred") + { + return FromHtml("#8B0000"); + } + else if (cssName == "darksalmon") + { + return FromHtml("#E9967A"); + } + else if (cssName == "darkseagreen") + { + return FromHtml("#8FBC8F"); + } + else if (cssName == "darkslateblue") + { + return FromHtml("#483D8B"); + } + else if (cssName == "darkslategray") + { + return FromHtml("#2F4F4F"); + } + else if (cssName == "darkturquoise") + { + return FromHtml("#00CED1"); + } + else if (cssName == "darviolet") + { + return FromHtml("#9400D3"); + } + else if (cssName == "deeppink") + { + return FromHtml("#FF1493"); + } + else if (cssName == "deepskyblue") + { + return FromHtml("#00BFFF"); + } + else if (cssName == "dimgray") + { + return FromHtml("#696969"); + } + else if (cssName == "dodgerblue") + { + return FromHtml("#1E90FF"); + } + else if (cssName == "firebrick") + { + return FromHtml("#B22222"); + } + else if (cssName == "floralwhite") + { + return FromHtml("#FFFAF0"); + } + else if (cssName == "forestgreen") + { + return FromHtml("#228B22"); + } + else if (cssName == "fuchsia") + { + return FromHtml("#FF00FF"); + } + else if (cssName == "gainsboro") + { + return FromHtml("#DCDCDC"); + } + else if (cssName == "ghostwhite") + { + return FromHtml("#F8F8FF"); + } + else if (cssName == "gold") + { + return FromHtml("#FFD700"); + } + else if (cssName == "goldenrod") + { + return FromHtml("#DAA520"); + } + else if (cssName == "gray") + { + return FromHtml("#808080"); + } + else if (cssName == "green") + { + return FromHtml("#008000"); + } + else if (cssName == "greenyellow") + { + return FromHtml("#ADFF2F"); + } + else if (cssName == "honeydew") + { + return FromHtml("#F0FFF0"); + } + else if (cssName == "hotpink") + { + return FromHtml("#FF69B4"); + } + else if (cssName == "indianred") { return FromHtml("#CD5C5C"); } + else if (cssName == "indigo") { return FromHtml("#4B0082"); } + else if (cssName == "ivory") + { + return FromHtml("#FFFFF0"); + } + else if (cssName == "khaki") + { + return FromHtml("#F0E68C"); + } + else if (cssName == "lavender") + { + return FromHtml("#E6E6FA"); + } + else if (cssName == "lavenderblush") + { + return FromHtml("#FFF0F5"); + } + else if (cssName == "lawngreen") + { + return FromHtml("#7CFC00"); + } + else if (cssName == "lemonchiffon") + { + return FromHtml("#FFFACD"); + } + else if (cssName == "lightblue") + { + return FromHtml("#ADD8E6"); + } + else if (cssName == "lightcoral") + { + return FromHtml("#F08080"); + } + else if (cssName == "lightcyan") + { + return FromHtml("#E0FFFF"); + } + else if (cssName == "lightgoldenrodyellow") + { + return FromHtml("#FAFAD2"); + } + else if (cssName == "lightgrey") + { + return FromHtml("#D3D3D3"); + } + else if (cssName == "lightgreen") + { + return FromHtml("#90EE90"); + } + else if (cssName == "lightpink") + { + return FromHtml("#FFB6C1"); + } + else if (cssName == "lightsalmon") + { + return FromHtml("#FFA07A"); + } + else if (cssName == "lightseagreen") + { + return FromHtml("#20B2AA"); + } + else if (cssName == "lightskyblue") + { + return FromHtml("#87CEFA"); + } + else if (cssName == "lightslategray") + { + return FromHtml("#778899"); + } + else if (cssName == "lightsteelblue") + { + return FromHtml("#B0C4DE"); + } + else if (cssName == "lightyellow") + { + return FromHtml("#FFFFE0"); + } + else if (cssName == "lime") + { + return FromHtml("#00FF00"); + } + else if (cssName == "limegreen") + { + return FromHtml("#32CD32"); + } + else if (cssName == "linen") + { + return FromHtml("#FAF0E6"); + } + else if (cssName == "magenta") + { + return FromHtml("#FF00FF"); + } + else if (cssName == "maroon") + { + return FromHtml("#800000"); + } + else if (cssName == "mediumaquamarine") + { + return FromHtml("#66CDAA"); + } + else if (cssName == "mediumblue") + { + return FromHtml("#0000CD"); + } + else if (cssName == "mediumorchid") + { + return FromHtml("#BA55D3"); + } + else if (cssName == "mediumpurple") + { + return FromHtml("#9370D8"); + } + else if (cssName == "mediumseagreen") + { + return FromHtml("#3CB371"); + } + else if (cssName == "mediumslateblue") + { + return FromHtml("#7B68EE"); + } + else if (cssName == "mediumspringgreen") + { + return FromHtml("#00FA9A"); + } + else if (cssName == "mediumturquoise") + { + return FromHtml("#48D1CC"); + } + else if (cssName == "mediumvioletred") + { + return FromHtml("#C71585"); + } + else if (cssName == "midnightblue") + { + return FromHtml("#191970"); + } + else if (cssName == "mintcream") + { + return FromHtml("#F5FFFA"); + } + else if (cssName == "mistyrose") + { + return FromHtml("#FFE4E1"); + } + else if (cssName == "moccasin") + { + return FromHtml("#FFE4B5"); + } + else if (cssName == "navajowhite") + { + return FromHtml("#FFDEAD"); + } + else if (cssName == "navy") + { + return FromHtml("#000080"); + } + else if (cssName == "oldlace") + { + return FromHtml("#FDF5E6"); + } + else if (cssName == "olive") + { + return FromHtml("#808000"); + } + else if (cssName == "olivedrab") + { + return FromHtml("#6B8E23"); + } + else if (cssName == "orange") + { + return FromHtml("#FFA500"); + } + else if (cssName == "orangered") + { + return FromHtml("#FF4500"); + } + else if (cssName == "orchid") + { + return FromHtml("#DA70D6"); + } + else if (cssName == "palegoldenrod") + { + return FromHtml("#EEE8AA"); + } + else if (cssName == "palegreen") + { + return FromHtml("#98FB98"); + } + else if (cssName == "paleturquoise") + { + return FromHtml("#AFEEEE"); + } + else if (cssName == "palevioletred") + { + return FromHtml("#D87093"); + } + else if (cssName == "papayawhip") + { + return FromHtml("#FFEFD5"); + } + else if (cssName == "peachpuff") + { + return FromHtml("#FFDAB9"); + } + else if (cssName == "peru") + { + return FromHtml("#CD853F"); + } + else if (cssName == "pink") + { + return FromHtml("#FFC0CB"); + } + else if (cssName == "plum") + { + return FromHtml("#DDA0DD"); + } + else if (cssName == "powderblue") + { + return FromHtml("#B0E0E6"); + } + else if (cssName == "purple") + { + return FromHtml("#800080"); + } + else if (cssName == "red") + { + return FromHtml("#FF0000"); + } + else if (cssName == "rosybrown") + { + return FromHtml("#BC8F8F"); + } + else if (cssName == "royalblue") + { + return FromHtml("#4169E1"); + } + else if (cssName == "saddlebrown") + { + return FromHtml("#8B4513"); + } + else if (cssName == "salmon") + { + return FromHtml("#FA8072"); + } + else if (cssName == "sandybrown") + { + return FromHtml("#F4A460"); + } + else if (cssName == "seagreen") + { + return FromHtml("#2E8B57"); + } + else if (cssName == "seashell") + { + return FromHtml("#FFF5EE"); + } + else if (cssName == "sienna") + { + return FromHtml("#A0522D"); + } + else if (cssName == "silver") + { + return FromHtml("#C0C0C0"); + } + else if (cssName == "skyblue") + { + return FromHtml("#87CEEB"); + } + else if (cssName == "slateblue") + { + return FromHtml("#6A5ACD"); + } + else if (cssName == "slategray") + { + return FromHtml("#708090"); + } + else if (cssName == "snow") + { + return FromHtml("#FFFAFA"); + } + else if (cssName == "springgreen") + { + return FromHtml("#00FF7F"); + } + else if (cssName == "steelblue") + { + return FromHtml("#4682B4"); + } + else if (cssName == "tan") + { + return FromHtml("#D2B48C"); + } + else if (cssName == "teal") + { + return FromHtml("#008080"); + } + else if (cssName == "thistle") + { + return FromHtml("#D8BFD8"); + } + else if (cssName == "tomato") + { + return FromHtml("#FF6347"); + } + else if (cssName == "turquoise") + { + return FromHtml("#40E0D0"); + } + else if (cssName == "violet") + { + return FromHtml("#EE82EE"); + } + else if (cssName == "wheat") + { + return FromHtml("#F5DEB3"); + } + else if (cssName == "white") + { + return FromHtml("#FFFFFF"); + } + else if (cssName == "whitesmoke") + { + return FromHtml("#F5F5F5"); + } + else if (cssName == "yellow") + { + return FromHtml("#FFFF00"); + } + else if (cssName == "yellowgreen") + { + return FromHtml("#9ACD32"); + } + + throw new NotImplementedException(); + } + + internal static Color FromCss(string cssColor) + { + //TODO: Identify the different types of colors in css ie "rgb(0, 1, 2)", "black", "#FFEE00", their rbga varieties and any others I've missed. + return FromCssName(cssColor); + } + } +} diff --git a/Plan B Html Parser (XNA 3.1)/TestProject1/ParseTests.cs b/Plan B Html Parser (XNA 3.1)/TestProject1/ParseTests.cs index d54c2be..3a6dacd 100644 --- a/Plan B Html Parser (XNA 3.1)/TestProject1/ParseTests.cs +++ b/Plan B Html Parser (XNA 3.1)/TestProject1/ParseTests.cs @@ -260,35 +260,30 @@ namespace TestProject1 public void Test_Parse_SpanWithStyle() { String htmlText = "asdf"; - String expectedResult = "asdf"; + String expectedResult = "asdf"; HtmlNode htmlNode = Parser.Parse(htmlText); Assert.IsNotNull(htmlNode, "The HtmlNode returned by the parser is null."); Assert.AreEqual(htmlNode.Children.Count, 1); - + Assert.IsInstanceOfType(htmlNode.Children[0], typeof(HtmlSpanNode)); HtmlSpanNode spanNode = htmlNode.Children[0] as HtmlSpanNode; - IEnumerable> spanStyleAttributes = spanNode.Attributes.Where(i=>i.Key == "style"); - /* - Assert.AreEqual(spanStyleAttributes.Count(), 1); + IEnumerable> spanStyleAttributes = spanNode.Attributes.Where(i => i.Key == "style"); - KeyValuePair spanStyleAttribute = spanStyleAttributes.First(); + Assert.AreEqual(spanStyleAttributes.Count(), 0); - Assert.AreEqual(spanStyleAttribute.Value, "color:black"); - /**/ - IEnumerable> spanColorStyles = spanNode.Styles.Where(i => i.Key == "color"); Assert.AreEqual(spanColorStyles.Count(), 1); KeyValuePair spanColorStyle = spanColorStyles.First(); - //Assert.AreEqual(spanColorStyle.Value, "rgb(0,0,0)"); - Assert.AreEqual(spanColorStyle.Value, "black"); + Assert.AreEqual("rgb(0, 0, 0)", spanColorStyle.Value); + //Assert.AreEqual(spanColorStyle.Value, "black"); /**/ Assert.AreEqual(expectedResult, htmlNode.InnerHtml);