#!/usr/bin/env python
import sys
# --------------------------------------------------------------------- HTML
_rename = {'pad': 'cellpadding', 'space': 'cellspacing', 'c': 'class'}.get
def _attrs(d):
return ''.join([ ' %s="%s"' % (_rename(k, k).replace('_', ''), d[k])
for k in d if d[k] is not None])
def _maketag(name, br=''):
return lambda *stuff, **attrs: [
'<%s%s%s>' % (name, _attrs(attrs), br), stuff, '%s>' % name, br]
def curry(tag, **defaults):
def result(*stuff, **attrs):
dict = defaults.copy()
dict.update(attrs)
return tag(*stuff, **dict)
return result
g = globals()
for t in 'a span th td li strong label textarea'.split(): g[t] = _maketag(t)
for t in 'h1 h2 h3 div form table tr ul ol'.split(): g[t] = _maketag(t, '\n')
table = curry(table, pad=0, space=0)
tablew = curry(table, width='100%')
tdr = curry(td, align='right')
trt = curry(tr, valign='top')
p, hr, br, nbsp = '\n
', '
\n', '
\n', ' '
def input(**attrs): return '' % (_attrs(attrs))
def img(src, **attrs): return '
' % (src, _attrs(attrs))
def esc(text): return text.replace('&', '&').replace('<', '<')
def link(url, *contents, **attrs): return a(contents, href=url, **attrs)
def flatten(stuff):
if type(stuff) in (list, tuple):
return ''.join(map(flatten, stuff))
return str(stuff)
def write(*stuff):
sys.stdout.write(flatten(stuff))
sys.stdout.flush()
# ----------------------------------------------------------------- the rest
black = '#000000'
white = '#ffffff'
def whiten(cv):
return 255 - int((255 - cv)*0.7)
r = [224, 0, 40]
b = [0, 80, 255]
reds = []
blues = []
for i in range(6):
reds.append('#%02x%02x%02x' % tuple(r))
blues.append('#%02x%02x%02x' % tuple(b))
r = map(whiten, r)
b = map(whiten, b)
dem = blues[0]
demb = blues[1]
rep = reds[0]
repb = reds[1]
tdl = curry(td, align='left')
tdr = curry(td, align='right')
tdc = curry(td, align='center')
thc = curry(th, align='center')
ff = 'font-family: lucida grande, lucida sans, helvetica, arial, sans-serif; font-size: %dpx; line-height: 100%%; '
xpos = 0.0
def xmove(width):
global xpos
oldx = int(xpos)
xpos += width
return int(xpos) - oldx
original_tr = tr
def tr(*args, **kw):
global xpos
xpos = 0.0
return original_tr(*args, **kw)
def bar(size, text='', bg=white, fg=white, bl=None, br=None, pad=5, hd=0):
width = xmove(size/700.0)
if br:
width -= 1
if bl:
width -= 1
style = "width: %dpx; color: %s; background: %s;" % (width, fg, bg)
if br:
style += " border-right: 1px solid %s;" % br
if bl:
style += " border-left: 1px solid %s;" % bl
style += " padding: %dpx 0; text-align: center;" % pad
style += ff % 9
tag = hd and thc or tdc
return tag(text, style=style)
def tbar(size, text='', bg=white, fg=white, pad=5):
return table(tr(bar(size, text, bg, fg, pad)))
xmid = 225000
write('Content-Type: text/html\n\n')
write(p)
def yearhead(year):
return td(table(tr(bar(xmid - 10000, pad=0),
bar(10000*2, year, fg=black, pad=0, hd=1))),
colspan=2, style='padding: 5px 0 1px 0;')
uncontested = tdl(nbsp*2, 'uncontested (George W. Bush)',
style='padding: 5px 0; ' + ff % 9)
write(table(
tr(th('Iowa Caucus Turnout, 2000–2008',
colspan=2, style='padding: 0; text-align: left; ' + ff % 12)),
tr(yearhead(2000)),
tr(tdr(table(tr(bar(xmid - 60000), bar(60000, '60 760', dem)))),
tdl(tbar(87666, '87 666', rep))
),
tr(yearhead(2004)),
tr(tdr(table(tr(bar(xmid - 124000), bar(124000, '124 000', dem)))),
uncontested,
),
tr(yearhead(2008)),
tr(tdr(table(tr(bar(xmid - 221000), bar(221000, '221 000', dem)))),
tdl(tbar(116114, '116 114', rep)),
),
style="border: 1px solid #aaa; padding: 10px;"
))
write(p)
write(table(
tr(th('Iowa Caucus Vote Distribution, 2000–2008',
colspan=2, style='padding: 0; text-align: left; ' + ff % 12)),
tr(yearhead(2000)),
tr(tdr(table(tr(bar(xmid - 60000),
bar((1-0.6344-0.3492)*60000, bg=dem),
bar(0.3492*60000, 'Bradl', dem, bl=demb),
bar(0.6344*60000, 'Gore', dem, bl=demb),
))),
tdl(table(tr(
bar(0.4099*87666, 'Bush', rep, br=repb),
bar(0.3050*87666, 'Forbes', rep, br=repb),
bar(0.1424*87666, 'Ke', rep, br=repb),
bar(0.0853*87666, 'B', rep, br=repb),
bar((1-0.4099-0.3050-0.1424-0.0853)*87666, bg=rep),
)))
),
tr(yearhead(2004)),
tr(tdr(table(tr(bar(xmid - 124000),
bar((1-0.376-0.318-0.180-0.106)*124000, bg=dem),
bar(0.106*124000, 'Ge', dem, bl=demb),
bar(0.180*124000, 'Dean', dem, bl=demb),
bar(0.318*124000, 'Edwards', dem, bl=demb),
bar(0.376*124000, 'Kerry', dem, bl=demb),
))),
uncontested,
),
tr(yearhead(2008)),
tr(tdr(table(tr(bar(xmid - 221000),
bar((1-0.376-0.297-0.295)*221000, bg=dem),
bar(0.295*221000, 'Clinton', dem, bl=demb),
bar(0.297*221000, 'Edwards', dem, bl=demb),
bar(0.376*221000, 'Obama', dem, bl=demb),
))),
tdl(table(tr(
bar(39814, 'Huckabee', rep, br=repb),
bar(29405, 'Romney', rep, br=repb),
bar(15521, 'Tho', rep, br=repb),
bar(15248, 'Mc', rep, br=repb),
bar(11598, 'Pa', rep, br=repb),
bar(116114-(39814+29405+15521+15248+11598), bg=rep),
)))
),
style="border: 1px solid #aaa; padding: 10px;"
))