1#!/usr/bin/env python
2
3from plasTeX import Command, Environment
4
5def ProcessOptions(options, document):
6    colors = {}
7    document.userdata.setPath('packages/color/colors', colors)
8    colors['red'] = latex2htmlcolor('1,0,0')
9    colors['green'] = latex2htmlcolor('0,1,0')
10    colors['blue'] = latex2htmlcolor('0,0,1')
11
12    colors['cyan'] = latex2htmlcolor('0,1,1')
13    colors['magenta'] = latex2htmlcolor('1,0,1')
14    colors['yellow'] = latex2htmlcolor('1,1,0')
15
16    colors['white'] = latex2htmlcolor('1')
17    colors['black'] = latex2htmlcolor('0')
18    colors['gray'] = latex2htmlcolor('0.9')
19
20    colors['darkred'] = latex2htmlcolor('0.8,0,0')
21    colors['middlered'] = latex2htmlcolor('0.9,0,0')
22    colors['lightred'] = latex2htmlcolor('1,0,0')
23
24    colors['darkgreen'] = latex2htmlcolor('0,0.6,0')
25    colors['middlegreen'] = latex2htmlcolor('0,0.8,0')
26    colors['lightgreen'] = latex2htmlcolor('0,1,0')
27
28    colors['darkblue'] = latex2htmlcolor('0,0,0.8')
29    colors['middleblue'] = latex2htmlcolor('0,0,0.9')
30    colors['lightblue'] = latex2htmlcolor('0,0,1')
31
32    colors['darkcyan'] = latex2htmlcolor('0.6,0.8,0.8')
33    colors['middlecyan'] = latex2htmlcolor('0,0.8,0.8')
34
35    colors['darkmagenta'] = latex2htmlcolor('0.8,0.6,0.8')
36    colors['middlemagenta'] = latex2htmlcolor('1,0,0.6')
37
38    colors['darkyellow'] = latex2htmlcolor('0.8,0.8,0.6')
39    colors['middleyellow'] = latex2htmlcolor('1,1,0.2')
40
41    colors['darkgray'] = latex2htmlcolor('0.5')
42    colors['middlegray'] = latex2htmlcolor('0.7')
43    colors['lightgray'] = latex2htmlcolor('0.9')
44
45def latex2htmlcolor(arg, model='rgb', named=None):
46    named = named or {}
47    if model == 'named':
48        return named.get(arg, '')
49    if ',' in arg:
50        parts = [float(x) for x in arg.split(',')]
51        # rgb
52        if len(parts) == 3:
53            red, green, blue = parts
54            red = min(int(red * 255), 255)
55            green = min(int(green * 255), 255)
56            blue = min(int(blue * 255), 255)
57        # cmyk
58        elif len(parts) == 4:
59            c, m, y, k = parts
60            red, green, blue = [int(255*x) for x in [1-c*(1-k)-k, 1-m*(1-k)-k, 1-y*(1-k)-k]]
61        else:
62            return arg.strip()
63    else:
64        try:
65            red = green = blue = float(arg)
66        except ValueError:
67            try:
68                return named[arg]
69            except KeyError:
70                return arg.strip()
71    return '#%.2X%.2X%.2X' % (red, green, blue)
72
73class definecolor(Command):
74    args = 'name:str model:str color:str'
75    def invoke(self, tex):
76        a = self.parse(tex)
77        u = self.ownerDocument.userdata
78        colors = u.getPath('packages/color/colors')
79        colors[a['name']] = latex2htmlcolor(a['color'], a['model'], colors)
80
81class textcolor(Command):
82    args = '[ model:str ] color:str self'
83    def invoke(self, tex):
84        a = self.parse(tex)
85        self.style['color'] = latex2htmlcolor(a['color'], a['model'],
86                  self.ownerDocument.userdata.getPath('packages/color/colors'))
87
88class color(Environment):
89    args = '[ model:str ] color:str'
90    def invoke(self, tex):
91        a = self.parse(tex)
92        self.style['color'] = latex2htmlcolor(a['color'], a['model'],
93                  self.ownerDocument.userdata.getPath('packages/color/colors'))
94
95class pagecolor(Command):
96    args = '[ model:str ] color:str'
97
98class colorbox(Command):
99    args = '[ model:str ] color:str self'
100    def invoke(self, tex):
101        a = self.parse(tex)
102        self.style['background-color'] = latex2htmlcolor(a['color'],
103     a['model'], self.ownerDocument.userdata.getPath('packages/color/colors'))
104
105class fcolorbox(Command):
106    args = '[ model:str ] bordercolor:str color:str self'
107    def invoke(self, tex):
108        a = self.parse(tex)
109        self.style['background-color'] = latex2htmlcolor(a['color'],
110     a['model'], self.ownerDocument.userdata.getPath('packages/color/colors'))
111        self.style['border'] = '1px solid %s' % latex2htmlcolor(
112                                          a['bordercolor'], a['model'],
113           self.ownerDocument.userdata.getPath('packages/color/colors'))
114
115class normalcolor(Command):
116    pass
117