#!/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!(/ /, ' ') @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!(/ /, ' ') # 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