/* SKKFEP/SKKGateのカタカナ確定のバグで発生した 破損データをユーザ辞書から除去するプログラム  過去のSKKFEP/SKKGateにはカタカナ確定の実装にバグが存在した。 20150708〜20160223版において拡張スクリプトがokuri=1で起動し、かつ[q] を使って確定を行った場合にまれに破損データが登録される可能性がある。  破損データは送りがなのついた候補であり、変換内容にカタカナ変換時と 同じ文字列を持つ。破損データは通常の方法では入力不可能なため、このま ま放置してもシステムへの悪影響はない。明確な問題が露見しなかったが故 に、バグ修正が遅れてしまったのはこのためである。無能の極みであると言 わざるを得ない。覇王翔吼拳。  コンピュータ様はアルファ・コンプレックス市民の親愛なる友人であり、 SKKは至高の存在でなければならない。問題の詳細が判明した現在、SKKの動 作に必要のない、破損データを放置し続けるなどという間抜けな事態は到底 看過できるものではない。状況を打開するためにこのプログラムを書いた。 【使いかた】 1. まず、SKKFEPとSKKGateを最新版にアップデートする。 2. 念のため「設定」でOK空押しを行い、設定レジストリもアップデートする。 3. このファイルをダウンロードし、ダブルクリックして実行する。破損デー タの件数と内容が表示されれば完了である。変更は即時反映されるため、 再起動は不要である。なお、実行後は本プログラムは不要となるので、 このファイルは削除すればよい。作戦成功だ!!(爆発音)  このプログラムはCC0 PUBLIC DOMAINです */ W = WScript X = ActiveXObject S = new X("WScript.Shell") F = new X("Scripting.FileSystemObject") try { G = new X("SKKGate") } catch (e) { quit("SKKFEPとSKKGateの最新版を使用してください") } r = clean(S.ExpandEnvironmentStrings("%APPDATA%\\SKKFEP\\skkuser.txt")) quit(r.length ? "破損データ" + r.length + "件を除去しました\n" + r : "辞書は正常です") /// 読込 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) { var a, c, i, I, n, t, x, s = [] if (F.FileExists(f)) for (t in f = ld(f)) { t = f[t] if (t.charAt(0) == ";") continue if (!/[a-z]\ /.test(t)) continue n = t.indexOf(" ") I = t.slice(0, n) for (x = "", i = 0; i < I.length - 1; i++) c = I.charCodeAt(i), x += String.fromCharCode(12352 < c && c < 12439 ? I.slice(i, 2) == "う゛" ? (i++, 12532) : c + 96 : c) a = t.slice(n, -1).split("/[") for (t in a) { t = a[t] if (t.slice(-2) == "/]") { t = t.slice(0, -2).split("/") if (/^[ぁ-んa-z]+$/.test(t[0])) { if (t[1].split(";")[0] == x) { G.Delete(I + "\1" + t[0], t[1].replace(";", "\2")) s.push(I + " [" + t[0] + "/" + t[1] + "]") } } } } } flush() return s } /// 反映 function flush() { try { S.Run(S.ExpandEnvironmentStrings("%windir%") + "\\IME\\SKK0\\skks.exe") } catch (e) {} } /// 終了 function quit(p) { W.Quit(S.Popup(p, 0, "SKKGate cleaner")) }