#!/usr/bin/env ruby
#
# dic2html_2007b_v01.rb
# 通信用語の基礎知識 html変換スクリプト
#
# Ver 0.01 (2007/07/21)
# ・本文の無い単語が出力されないバグ修正(例:安全ブレーカー)
# ・単位や下付き文字等に使用されている\foo{bar};の表記をbarに変更するようにした
#
# Ver 0.00 (2006/07/04)
# ・新規作成
#
#
# 通信用語の基礎知識2007年後期版(http://www.wdic.org/)をhtml形式に変換
# 作成したindex.htmlはEBStudio(http://www31.ocn.ne.jp/~h_ishida/)
# でEPWINGに変換を行う。
# 本スクリプトはプラグインには未対応
#
# データの配置(例C:\dicで作業する場合)
# C:\dic\dic2html.rb (本スクリプト)
# \wdc072a\ (分野ごとのフォルダ、名前は何でも良い)
# \ *.DV6 (辞書ファイル:必須)
# \ *.WLF (グループリストファイル:必須)
# \ その他
# \wdc072c\
# \ 同上
# 以下略
#
#
#
require 'nkf'
$KCODE = 's' # Shift-JISで記述
#
# 罫線内の半角スペースを16x8の外字に置き換える(本スクリプト未対応)
# 置き換えるとザウルス使用時に表のレイアウトが崩れなくなる、ただしPC上では崩れる
# 1:置き換え
# 0:置き換えしない
# ConvSpc = 1
class Main
ExtWLF = '*.WLF' # グループリストファイル拡張子
ExtDV6 = '*.DV6' # 辞書ファイル拡張子
#
# main
#
def initialize
@cate = {'MILI' => true, 'CUL' => true, 'GEO' => true, 'MOE' => true,
'RAIL' => true, 'SCI' => true, 'TECH' => true, 'WDIC' => true}
@id = Hash.new(nil) # リンクID用ハッシュ
Dir.chdir(Dir.pwd) # Current取得
Dir.foreach(Dir.pwd){|dir| # idハッシュ作成
next if dir == '.'
next if dir == '..'
if FileTest.directory?(dir)
makeIDHash(dir)
end
}
fout = File.open('index.html', 'w')
addHeader(fout)
Dir.foreach(Dir.pwd){|dir| # html変換
next if dir == '.'
next if dir == '..'
if FileTest.directory?(dir)
dir2HTML(dir, fout)
end
}
addFooter(fout)
fout.close
end
# グループリストファイルからグループ名を、辞書ファイルから語句を取得
def makeIDHash(dir)
print "Creating ID Hash... #{dir}\n"
Dir.chdir(dir) # Currentを対象ディレクトリへ移動
cnt = 0 # id番号
groupFileList = Dir.glob(ExtWLF)
groupfile = groupFileList[0] # foo.WLF
if !groupfile.nil? # グループリストファイルが存在しなければ何もしない
prefix = groupfile.split('.')[0] # foo
dicFileList = Dir.glob(ExtDV6) # *.DV6
dicFileList.each{|dicfile|
print " Search ... #{dicfile}\n"
fin = File.open(dicfile)
while(li = fin.gets)
line = NKF.nkf('-m0Wsx', li.chomp!) # UTF->SJIS
if line =~ /^#(.+)$/ # 語句抽出
item = $1
if item
item.gsub!(/\\/, '') # 「\」削除
# item.gsub!(/&/, '&')
item.gsub!(/, '<')
item.gsub!(/>/, '>')
# item.gsub!(/"/, '"')
# item.gsub!(/ /, ' ')
@id["#{prefix}#{item}"] = "#{prefix}" + sprintf("%06d", cnt) # ハッシュに登録
cnt += 1
end
end
end
fin.close
}
end
Dir.chdir('..')
end
# 1分野(1ディレクトリ)をhtmlへ変換
def dir2HTML(dir, fout)
print "Convert... #{dir}\n"
Dir.chdir(dir) # Currentを対象ディレクトリへ移動
groupFileList = Dir.glob(ExtWLF)
groupfile = groupFileList[0]
prefix = groupfile.split('.')[0]
dicFileList = Dir.glob(ExtDV6)
dicFileList.each{|dicfile|
print "Convert...... #{dicfile}\n"
dicFile2HTML(dicfile, fout, prefix)
}
Dir.chdir('..')
end
# 1個のDICファイルをhtmlへ変換
# status
# 0: IDLE
# 1: 単語行を処理した
# 2: 読み、品詞、スペルを処理中
# 3: 内容項目出力中
# 4: 表処理中
# 5: リンク行
def dicFile2HTML(file, fout, prefix)
status = 0
tango = ''
id = -1
a_yomi = Array.new
a_kana = Array.new
a_spell = Array.new
a_pos = Array.new
f = File.open(file)
while(li = f.gets)
line = NKF.nkf('-m0Wsx', li.chomp!) # UTF -> SJIS
line.gsub!(/\\.+?\{(.+?)\};/, '\1') # \foo{bar}; を barに (07/07/21追加)
# line.gsub!(/&/, '&')
line.gsub!(/, '<')
line.gsub!(/>/, '>')
# line.gsub!(/"/, '"')
# line.gsub!(/ /, ' ')
# if line =~ /\\date\{/ # \date{…}除去
# line.gsub!(/\\date\{/, '')
# line.gsub!(/\}\;/, '')
# end
#p prefix
#p file
#p line
case line
# 行頭から文字が存在する場合
when /^\S/
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2 # 内容記述の無い単語出力の為 (07/07/21追加)
if status != 0
fout.print "\n" # 前の項目処理終了
a_yomi.clear
a_kana.clear
a_spell.clear
a_pos.clear
end
if line !~ /^#/ # 単語行でなければ
status = 0
else # 単語行の処理
line =~ /^#(.+)$/
tango = $1
if tango
id, tango = getID(tango, prefix) # id取得
fout.print "
#{tango}\n"
status = 1
else
print "Skip #{line}\n"
status = 0
end
end
when /^\t+(dir:|author:|valid:|pron:|flag:|expire:|qyomi:)/ # Skip項目
next if status == 0
# status = x
when /^\tyomi:/
next if status == 0
line =~ /^\tyomi:(.+)$/
yomi = $1
yomi.gsub!(/\-/, '')
a_yomi.push(yomi)
kana = NKF.nkf('-m0Sshx', yomi)
a_kana.push(kana)
status = 2
when /^\tspell:/
next if status == 0
line =~ /^\tspell:(.+)$/
a_spell.push($1)
status = 2
when /^\tpos:/
next if status == 0
line =~ /^\tpos:(.+)$/
a_pos.push($1)
status = 2
when /^\t+(\*|\+|>>) / # 内容出力「*」「+」「>>」
next if status == 0
# よみ、品詞、スペル出力
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2
line =~ /^\t+(\*|\+|>>)(.+)$/
kigou = $1
item = $2
kigou = '*' if kigou == '*'
kigou = '+' if kigou == '+'
item.gsub!(/\/\/.*?\//, '') # 「//…/」 別分野へのリンク削除(単語付き)
item.gsub!(/\[\[\/\w+\//, '') # 「[[/abc/」別分野へのリンク削除
item.gsub!(/\[\[\w+\//, '') # 「[[abc/」別分野へのリンク削除
item.gsub!(/\[\[/, '') # リンク左かっこ削除
item.gsub!(/\]\]/, '') # リンク右かっこ削除
fout.print "#{kigou}#{item}
\n"
status = 3
when /^\t+=>/ # リンク=>出力
next if status == 0
# よみ、品詞、スペル出力
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2
line =~ /^\t+=> \[\[(.+)\]\]/
tango = $1
id = getID(tango, prefix)
fout.print "=> #{tango}
\n"
status = 3
when /^\t+(\)\)|\|\||\|\=|:>|:<)/ # 表出力「))」「||」「|=」「:<」「>:」
next if status == 0
# よみ、品詞、スペル出力
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2
line =~ /^\t+(\)\)|\|\||\|\=|:>|:<) (.*)$/
k = $1
item = $2
kigou = ''
kigou = '★' if k == ':>'
kigou = '☆' if k == ':<'
item.gsub!(/\/\/.*?\//, '') # 「//…/」 別分野へのリンク削除(単語付き)
item.gsub!(/\[\[\/\w+\//, '') # 「[[/abc/」別分野へのリンク削除
item.gsub!(/\[\[\w+\//, '') # 「[[abc/」別分野へのリンク削除
item.gsub!(/\[\[/, '') # リンク左かっこ削除
item.gsub!(/\]\]/, '') # リンク右かっこ削除
fout.print "#{kigou}#{item}
\n"
status = 4
when /^\t+(=|::?|%%)/ # 「=」「:」「::」「%%」
next if status == 0
# よみ、品詞、スペル出力
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2
line =~ /^\t+(=|::?|%%) (.+)/
kigou = $1
item = $2
case kigou
when '='
kigou = '▼'
when ':'
kigou = '▽'
when /::/
kigou = '◆'
when /%%/
kigou = '◇'
end
fout.print "#{kigou}#{item}
\n"
status = 3
when /^\t\/\/LINK/ # LINK行開始
next if status == 0
# よみ、品詞、スペル出力
printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout) if status == 2
status = 5
when /^\t+-/ # 「-」LINK行処理
next if status == 0
if line !~ /\[\[/ # [[…]]が存在しない場合
item = line.sub(/^\t+-/, '')
fout.print "◇#{item}
\n"
elsif line =~ /.*\[\[.*<.+>.*\]\].*/ # [[…<…>…]]の場合
item = line.sub(/^\t+-/, '')
item.gsub!(/\[\[/, '')
item.gsub!(/\]\]/, '')
fout.print "◇#{item}
\n"
elsif line =~ /^\t+(-\!?.*)\[\[(.+)\]\](.*)$/
pre = $1
item = $2
post = $3
pre.sub!(/^\-\!?\s/, '◇')
if item =~ /(http:|https:|ftp:|urn:|geo:|news:|phone:)/
fout.print "#{pre}#{item}#{post}
\n"
else
id, tango = getID(item, prefix)
fout.print "#{pre}#{tango}#{post}
\n"
end
end
status = 5
# その他
else
if line =~ /^\t/
fout.print "Error Unknown Line : #{line}\n"
end
end
end
f.close
end
# 単語からIDを取得
def getID(tango, prefix)
word = tango.gsub(/\\/, '') # 「\」削除
if word =~ /^\/(.+?)\/(.+)$/ # /…/が他分野であるか判定
pre = $1
w = $2
if @cate[pre] # 他分野の場合
word = w
else
pre = prefix
end
else
pre = prefix
end
id = @id["#{pre}#{word}"] # 単語に対応するid取得
id = 'Error no ID ' if id.nil? # idが登録されていない
return id, word
end
# かな、読み、spell、品詞出力
def printAttr(a_yomi ,a_kana ,a_spell, a_pos, fout)
flag = nil
a_kana.each{|kana|
fout.print"#{kana}\n"
}
fout.print "\n"
a_yomi.each{|yomi|
fout.print"[#{yomi}]"
flag = true
}
fout.print " " if flag
flag = nil
a_spell.each{|spell|
fout.print"(#{spell})"
flag = true
}
fout.print " " if flag
flag = nil
a_pos.each{|pos|
pos.gsub!(/,/, "/")
fout.print"〔#{pos}〕"
}
fout.print"
\n"
end
# html header 出力
def addHeader(fout)
fout.print <<'EOF'
サンプル文書
EOF
end
# html footer 出力
def addFooter(fout)
fout.print <<'EOF'
EOF
end
end
Main.new