#!/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, '' % 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;" ))