/** 東方Project辞書 Release 6 http://9lab.jp/works/dic/th-dic.php のローマ字かな変換規則外の英字エントリを補正した汎用テキスト辞書を再構築する 【使いかた】 1. 東方Porject辞書(MS-IME版またはGoogle版)をダウンロードして展開する。 MS-IME版のほうが編集元っぽいのでおすすめ。どちらを使ってもSKKでは99%同じ辞書になる。 内容をきっちり比べれば一体どの文字がGoogleに欠落『そーなのかー』理解できるはず。 2. 展開したフォルダ内でこのプログラムを実行する。 3. 「thdic-r6-0-総合.txt」の不要なエントリがAbbrevモード用の英字で置き換えられた 「thdic-r6.txt」が出力される。 4. SKK日本語入力FEPならこのまま利用できるので辞書フォルダにコピーする。 5. おわり。  このプログラムはCC0 PUBLIC DOMAINです */ LOADFILE = "thdic-r6-0-総合.txt" SAVEFILE = "thdic-r6.txt" ENCODING = "shift_jis" /// 読みを厳密なひらがなか英字に合致するように補正するためのテーブル /// @note 好みでabbrevの英字に置き換えたほうがSKK使いにとっては利用しやすいかも REPLACE = { "あんのうんx": "あんのうんえっくす", // unknownx "そらにうかぶぶったいx": "そらにうかぶぶったいえっくす", // soraniukabubuttaix "gのむこう": "gnomukou", // "じーのむこう"は既出 "ghqくらいしす": "じーえっちきゅーくらいしす", // ghqcrysis "まいなすk": "まいなすけー", // minusk "もf": "mf", // えむえふ "にんぎょうsp": "にんぎょうえすぴー", // ningyousp "cりこしぇ": "しーりこしぇ", // cricochet "まじかるr360": "まじかるあーる360", // magicalr360 "dなのきず": "でぃーえぬえーのきず", // dnanokizu "ゆうせいよりのだんまくx": "ゆうせいよりのだんまくえっくす", // yuuseiyorinodanmakux "すーぱーすこーぷ3d": "すーぱーすこーぷすりーでぃー", // superscope3d "20っxねんしごのたび": "にせんえっくすえっくすねんしごのたび", // 20xxnensigonotabi "20xxねんしごのたび": "にーぜろえっくすえっくすねんしごのたび", // 20xxnensigonotabi "3dぷりんたーがん": "すりーでぃーぷりんたーがん", // 3dprintergun "ゆうげまがん": "ゆうげんまがん", // 誤字修正 "たぶぁらさ": "tabularasa", // 自動抽出判定漏れ "かstぇえxpぉれr": "castleexplorer", // 自動抽出単語過剰 "とうほうpろじぇct": "touhouproject", // 自動抽出情報なし "あのrであlfろmごd": "anordealfromgod", // 自動抽出情報なし "えてrなldれあm": "eternaldream", // 自動抽出情報なし "": "" } X = ActiveXObject thdic_fix(LOADFILE, SAVEFILE) /// 東方Project辞書を再構築する function thdic_fix(infile, outfile) { var a = ld(infile), o = [], l, z, t for (l in a) { l = a[l], z = l.split("\t"), t = z[0] // コメントと空行 if (t.length == 0 || t.charAt(0) == "!") { o.push(l) continue } // 文字の正規化 (フェーズ0) t = t.replace(/[!-z]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - 65248) }) // .replace(/ヴ/g, "う゛") // 他のSKKで使いたい場合はこの行を有効化せよ // 厳密なローマ字かな変換になるよう修正 (フェーズ1) if (t in REPLACE) t = REPLACE[t] if (t != z[0]) z[0] = t, l = z.join("\t") // 正常なエントリならそのまま登録 if (/^[a-z]+$/.test(t) || !/[a-z]/.test(t)) { o.push(l) continue } // ローマ字かな変換規格外の単語をAbbrevモード用の英字で補完 (フェーズ2) if (/^[\x20-\x7E]+$/.test(z[1])) { z[0] = z[1].replace(/[^A-Za-z]/g, "").toLowerCase(), l = z.join("\t") o.push(l) continue } // 変換できなかった候補をコメントアウトして残す o.push("!無効\t" + l) } sv(outfile, o) } /// ロード function ld(f, a) { with (new X("ADODB.Stream")) { Charset = "iso-8859-1", Open(), LoadFromFile(f), a = ReadText(2), Close(), Charset = a == "\xFF\xFE" ? "utf-16" : a == "\xE3\x81" ? "utf-8" : "_autodetect", Open(), LoadFromFile(f), a = ReadText(-1).split("\r\n"), a.pop(), Close() } return a } /// セーブ function sv(f, a) { with (new X("ADODB.Stream")) { Charset = ENCODING, Open(), WriteText(a.join("\r\n"), 1), SaveToFile(f, 2), Close() } }