242 lines
7.0 KiB
Python
242 lines
7.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
simplestyle.py
|
|
Two simple functions for working with inline css
|
|
and some color handling on top.
|
|
|
|
Copyright (C) 2005 Aaron Spike, aaron@ekips.org
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
"""
|
|
|
|
svgcolors={
|
|
'aliceblue':'#f0f8ff',
|
|
'antiquewhite':'#faebd7',
|
|
'aqua':'#00ffff',
|
|
'aquamarine':'#7fffd4',
|
|
'azure':'#f0ffff',
|
|
'beige':'#f5f5dc',
|
|
'bisque':'#ffe4c4',
|
|
'black':'#000000',
|
|
'blanchedalmond':'#ffebcd',
|
|
'blue':'#0000ff',
|
|
'blueviolet':'#8a2be2',
|
|
'brown':'#a52a2a',
|
|
'burlywood':'#deb887',
|
|
'cadetblue':'#5f9ea0',
|
|
'chartreuse':'#7fff00',
|
|
'chocolate':'#d2691e',
|
|
'coral':'#ff7f50',
|
|
'cornflowerblue':'#6495ed',
|
|
'cornsilk':'#fff8dc',
|
|
'crimson':'#dc143c',
|
|
'cyan':'#00ffff',
|
|
'darkblue':'#00008b',
|
|
'darkcyan':'#008b8b',
|
|
'darkgoldenrod':'#b8860b',
|
|
'darkgray':'#a9a9a9',
|
|
'darkgreen':'#006400',
|
|
'darkgrey':'#a9a9a9',
|
|
'darkkhaki':'#bdb76b',
|
|
'darkmagenta':'#8b008b',
|
|
'darkolivegreen':'#556b2f',
|
|
'darkorange':'#ff8c00',
|
|
'darkorchid':'#9932cc',
|
|
'darkred':'#8b0000',
|
|
'darksalmon':'#e9967a',
|
|
'darkseagreen':'#8fbc8f',
|
|
'darkslateblue':'#483d8b',
|
|
'darkslategray':'#2f4f4f',
|
|
'darkslategrey':'#2f4f4f',
|
|
'darkturquoise':'#00ced1',
|
|
'darkviolet':'#9400d3',
|
|
'deeppink':'#ff1493',
|
|
'deepskyblue':'#00bfff',
|
|
'dimgray':'#696969',
|
|
'dimgrey':'#696969',
|
|
'dodgerblue':'#1e90ff',
|
|
'firebrick':'#b22222',
|
|
'floralwhite':'#fffaf0',
|
|
'forestgreen':'#228b22',
|
|
'fuchsia':'#ff00ff',
|
|
'gainsboro':'#dcdcdc',
|
|
'ghostwhite':'#f8f8ff',
|
|
'gold':'#ffd700',
|
|
'goldenrod':'#daa520',
|
|
'gray':'#808080',
|
|
'grey':'#808080',
|
|
'green':'#008000',
|
|
'greenyellow':'#adff2f',
|
|
'honeydew':'#f0fff0',
|
|
'hotpink':'#ff69b4',
|
|
'indianred':'#cd5c5c',
|
|
'indigo':'#4b0082',
|
|
'ivory':'#fffff0',
|
|
'khaki':'#f0e68c',
|
|
'lavender':'#e6e6fa',
|
|
'lavenderblush':'#fff0f5',
|
|
'lawngreen':'#7cfc00',
|
|
'lemonchiffon':'#fffacd',
|
|
'lightblue':'#add8e6',
|
|
'lightcoral':'#f08080',
|
|
'lightcyan':'#e0ffff',
|
|
'lightgoldenrodyellow':'#fafad2',
|
|
'lightgray':'#d3d3d3',
|
|
'lightgreen':'#90ee90',
|
|
'lightgrey':'#d3d3d3',
|
|
'lightpink':'#ffb6c1',
|
|
'lightsalmon':'#ffa07a',
|
|
'lightseagreen':'#20b2aa',
|
|
'lightskyblue':'#87cefa',
|
|
'lightslategray':'#778899',
|
|
'lightslategrey':'#778899',
|
|
'lightsteelblue':'#b0c4de',
|
|
'lightyellow':'#ffffe0',
|
|
'lime':'#00ff00',
|
|
'limegreen':'#32cd32',
|
|
'linen':'#faf0e6',
|
|
'magenta':'#ff00ff',
|
|
'maroon':'#800000',
|
|
'mediumaquamarine':'#66cdaa',
|
|
'mediumblue':'#0000cd',
|
|
'mediumorchid':'#ba55d3',
|
|
'mediumpurple':'#9370db',
|
|
'mediumseagreen':'#3cb371',
|
|
'mediumslateblue':'#7b68ee',
|
|
'mediumspringgreen':'#00fa9a',
|
|
'mediumturquoise':'#48d1cc',
|
|
'mediumvioletred':'#c71585',
|
|
'midnightblue':'#191970',
|
|
'mintcream':'#f5fffa',
|
|
'mistyrose':'#ffe4e1',
|
|
'moccasin':'#ffe4b5',
|
|
'navajowhite':'#ffdead',
|
|
'navy':'#000080',
|
|
'oldlace':'#fdf5e6',
|
|
'olive':'#808000',
|
|
'olivedrab':'#6b8e23',
|
|
'orange':'#ffa500',
|
|
'orangered':'#ff4500',
|
|
'orchid':'#da70d6',
|
|
'palegoldenrod':'#eee8aa',
|
|
'palegreen':'#98fb98',
|
|
'paleturquoise':'#afeeee',
|
|
'palevioletred':'#db7093',
|
|
'papayawhip':'#ffefd5',
|
|
'peachpuff':'#ffdab9',
|
|
'peru':'#cd853f',
|
|
'pink':'#ffc0cb',
|
|
'plum':'#dda0dd',
|
|
'powderblue':'#b0e0e6',
|
|
'purple':'#800080',
|
|
'rebeccapurple':'#663399',
|
|
'red':'#ff0000',
|
|
'rosybrown':'#bc8f8f',
|
|
'royalblue':'#4169e1',
|
|
'saddlebrown':'#8b4513',
|
|
'salmon':'#fa8072',
|
|
'sandybrown':'#f4a460',
|
|
'seagreen':'#2e8b57',
|
|
'seashell':'#fff5ee',
|
|
'sienna':'#a0522d',
|
|
'silver':'#c0c0c0',
|
|
'skyblue':'#87ceeb',
|
|
'slateblue':'#6a5acd',
|
|
'slategray':'#708090',
|
|
'slategrey':'#708090',
|
|
'snow':'#fffafa',
|
|
'springgreen':'#00ff7f',
|
|
'steelblue':'#4682b4',
|
|
'tan':'#d2b48c',
|
|
'teal':'#008080',
|
|
'thistle':'#d8bfd8',
|
|
'tomato':'#ff6347',
|
|
'turquoise':'#40e0d0',
|
|
'violet':'#ee82ee',
|
|
'wheat':'#f5deb3',
|
|
'white':'#ffffff',
|
|
'whitesmoke':'#f5f5f5',
|
|
'yellow':'#ffff00',
|
|
'yellowgreen':'#9acd32'
|
|
}
|
|
|
|
def parseStyle(s):
|
|
"""Create a dictionary from the value of an inline style attribute"""
|
|
if s is None:
|
|
return {}
|
|
else:
|
|
return dict([[x.strip() for x in i.split(":")] for i in s.split(";") if len(i.strip())])
|
|
|
|
def formatStyle(a):
|
|
"""Format an inline style attribute from a dictionary"""
|
|
return ";".join([att+":"+str(val) for att,val in a.iteritems()])
|
|
|
|
def isColor(c):
|
|
"""Determine if its a color we can use. If not, leave it unchanged."""
|
|
if c.startswith('#') and (len(c)==4 or len(c)==7):
|
|
return True
|
|
if c.lower() in svgcolors.keys():
|
|
return True
|
|
#might be "none" or some undefined color constant or rgb()
|
|
#however, rgb() shouldnt occur at this point
|
|
return False
|
|
|
|
def parseColor(c):
|
|
"""Creates a rgb int array"""
|
|
tmp = svgcolors.get(c.lower())
|
|
if tmp is not None:
|
|
c = tmp
|
|
elif c.startswith('#') and len(c)==4:
|
|
c='#'+c[1:2]+c[1:2]+c[2:3]+c[2:3]+c[3:]+c[3:]
|
|
elif c.startswith('rgb('):
|
|
# remove the rgb(...) stuff
|
|
tmp = c.strip()[4:-1]
|
|
numbers = [number.strip() for number in tmp.split(',')]
|
|
converted_numbers = []
|
|
if len(numbers) == 3:
|
|
for num in numbers:
|
|
if num.endswith(r'%'):
|
|
converted_numbers.append(int(float(num[0:-1])*255/100))
|
|
else:
|
|
converted_numbers.append(int(num))
|
|
return tuple(converted_numbers)
|
|
else:
|
|
return (0,0,0)
|
|
try:
|
|
r=int(c[1:3],16)
|
|
g=int(c[3:5],16)
|
|
b=int(c[5:],16)
|
|
except:
|
|
# unknown color ...
|
|
# Return a default color. Maybe not the best thing to do but probably
|
|
# better than raising an exception.
|
|
return(0,0,0)
|
|
return (r,g,b)
|
|
|
|
def formatColoria(a):
|
|
"""int array to #rrggbb"""
|
|
return '#%02x%02x%02x' % (a[0],a[1],a[2])
|
|
|
|
def formatColorfa(a):
|
|
"""float array to #rrggbb"""
|
|
return '#%02x%02x%02x' % (int(round(a[0]*255)),int(round(a[1]*255)),int(round(a[2]*255)))
|
|
|
|
def formatColor3i(r,g,b):
|
|
"""3 ints to #rrggbb"""
|
|
return '#%02x%02x%02x' % (r,g,b)
|
|
|
|
def formatColor3f(r,g,b):
|
|
"""3 floats to #rrggbb"""
|
|
return '#%02x%02x%02x' % (int(round(r*255)),int(round(g*255)),int(round(b*255))) |