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

yatex.org