#! /usr/local/bin/ruby
# FT-review-link update-check
# 2001.12.28-2002.2.8
# 重複レコード(非重要項目は緩拘束の上で)のチェック項目を追加必要。
#mode_check = true
mode_check = false
message_mode = 'sjis'
require "kconv"
#----- def argopt -----
def argopt ( argv, opt2v )
argopt0 = []
argopt1 = []
argopt2 = []
num = '0123456789'
flag = false
argv.each { |arg|
if (arg =~ /^-/) && ((arg[1] < num[0]) || (arg[1] > num[-1])) then
flag = false
opt2v.each { |opt|
flag = true if arg == opt
}
if flag == false then
argopt1 << arg
else
argopt2 << arg
end
else
if flag == false then
argopt0 << arg
else
argopt2 << arg
end
flag = false
end
}
newargopt2 = []
0.upto(argopt2.size - 2) { |i|
tmp = []
tmp << argopt2[i]
if argopt2[i+1] !~ /^-/
tmp << argopt2[i+1]
i = i + 1
end
newargopt2 << tmp
}
if argopt2[argopt2.size - 1] =~ /^-/
newargopt2 << argopt2[argopt2.size - 1]
end
argopts = []
argopts << argopt0 << argopt1 << newargopt2
return argopts
end
#----- check arg -----
usage = 'command (no-arg)(book.txt, reviewer.txt, review.txt reviewer_comment.txt -> isbnXXXXXXXXXX.html, list.html, reviewer_XXXXX.html)'
opt2v = []
argopts = argopt ( ARGV, opt2v )
case argopts[0].size
when 1
input = argopts[0][0]
when 2
input = argopts[0][0]
output = argopts[0][1]
#else
# $stderr.puts "Usage: " << usage
# exit 1
end
flag_isbn = false
argopts[1].each { |option|
if (option == "-h") || (option == "-help") then
$stderr.puts "Usage: " << usage
exit 1
end
if (option == "-isbn") then
$stderr.puts "CHK; check isbn"
flag_isbn = true
end
}
#----- def data read -----
def ttcsv_reader ( file = nil, checkkey = nil, checktrack = nil )
$stderr.puts "CHK; file; " << file
if file.nil? then fp = $stdin
else fp = File.open( file ) end
text = []
fp.each {|line|
string = Kconv.toeuc(line).chomp.chomp("\r")
text << string if string !~ /^#/
}
if !file.nil? then fp.close end
key = text.shift.split("\t")
data = []
text.each_index { |j|
record = {}
record["track"] = j if checktrack.nil?
info = text[j].split("\t")
key.each_index { |i|
str = info[i]
str = '' if str.nil?
record[key[i]] = str
}
data << record
}
return data if checkkey.nil?
return data, key if !checkkey.nil?
end
def nncomment_reader ( file = nil )
$stderr.puts "CHK; file; " << file
if file.nil? then fp = $stdin
else fp = File.open( file ) end
text = []
fp.each {|line|
string = Kconv.toeuc(line).chomp.chomp("\r")
text << string if string !~ /^#/
}
if !file.nil? then fp.close end
data = []
text1 = text.join("\n")
text2 = text1.split("\n\n")
text2.each { |block|
record = {}
if block =~ /^(.*?)\n([\S\s]*)$/ then
record["r-code"] = $1
record["comment"] = $2
data << record
end
}
return data
end
#----- def data -----
def data_upcheck (newdata, olddata)
newdata.each { |line|
olddata.each { |line2|
if line == line2 then
line["upchk"] = true
line2["upchk"] = true
end
}
}
newlist = []
oldlist = []
newdata.each_index { |i|
newlist << i if newdata[i]["upchk"].nil?
}
olddata.each_index { |i|
oldlist << i if olddata[i]["upchk"].nil?
}
return newlist, oldlist
end
def data_output ( data, file = nil )
$stderr.puts "CHK; file; " << file
if file.nil? then
fp = $stdout
else
fp = File.open( file, "w" )
end
data.each { |key, line|
list = []
list << key
line.each { |track|
list << track
}
fp.puts list.join("\t")
}
fp.close
end
#===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== =====
#----- data read ----
dir = ''
newbook = ttcsv_reader(dir + "book.txt", nil, "notrack")
newreviewer = ttcsv_reader(dir + "reviewer.txt", nil, "notrack")
newreview = ttcsv_reader(dir + "review.txt", nil, "notrack")
newreviewer_comment = nncomment_reader(dir + "reviewer_comment.txt")
newimage_hayakawa = ttcsv_reader(dir + "image_hayakawa.txt", nil, "notrack")
newimage_amazon = ttcsv_reader(dir + "image_amazon.txt", nil, "notrack")
dir = 'upchk/'
oldbook = ttcsv_reader(dir + "book.txt", nil, "notrack")
oldreviewer = ttcsv_reader(dir + "reviewer.txt", nil, "notrack")
oldreview = ttcsv_reader(dir + "review.txt", nil, "notrack")
oldreviewer_comment = nncomment_reader(dir + "reviewer_comment.txt")
oldimage_hayakawa = ttcsv_reader(dir + "image_hayakawa.txt", nil, "notrack")
oldimage_amazon = ttcsv_reader(dir + "image_amazon.txt", nil, "notrack")
#----- add and del check -----
addlist = {}
dellist = {}
addlist["book"], dellist["book"] = data_upcheck(newbook, oldbook)
addlist["review"], dellist["review"] = data_upcheck(newreview, oldreview)
addlist["reviewer"], dellist["reviewer"] = data_upcheck(newreviewer, oldreviewer)
addlist["reviewer_comment"], dellist["reviewer_comment"] = data_upcheck(newreviewer_comment, oldreviewer_comment)
#----- edit info link-----
#? hash-search-method ?
$stderr.puts "CHK; search review data"
#list = (addlist["reviewer_comment"], dellist["reviewer_comment"]).flat
newreviewer_comment.each_index { |i|
newreviewer.each_index { |j|
if newreviewer_comment[i]["r-code"] == newreviewer[j]["r-code"] then
newreviewer_comment[i]["reviewer-number"] = j
end
}
}
newbook.each{ |line| line["review-list"] = [] }
newreviewer.each{ |line| line["book-list"] = [] }
newreview.each_index { |i|
if newreview[i]["upchk"].nil? then
newbook.each_index { |j|
if newreview[i]["h-code"] == newbook[j]["h-code"] then
newbook[j]["review-list"] << i
newreviewer.each_index { |k|
if newreview[i]["r-code"] == newreviewer[k]["r-code"] then
newreviewer[k]["book-list"] << j
end
}
end
}
newreviewer.each_index { |j|
if newreview[i]["r-code"] == newreviewer[j]["r-code"] then
newreview[i]["reviewer-number"] = j
end
}
end
}
oldreviewer_comment.each_index { |i|
oldreviewer.each_index { |j|
if oldreviewer_comment[i]["r-code"] == oldreviewer[j]["r-code"] then
oldreviewer_comment[i]["reviewer-number"] = j
end
}
}
oldbook.each{ |line| line["review-list"] = [] }
oldreviewer.each{ |line| line["book-list"] = [] }
oldreview.each_index { |i|
if oldreview[i]["upchk"].nil? then
oldbook.each_index { |j|
if oldreview[i]["h-code"] == oldbook[j]["h-code"] then
oldbook[j]["review-list"] << i
oldreviewer.each_index { |k|
if oldreview[i]["r-code"] == oldreviewer[k]["r-code"] then
oldreviewer[k]["book-list"] << j
end
}
end
}
oldreviewer.each_index { |j|
if oldreview[i]["r-code"] == oldreviewer[j]["r-code"] then
oldreview[i]["reviewer-number"] = j
end
}
end
}
#----- filename -----
$stderr.puts "CHK; append output filename"
newbook.each { |line|
isbn = line["isbn"]
hcode = line["h-code"]
file = 'isbn' + isbn.downcase.gsub(/-/, '') + '.html' if isbn != ''
file = 'code' + hcode.downcase.gsub(/-/, '') + '.html' if isbn == ''
if (file == 'code.html') then
file = nil
$stderr.puts "WAR; filename; " + file
end
line["file"] = file
}
newreviewer.each { |line|
rcode = line["r-code"]
file = 'reviewer_' + rcode + '.html'
if (file == 'reviewer_.html') then
file = nil
$stderr.puts "WAR; filename; " + file
end
line["file"] = file
}
#----- history data -----
history = []
time = Time.now.strftime("%Y.%m.%d")
addlist["book"].each { |track|
str = time + "\t"
str << '『' + newbook[track]["title"] + '』'
str << 'の書籍情報を追加/修正'
history << str
}
dellist["book"].each { |track|
str = time + "\t" + '『' + oldbook[track]["title"] + '』の書籍情報を削除'
history << str
}
addlist["reviewer"].each { |track|
str = time + "\t"
str << '' + newreviewer[track]["reviewer"] + ''
str << ' さんの情報を追加/修正'
history << str
}
dellist["reviewer"].each { |track|
str = time + "\t" + oldreviewer[track]["reviewer"] + ' さんの情報を削除'
history << str
}
addlist["reviewer_comment"].each { |track|
rnum = newreviewer_comment[track]["reviewer-number"]
str = time + "\t"
str << '' + newreviewer[rnum]["reviewer"] + ''
str << ' さんの詳細情報を追加/修正'
history << str
}
dellist["reviewer_comment"].each { |track|
rnum = oldreviewer_comment[track]["reviewer-number"]
str = time + "\t" + oldreviewer[rnum]["reviewer"] + ' さんの詳細情報を削除'
history << str
}
newreviewer.each { |line|
if line["book-list"].size > 0 then
str = time + "\t"
member = []
line["book-list"].each { |track|
str_mem = '『'
str_mem << newbook[track]["title"] + '』'
member << str_mem
}
str << member.join + 'に'
str << ' ' + line["reviewer"] + ' さん'
str << 'の書評を追加/修正'
history << str
end
}
oldreviewer.each { |line|
if line["book-list"].size > 0 then
str = time + "\t"
member = []
line["book-list"].each { |track|
str_mem = '『' + oldbook[track]["title"] + '』'
member << str_mem
}
str << member.join + 'の '
str << line["reviewer"] + ' さん'
str << 'の書評を削除'
history << str
end
}
data_output(addlist, "addlist.dat")
data_output(dellist, "dellist.dat")
if history.size > 0 then
file = "history.txt"
$stderr.puts "CHK; file; " << file
if file.nil? then
fp = $stdout
else
fp = File.open( file, "a" )
end
#if file.nil? then
# fp.puts "#" + nowtime
# fp.puts "date\tinfo"
#end
history.each { |line|
fp.puts line
}
fp.close
end
#---------- isbn check -----
if flag_isbn == true then
newbook.each{ |line|
isbn = line["isbn"].downcase.gsub(/-/, '')
digit = 0
0.upto(isbn.size - 2) { |i|
digit = digit + isbn[i..i].to_i * (10 - i)
}
digit = 11 - (digit % 11)
check = digit.to_s
check = 'x' if digit == 10
check = '0' if digit == 11
if check != isbn[-1..-1].to_s then
$stderr.puts "ERR; isbn; " + line["isbn"]
end
}
end