Newer
Older
ClosedXML / ClosedXML / NetStandard / XLColorTranslator.cs
@Francois Botha Francois Botha on 6 Sep 2017 10 KB Add support for .NET 3.5
#if _NETSTANDARD_

using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;

namespace ClosedXML.NetStandard
{
    public class XLColorTranslator
    {
        private static IDictionary<string, Color> NAMED_COLOR_MAP = new Dictionary<string, Color>{
            //X11 Color Names (W3C color names)
            //Red color names
            {"indianred", Color.FromArgb(205, 92, 92)},
            {"lightcoral",Color.FromArgb(240, 128, 128)},
            {"salmon",Color.FromArgb(250, 128, 114)},
            {"darksalmon",Color.FromArgb(233, 150, 122)},
            {"crimson",Color.FromArgb(220, 20, 60)},
            {"red",Color.FromArgb(255, 0, 0)},
            {"firebrick",Color.FromArgb(178, 34, 34)},
            {"darkred",Color.FromArgb(139, 0, 0)},
            //Pink color names
            {"pink",Color.FromArgb(255, 192, 203)},
            {"lightpink",Color.FromArgb(255, 182, 193)},
            {"hotpink",Color.FromArgb(255, 105, 180)},
            {"deeppink",Color.FromArgb(255, 20, 147)},
            {"mediumvioletred",Color.FromArgb(199, 21, 133)},
            {"palevioletred",Color.FromArgb(219, 112, 147)},
            //Orange color names
            {"lightsalmon",Color.FromArgb(255, 160, 122)},
            {"coral",Color.FromArgb(255, 127, 80)},
            {"tomato",Color.FromArgb(255, 99, 71)},
            {"orangered",Color.FromArgb(255, 69, 0)},
            {"darkorange",Color.FromArgb(255, 140, 0)},
            {"orange",Color.FromArgb(255, 165, 0)},
            //Yellow color names
            {"gold",Color.FromArgb(255, 215, 0)},
            {"yellow",Color.FromArgb(255, 255, 0)},
            {"lightyellow",Color.FromArgb(255, 255, 224)},
            {"lemonchiffon",Color.FromArgb(255, 250, 205)},
            {"lightgoldenrodyellow",Color.FromArgb(250, 250, 210)},
            {"papayawhip",Color.FromArgb(255, 239, 213)},
            {"moccasin",Color.FromArgb(255, 228, 181)},
            {"peachpuff",Color.FromArgb(255, 218, 185)},
            {"palegoldenrod",Color.FromArgb(238, 232, 170)},
            {"khaki",Color.FromArgb(240, 230, 140)},
            {"darkkhaki",Color.FromArgb(189, 183, 107)},
            //Purple color names
            {"lavender",Color.FromArgb(230, 230, 250)},
            {"thistle",Color.FromArgb(216, 191, 216)},
            {"plum",Color.FromArgb(221, 160, 221)},
            {"violet",Color.FromArgb(238, 130, 238)},
            {"orchid",Color.FromArgb(218, 112, 214)},
            {"fuchsia",Color.FromArgb(255, 0, 255)},
            {"magenta",Color.FromArgb(255, 0, 255)},
            {"mediumorchid",Color.FromArgb(186, 85, 211)},
            {"mediumpurple",Color.FromArgb(147, 112, 219)},
            {"blueviolet",Color.FromArgb(138, 43, 226)},
            {"darkviolet",Color.FromArgb(148, 0, 211)},
            {"darkorchid",Color.FromArgb(153, 50, 204)},
            {"darkmagenta",Color.FromArgb(139, 0, 139)},
            {"purple",Color.FromArgb(128, 0, 128)},
            {"indigo",Color.FromArgb(75, 0, 130)},
            {"slateblue",Color.FromArgb(106, 90, 205)},
            {"darkslateblue",Color.FromArgb(72, 61, 139)},
            //Green color names
            {"greenyellow",Color.FromArgb(173, 255, 47)},
            {"chartreuse",Color.FromArgb(127, 255, 0)},
            {"lawngreen",Color.FromArgb(124, 252, 0)},
            {"lime",Color.FromArgb(0, 255, 0)},
            {"limegreen",Color.FromArgb(50, 205, 50)},
            {"palegreen",Color.FromArgb(152, 251, 152)},
            {"lightgreen",Color.FromArgb(144, 238, 144)},
            {"mediumspringgreen",Color.FromArgb(0, 250, 154)},
            {"springgreen",Color.FromArgb(0, 255, 127)},
            {"mediumseagreen",Color.FromArgb(60, 179, 113)},
            {"seagreen",Color.FromArgb(46, 139, 87)},
            {"forestgreen",Color.FromArgb(34, 139, 34)},
            {"green",Color.FromArgb(0, 128, 0)},
            {"darkgreen",Color.FromArgb(0, 100, 0)},
            {"yellowgreen",Color.FromArgb(154, 205, 50)},
            {"olivedrab",Color.FromArgb(107, 142, 35)},
            {"olive",Color.FromArgb(128, 128, 0)},
            {"darkolivegreen",Color.FromArgb(85, 107, 47)},
            {"mediumaquamarine",Color.FromArgb(102, 205, 170)},
            {"darkseagreen",Color.FromArgb(143, 188, 143)},
            {"lightseagreen",Color.FromArgb(32, 178, 170)},
            {"darkcyan",Color.FromArgb(0, 139, 139)},
            {"teal",Color.FromArgb(0, 128, 128)},
            //Blue color names
            {"aqua",Color.FromArgb(0, 255, 255)},
            {"cyan",Color.FromArgb(0, 255, 255)},
            {"lightcyan",Color.FromArgb(224, 255, 255)},
            {"paleturquoise",Color.FromArgb(175, 238, 238)},
            {"aquamarine",Color.FromArgb(127, 255, 212)},
            {"turquoise",Color.FromArgb(64, 224, 208)},
            {"mediumturquoise",Color.FromArgb(72, 209, 204)},
            {"darkturquoise",Color.FromArgb(0, 206, 209)},
            {"cadetblue",Color.FromArgb(95, 158, 160)},
            {"steelblue",Color.FromArgb(70, 130, 180)},
            {"lightsteelblue",Color.FromArgb(176, 196, 222)},
            {"powderblue",Color.FromArgb(176, 224, 230)},
            {"lightblue",Color.FromArgb(173, 216, 230)},
            {"skyblue",Color.FromArgb(135, 206, 235)},
            {"lightskyblue",Color.FromArgb(135, 206, 250)},
            {"deepskyblue",Color.FromArgb(0, 191, 255)},
            {"dodgerblue",Color.FromArgb(30, 144, 255)},
            {"cornflowerblue",Color.FromArgb(100, 149, 237)},
            {"mediumslateblue",Color.FromArgb(123, 104, 238)},
            {"royalblue",Color.FromArgb(65, 105, 225)},
            {"blue",Color.FromArgb(0, 0, 255)},
            {"mediumblue",Color.FromArgb(0, 0, 205)},
            {"darkblue",Color.FromArgb(0, 0, 139)},
            {"navy",Color.FromArgb(0, 0, 128)},
            {"midnightblue",Color.FromArgb(25, 25, 112)},
            //Brown color names
            {"cornsilk",Color.FromArgb(255, 248, 220)},
            {"blanchedalmond",Color.FromArgb(255, 235, 205)},
            {"bisque",Color.FromArgb(255, 228, 196)},
            {"navajowhite",Color.FromArgb(255, 222, 173)},
            {"wheat",Color.FromArgb(245, 222, 179)},
            {"burlywood",Color.FromArgb(222, 184, 135)},
            {"tan",Color.FromArgb(210, 180, 140)},
            {"rosybrown",Color.FromArgb(188, 143, 143)},
            {"sandybrown",Color.FromArgb(244, 164, 96)},
            {"goldenrod",Color.FromArgb(218, 165, 32)},
            {"darkgoldenrod",Color.FromArgb(184, 134, 11)},
            {"peru",Color.FromArgb(205, 133, 63)},
            {"chocolate",Color.FromArgb(210, 105, 30)},
            {"saddlebrown",Color.FromArgb(139, 69, 19)},
            {"sienna",Color.FromArgb(160, 82, 45)},
            {"brown",Color.FromArgb(165, 42, 42)},
            {"maroon",Color.FromArgb(128, 0, 0)},
            //White color names
            {"white",Color.FromArgb(255, 255, 255)},
            {"snow",Color.FromArgb(255, 250, 250)},
            {"honeydew",Color.FromArgb(240, 255, 240)},
            {"mintcream",Color.FromArgb(245, 255, 250)},
            {"azure",Color.FromArgb(240, 255, 255)},
            {"aliceblue",Color.FromArgb(240, 248, 255)},
            {"ghostwhite",Color.FromArgb(248, 248, 255)},
            {"whitesmoke",Color.FromArgb(245, 245, 245)},
            {"seashell",Color.FromArgb(255, 245, 238)},
            {"beige",Color.FromArgb(245, 245, 220)},
            {"oldlace",Color.FromArgb(253, 245, 230)},
            {"floralwhite",Color.FromArgb(255, 250, 240)},
            {"ivory",Color.FromArgb(255, 255, 240)},
            {"antiquewhite",Color.FromArgb(250, 235, 215)},
            {"linen",Color.FromArgb(250, 240, 230)},
            {"lavenderblush",Color.FromArgb(255, 240, 245)},
            {"mistyrose",Color.FromArgb(255, 228, 225)},
            //Grey color names
            {"gainsboro",Color.FromArgb(220, 220, 220)},
            {"lightgrey",Color.FromArgb(211, 211, 211)},
            {"silver",Color.FromArgb(192, 192, 192)},
            {"darkgray",Color.FromArgb(169, 169, 169)},
            {"gray",Color.FromArgb(128, 128, 128)},
            {"dimgray",Color.FromArgb(105, 105, 105)},
            {"lightslategray",Color.FromArgb(119, 136, 153)},
            {"slategray",Color.FromArgb(112, 128, 144)},
            {"darkslategray",Color.FromArgb(47, 79, 79)},
            {"black",Color.FromArgb(0, 0, 0)},
        };

        private static Regex HexParser = new Regex("^#([0-9a-f]{2})?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$");
        private static Regex ShortHexParser = new Regex("^#([0-9a-f]{1})?([0-9a-f]{1})([0-9a-f]{1})([0-9a-f]{1})$");

        public static Color FromKnownColor(KnownColor knownColor)
        {
            var s = knownColor.ToString().ToLowerInvariant();
            return XLColorTranslator.FromHtml(s);
        }

        public static Color FromHtml(string htmlColor)
        {
            string id = htmlColor.Trim().ToLowerInvariant();
            if (NAMED_COLOR_MAP.ContainsKey(id))
            {
                return NAMED_COLOR_MAP[id];
            }
            else
            {
                var m = HexParser.Match(id);
                if (m.Value == String.Empty)
                {
                    m = ShortHexParser.Match(id);
                    if (m.Value == String.Empty)
                    {
                        throw new ArgumentException("Invalid HTML color: " + htmlColor);
                    }
                }
                if (XLHelper.IsNullOrWhiteSpace(m.Groups[1].Value))
                    return Color.FromArgb(
                        Convert.ToInt32(m.Groups[2].Value.PadRight(2, m.Groups[2].Value[0]), 16),
                        Convert.ToInt32(m.Groups[3].Value.PadRight(2, m.Groups[3].Value[0]), 16),
                        Convert.ToInt32(m.Groups[4].Value.PadRight(2, m.Groups[4].Value[0]), 16));
                else
                    return Color.FromArgb(
                        Convert.ToInt32(m.Groups[1].Value.PadRight(2, m.Groups[1].Value[0]), 16),
                        Convert.ToInt32(m.Groups[2].Value.PadRight(2, m.Groups[2].Value[0]), 16),
                        Convert.ToInt32(m.Groups[3].Value.PadRight(2, m.Groups[3].Value[0]), 16),
                        Convert.ToInt32(m.Groups[4].Value.PadRight(2, m.Groups[4].Value[0]), 16));
            }
        }
    }
}

#endif