comparison sat_frontends/tools/css_color.py @ 3028:ab2696e34d29

Python 3 port: /!\ this is a huge commit /!\ starting from this commit, SàT is needs Python 3.6+ /!\ SàT maybe be instable or some feature may not work anymore, this will improve with time This patch port backend, bridge and frontends to Python 3. Roughly this has been done this way: - 2to3 tools has been applied (with python 3.7) - all references to python2 have been replaced with python3 (notably shebangs) - fixed files not handled by 2to3 (notably the shell script) - several manual fixes - fixed issues reported by Python 3 that where not handled in Python 2 - replaced "async" with "async_" when needed (it's a reserved word from Python 3.7) - replaced zope's "implements" with @implementer decorator - temporary hack to handle data pickled in database, as str or bytes may be returned, to be checked later - fixed hash comparison for password - removed some code which is not needed anymore with Python 3 - deactivated some code which needs to be checked (notably certificate validation) - tested with jp, fixed reported issues until some basic commands worked - ported Primitivus (after porting dependencies like urwid satext) - more manual fixes
author Goffi <goffi@goffi.org>
date Tue, 13 Aug 2019 19:08:41 +0200
parents 003b8b4b56a7
children 9d0df638c8b4
comparison
equal deleted inserted replaced
3027:ff5bcb12ae60 3028:ab2696e34d29
21 21
22 log = getLogger(__name__) 22 log = getLogger(__name__)
23 23
24 24
25 CSS_COLORS = { 25 CSS_COLORS = {
26 u"black": u"000000", 26 "black": "000000",
27 u"silver": u"c0c0c0", 27 "silver": "c0c0c0",
28 u"gray": u"808080", 28 "gray": "808080",
29 u"white": u"ffffff", 29 "white": "ffffff",
30 u"maroon": u"800000", 30 "maroon": "800000",
31 u"red": u"ff0000", 31 "red": "ff0000",
32 u"purple": u"800080", 32 "purple": "800080",
33 u"fuchsia": u"ff00ff", 33 "fuchsia": "ff00ff",
34 u"green": u"008000", 34 "green": "008000",
35 u"lime": u"00ff00", 35 "lime": "00ff00",
36 u"olive": u"808000", 36 "olive": "808000",
37 u"yellow": u"ffff00", 37 "yellow": "ffff00",
38 u"navy": u"000080", 38 "navy": "000080",
39 u"blue": u"0000ff", 39 "blue": "0000ff",
40 u"teal": u"008080", 40 "teal": "008080",
41 u"aqua": u"00ffff", 41 "aqua": "00ffff",
42 u"orange": u"ffa500", 42 "orange": "ffa500",
43 u"aliceblue": u"f0f8ff", 43 "aliceblue": "f0f8ff",
44 u"antiquewhite": u"faebd7", 44 "antiquewhite": "faebd7",
45 u"aquamarine": u"7fffd4", 45 "aquamarine": "7fffd4",
46 u"azure": u"f0ffff", 46 "azure": "f0ffff",
47 u"beige": u"f5f5dc", 47 "beige": "f5f5dc",
48 u"bisque": u"ffe4c4", 48 "bisque": "ffe4c4",
49 u"blanchedalmond": u"ffebcd", 49 "blanchedalmond": "ffebcd",
50 u"blueviolet": u"8a2be2", 50 "blueviolet": "8a2be2",
51 u"brown": u"a52a2a", 51 "brown": "a52a2a",
52 u"burlywood": u"deb887", 52 "burlywood": "deb887",
53 u"cadetblue": u"5f9ea0", 53 "cadetblue": "5f9ea0",
54 u"chartreuse": u"7fff00", 54 "chartreuse": "7fff00",
55 u"chocolate": u"d2691e", 55 "chocolate": "d2691e",
56 u"coral": u"ff7f50", 56 "coral": "ff7f50",
57 u"cornflowerblue": u"6495ed", 57 "cornflowerblue": "6495ed",
58 u"cornsilk": u"fff8dc", 58 "cornsilk": "fff8dc",
59 u"crimson": u"dc143c", 59 "crimson": "dc143c",
60 u"darkblue": u"00008b", 60 "darkblue": "00008b",
61 u"darkcyan": u"008b8b", 61 "darkcyan": "008b8b",
62 u"darkgoldenrod": u"b8860b", 62 "darkgoldenrod": "b8860b",
63 u"darkgray": u"a9a9a9", 63 "darkgray": "a9a9a9",
64 u"darkgreen": u"006400", 64 "darkgreen": "006400",
65 u"darkgrey": u"a9a9a9", 65 "darkgrey": "a9a9a9",
66 u"darkkhaki": u"bdb76b", 66 "darkkhaki": "bdb76b",
67 u"darkmagenta": u"8b008b", 67 "darkmagenta": "8b008b",
68 u"darkolivegreen": u"556b2f", 68 "darkolivegreen": "556b2f",
69 u"darkorange": u"ff8c00", 69 "darkorange": "ff8c00",
70 u"darkorchid": u"9932cc", 70 "darkorchid": "9932cc",
71 u"darkred": u"8b0000", 71 "darkred": "8b0000",
72 u"darksalmon": u"e9967a", 72 "darksalmon": "e9967a",
73 u"darkseagreen": u"8fbc8f", 73 "darkseagreen": "8fbc8f",
74 u"darkslateblue": u"483d8b", 74 "darkslateblue": "483d8b",
75 u"darkslategray": u"2f4f4f", 75 "darkslategray": "2f4f4f",
76 u"darkslategrey": u"2f4f4f", 76 "darkslategrey": "2f4f4f",
77 u"darkturquoise": u"00ced1", 77 "darkturquoise": "00ced1",
78 u"darkviolet": u"9400d3", 78 "darkviolet": "9400d3",
79 u"deeppink": u"ff1493", 79 "deeppink": "ff1493",
80 u"deepskyblue": u"00bfff", 80 "deepskyblue": "00bfff",
81 u"dimgray": u"696969", 81 "dimgray": "696969",
82 u"dimgrey": u"696969", 82 "dimgrey": "696969",
83 u"dodgerblue": u"1e90ff", 83 "dodgerblue": "1e90ff",
84 u"firebrick": u"b22222", 84 "firebrick": "b22222",
85 u"floralwhite": u"fffaf0", 85 "floralwhite": "fffaf0",
86 u"forestgreen": u"228b22", 86 "forestgreen": "228b22",
87 u"gainsboro": u"dcdcdc", 87 "gainsboro": "dcdcdc",
88 u"ghostwhite": u"f8f8ff", 88 "ghostwhite": "f8f8ff",
89 u"gold": u"ffd700", 89 "gold": "ffd700",
90 u"goldenrod": u"daa520", 90 "goldenrod": "daa520",
91 u"greenyellow": u"adff2f", 91 "greenyellow": "adff2f",
92 u"grey": u"808080", 92 "grey": "808080",
93 u"honeydew": u"f0fff0", 93 "honeydew": "f0fff0",
94 u"hotpink": u"ff69b4", 94 "hotpink": "ff69b4",
95 u"indianred": u"cd5c5c", 95 "indianred": "cd5c5c",
96 u"indigo": u"4b0082", 96 "indigo": "4b0082",
97 u"ivory": u"fffff0", 97 "ivory": "fffff0",
98 u"khaki": u"f0e68c", 98 "khaki": "f0e68c",
99 u"lavender": u"e6e6fa", 99 "lavender": "e6e6fa",
100 u"lavenderblush": u"fff0f5", 100 "lavenderblush": "fff0f5",
101 u"lawngreen": u"7cfc00", 101 "lawngreen": "7cfc00",
102 u"lemonchiffon": u"fffacd", 102 "lemonchiffon": "fffacd",
103 u"lightblue": u"add8e6", 103 "lightblue": "add8e6",
104 u"lightcoral": u"f08080", 104 "lightcoral": "f08080",
105 u"lightcyan": u"e0ffff", 105 "lightcyan": "e0ffff",
106 u"lightgoldenrodyellow": u"fafad2", 106 "lightgoldenrodyellow": "fafad2",
107 u"lightgray": u"d3d3d3", 107 "lightgray": "d3d3d3",
108 u"lightgreen": u"90ee90", 108 "lightgreen": "90ee90",
109 u"lightgrey": u"d3d3d3", 109 "lightgrey": "d3d3d3",
110 u"lightpink": u"ffb6c1", 110 "lightpink": "ffb6c1",
111 u"lightsalmon": u"ffa07a", 111 "lightsalmon": "ffa07a",
112 u"lightseagreen": u"20b2aa", 112 "lightseagreen": "20b2aa",
113 u"lightskyblue": u"87cefa", 113 "lightskyblue": "87cefa",
114 u"lightslategray": u"778899", 114 "lightslategray": "778899",
115 u"lightslategrey": u"778899", 115 "lightslategrey": "778899",
116 u"lightsteelblue": u"b0c4de", 116 "lightsteelblue": "b0c4de",
117 u"lightyellow": u"ffffe0", 117 "lightyellow": "ffffe0",
118 u"limegreen": u"32cd32", 118 "limegreen": "32cd32",
119 u"linen": u"faf0e6", 119 "linen": "faf0e6",
120 u"mediumaquamarine": u"66cdaa", 120 "mediumaquamarine": "66cdaa",
121 u"mediumblue": u"0000cd", 121 "mediumblue": "0000cd",
122 u"mediumorchid": u"ba55d3", 122 "mediumorchid": "ba55d3",
123 u"mediumpurple": u"9370db", 123 "mediumpurple": "9370db",
124 u"mediumseagreen": u"3cb371", 124 "mediumseagreen": "3cb371",
125 u"mediumslateblue": u"7b68ee", 125 "mediumslateblue": "7b68ee",
126 u"mediumspringgreen": u"00fa9a", 126 "mediumspringgreen": "00fa9a",
127 u"mediumturquoise": u"48d1cc", 127 "mediumturquoise": "48d1cc",
128 u"mediumvioletred": u"c71585", 128 "mediumvioletred": "c71585",
129 u"midnightblue": u"191970", 129 "midnightblue": "191970",
130 u"mintcream": u"f5fffa", 130 "mintcream": "f5fffa",
131 u"mistyrose": u"ffe4e1", 131 "mistyrose": "ffe4e1",
132 u"moccasin": u"ffe4b5", 132 "moccasin": "ffe4b5",
133 u"navajowhite": u"ffdead", 133 "navajowhite": "ffdead",
134 u"oldlace": u"fdf5e6", 134 "oldlace": "fdf5e6",
135 u"olivedrab": u"6b8e23", 135 "olivedrab": "6b8e23",
136 u"orangered": u"ff4500", 136 "orangered": "ff4500",
137 u"orchid": u"da70d6", 137 "orchid": "da70d6",
138 u"palegoldenrod": u"eee8aa", 138 "palegoldenrod": "eee8aa",
139 u"palegreen": u"98fb98", 139 "palegreen": "98fb98",
140 u"paleturquoise": u"afeeee", 140 "paleturquoise": "afeeee",
141 u"palevioletred": u"db7093", 141 "palevioletred": "db7093",
142 u"papayawhip": u"ffefd5", 142 "papayawhip": "ffefd5",
143 u"peachpuff": u"ffdab9", 143 "peachpuff": "ffdab9",
144 u"peru": u"cd853f", 144 "peru": "cd853f",
145 u"pink": u"ffc0cb", 145 "pink": "ffc0cb",
146 u"plum": u"dda0dd", 146 "plum": "dda0dd",
147 u"powderblue": u"b0e0e6", 147 "powderblue": "b0e0e6",
148 u"rosybrown": u"bc8f8f", 148 "rosybrown": "bc8f8f",
149 u"royalblue": u"4169e1", 149 "royalblue": "4169e1",
150 u"saddlebrown": u"8b4513", 150 "saddlebrown": "8b4513",
151 u"salmon": u"fa8072", 151 "salmon": "fa8072",
152 u"sandybrown": u"f4a460", 152 "sandybrown": "f4a460",
153 u"seagreen": u"2e8b57", 153 "seagreen": "2e8b57",
154 u"seashell": u"fff5ee", 154 "seashell": "fff5ee",
155 u"sienna": u"a0522d", 155 "sienna": "a0522d",
156 u"skyblue": u"87ceeb", 156 "skyblue": "87ceeb",
157 u"slateblue": u"6a5acd", 157 "slateblue": "6a5acd",
158 u"slategray": u"708090", 158 "slategray": "708090",
159 u"slategrey": u"708090", 159 "slategrey": "708090",
160 u"snow": u"fffafa", 160 "snow": "fffafa",
161 u"springgreen": u"00ff7f", 161 "springgreen": "00ff7f",
162 u"steelblue": u"4682b4", 162 "steelblue": "4682b4",
163 u"tan": u"d2b48c", 163 "tan": "d2b48c",
164 u"thistle": u"d8bfd8", 164 "thistle": "d8bfd8",
165 u"tomato": u"ff6347", 165 "tomato": "ff6347",
166 u"turquoise": u"40e0d0", 166 "turquoise": "40e0d0",
167 u"violet": u"ee82ee", 167 "violet": "ee82ee",
168 u"wheat": u"f5deb3", 168 "wheat": "f5deb3",
169 u"whitesmoke": u"f5f5f5", 169 "whitesmoke": "f5f5f5",
170 u"yellowgreen": u"9acd32", 170 "yellowgreen": "9acd32",
171 u"rebeccapurple": u"663399", 171 "rebeccapurple": "663399",
172 } 172 }
173 DEFAULT = u"000000" 173 DEFAULT = "000000"
174 174
175 175
176 def parse(raw_value, as_string=True): 176 def parse(raw_value, as_string=True):
177 """parse CSS color value and return normalised value 177 """parse CSS color value and return normalised value
178 178
184 else value is a 3 or 4 tuple of int (e.g.: (255, 0, 170, 187)). 184 else value is a 3 or 4 tuple of int (e.g.: (255, 0, 170, 187)).
185 If present, the 4th value is the alpha channel 185 If present, the 4th value is the alpha channel
186 If value can't be parsed, a warning message is logged, and DEFAULT is returned 186 If value can't be parsed, a warning message is logged, and DEFAULT is returned
187 """ 187 """
188 raw_value = raw_value.strip().lower() 188 raw_value = raw_value.strip().lower()
189 if raw_value.startswith(u"#"): 189 if raw_value.startswith("#"):
190 # we have a hexadecimal value 190 # we have a hexadecimal value
191 str_value = raw_value[1:] 191 str_value = raw_value[1:]
192 if len(raw_value) in (3, 4): 192 if len(raw_value) in (3, 4):
193 str_value = u"".join([2 * v for v in str_value]) 193 str_value = "".join([2 * v for v in str_value])
194 elif raw_value.startswith(u"rgb"): 194 elif raw_value.startswith("rgb"):
195 left_p = raw_value.find(u"(") 195 left_p = raw_value.find("(")
196 right_p = raw_value.find(u")") 196 right_p = raw_value.find(")")
197 rgb_values = [v.strip() for v in raw_value[left_p + 1 : right_p].split(",")] 197 rgb_values = [v.strip() for v in raw_value[left_p + 1 : right_p].split(",")]
198 expected_len = 4 if raw_value.startswith(u"rgba") else 3 198 expected_len = 4 if raw_value.startswith("rgba") else 3
199 if len(rgb_values) != expected_len: 199 if len(rgb_values) != expected_len:
200 log.warning(u"incorrect value: {}".format(raw_value)) 200 log.warning("incorrect value: {}".format(raw_value))
201 str_value = DEFAULT 201 str_value = DEFAULT
202 else: 202 else:
203 int_values = [] 203 int_values = []
204 for rgb_v in rgb_values: 204 for rgb_v in rgb_values:
205 p_idx = rgb_v.find(u"%") 205 p_idx = rgb_v.find("%")
206 if p_idx == -1: 206 if p_idx == -1:
207 # base 10 value 207 # base 10 value
208 try: 208 try:
209 int_v = int(rgb_v) 209 int_v = int(rgb_v)
210 if int_v > 255: 210 if int_v > 255:
211 raise ValueError(u"value exceed 255") 211 raise ValueError("value exceed 255")
212 int_values.append(int_v) 212 int_values.append(int_v)
213 except ValueError: 213 except ValueError:
214 log.warning(u"invalid int: {}".format(rgb_v)) 214 log.warning("invalid int: {}".format(rgb_v))
215 int_values.append(0) 215 int_values.append(0)
216 else: 216 else:
217 # percentage 217 # percentage
218 try: 218 try:
219 int_v = int(int(rgb_v[:p_idx]) / 100.0 * 255) 219 int_v = int(int(rgb_v[:p_idx]) / 100.0 * 255)
220 if int_v > 255: 220 if int_v > 255:
221 raise ValueError(u"value exceed 255") 221 raise ValueError("value exceed 255")
222 int_values.append(int_v) 222 int_values.append(int_v)
223 except ValueError: 223 except ValueError:
224 log.warning(u"invalid percent value: {}".format(rgb_v)) 224 log.warning("invalid percent value: {}".format(rgb_v))
225 int_values.append(0) 225 int_values.append(0)
226 str_value = u"".join([u"{:02x}".format(v) for v in int_values]) 226 str_value = "".join(["{:02x}".format(v) for v in int_values])
227 elif raw_value.startswith(u"hsl"): 227 elif raw_value.startswith("hsl"):
228 log.warning(u"hue-saturation-lightness not handled yet") # TODO 228 log.warning("hue-saturation-lightness not handled yet") # TODO
229 str_value = DEFAULT 229 str_value = DEFAULT
230 else: 230 else:
231 try: 231 try:
232 str_value = CSS_COLORS[raw_value] 232 str_value = CSS_COLORS[raw_value]
233 except KeyError: 233 except KeyError:
234 log.warning(u"unrecognised format: {}".format(raw_value)) 234 log.warning("unrecognised format: {}".format(raw_value))
235 str_value = DEFAULT 235 str_value = DEFAULT
236 236
237 if as_string: 237 if as_string:
238 return str_value 238 return str_value
239 else: 239 else:
240 return tuple( 240 return tuple(
241 [ 241 [
242 int(str_value[i] + str_value[i + 1], 16) 242 int(str_value[i] + str_value[i + 1], 16)
243 for i in xrange(0, len(str_value), 2) 243 for i in range(0, len(str_value), 2)
244 ] 244 ]
245 ) 245 )