Mercurial > hgrepos > hgweb.cgi > after5
comparison after5.rb @ 3:354e09bb8ce1 draft
RCS-revision 1.4
date: 2004/01/02 14:30:58; author: yuuji; state: Exp; lines: +64 -46
The amount of chedule text in monthly calendar is now selectable.
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Fri, 02 Jan 2004 14:30:58 +0859 |
parents | 1110baebe9a9 |
children | b7e65c9caa23 |
comparison
equal
deleted
inserted
replaced
2:1110baebe9a9 | 3:354e09bb8ce1 |
---|---|
1 #!/usr/local/bin/ruby | 1 #!/usr/local/bin/ruby |
2 # | 2 # |
3 # Associative Scheduling Table - after5 | 3 # Associative Scheduling Table - after5 |
4 # (C)2003, 2004 by HIROSE Yuuji [yuuji@gentei.org] | 4 # (C)2003, 2004 by HIROSE Yuuji [yuuji@gentei.org] |
5 # $Id: after5.rb,v 1.3 2004/01/01 09:15:50 yuuji Exp $ | 5 # $Id: after5.rb,v 1.4 2004/01/02 14:30:58 yuuji Exp $ |
6 # Last modified Thu Jan 1 18:11:47 2004 on firestorm | 6 # Last modified Fri Jan 2 23:25:50 2004 on firestorm |
7 # See http://www.gentei.org/~yuuji/software/after5/ | 7 # See http://www.gentei.org/~yuuji/software/after5/ |
8 # このスクリプトはEUCで保存してください。 | 8 # このスクリプトはEUCで保存してください。 |
9 | 9 |
10 require 'kconv' | 10 require 'kconv' |
11 | 11 |
109 #start = (b<e ? b : e) | 109 #start = (b<e ? b : e) |
110 #last = (b>e ? b : e) | 110 #last = (b>e ? b : e) |
111 c=0 | 111 c=0 |
112 "<select name=\"#{name}\">\n" + \ | 112 "<select name=\"#{name}\">\n" + \ |
113 range.collect{|i| | 113 range.collect{|i| |
114 sprintf "<option%s>%s%s", | 114 value = (i.is_a?(Array) ? i[1] : i).to_s |
115 (selected.to_s==i.to_s) ? " selected" : "", | 115 sprintf "<option%s%s>%s%s</option>", |
116 i.to_s, | 116 (selected.to_s==value.to_s) ? " selected" : "", |
117 i.is_a?(Array) ? " value=\"%s\"" % value : '', | |
118 i.is_a?(Array) ? i[0] : i.to_s, | |
117 (c+=1)%6==0 ? "\n" : '' | 119 (c+=1)%6==0 ? "\n" : '' |
118 }.join + \ | 120 }.join + \ |
119 "\n</select>\n" | 121 "\n</select>\n" |
120 end | 122 end |
121 end | 123 end |
915 @myname='a5.cgi' if test(?f, "a5.cgi") | 917 @myname='a5.cgi' if test(?f, "a5.cgi") |
916 @conf = nil | 918 @conf = nil |
917 @schedulearea = {'rows'=>'4', 'cols'=>'60', 'name'=>'schedule'} | 919 @schedulearea = {'rows'=>'4', 'cols'=>'60', 'name'=>'schedule'} |
918 @oldagent = (%r,Mozilla/4, =~ ENV['HTTP_USER_AGENT']) | 920 @oldagent = (%r,Mozilla/4, =~ ENV['HTTP_USER_AGENT']) |
919 @lang = 0 | 921 @lang = 0 |
922 @savecookieregexp = /^(user$|passwd$|display(mode|days)$|nt|headline)/ | |
920 @opt = { | 923 @opt = { |
921 'conf' => @mybase+".cf", | 924 'conf' => @mybase+".cf", |
922 'css' => @mybase+".css", | 925 'css' => @mybase+".css", |
923 'logfile' => @mybase+".log", | 926 'logfile' => @mybase+".log", |
924 "sendmail" => "/usr/sbin/sendmail", | 927 "sendmail" => "/usr/sbin/sendmail", |
948 ['nt3d', "3"+msg('days', 'before')], | 951 ['nt3d', "3"+msg('days', 'before')], |
949 ['nt7d', "7"+msg('days', 'before')], | 952 ['nt7d', "7"+msg('days', 'before')], |
950 ['nt30d', "30"+msg('days', 'before')], | 953 ['nt30d', "30"+msg('days', 'before')], |
951 ] | 954 ] |
952 ##@job = "today" | 955 ##@job = "today" |
956 @wnames = %w[sun mon tue wed thu fri sat] | |
953 @job = "login" | 957 @job = "login" |
954 @sc = ScheduleDir.new | 958 @sc = ScheduleDir.new |
955 @O = StringIO.new | 959 @O = StringIO.new |
956 @H = HTMLout.new() | 960 @H = HTMLout.new() |
957 @umback = File.umask | 961 @umback = File.umask |
960 File.umask(007) | 964 File.umask(007) |
961 end | 965 end |
962 def doit() | 966 def doit() |
963 @params = getarg() | 967 @params = getarg() |
964 @cookie = getcookie() | 968 @cookie = getcookie() |
969 importcookie() | |
965 @lang = (/^j/i =~ @opt['lang'] ? 0 : 1) | 970 @lang = (/^j/i =~ @opt['lang'] ? 0 : 1) |
966 p @cookie if $DEBUG | 971 p @cookie if $DEBUG |
967 p @params if $DEBUG | 972 p @params if $DEBUG |
968 | 973 |
969 @params['displaymode'] = @params['displaymode'] || @cookie['displaymode'] | 974 ### @params['displaymode'] = @params['displaymode'] || @cookie['displaymode'] |
970 personal = /personal/i =~ @params['displaymode'] | 975 personal = /personal/i =~ @params['displaymode'] |
971 bodyclass = if personal then {'class'=>'personal'} end | 976 bodyclass = if personal then {'class'=>'personal'} end |
972 | |
973 ######### @O.puts @H.p(@cookie.inspect) #cookie check! | |
974 | 977 |
975 ## x = {"align"=>'center'} | 978 ## x = {"align"=>'center'} |
976 ## @H.element("p", x, "hoge", nil) | 979 ## @H.element("p", x, "hoge", nil) |
977 ## @H.element("p", nil, "buha", nil) | 980 ## @H.element("p", nil, "buha", nil) |
978 | 981 |
982 if nil | |
979 if !@params['passwd'] && @cookie['passwd'] | 983 if !@params['passwd'] && @cookie['passwd'] |
980 @params['passwd'] = @cookie['passwd'] | 984 @params['passwd'] = @cookie['passwd'] |
981 end | 985 end |
982 if !@params['user'] && @cookie['user'] | 986 if !@params['user'] && @cookie['user'] |
983 @params['user'] = @cookie['user'] | 987 @params['user'] = @cookie['user'] |
988 end | |
984 end | 989 end |
985 @params['user'] = safecopy(@params['user']) | 990 @params['user'] = safecopy(@params['user']) |
986 | 991 |
987 eval @job | 992 eval @job |
988 @O.append(@H.contenttype() + | 993 @O.append(@H.contenttype() + |
996 print @O.readlines | 1001 print @O.readlines |
997 end | 1002 end |
998 def msg(*keyword) | 1003 def msg(*keyword) |
999 unless defined?(@msg) | 1004 unless defined?(@msg) |
1000 @msg = { | 1005 @msg = { |
1001 'title' => ['みんなの予定表 <img src="after5.png" alt="「アフター5」" width="107" height="53">', 'Schedule table for us all <img src="after5.png" alt="After 5" width="107" height="53">'], | 1006 'title' => ['みんなの予定表 <img src="after5.png" alt="「アフター5」">', 'Schedule table for us all <img src="after5.png" alt="After 5">'], |
1002 'login' => ['ログイン', 'Login'], | 1007 'login' => ['ログイン', 'Login'], |
1003 'loginfirst' => ['最初にログインすべし', 'Login first'], | 1008 'loginfirst' => ['最初にログインすべし', 'Login first'], |
1004 'autherror' => ['認証エラーがあったと管理者に伝えてくれっす', | 1009 'autherror' => ['認証エラーがあったと管理者に伝えてくれっす', |
1005 'Unexpected authentication error. Please tell this to the administrator'], | 1010 'Unexpected authentication error. Please tell this to the administrator'], |
1006 'yourmail' => ['あなたのメイルアドレス', 'Your email address'], | 1011 'yourmail' => ['あなたのメイルアドレス', 'Your email address'], |
1097 'newgroup' => ['新規グループ作成', 'Create new group'], | 1102 'newgroup' => ['新規グループ作成', 'Create new group'], |
1098 'adminop' => ['管理<br>操作', "Administrative<br>operation"], | 1103 'adminop' => ['管理<br>操作', "Administrative<br>operation"], |
1099 'member' => ['メンバー', 'Member'], | 1104 'member' => ['メンバー', 'Member'], |
1100 'personalmode' => ['自分のだけ表示モード', 'Display Personal Only'], | 1105 'personalmode' => ['自分のだけ表示モード', 'Display Personal Only'], |
1101 'normalmode' => ['全員分表示モード', "Display Everyone's"], | 1106 'normalmode' => ['全員分表示モード', "Display Everyone's"], |
1107 'display' => ['予定表示行: ', 'Display schedule of: '], | |
1108 'nameonly' => ['名前のみ', 'Name Only'], | |
1109 'head5char' => ['先頭5文字', 'Head 5 chars'], | |
1110 'headline' => ['先頭1行', 'Headline only'], | |
1111 'whole' => ['長くても全部', 'Whole text'], | |
1102 'addedtogroup' => ['をグループに追加 →', 'added to the group:'], | 1112 'addedtogroup' => ['をグループに追加 →', 'added to the group:'], |
1103 'removedfromgp' => ['をグループから削除:', 'removed from the group:'], | 1113 'removedfromgp' => ['をグループから削除:', 'removed from the group:'], |
1104 'soleadmin' => ['%s は %s の唯一の管理者なのでやめられないのだ', | 1114 'soleadmin' => ['%s は %s の唯一の管理者なのでやめられないのだ', |
1105 "%s is sole administrator of %s. Cannot retire."], | 1115 "%s is sole administrator of %s. Cannot retire."], |
1106 'recursewarn' => ['個人では加入してないが、別の加入グループがこのグループに入っているので実質参加していることになっている。', | 1116 'recursewarn' => ['個人では加入してないが、別の加入グループがこのグループに入っているので実質参加していることになっている。', |
1139 '' | 1149 '' |
1140 end | 1150 end |
1141 }.join(['', ' '][@lang]) | 1151 }.join(['', ' '][@lang]) |
1142 end | 1152 end |
1143 | 1153 |
1154 def importcookie() | |
1155 @cookie.keys.grep(@savecookieregexp){|v| | |
1156 @params[v] = @params[v] || @cookie[v] | |
1157 } | |
1158 end | |
1144 def setcookie() | 1159 def setcookie() |
1145 p = {} | 1160 p = {} |
1146 @params.keys.grep(/^(user$|passwd$|display(mode|days)$|nt)/){|v| | 1161 @params.keys.grep(@savecookieregexp){|v| |
1147 p[v] = @params[v].to_s.strip | 1162 p[v] = @params[v].to_s.strip |
1148 } | 1163 } |
1149 c = gencookie(p, 3600*6*1) | 1164 c = gencookie(p, 3600*6*1) |
1150 printf "Set-Cookie: %s\n", c if c | 1165 printf "Set-Cookie: %s\n", c if c |
1151 end | 1166 end |
1439 month = day.month.to_s | 1454 month = day.month.to_s |
1440 first = Time.mktime(day.year, day.month, 1) | 1455 first = Time.mktime(day.year, day.month, 1) |
1441 last = daysofmonth(day.year, day.month) | 1456 last = daysofmonth(day.year, day.month) |
1442 wday1 = first.wday | 1457 wday1 = first.wday |
1443 start = 1-wday1 | 1458 start = 1-wday1 |
1444 wname = %w[sun mon tue wed thu fri sat] | 1459 wname = @wnames |
1445 today = Time.now | 1460 today = Time.now |
1446 todaym = today.month | 1461 todaym = today.month |
1447 todayd = today.day | 1462 todayd = today.day |
1448 tdclass = {} | 1463 tdclass = {} |
1449 tdclass["width"] = "64px" if @oldagent # workaround for NN4 | 1464 tdclass["width"] = "64px" if @oldagent # workaround for NN4 |
1450 personal = /personal/ =~ @params['displaymode'] | 1465 personal = /personal/ =~ @params['displaymode'] |
1451 | 1466 headline = @params['headline'] |
1467 monthstr = sprintf "%d/%d", day.year, day.month | |
1468 | |
1452 holiday = Holiday.new | 1469 holiday = Holiday.new |
1453 # create dayofweek header | 1470 # create dayofweek header |
1454 @O.print @H.elementln("h1", nil){sprintf "%d/%d", day.year, day.month} | 1471 @O.print @H.elementln("h1", nil){monthstr} |
1455 # which mode? | 1472 # which mode? |
1456 @O.print @H.p(msg(personal ? 'personalmode' : 'normalmode')) | 1473 @O.print @H.p(msg(personal ? 'personalmode' : 'normalmode')) |
1457 # | 1474 # |
1458 # display table | 1475 # display table |
1459 @O.print @H.startelement("table", {'border'=>"1", 'class'=>'main'}) | 1476 @O.print @H.startelement("table", {'border'=>"1", 'class'=>'main'}) |
1488 @H.element("p", {'class'=>'topic'}){ | 1505 @H.element("p", {'class'=>'topic'}){ |
1489 s = @sc.day_all(date, @params['user'], personal) | 1506 s = @sc.day_all(date, @params['user'], personal) |
1490 if !s.empty? | 1507 if !s.empty? |
1491 s.keys.sort.collect{|time| | 1508 s.keys.sort.collect{|time| |
1492 s[time].keys.sort.collect{|who| | 1509 s[time].keys.sort.collect{|who| |
1493 sprintf "%04s:%s", | 1510 text = s[time][who]['sched'].gsub(/\n/, '') |
1494 time == @opt['alldaydir'] ? msg('allday') : time, | 1511 sprintf "%s%s", |
1512 time == @opt['alldaydir'] ? '' : time+":", | |
1495 if personal | 1513 if personal |
1496 s[time][who]['sched'].split("\n")[0] | 1514 text.split("\n") ##[0] |
1497 else | 1515 else |
1498 nickname(who) | 1516 nickname(who) + '=' + \ |
1517 if headline == 'whole' | |
1518 text | |
1519 elsif headline == 'head5char' | |
1520 text.sub(/(.{5}).*/, '\1') | |
1521 elsif headline == 'headline' | |
1522 text.split("\n")[0] | |
1523 end.to_s | |
1499 end | 1524 end |
1500 }.join | 1525 }.join("<br>") |
1501 }.join("<br>") | 1526 }.join("<br>\n") |
1502 else | 1527 else |
1503 @opt['tdskip'] | 1528 @opt['tdskip'] |
1504 end | 1529 end |
1505 } | 1530 } |
1506 else | 1531 else |
1507 @opt['tdskip'] | 1532 @opt['tdskip'] |
1508 end | 1533 end |
1509 } | |
1510 }.join | |
1511 } | |
1512 # ここ活かしてない | |
1513 @H.elementln("tr", nil){ | |
1514 (column..column+6).collect{|d| | |
1515 wd=d%7 | |
1516 @H.element("td", {'class'=>wname[wd]}){ | |
1517 @H.element("div", {'class'=>'scline'}){ | |
1518 if d>0 && d <= last | |
1519 s = @sc.day_all("%d/%d/%d"%[day.year, day.month, d]) | |
1520 unless s.empty? | |
1521 s.keys.sort.collect{|time| | |
1522 s[time].keys.sort.collect{|who| | |
1523 sprintf "%4s:%s", time, who.sub(/@.*/, '') | |
1524 } | |
1525 }.join("<br>") | |
1526 else | |
1527 @opt['tdskip'] | |
1528 end | |
1529 else | |
1530 @opt['tdskip'] | |
1531 end | |
1532 } | |
1533 } | 1534 } |
1534 }.join | 1535 }.join |
1535 } | 1536 } |
1536 column += 7 | 1537 column += 7 |
1537 end | 1538 end |
1556 }.join("\n") | 1557 }.join("\n") |
1557 } | 1558 } |
1558 @O.print "\n"+@H.endelement(nil, true) | 1559 @O.print "\n"+@H.endelement(nil, true) |
1559 | 1560 |
1560 @O.print "showtable" if @params['user'] == @author | 1561 @O.print "showtable" if @params['user'] == @author |
1562 @O.print @H.elementln("form", {'action'=>@myname+"?-month+#{monthstr}", 'method'=>'POST'}){ | |
1563 choice = [ | |
1564 [msg('nameonly'), 'name'], | |
1565 [msg('head5char'), 'head5char'], | |
1566 [msg('headline'), 'headline'], | |
1567 [msg('whole'), 'whole']] | |
1568 msg('display') + \ | |
1569 @H.select('headline', choice, headline) + \ | |
1570 @H.submit("GO", "GO") | |
1571 } | |
1561 @O.print footer | 1572 @O.print footer |
1562 ##schedule.day_all("2003/12/22") | 1573 ##schedule.day_all("2003/12/22") |
1563 # @O.print @H.endelement() | 1574 # @O.print @H.endelement() |
1564 end | 1575 end |
1565 | 1576 |
1590 day = Time.mktime(*date2ymd(datestr)) | 1601 day = Time.mktime(*date2ymd(datestr)) |
1591 i = -1 | 1602 i = -1 |
1592 while (i+=1) < range | 1603 while (i+=1) < range |
1593 d = Time.at(day+i*3600*24) | 1604 d = Time.at(day+i*3600*24) |
1594 date = sprintf("%04d/%02d/%02d", d.year, d.month, d.day) | 1605 date = sprintf("%04d/%02d/%02d", d.year, d.month, d.day) |
1606 datewn = @H.element("span", {'class'=>@wnames[d.wday]}){ | |
1607 sprintf("%s(%s)", date, @msg['wnames'][@lang][d.wday]) | |
1608 } | |
1595 s = @sc.day_all(date, user, personal) | 1609 s = @sc.day_all(date, user, personal) |
1596 next if s.empty? | 1610 next if s.empty? |
1597 | 1611 |
1598 r << @H.element("tr", nil){ | 1612 r << @H.element("tr", nil){ |
1599 @H.element("th", {'class'=>'time'}){'TIME'} + \ | 1613 @H.element("th", {'class'=>'time'}){'TIME'} + \ |
1600 @H.element("th", nil){date+' - Schedule'} | 1614 @H.element("th", nil){'Who - '+datewn+' - What'} |
1601 } | 1615 } |
1602 for time in s.keys | 1616 for time in s.keys |
1603 tstr = case time | 1617 tstr = case time |
1604 when @opt['alldaydir'] | 1618 when @opt['alldaydir'] |
1605 msg('allday') | 1619 msg('allday') |
1792 return nil | 1806 return nil |
1793 end | 1807 end |
1794 user = safecopy(@params['user']) | 1808 user = safecopy(@params['user']) |
1795 personal = (/personal/i =~ @params['displaymode']) | 1809 personal = (/personal/i =~ @params['displaymode']) |
1796 @params['displaydays'] = @params['displaydays'] || @cookie['displaydays'] | 1810 @params['displaydays'] = @params['displaydays'] || @cookie['displaydays'] |
1797 days = (@params['displaydays'] || 1).to_i | 1811 days = @params['displaydays'].to_i |
1812 days = (days > 0 ? days : 1) | |
1798 | 1813 |
1799 # str = @sc.day_all(date, user, personal) | 1814 # str = @sc.day_all(date, user, personal) |
1800 outstr = dayTableString(user, date, days, personal) | 1815 outstr = dayTableString(user, date, days, personal) |
1801 | 1816 |
1802 @O.print @H.element("h1", nil){ | 1817 @O.print @H.element("h1", nil){ |
1913 return nil | 1928 return nil |
1914 end | 1929 end |
1915 user = registerer = @params['user'] | 1930 user = registerer = @params['user'] |
1916 as = @params['registas'] | 1931 as = @params['registas'] |
1917 if as && as > '' && /^no$/ !~ as && @sc.ismember(user, as) | 1932 if as && as > '' && /^no$/ !~ as && @sc.ismember(user, as) |
1918 registerer = as | 1933 if (gr=grepgroup(as)) |
1934 registerer = gr | |
1935 end | |
1919 end | 1936 end |
1920 now = Time.now | 1937 now = Time.now |
1921 #y, m, d, h, min = now.year, now.month, now.day, now.hour, now.min | 1938 #y, m, d, h, min = now.year, now.month, now.day, now.hour, now.min |
1922 | 1939 |
1923 $KCODE='e' if $DEBUG | 1940 $KCODE='e' if $DEBUG |
2977 end | 2994 end |
2978 cookie | 2995 cookie |
2979 end | 2996 end |
2980 end | 2997 end |
2981 | 2998 |
2999 $KCODE='e' | |
2982 After5.new.doit | 3000 After5.new.doit |
2983 | 3001 |
2984 if __FILE__ == $0 | 3002 if __FILE__ == $0 |
2985 end | 3003 end |
2986 | 3004 |