""" Parsing for CSS colour values. Supported formats: hex literal short: #fff hex literal long: #fafafa rgb bytes: rgb(255,100,0) rgb percent: rgb(100%,100%,0%) named color: black """ import wx import string import urlparse from pyparsing import nums, Literal, Optional, oneOf, Group, StringEnd, Combine, Word, alphas, hexnums from ..pathdata import number, sign number = number.copy() integerConstant = Word(nums+"+-").setParseAction(lambda t:int(t[0])) #rgb format parser comma = Literal(",").suppress() def clampColourByte(val): val = int(val) return min(max(0,val), 255) def clampColourPerc(val): val = float(val) return min(max(0,val), 100) def parseColorPerc(token): val = token[0] val = clampColourPerc(val) #normalize to bytes return int(255 * (val / 100.0)) colorByte = Optional(sign) + integerConstant.setParseAction(lambda t: clampColourByte(t[0])) colorPerc = number.setParseAction(parseColorPerc) + Literal("%").suppress() rgb = ( Literal("rgb(").setParseAction(lambda t: "RGB") + ( #integer constants, ie 255,255,255 Group(colorByte + comma + colorByte + comma + colorByte) ^ #percentage values, ie 100%, 50% Group(colorPerc + comma + colorPerc + comma + colorPerc) ) + Literal(")").suppress() + StringEnd() ) def parseShortHex(t): return tuple(int(x*2, 16) for x in t[0]) doubleHex = Word(hexnums, exact=2).setParseAction(lambda t: int(t[0], 16)) hexLiteral = (Literal("#").setParseAction(lambda t: "RGB") + ( Group(doubleHex + doubleHex + doubleHex) | Word(hexnums, exact=3).setParseAction(parseShortHex) ) + StringEnd() ) def parseNamedColour(t): try: return ["RGB", NamedColours[t[0].lower()]] except KeyError: return ["RGB", (0,0,0)] namedColour = Word(alphas).setParseAction(parseNamedColour) colourValue = rgb | hexLiteral | namedColour ##constants NamedColours = { #~ #html named colours #~ "black":(0,0,0), #~ "silver": (0xc0, 0xc0, 0xc0, 255), #~ "gray": (0x80, 0x80, 0x80), #~ "white":(255,255,255), #~ "maroon":(0x80, 0, 0), #~ "red":(0xff, 0, 0), #~ "purple":(0x80, 0, 0x80), #~ "fuchsia":(0xff, 0, 0xff), #~ "green": (0, 0x80, 0), #~ "lime": (0, 0xff, 0), #~ "olive": (0x80, 0x80, 00), #~ "yellow":(0xff, 0xff, 00), #~ "navy": (0, 0, 0x80), #~ "blue": (0, 0, 0xff), #~ "teal": (0, 0x80, 0x80), #~ "aqua": (0, 0xff, 0xff), #expanded named colors from SVG spc 'aliceblue' : (240, 248, 255) , 'antiquewhite' : (250, 235, 215) , 'aqua' : ( 0, 255, 255) , 'aquamarine' : (127, 255, 212) , 'azure' : (240, 255, 255) , 'beige' : (245, 245, 220) , 'bisque' : (255, 228, 196) , 'black' : ( 0, 0, 0) , 'blanchedalmond' : (255, 235, 205) , 'blue' : ( 0, 0, 255) , 'blueviolet' : (138, 43, 226) , 'brown' : (165, 42, 42) , 'burlywood' : (222, 184, 135) , 'cadetblue' : ( 95, 158, 160) , 'chartreuse' : (127, 255, 0) , 'chocolate' : (210, 105, 30) , 'coral' : (255, 127, 80) , 'cornflowerblue' : (100, 149, 237) , 'cornsilk' : (255, 248, 220) , 'crimson' : (220, 20, 60) , 'cyan' : ( 0, 255, 255) , 'darkblue' : ( 0, 0, 139) , 'darkcyan' : ( 0, 139, 139) , 'darkgoldenrod' : (184, 134, 11) , 'darkgray' : (169, 169, 169) , 'darkgreen' : ( 0, 100, 0) , 'darkgrey' : (169, 169, 169) , 'darkkhaki' : (189, 183, 107) , 'darkmagenta' : (139, 0, 139) , 'darkolivegreen' : ( 85, 107, 47) , 'darkorange' : (255, 140, 0) , 'darkorchid' : (153, 50, 204) , 'darkred' : (139, 0, 0) , 'darksalmon' : (233, 150, 122) , 'darkseagreen' : (143, 188, 143) , 'darkslateblue' : ( 72, 61, 139) , 'darkslategray' : ( 47, 79, 79) , 'darkslategrey' : ( 47, 79, 79) , 'darkturquoise' : ( 0, 206, 209) , 'darkviolet' : (148, 0, 211) , 'deeppink' : (255, 20, 147) , 'deepskyblue' : ( 0, 191, 255) , 'dimgray' : (105, 105, 105) , 'dimgrey' : (105, 105, 105) , 'dodgerblue' : ( 30, 144, 255) , 'firebrick' : (178, 34, 34) , 'floralwhite' : (255, 250, 240) , 'forestgreen' : ( 34, 139, 34) , 'fuchsia' : (255, 0, 255) , 'gainsboro' : (220, 220, 220) , 'ghostwhite' : (248, 248, 255) , 'gold' : (255, 215, 0) , 'goldenrod' : (218, 165, 32) , 'gray' : (128, 128, 128) , 'grey' : (128, 128, 128) , 'green' : ( 0, 128, 0) , 'greenyellow' : (173, 255, 47) , 'honeydew' : (240, 255, 240) , 'hotpink' : (255, 105, 180) , 'indianred' : (205, 92, 92) , 'indigo' : ( 75, 0, 130) , 'ivory' : (255, 255, 240) , 'khaki' : (240, 230, 140) , 'lavender' : (230, 230, 250) , 'lavenderblush' : (255, 240, 245) , 'lawngreen' : (124, 252, 0) , 'lemonchiffon' : (255, 250, 205) , 'lightblue' : (173, 216, 230) , 'lightcoral' : (240, 128, 128) , 'lightcyan' : (224, 255, 255) , 'lightgoldenrodyellow' : (250, 250, 210) , 'lightgray' : (211, 211, 211) , 'lightgreen' : (144, 238, 144) , 'lightgrey' : (211, 211, 211) , 'lightpink' : (255, 182, 193) , 'lightsalmon' : (255, 160, 122) , 'lightseagreen' : ( 32, 178, 170) , 'lightskyblue' : (135, 206, 250) , 'lightslategray' : (119, 136, 153) , 'lightslategrey' : (119, 136, 153) , 'lightsteelblue' : (176, 196, 222) , 'lightyellow' : (255, 255, 224) , 'lime' : ( 0, 255, 0) , 'limegreen' : ( 50, 205, 50) , 'linen' : (250, 240, 230) , 'magenta' : (255, 0, 255) , 'maroon' : (128, 0, 0) , 'mediumaquamarine' : (102, 205, 170) , 'mediumblue' : ( 0, 0, 205) , 'mediumorchid' : (186, 85, 211) , 'mediumpurple' : (147, 112, 219) , 'mediumseagreen' : ( 60, 179, 113) , 'mediumslateblue' : (123, 104, 238) , 'mediumspringgreen' : ( 0, 250, 154) , 'mediumturquoise' : ( 72, 209, 204) , 'mediumvioletred' : (199, 21, 133) , 'midnightblue' : ( 25, 25, 112) , 'mintcream' : (245, 255, 250) , 'mistyrose' : (255, 228, 225) , 'moccasin' : (255, 228, 181) , 'navajowhite' : (255, 222, 173) , 'navy' : ( 0, 0, 128) , 'oldlace' : (253, 245, 230) , 'olive' : (128, 128, 0) , 'olivedrab' : (107, 142, 35) , 'orange' : (255, 165, 0) , 'orangered' : (255, 69, 0) , 'orchid' : (218, 112, 214) , 'palegoldenrod' : (238, 232, 170) , 'palegreen' : (152, 251, 152) , 'paleturquoise' : (175, 238, 238) , 'palevioletred' : (219, 112, 147) , 'papayawhip' : (255, 239, 213) , 'peachpuff' : (255, 218, 185) , 'peru' : (205, 133, 63) , 'pink' : (255, 192, 203) , 'plum' : (221, 160, 221) , 'powderblue' : (176, 224, 230) , 'purple' : (128, 0, 128) , 'red' : (255, 0, 0) , 'rosybrown' : (188, 143, 143) , 'royalblue' : ( 65, 105, 225) , 'saddlebrown' : (139, 69, 19) , 'salmon' : (250, 128, 114) , 'sandybrown' : (244, 164, 96) , 'seagreen' : ( 46, 139, 87) , 'seashell' : (255, 245, 238) , 'sienna' : (160, 82, 45) , 'silver' : (192, 192, 192) , 'skyblue' : (135, 206, 235) , 'slateblue' : (106, 90, 205) , 'slategray' : (112, 128, 144) , 'slategrey' : (112, 128, 144) , 'snow' : (255, 250, 250) , 'springgreen' : ( 0, 255, 127) , 'steelblue' : ( 70, 130, 180) , 'tan' : (210, 180, 140) , 'teal' : ( 0, 128, 128) , 'thistle' : (216, 191, 216) , 'tomato' : (255, 99, 71) , 'turquoise' : ( 64, 224, 208) , 'violet' : (238, 130, 238) , 'wheat' : (245, 222, 179) , 'white' : (255, 255, 255) , 'whitesmoke' : (245, 245, 245) , 'yellow' : (255, 255, 0) , 'yellowgreen' : (154, 205, 50) , } def fillCSS2SystemColours(): #The system colours require a wxApp to be present to retrieve, #so if you wnat support for them you'll need #to call this function after your wxApp instance starts systemColors = { "ActiveBorder": wx.SYS_COLOUR_ACTIVEBORDER, "ActiveCaption": wx.SYS_COLOUR_ACTIVECAPTION, "AppWorkspace": wx.SYS_COLOUR_APPWORKSPACE, "Background": wx.SYS_COLOUR_BACKGROUND, "ButtonFace": wx.SYS_COLOUR_BTNFACE, "ButtonHighlight": wx.SYS_COLOUR_BTNHIGHLIGHT, "ButtonShadow": wx.SYS_COLOUR_BTNSHADOW, "ButtonText": wx.SYS_COLOUR_BTNTEXT, "CaptionText": wx.SYS_COLOUR_CAPTIONTEXT, "GrayText": wx.SYS_COLOUR_GRAYTEXT, "Highlight": wx.SYS_COLOUR_HIGHLIGHT, "HighlightText": wx.SYS_COLOUR_HIGHLIGHTTEXT, "InactiveBorder": wx.SYS_COLOUR_INACTIVEBORDER, "InactiveCaption": wx.SYS_COLOUR_INACTIVECAPTION, "InfoBackground": wx.SYS_COLOUR_INFOBK, "InfoText": wx.SYS_COLOUR_INFOTEXT, "Menu": wx.SYS_COLOUR_MENU, "MenuText": wx.SYS_COLOUR_MENUTEXT, "Scrollbar": wx.SYS_COLOUR_SCROLLBAR, "ThreeDDarkShadow": wx.SYS_COLOUR_3DDKSHADOW, "ThreeDFace": wx.SYS_COLOUR_3DFACE, "ThreeDHighlight": wx.SYS_COLOUR_3DHIGHLIGHT, "ThreeDLightShadow": wx.SYS_COLOUR_3DLIGHT, "ThreeDShadow": wx.SYS_COLOUR_3DSHADOW, "Window": wx.SYS_COLOUR_WINDOW, "WindowFrame": wx.SYS_COLOUR_WINDOWFRAME, "WindowText": wx.SYS_COLOUR_WINDOWTEXT } NamedColours.update( #strip the alpha from the system colors. Is this really what we want to do? (k.lower(), wx.SystemSettings.GetColour(v)[:3]) for (k,v) in systemColors.iteritems() )