shoefiti

Hex Artifact Content
Login

Artifact f3fdec05c48bfa51a72fc1834edcb8611babaf02365d4be61ba99c7bcdeb62dd:


0000: 72 65 71 75 69 72 65 20 27 72 75 62 79 67 65 6d  require 'rubygem
0010: 73 27 0a 72 65 71 75 69 72 65 20 27 64 61 74 65  s'.require 'date
0020: 27 0a 72 65 71 75 69 72 65 20 27 6a 73 6f 6e 27  '.require 'json'
0030: 0a 0a 53 68 6f 65 73 2e 61 70 70 20 3a 74 69 74  ..Shoes.app :tit
0040: 6c 65 20 3d 3e 20 22 53 68 6f 65 66 69 74 69 20  le => "Shoefiti 
0050: 2d 20 4c 69 62 72 65 6c 69 73 74 20 42 72 6f 77  - Librelist Brow
0060: 73 65 72 22 2c 20 3a 68 65 69 67 68 74 20 3d 3e  ser", :height =>
0070: 20 37 30 30 2c 20 3a 73 63 72 6f 6c 6c 20 3d 3e   700, :scroll =>
0080: 20 66 61 6c 73 65 20 64 6f 0a 0a 09 63 6c 61 73   false do...clas
0090: 73 20 45 6d 61 69 6c 20 0a 09 09 23 57 68 61 74  s Email ...#What
00a0: 20 61 62 6f 75 74 20 77 68 61 74 20 63 6c 61 73   about what clas
00b0: 73 20 72 65 74 61 69 6e 73 20 69 6e 20 6d 65 6d  s retains in mem
00c0: 6f 72 79 3f 20 44 6f 20 49 20 6e 65 65 64 20 74  ory? Do I need t
00d0: 6f 20 66 6c 75 73 68 20 74 68 65 20 63 6c 61 73  o flush the clas
00e0: 73 3f 20 49 73 20 74 68 61 74 20 65 76 65 6e 20  s? Is that even 
00f0: 70 6f 73 73 69 62 6c 65 3f 0a 09 09 23 50 65 72  possible?...#Per
0100: 68 61 70 73 20 6e 65 65 64 20 74 6f 20 68 61 6e  haps need to han
0110: 64 20 6c 69 73 74 2c 20 6d 6f 6e 74 68 2c 20 64  d list, month, d
0120: 61 79 2c 20 79 65 61 72 20 61 74 74 72 69 62 75  ay, year attribu
0130: 74 65 73 20 74 6f 20 64 72 61 77 5f 61 6c 6c 2e  tes to draw_all.
0140: 20 0a 09 09 23 50 65 72 68 61 70 73 20 75 73 69   ...#Perhaps usi
0150: 6e 67 20 61 20 63 6c 61 73 73 20 69 73 20 6e 6f  ng a class is no
0160: 74 20 74 68 65 20 62 65 73 74 20 77 61 79 2e 2e  t the best way..
0170: 2e 20 55 73 65 20 68 61 73 68 20 6f 72 20 61 72  . Use hash or ar
0180: 72 61 79 2e 0a 0a 09 09 61 74 74 72 5f 61 63 63  ray.....attr_acc
0190: 65 73 73 6f 72 20 3a 64 61 74 65 2c 20 3a 66 72  essor :date, :fr
01a0: 6f 6d 2c 20 3a 73 75 62 6a 65 63 74 2c 20 3a 62  om, :subject, :b
01b0: 6f 64 79 0a 0a 09 09 64 65 66 20 69 6e 69 74 69  ody....def initi
01c0: 61 6c 69 7a 65 28 64 61 74 65 2c 20 66 72 6f 6d  alize(date, from
01d0: 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64 79 29  , subject, body)
01e0: 0a 09 09 09 40 64 61 74 65 20 3d 20 64 61 74 65  ....@date = date
01f0: 0a 09 09 09 40 66 72 6f 6d 20 3d 20 66 72 6f 6d  ....@from = from
0200: 0a 09 09 09 40 73 75 62 6a 65 63 74 20 3d 20 73  ....@subject = s
0210: 75 62 6a 65 63 74 0a 09 09 09 40 62 6f 64 79 20  ubject....@body 
0220: 3d 20 62 6f 64 79 0a 09 09 09 23 40 74 68 72 65  = body....#@thre
0230: 61 64 20 3d 20 73 75 62 6a 65 63 74 2e 73 74 72  ad = subject.str
0240: 69 70 20 6f 66 20 52 45 2c 20 46 57 2c 20 65 74  ip of RE, FW, et
0250: 63 2e 20 0a 09 09 09 23 57 61 6e 74 20 74 6f 20  c. ....#Want to 
0260: 73 65 74 20 74 68 72 65 61 64 2e 20 42 61 73 65  set thread. Base
0270: 64 20 6f 6e 20 73 75 62 6a 65 63 74 3f 0a 09 09  d on subject?...
0280: 65 6e 64 0a 0a 3d 62 65 67 69 6e 0a 09 09 64 65  end..=begin...de
0290: 66 20 73 65 6c 66 2e 73 6f 72 74 5f 62 79 5f 74  f self.sort_by_t
02a0: 68 72 65 61 64 28 74 68 72 65 61 64 29 20 3f 3f  hread(thread) ??
02b0: 3f 0a 09 09 09 23 21 0a 09 09 09 4f 62 6a 65 63  ?....#!....Objec
02c0: 74 53 70 61 63 65 2e 65 61 63 68 5f 6f 62 6a 65  tSpace.each_obje
02d0: 63 74 28 45 6d 61 69 6c 29 20 64 6f 20 7c 65 7c  ct(Email) do |e|
02e0: 0a 09 09 09 09 65 2e 74 68 72 65 61 64 20 3d 3d  .....e.thread ==
02f0: 20 0a 0a 09 09 65 6e 64 0a 3d 65 6e 64 0a 09 09   ....end.=end...
0300: 0a 09 09 64 65 66 20 73 65 6c 66 2e 64 72 61 77  ...def self.draw
0310: 5f 61 6c 6c 0a 09 09 09 4f 62 6a 65 63 74 53 70  _all....ObjectSp
0320: 61 63 65 2e 65 61 63 68 5f 6f 62 6a 65 63 74 28  ace.each_object(
0330: 45 6d 61 69 6c 29 20 64 6f 20 7c 65 7c 0a 0a 09  Email) do |e|...
0340: 09 09 09 23 40 6d 65 73 73 61 67 65 6c 69 73 74  ...#@messagelist
0350: 2e 61 70 70 65 6e 64 7b 0a 09 09 09 09 09 24 61  .append{......$a
0360: 70 70 2e 73 74 61 63 6b 20 3a 6d 61 72 67 69 6e  pp.stack :margin
0370: 20 3d 3e 20 33 30 2c 20 3a 77 69 64 74 68 20 3d   => 30, :width =
0380: 3e 20 35 35 30 20 64 6f 20 23 49 73 20 74 68 69  > 550 do #Is thi
0390: 73 20 75 6e 64 65 72 73 74 6f 6f 64 20 68 65 72  s understood her
03a0: 65 3f 20 53 6f 6d 65 20 6f 66 20 74 68 69 73 20  e? Some of this 
03b0: 69 73 20 6e 6f 74 20 77 6f 72 6b 69 6e 67 2e 0a  is not working..
03c0: 09 09 09 09 09 09 24 61 70 70 2e 62 6f 72 64 65  ......$app.borde
03d0: 72 20 62 6c 61 63 6b 2c 20 3a 73 74 72 6f 6b 65  r black, :stroke
03e0: 77 69 64 74 68 20 3d 3e 20 32 20 0a 09 09 09 09  width => 2 .....
03f0: 09 09 24 61 70 70 2e 69 6e 73 63 72 69 70 74 69  ..$app.inscripti
0400: 6f 6e 20 65 2e 64 61 74 65 0a 09 09 09 09 09 09  on e.date.......
0410: 24 61 70 70 2e 69 6e 73 63 72 69 70 74 69 6f 6e  $app.inscription
0420: 20 65 2e 66 72 6f 6d 0a 09 09 09 09 09 09 24 61   e.from.......$a
0430: 70 70 2e 69 6e 73 63 72 69 70 74 69 6f 6e 20 65  pp.inscription e
0440: 2e 73 75 62 6a 65 63 74 0a 09 09 09 09 09 09 24  .subject.......$
0450: 61 70 70 2e 70 61 72 61 20 65 2e 62 6f 64 79 2e  app.para e.body.
0460: 74 6f 5f 73 0a 09 09 09 09 09 65 6e 64 0a 09 09  to_s......end...
0470: 09 09 23 7d 0a 09 09 09 65 6e 64 0a 09 09 65 6e  ..#}....end...en
0480: 64 0a 0a 09 65 6e 64 0a 0a 0a 09 23 4e 65 65 64  d...end....#Need
0490: 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 6e   to be careful n
04a0: 6f 74 20 74 6f 20 67 65 74 20 6d 6f 6e 74 68 73  ot to get months
04b0: 20 74 68 61 74 20 64 6f 6e 27 74 20 65 78 69 73   that don't exis
04c0: 74 20 28 74 68 69 6e 6b 20 6f 6b 20 62 61 63 6b  t (think ok back
04d0: 20 69 6e 20 74 69 6d 65 2c 20 77 69 74 68 69 6e   in time, within
04e0: 20 72 65 61 73 6f 6e 3f 3f 29 0a 09 64 65 66 20   reason??)..def 
04f0: 63 68 61 6e 67 65 6d 6f 6e 74 68 28 64 69 72 65  changemonth(dire
0500: 63 74 69 6f 6e 29 0a 09 09 69 66 20 64 69 72 65  ction)...if dire
0510: 63 74 69 6f 6e 20 3d 3d 20 3a 62 61 63 6b 77 61  ction == :backwa
0520: 72 64 0a 09 09 09 69 66 20 40 6d 6f 6e 74 68 20  rd....if @month 
0530: 3d 3d 20 31 20 23 74 65 6d 70 74 69 6e 67 20 74  == 1 #tempting t
0540: 6f 20 64 6f 20 22 31 32 2f 22 2e 6e 65 78 74 20  o do "12/".next 
0550: 62 75 74 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e  but no correspon
0560: 64 69 6e 67 20 70 72 65 76 69 6f 75 73 0a 09 09  ding previous...
0570: 09 09 40 79 65 61 72 20 2d 3d 20 31 0a 09 09 09  ..@year -= 1....
0580: 09 40 6d 6f 6e 74 68 20 3d 20 31 32 0a 09 09 09  .@month = 12....
0590: 65 6c 73 65 0a 09 09 09 09 40 6d 6f 6e 74 68 20  else.....@month 
05a0: 2d 3d 20 31 0a 09 09 09 65 6e 64 0a 09 09 65 6e  -= 1....end...en
05b0: 64 0a 09 09 69 66 20 64 69 72 65 63 74 69 6f 6e  d...if direction
05c0: 20 3d 3d 20 3a 66 6f 72 77 61 72 64 0a 09 09 09   == :forward....
05d0: 69 66 20 40 6d 6f 6e 74 68 20 3d 3d 20 31 32 0a  if @month == 12.
05e0: 09 09 09 09 40 79 65 61 72 20 2b 3d 20 31 0a 09  ....@year += 1..
05f0: 09 09 09 40 6d 6f 6e 74 68 20 3d 20 31 0a 09 09  ...@month = 1...
0600: 09 65 6c 73 65 0a 09 09 09 09 40 6d 6f 6e 74 68  .else.....@month
0610: 20 2b 3d 20 31 0a 09 09 09 65 6e 64 0a 09 09 65   += 1....end...e
0620: 6e 64 0a 09 09 64 65 62 75 67 28 40 79 65 61 72  nd...debug(@year
0630: 29 0a 09 09 64 65 62 75 67 28 40 6d 6f 6e 74 68  )...debug(@month
0640: 29 0a 09 09 64 6f 77 6e 6c 6f 61 64 28 55 52 4c  )...download(URL
0650: 2b 40 6c 69 73 74 2b 40 79 65 61 72 2e 74 6f 5f  +@list+@year.to_
0660: 73 2b 22 2f 22 2b 28 30 20 69 66 20 40 6d 6f 6e  s+"/"+(0 if @mon
0670: 74 68 20 3c 20 31 30 29 2e 74 6f 5f 73 2b 40 6d  th < 10).to_s+@m
0680: 6f 6e 74 68 2e 74 6f 5f 73 29 20 64 6f 20 7c 72  onth.to_s) do |r
0690: 65 73 70 7c 0a 09 09 09 40 64 61 79 73 20 3d 20  esp|....@days = 
06a0: 65 76 61 6c 28 72 65 73 70 2e 72 65 73 70 6f 6e  eval(resp.respon
06b0: 73 65 2e 62 6f 64 79 29 5b 31 5d 0a 09 09 09 64  se.body)[1]....d
06c0: 65 62 75 67 28 40 64 61 79 73 29 0a 09 09 09 23  ebug(@days)....#
06d0: 40 73 74 61 63 6b 5f 63 61 6c 2e 73 68 6f 77 0a  @stack_cal.show.
06e0: 09 09 09 23 40 73 74 61 63 6b 5f 63 61 6c 5f 6e  ...#@stack_cal_n
06f0: 61 76 2e 73 68 6f 77 0a 09 09 09 40 77 68 65 6e  av.show....@when
0700: 2e 72 65 70 6c 61 63 65 28 40 6d 6f 6e 74 68 2e  .replace(@month.
0710: 74 6f 5f 73 2c 20 22 20 22 2c 20 40 79 65 61 72  to_s, " ", @year
0720: 2e 74 6f 5f 73 29 0a 09 09 09 64 72 61 77 63 61  .to_s)....drawca
0730: 6c 65 6e 64 61 72 28 40 6c 69 73 74 2c 20 40 79  lendar(@list, @y
0740: 65 61 72 2c 20 40 6d 6f 6e 74 68 2c 20 40 64 61  ear, @month, @da
0750: 79 73 29 0a 09 09 65 6e 64 0a 09 65 6e 64 0a 09  ys)...end..end..
0760: 0a 09 09 0a 09 64 65 66 20 69 6e 69 74 0a 09 09  .....def init...
0770: 64 6f 77 6e 6c 6f 61 64 28 55 52 4c 29 20 64 6f  download(URL) do
0780: 20 7c 72 65 73 70 7c 0a 09 09 09 40 6c 69 73 74   |resp|....@list
0790: 5f 6c 69 73 74 2e 69 74 65 6d 73 20 3d 20 65 76  _list.items = ev
07a0: 61 6c 28 72 65 73 70 2e 72 65 73 70 6f 6e 73 65  al(resp.response
07b0: 2e 62 6f 64 79 29 5b 31 5d 0a 09 09 09 40 73 74  .body)[1]....@st
07c0: 61 63 6b 5f 6c 69 73 74 2e 73 68 6f 77 0a 09 09  ack_list.show...
07d0: 65 6e 64 0a 09 65 6e 64 0a 0a 0a 09 23 4e 65 65  end..end....#Nee
07e0: 64 20 74 6f 20 63 6c 65 61 72 20 61 6e 64 20 72  d to clear and r
07f0: 65 64 72 61 77 20 6c 69 6b 65 20 6d 61 69 6c 70  edraw like mailp
0800: 61 6e 65 0a 09 64 65 66 20 64 72 61 77 63 61 6c  ane..def drawcal
0810: 65 6e 64 61 72 28 6c 69 73 74 2c 20 79 65 61 72  endar(list, year
0820: 2c 20 6d 6f 6e 74 68 2c 20 6d 61 69 6c 64 61 79  , month, mailday
0830: 73 29 0a 09 09 64 65 62 75 67 28 22 57 68 65 72  s)...debug("Wher
0840: 65 27 73 20 74 68 65 20 63 61 6c 65 6e 64 61 72  e's the calendar
0850: 3f 22 29 0a 09 09 6f 66 66 3d 44 61 74 65 2e 6e  ?")...off=Date.n
0860: 65 77 28 79 65 61 72 2c 20 6d 6f 6e 74 68 2c 20  ew(year, month, 
0870: 30 31 29 2e 77 64 61 79 2d 31 20 23 4f 66 66 73  01).wday-1 #Offs
0880: 65 74 2c 20 63 61 6e 27 74 20 72 65 6d 65 6d 62  et, can't rememb
0890: 65 72 20 77 68 79 20 49 20 6e 65 65 64 20 74 68  er why I need th
08a0: 65 20 2d 31 20 68 65 72 65 2c 20 62 75 74 20 49  e -1 here, but I
08b0: 20 64 6f 2e 0a 09 09 6d 64 61 79 73 3d 28 44 61   do....mdays=(Da
08c0: 74 65 2e 6e 65 77 28 79 65 61 72 2c 20 31 32 2c  te.new(year, 12,
08d0: 20 33 31 29 20 3c 3c 20 28 31 32 2d 6d 6f 6e 74   31) << (12-mont
08e0: 68 29 29 2e 64 61 79 20 23 44 61 79 73 20 69 6e  h)).day #Days in
08f0: 20 74 68 65 20 6d 6f 6e 74 68 0a 09 09 72 6f 77   the month...row
0900: 73 3d 28 28 6d 64 61 79 73 2b 6f 66 66 2b 31 29  s=((mdays+off+1)
0910: 2e 74 6f 5f 66 2f 37 2e 30 29 2e 63 65 69 6c 20  .to_f/7.0).ceil 
0920: 23 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20  #Number of rows 
0930: 69 6e 20 63 61 6c 65 6e 64 61 72 2c 20 70 6c 75  in calendar, plu
0940: 73 20 31 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74  s 1 to compensat
0950: 65 20 66 6f 72 20 2d 31 20 61 62 6f 76 65 2e 20  e for -1 above. 
0960: 48 61 76 65 20 63 6f 6e 66 75 73 65 64 20 6d 79  Have confused my
0970: 73 65 6c 66 0a 09 09 64 61 79 73 20 3d 20 25 77  self...days = %w
0980: 7b 53 75 20 4d 6f 20 54 75 20 57 65 20 54 68 20  {Su Mo Tu We Th 
0990: 46 72 20 53 61 7d 0a 09 09 40 6d 65 73 73 61 67  Fr Sa}...@messag
09a0: 65 6c 69 73 74 2e 63 6c 65 61 72 0a 09 09 40 73  elist.clear...@s
09b0: 74 61 63 6b 5f 63 61 6c 2e 63 6c 65 61 72 7b 0a  tack_cal.clear{.
09c0: 09 09 64 61 79 73 2e 65 61 63 68 20 64 6f 20 7c  ..days.each do |
09d0: 63 6f 6c 75 6d 6e 7c 0a 09 09 09 69 20 3d 20 64  column|....i = d
09e0: 61 79 73 2e 69 6e 64 65 78 28 63 6f 6c 75 6d 6e  ays.index(column
09f0: 29 0a 09 09 09 72 6f 77 20 3d 20 30 0a 09 09 09  )....row = 0....
0a00: 73 74 61 63 6b 20 3a 6c 65 66 74 20 3d 3e 20 69  stack :left => i
0a10: 2a 34 30 2c 20 3a 74 6f 70 20 3d 3e 20 31 30 20  *40, :top => 10 
0a20: 64 6f 0a 09 09 09 09 70 61 72 61 20 63 6f 6c 75  do.....para colu
0a30: 6d 6e 0a 09 09 09 09 75 6e 74 69 6c 20 72 6f 77  mn.....until row
0a40: 20 3d 3d 20 72 6f 77 73 20 64 6f 0a 09 09 09 09   == rows do.....
0a50: 09 63 61 6c 64 61 79 20 3d 20 69 2d 6f 66 66 2b  .calday = i-off+
0a60: 37 2a 72 6f 77 0a 09 09 09 09 09 69 66 20 28 31  7*row......if (1
0a70: 2e 2e 6d 64 61 79 73 29 20 3d 3d 3d 20 63 61 6c  ..mdays) === cal
0a80: 64 61 79 20 23 4f 6e 6c 79 20 77 61 6e 74 20 74  day #Only want t
0a90: 6f 20 64 72 61 77 20 69 66 20 67 72 65 61 74 65  o draw if greate
0aa0: 72 20 74 68 61 6e 20 7a 65 72 6f 20 61 6e 64 20  r than zero and 
0ab0: 6c 65 73 73 20 74 68 61 6e 20 6d 61 78 20 64 61  less than max da
0ac0: 79 73 0a 09 09 09 09 09 09 69 66 20 63 61 6c 64  ys.......if cald
0ad0: 61 79 2e 74 6f 5f 73 2e 6c 65 6e 67 74 68 20 3d  ay.to_s.length =
0ae0: 3d 20 31 0a 09 09 09 09 09 09 09 63 61 6c 64 61  = 1........calda
0af0: 79 73 74 72 20 3d 20 22 30 22 2b 63 61 6c 64 61  ystr = "0"+calda
0b00: 79 2e 74 6f 5f 73 20 23 6e 65 65 64 20 22 30 22  y.to_s #need "0"
0b10: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 73 69 6e   in front of sin
0b20: 67 6c 65 20 64 69 67 69 74 73 0a 09 09 09 09 09  gle digits......
0b30: 09 65 6c 73 65 0a 09 09 09 09 09 09 09 63 61 6c  .else........cal
0b40: 64 61 79 73 74 72 20 3d 20 63 61 6c 64 61 79 2e  daystr = calday.
0b50: 74 6f 5f 73 0a 09 09 09 09 09 09 65 6e 64 0a 09  to_s.......end..
0b60: 09 09 09 09 09 69 66 20 6d 61 69 6c 64 61 79 73  .....if maildays
0b70: 2e 69 6e 63 6c 75 64 65 3f 28 63 61 6c 64 61 79  .include?(calday
0b80: 73 74 72 2b 22 2f 22 29 20 0a 09 09 09 09 09 09  str+"/") .......
0b90: 09 70 61 72 61 20 6d 61 6b 65 5f 64 61 74 65 5f  .para make_date_
0ba0: 6c 69 6e 6b 28 6c 69 73 74 2c 20 79 65 61 72 2c  link(list, year,
0bb0: 20 6d 6f 6e 74 68 2c 20 63 61 6c 64 61 79 29 0a   month, calday).
0bc0: 09 09 09 09 09 09 65 6c 73 65 0a 09 09 09 09 09  ......else......
0bd0: 09 09 70 61 72 61 20 63 61 6c 64 61 79 0a 09 09  ..para calday...
0be0: 09 09 09 09 65 6e 64 0a 09 09 09 09 09 65 6c 73  ....end......els
0bf0: 65 20 0a 09 09 09 09 09 09 70 61 72 61 20 22 22  e .......para ""
0c00: 0a 09 09 09 09 09 65 6e 64 0a 09 09 09 09 09 72  ......end......r
0c10: 6f 77 20 2b 3d 20 31 0a 09 09 09 09 65 6e 64 0a  ow += 1.....end.
0c20: 09 09 09 65 6e 64 0a 09 09 65 6e 64 7d 0a 09 65  ...end...end}..e
0c30: 6e 64 0a 0a 0a 09 64 65 66 20 6d 61 6b 65 5f 64  nd....def make_d
0c40: 61 74 65 5f 6c 69 6e 6b 28 6c 69 73 74 2c 20 79  ate_link(list, y
0c50: 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 64 61 79 29  ear, month, day)
0c60: 20 23 68 74 74 70 3a 2f 2f 74 68 72 65 61 64 2e   #http://thread.
0c70: 67 6d 61 6e 65 2e 6f 72 67 2f 67 6d 61 6e 65 2e  gmane.org/gmane.
0c80: 63 6f 6d 70 2e 6c 69 62 2e 73 68 6f 65 73 2f 34  comp.lib.shoes/4
0c90: 30 34 32 2f 66 6f 63 75 73 3d 34 30 34 34 0a 09  042/focus=4044..
0ca0: 09 6c 69 6e 6b 28 64 61 79 29 7b 67 65 74 6d 61  .link(day){getma
0cb0: 69 6c 73 28 6c 69 73 74 2c 20 79 65 61 72 2c 20  ils(list, year, 
0cc0: 6d 6f 6e 74 68 2c 20 64 61 79 29 7d 0a 09 65 6e  month, day)}..en
0cd0: 64 0a 09 0a 0a 09 64 65 66 20 67 65 74 6d 61 69  d.....def getmai
0ce0: 6c 73 28 6c 69 73 74 2c 20 79 65 61 72 2c 20 6d  ls(list, year, m
0cf0: 6f 6e 74 68 2c 20 64 61 79 29 0a 09 09 23 6e 65  onth, day)...#ne
0d00: 65 64 20 74 6f 20 66 69 78 20 6d 6f 6e 74 68 73  ed to fix months
0d10: 20 61 6e 64 20 64 61 79 73 20 68 65 72 65 2c 20   and days here, 
0d20: 69 65 20 30 20 6f 6e 20 66 72 6f 6e 74 2e 0a 09  ie 0 on front...
0d30: 09 69 66 20 6d 6f 6e 74 68 2e 74 6f 5f 73 2e 6c  .if month.to_s.l
0d40: 65 6e 67 74 68 20 3d 3d 20 31 0a 09 09 09 6d 6f  ength == 1....mo
0d50: 6e 74 68 20 3d 20 22 30 22 2b 6d 6f 6e 74 68 2e  nth = "0"+month.
0d60: 74 6f 5f 73 20 23 4d 72 2e 20 43 6f 6e 73 69 73  to_s #Mr. Consis
0d70: 74 65 6e 74 2e 20 44 6f 6e 65 20 64 69 66 66 65  tent. Done diffe
0d80: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
0d90: 75 72 6c 73 21 0a 09 09 65 6c 73 65 0a 09 09 09  urls!...else....
0da0: 6d 6f 6e 74 68 20 3d 20 6d 6f 6e 74 68 2e 74 6f  month = month.to
0db0: 5f 73 0a 09 09 65 6e 64 0a 09 09 69 66 20 64 61  _s...end...if da
0dc0: 79 2e 74 6f 5f 73 2e 6c 65 6e 67 74 68 20 3d 3d  y.to_s.length ==
0dd0: 20 31 0a 09 09 09 64 61 79 20 3d 20 22 30 22 2b   1....day = "0"+
0de0: 64 61 79 2e 74 6f 5f 73 0a 09 09 65 6c 73 65 0a  day.to_s...else.
0df0: 09 09 09 64 61 79 20 3d 20 64 61 79 2e 74 6f 5f  ...day = day.to_
0e00: 73 0a 09 09 65 6e 64 0a 09 09 75 72 6c 20 3d 20  s...end...url = 
0e10: 22 68 74 74 70 3a 2f 2f 6c 69 62 72 65 6c 69 73  "http://librelis
0e20: 74 2e 63 6f 6d 2f 61 72 63 68 69 76 65 73 2f 22  t.com/archives/"
0e30: 2b 6c 69 73 74 2b 22 2f 22 2b 79 65 61 72 2e 74  +list+"/"+year.t
0e40: 6f 5f 73 2b 22 2f 22 2b 6d 6f 6e 74 68 2e 74 6f  o_s+"/"+month.to
0e50: 5f 73 2b 22 2f 22 2b 64 61 79 2e 74 6f 5f 73 2b  _s+"/"+day.to_s+
0e60: 22 2f 6a 73 6f 6e 2f 22 0a 09 09 23 64 65 62 75  "/json/"...#debu
0e70: 67 28 75 72 6c 29 0a 09 09 64 6f 77 6e 6c 6f 61  g(url)...downloa
0e80: 64 28 75 72 6c 29 20 64 6f 20 7c 64 61 74 61 7c  d(url) do |data|
0e90: 0a 09 09 09 65 6d 61 69 6c 73 20 3d 20 65 76 61  ....emails = eva
0ea0: 6c 28 64 61 74 61 2e 72 65 73 70 6f 6e 73 65 2e  l(data.response.
0eb0: 62 6f 64 79 29 5b 31 5d 0a 09 09 09 65 6d 61 69  body)[1]....emai
0ec0: 6c 73 2e 65 61 63 68 20 64 6f 20 7c 6d 65 73 73  ls.each do |mess
0ed0: 61 67 65 7c 0a 09 09 09 09 64 6f 77 6e 6c 6f 61  age|.....downloa
0ee0: 64 28 75 72 6c 2b 6d 65 73 73 61 67 65 29 20 64  d(url+message) d
0ef0: 6f 20 7c 64 61 74 61 7c 0a 09 09 09 09 09 6a 73  o |data|......js
0f00: 20 3d 20 4a 53 4f 4e 2e 70 61 72 73 65 28 64 61   = JSON.parse(da
0f10: 74 61 2e 72 65 73 70 6f 6e 73 65 2e 62 6f 64 79  ta.response.body
0f20: 29 0a 09 09 09 09 09 45 6d 61 69 6c 2e 6e 65 77  )......Email.new
0f30: 28 0a 09 09 09 09 09 09 6a 73 5b 22 68 65 61 64  (.......js["head
0f40: 65 72 73 22 5d 5b 22 44 61 74 65 22 5d 2c 20 0a  ers"]["Date"], .
0f50: 09 09 09 09 09 09 6a 73 5b 22 68 65 61 64 65 72  ......js["header
0f60: 73 22 5d 5b 22 46 72 6f 6d 22 5d 2c 20 0a 09 09  s"]["From"], ...
0f70: 09 09 09 09 6a 73 5b 22 68 65 61 64 65 72 73 22  ....js["headers"
0f80: 5d 5b 22 53 75 62 6a 65 63 74 22 5d 2c 0a 09 09  ]["Subject"],...
0f90: 09 09 09 09 69 66 20 6a 73 5b 22 62 6f 64 79 22  ....if js["body"
0fa0: 5d 20 0a 09 09 09 09 09 09 09 70 61 72 61 20 6a  ] ........para j
0fb0: 73 5b 22 62 6f 64 79 22 5d 0a 09 09 09 09 09 09  s["body"].......
0fc0: 65 6c 73 65 20 0a 09 09 09 09 09 09 09 70 61 72  else ........par
0fd0: 61 20 6a 73 5b 22 70 61 72 74 73 22 5d 5b 30 5d  a js["parts"][0]
0fe0: 5b 22 62 6f 64 79 22 5d 0a 09 09 09 09 09 09 65  ["body"].......e
0ff0: 6e 64 0a 09 09 09 09 09 29 0a 09 09 09 09 65 6e  nd......).....en
1000: 64 0a 09 09 09 65 6e 64 0a 09 09 09 40 6d 65 73  d....end....@mes
1010: 73 61 67 65 6c 69 73 74 2e 63 6c 65 61 72 7b 0a  sagelist.clear{.
1020: 09 09 09 09 23 73 74 61 63 6b 20 64 6f 0a 09 09  ....#stack do...
1030: 09 09 09 45 6d 61 69 6c 2e 64 72 61 77 5f 61 6c  ...Email.draw_al
1040: 6c 20 23 6c 69 73 74 2c 20 64 61 74 65 3f 0a 09  l #list, date?..
1050: 09 09 09 23 65 6e 64 0a 09 09 09 7d 0a 09 09 65  ...#end....}...e
1060: 6e 64 0a 09 65 6e 64 0a 09 0a 09 0a 09 23 41 63  nd..end......#Ac
1070: 74 75 61 6c 20 61 70 70 20 73 74 75 66 66 0a 09  tual app stuff..
1080: 55 52 4c 20 3d 20 22 68 74 74 70 3a 2f 2f 6c 69  URL = "http://li
1090: 62 72 65 6c 69 73 74 2e 63 6f 6d 2f 61 72 63 68  brelist.com/arch
10a0: 69 76 65 73 2f 22 0a 0a 09 23 54 72 79 20 64 6f  ives/"...#Try do
10b0: 69 6e 67 20 73 69 6e 67 6c 65 20 6c 69 73 74 20  ing single list 
10c0: 62 6f 78 20 6f 77 69 6e 67 20 74 6f 20 6c 69 73  box owing to lis
10d0: 74 5f 62 6f 78 20 74 72 6f 75 62 6c 65 73 20 6f  t_box troubles o
10e0: 6e 20 73 68 6f 65 73 20 4d 69 6e 47 57 0a 09 23  n shoes MinGW..#
10f0: 4d 6f 72 65 20 63 6c 6f 73 65 6c 79 20 6d 69 6d  More closely mim
1100: 69 63 73 20 74 68 65 20 77 65 62 20 69 6e 74 65  ics the web inte
1110: 72 66 61 63 65 0a 09 66 6c 6f 77 20 3a 77 69 64  rface..flow :wid
1120: 74 68 20 3d 3e 20 22 31 30 30 25 22 20 64 6f 0a  th => "100%" do.
1130: 09 09 73 74 61 63 6b 20 3a 77 69 64 74 68 20 3d  ..stack :width =
1140: 3e 20 22 34 30 25 22 20 64 6f 20 0a 09 09 09 40  > "40%" do ....@
1150: 73 74 61 63 6b 5f 6c 69 73 74 20 3d 20 73 74 61  stack_list = sta
1160: 63 6b 20 3a 6d 61 72 67 69 6e 20 3d 3e 20 31 30  ck :margin => 10
1170: 20 64 6f 0a 09 09 09 09 40 6c 69 73 74 5f 6c 69   do.....@list_li
1180: 73 74 20 3d 20 6c 69 73 74 5f 62 6f 78 20 64 6f  st = list_box do
1190: 20 7c 6c 69 73 74 7c 20 0a 09 09 09 09 09 40 6c   |list| ......@l
11a0: 69 73 74 20 3d 20 6c 69 73 74 2e 74 65 78 74 09  ist = list.text.
11b0: 0a 09 09 09 09 09 64 6f 77 6e 6c 6f 61 64 28 55  ......download(U
11c0: 52 4c 2b 40 6c 69 73 74 29 20 64 6f 20 7c 72 65  RL+@list) do |re
11d0: 73 70 7c 0a 09 09 09 09 09 09 40 79 65 61 72 20  sp|.......@year 
11e0: 3d 20 65 76 61 6c 28 72 65 73 70 2e 72 65 73 70  = eval(resp.resp
11f0: 6f 6e 73 65 2e 62 6f 64 79 29 5b 31 5d 5b 2d 31  onse.body)[1][-1
1200: 5d 2e 74 6f 5f 69 0a 09 09 09 09 09 09 64 65 62  ].to_i.......deb
1210: 75 67 28 40 79 65 61 72 29 0a 09 09 09 09 09 09  ug(@year).......
1220: 64 6f 77 6e 6c 6f 61 64 28 55 52 4c 2b 40 6c 69  download(URL+@li
1230: 73 74 2b 40 79 65 61 72 2e 74 6f 5f 73 29 20 64  st+@year.to_s) d
1240: 6f 20 7c 72 65 73 70 7c 0a 09 09 09 09 09 09 09  o |resp|........
1250: 40 6d 6f 6e 74 68 20 3d 20 65 76 61 6c 28 72 65  @month = eval(re
1260: 73 70 2e 72 65 73 70 6f 6e 73 65 2e 62 6f 64 79  sp.response.body
1270: 29 5b 31 5d 5b 2d 31 5d 2e 74 6f 5f 69 0a 09 09  )[1][-1].to_i...
1280: 09 09 09 09 09 64 65 62 75 67 28 40 6d 6f 6e 74  .....debug(@mont
1290: 68 29 0a 09 09 09 09 09 09 09 64 6f 77 6e 6c 6f  h)........downlo
12a0: 61 64 28 55 52 4c 2b 40 6c 69 73 74 2b 40 79 65  ad(URL+@list+@ye
12b0: 61 72 2e 74 6f 5f 73 2b 22 2f 22 2b 28 30 20 69  ar.to_s+"/"+(0 i
12c0: 66 20 40 6d 6f 6e 74 68 20 3c 20 31 30 29 2e 74  f @month < 10).t
12d0: 6f 5f 73 2b 40 6d 6f 6e 74 68 2e 74 6f 5f 73 29  o_s+@month.to_s)
12e0: 20 64 6f 20 7c 72 65 73 70 7c 0a 09 09 09 09 09   do |resp|......
12f0: 09 09 09 40 64 61 79 73 20 3d 20 65 76 61 6c 28  ...@days = eval(
1300: 72 65 73 70 2e 72 65 73 70 6f 6e 73 65 2e 62 6f  resp.response.bo
1310: 64 79 29 5b 31 5d 0a 09 09 09 09 09 09 09 09 64  dy)[1].........d
1320: 65 62 75 67 28 40 64 61 79 73 29 0a 09 09 09 09  ebug(@days).....
1330: 09 09 09 09 40 77 68 65 6e 2e 72 65 70 6c 61 63  ....@when.replac
1340: 65 28 40 6d 6f 6e 74 68 2e 74 6f 5f 73 2c 20 22  e(@month.to_s, "
1350: 20 22 2c 20 40 79 65 61 72 2e 74 6f 5f 73 29 0a   ", @year.to_s).
1360: 09 09 09 09 09 09 09 09 64 72 61 77 63 61 6c 65  ........drawcale
1370: 6e 64 61 72 28 40 6c 69 73 74 2c 20 40 79 65 61  ndar(@list, @yea
1380: 72 2c 20 40 6d 6f 6e 74 68 2c 20 40 64 61 79 73  r, @month, @days
1390: 29 0a 09 09 09 09 09 09 09 65 6e 64 0a 09 09 09  )........end....
13a0: 09 09 09 65 6e 64 0a 09 09 09 09 09 65 6e 64 0a  ...end......end.
13b0: 09 09 09 09 65 6e 64 0a 09 09 09 65 6e 64 0a 09  ....end....end..
13c0: 09 09 40 6c 69 73 74 75 72 6c 20 3d 20 22 22 0a  ..@listurl = "".
13d0: 09 09 09 40 73 74 61 63 6b 5f 63 61 6c 5f 6e 61  ...@stack_cal_na
13e0: 76 20 3d 20 73 74 61 63 6b 20 3a 6d 61 72 67 69  v = stack :margi
13f0: 6e 20 3d 3e 20 31 30 20 64 6f 0a 09 09 09 09 62  n => 10 do.....b
1400: 75 74 74 6f 6e 20 22 3c 22 20 64 6f 0a 09 09 09  utton "<" do....
1410: 09 09 63 68 61 6e 67 65 6d 6f 6e 74 68 28 3a 62  ..changemonth(:b
1420: 61 63 6b 77 61 72 64 29 0a 09 09 09 09 65 6e 64  ackward).....end
1430: 0a 09 09 09 09 40 77 68 65 6e 20 3d 20 70 61 72  .....@when = par
1440: 61 20 22 20 22 0a 09 09 09 09 40 77 68 65 6e 2e  a " ".....@when.
1450: 73 74 79 6c 65 20 3a 6d 61 72 67 69 6e 20 3d 3e  style :margin =>
1460: 20 31 30 0a 09 09 09 09 62 75 74 74 6f 6e 20 22   10.....button "
1470: 3e 22 20 64 6f 0a 09 09 09 09 09 63 68 61 6e 67  >" do......chang
1480: 65 6d 6f 6e 74 68 28 3a 66 6f 72 77 61 72 64 29  emonth(:forward)
1490: 0a 09 09 09 09 65 6e 64 0a 09 09 09 65 6e 64 0a  .....end....end.
14a0: 09 09 65 6e 64 0a 09 09 40 73 74 61 63 6b 5f 63  ..end...@stack_c
14b0: 61 6c 20 3d 20 73 74 61 63 6b 20 3a 77 69 64 74  al = stack :widt
14c0: 68 20 3d 3e 20 22 36 30 25 22 20 64 6f 0a 09 09  h => "60%" do...
14d0: 09 70 61 72 61 20 22 20 22 0a 09 09 65 6e 64 0a  .para " "...end.
14e0: 09 65 6e 64 0a 09 40 6d 65 73 73 61 67 65 6c 69  .end..@messageli
14f0: 73 74 20 3d 20 73 74 61 63 6b 20 3a 68 65 69 67  st = stack :heig
1500: 68 74 20 3d 3e 20 34 32 35 2c 20 3a 73 63 72 6f  ht => 425, :scro
1510: 6c 6c 20 3d 3e 20 74 72 75 65 20 0a 09 69 6e 69  ll => true ..ini
1520: 74 20 09 0a 0a 65 6e 64 0a 0a 23 57 68 61 74 20  t ...end..#What 
1530: 77 6f 75 6c 64 20 6d 61 6b 65 20 74 68 69 73 20  would make this 
1540: 75 73 65 66 75 6c 3f 3f 20 0a 23 47 72 6f 75 70  useful?? .#Group
1550: 69 6e 67 20 62 79 20 74 68 72 65 61 64 2f 73 75  ing by thread/su
1560: 62 6a 65 63 74 20 2d 20 63 6f 6c 6c 61 70 73 69  bject - collapsi
1570: 62 6c 65 20 73 65 63 74 69 6f 6e 73 2e 20 0a 23  ble sections. .#
1580: 46 6f 72 20 6e 6f 77 20 72 65 61 6c 6c 79 20 68  For now really h
1590: 61 76 65 20 74 6f 20 6b 65 65 70 20 65 76 65 72  ave to keep ever
15a0: 79 74 68 69 6e 67 20 74 6f 20 22 6f 6e 65 20 64  ything to "one d
15b0: 61 79 22 20 0a 0a 0a                             ay" ...