-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathfunctions.rb
executable file
·214 lines (182 loc) · 4.14 KB
/
functions.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#! /usr/bin/ruby
# coding: utf-8
require 'csv'
require 'time'
require 'date'
require 'sqlite3'
require 'cgi'
require 'erb'
require 'yaml'
WEEK = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
WEEK_JP = ["日", "月", "火", "水", "木", "金", "土"]
WDAY_MAP = {
"日" => 0,
"月" => 1,
"火" => 2,
"水" => 3,
"木" => 4,
"金" => 5,
"土" => 6
}
CONFIG = YAML.load_file(File.expand_path("../config.yml", __FILE__))
P_START = CONFIG["P"]["START"]
P_END = CONFIG["P"]["END"]
TERM_BEGIN = CONFIG["TERM"]["BEGIN"]
TERM_END = CONFIG["TERM"]["END"]
class Time
# http://www.asahi-net.or.jp/~CI5M-NMR/iCal/ref.html
# 日付と時刻を一緒に記述する時は、間を T で区切る。例: 19980119T230000
def to_icsf
self.strftime("%Y%m%dT%H%M00")
end
end
class Hash
# http://d.hatena.ne.jp/hamajyotan/20110226/1298739617
def map_to_hash &block
ret = {}
each { |k,v| ret[k] = block.call(v) }
ret
end
end
#
# 各曜日の授業開始日を求める
#
def get_term_start_each_wday(term_start)
term_start_each_wday = Array.new
current = term_start
i = (yday = term_start.yday)
j = (wday = term_start.wday)
while i < (yday + 7) do
term_start_each_wday[j] = current.to_s
i += 1
j = (j+1)%7
current = current.next
end
term_start_each_wday
end
#
# 曜時限をパースする
# input: 月・木4,5
# retrun: [[wday, start, end], [wday, start, end], ...]
#
def parse_jigen(str)
ret = []
str.lines do |line|
if line =~ /^(\D+)([\d\-,]+)$/
wday_ss = $1
koma_ss = $2
wday_ss.split("・").each do |wday_s|
wday = WDAY_MAP[wday_s]
# example: 4,5
if koma_ss =~ /^[\d,s]+$/
kstart = kend = 0
koma_ss.split(",").map(&:to_i).each do |k|
if kstart == 0
kstart = kend = k
next
end
if k == kend + 1
kend = k
else
ret << { wday: wday, start: kstart, end: kend }
kstart = kend = k
end
end
ret << { wday: wday, start: kstart, end: kend }
# example: 3-6
elsif koma_ss =~ /^[\d\-]+$/
kstart = koma_ss[0].to_i
kend = koma_ss[2].to_i
ret << {:wday => wday, :start => kstart, :end => kend}
end
end
end
end
ret
end
#
# 実施学期をパースする
# input:
# - 春C秋ABC
# - 集中
# - 通年
# - 春AB秋AB
# - 夏季休業中
# retrun: [[date_begin, date_end], [date_bigin, date_end], ...]
#
def parse_term(str)
ret = []
str.lines do |line|
line = "春ABC秋ABC" if line == "通年"
if line.gsub!("夏季休業中", '')
ret << {:begin => TERM_BEGIN["夏"], :end => TERM_END["夏"]}
end
rscan = line.strip.scan(/[春秋][ABC]+/)
rscan.each do |item|
term = item[0]
mod = item[1..10]
begin_ = end_ = nil
case mod.size
when 1
begin_ = end_ = mod
when 2
begin_ = mod[0]
end_ = mod[1]
when 3
begin_ = mod[0]
end_ = mod[2]
end
ret << {:begin => TERM_BEGIN[term][begin_], :end => TERM_END[term][end_]}
end
end
ret
end
#
# オブジェクトを深いコピーする
#
def deep_copy(obj)
Marshal.load(Marshal.dump(obj))
end
#
# ログ
#
def log(str, file)
open(file, "a") do |f|
f.write("[#{Time.now.to_s}] #{str}\n")
end
end
#
# エラー処理は全部これ
#
def exception_handling(e, cgi)
log(e.to_s + "\n" + e.backtrace.join("\n"), "./error.log")
print cgi.header( {
"status" => "REDIRECT",
"Location" => "./?has_error=true"
})
end
#TERM_MAP = {
# "春AB" => :S_AB,
# "春ABC" => :S_ABC,
# "春C" => :S_C,
# "秋AB" => :A_AB,
# "秋ABC" => :A_ABC,
# "秋C" => :A_C
#}
#
#TERM_START = {
# :S_AB => "2013/04/12",
# :S_ABC => "2013/04/12",
# :S_C => "2013/07/03",
# :A_AB => "2013/10/01",
# :A_ABC => "2013/10/01",
# :A_C => "2013/12/23"
#}
#TERM_END = {
# :S_AB => "2013/07/02 22:00",
# :S_ABC => "2013/08/07 22:00",
# :S_C => "2013/08/07 22:00",
# :A_AB => "2013/12/20 22:00",
# :A_ABC => "2014/02/07 22:00",
# :A_C => "2014/02/07 22:00"
#}