/* SKK送りがな入力補正辞書フォーマット拡張実証実験用試作 略して「SKKプラス」 β0+10i以前の旧バージョン用のユーザ辞書内データの削除ツール ユーザ辞書に設定を行うタイプの古い方式の補正データをユーザ辞書から除去します 変更は即時反映されます。再起動は不要です 【使いかた】 1. このページを「名前をつけて保存」します 2. 保存したプログラム(skkplus.js)をエクスプローラでダブルクリックして実行します 3. おわり このプログラムはCC0 PUBLIC DOMAINです β0+11i対応版 */ /* SKK送りがな入力補正辞書フォーマット拡張実証実験用試作 略して「SKKプラス」 送りがな入力補正辞書ファイル(skkplus.txt)を読み込み、ユーザ辞書に設定します 変更は即時反映されます。再起動は不要です 【使いかた】 1. このページを「名前をつけて保存」します 2. 保存したプログラム(skkplus.js)をエクスプローラでダブルクリックして実行します 3. 自動的に辞書ファイル(skkplus.txt)がダウンロードされ、ユーザ辞書に設定が書き込まれます 4. 設定後はこのプログラムと辞書ファイルは不要になるので削除しておきましょう 5. おわり なお、既に設定済みだった場合は、ユーザ辞書に書き込まれた設定が解除されます このプログラムはCC0 PUBLIC DOMAINです */ URL = "http://coexe.web.fc2.com/skkplus.txt" FILENAME = "skkplus.txt" ANNOTATION = "入力補正" W = WScript X = ActiveXObject S = new X("WScript.Shell") F = new X("Scripting.FileSystemObject") try { G = new X("SKKGate") } catch (e) { quit("SKKFEPとSKKプラスの最新版を使用してください") } !clean(S.ExpandEnvironmentStrings("%APPDATA%\\SKKFEP\\skkuser.txt")) || quit("旧設定を消去しました") /* F.FileExists(FILENAME) || dl(URL, FILENAME) F.FileExists(FILENAME) || quit("ダウンロードに失敗しました") setup(FILENAME, ANNOTATION) quit("送りがな入力補正情報を設定しました") */ quit("ユーザ辞書は正常です") /// ダウンロード function dl(u, f) { var h = new X("MSXML2.XMLHTTP"), s = 1 try { h.Open("GET", u, 0) h.Send() s = h.status } catch (e) {} if (s == 200) with (new X("ADODB.Stream")) { Type = 1 Open() Write(h.responseBody) SaveToFile(f, 2) s = 0 } return s } /// 読込 function ld(f, a) { with (new X("ADODB.Stream")) { Type = 2 Charset = "iso-8859-1" Open() LoadFromFile(f) a = ReadText(2) Close() Charset = a == "\xFF\xFE" ? "utf-16" : "_autodetect" Open() LoadFromFile(f) a = ReadText(-1).split(/\r|\n|\r\n/) Close() } return a } /// 消去 function clean(f) { if (!F.FileExists(f)) return var a, d = ld(f).reverse(), i, j, k, t, x, c = 0 for (i in d) { // コメント行をスキップ t = d[i] if (t.charAt(0) == ";") continue // 送りなし候補をスキップ x = t.split(" ")[0] if (!/^[ぁ-ん]+[a-z]$/.test(x)) continue // 送りがなつきの補正情報と「ん+な行」で開始するものを削除 a = t.slice(0, -1).split("/[") for (j in a) { t = a[j] if (t.slice(-2) != "/]") continue t = t.slice(0, -2).split("/") if (!/^[ぁ-ん\*]+$/.test(t[0])) continue for (k = 1; k < t.length; k++) if (t[k].split(";")[0].indexOf("*") + 1 || /^ん[なにぬねの]/.test(t[0])) G.Delete(x + "\1" + t[0], t[k].replace(";", "\2")), c++ } // 送りがなのない補正情報を削除 a = G.Search(x, 2).split(/\3|$/) for (j in a) if (a[j].split("\2")[0].indexOf("*") + 1) G.Delete(x, a[j]), c++ } flush() return c } /* /// 設定 function setup(f, n) { var A = {}, B = {}, C = {}, a, d = ld(f), i, j, k, p, q, r, x for (i in d) { if (d[i].charAt(0) == ";") continue a = d[i].replace(/[ \t]+;.*$/, "").split(/[ \t]+/), x = a[0] if (!/^[ぁ-ん]+[a-z]$/.test(x)) continue if (!A[x]) A[x] = [], B[x] = [], C[x] = [] for (j = 1; j < a.length; j++) { p = a[j], q = p.replace(/[ぁ-ん]+$/, "") if (p.indexOf("?") + 1) continue p = p.slice(q.length).replace(/\/$/, "").replace(";", "\2"), q = q || "*" if (j > 1 && !p && q == "*") p = q if (q.indexOf("\2") < 0) { if (q.indexOf("*") < 0) { r = G.Search(x).split(/\3|$/) for (k in r) if (r[k].split("\2")[0] == q) q = r[k] } else q += "\2" + n } p = [p, q] if (q.charAt(0) == "*") C[x].unshift(p) else if (q.split("\2")[0].indexOf("*") + 1) B[x].unshift(p) else A[x].unshift(p) } } a = [] for (i in A) if (B[i].length || C[i].length) a.unshift(i) for (j in a) i = a[j], up(i, C[i]), up(i, B[i]), up(i, A[i]) flush() } /// 更新 function up(i, a) { for (var j in a) G.Update(i + "\1" + a[j][0], a[j][1], 0, 1) } */ /// 反映 function flush() { try { S.Run(S.ExpandEnvironmentStrings("%windir%") + "\\IME\\SKK0\\skks.exe") } catch (e) {} } /// 終了 function quit(p) { W.Quit(S.Popup(p, 0, "SKKPlus")) }