/* サンプル2 - 完全独立して変換処理を行うゲートの例 β0+11i対応版 */ /** @note 変換処理に特化したい場合はゲート2で動作させて標準スクリプトと組み合わせるのがお勧め。 標準スクリプトでは、L辞書で検索失敗した場合にゲート2に接続して検索を続行する。 この場合、学習処理はゲート0側で行なわれるため変換処理(case 0)だけ記述すればよい。 */ myself = 0 ///< 自分のゲート番号 Gate = new ActiveXObject("SKKGate"), Shell = new ActiveXObject("WScript.Shell") memory = {} ///< 辞書格納用 /// 学習 function study(i, c) { if (!(i in memory)) memory[i] = [] destroy(i, c) memory[i].unshift(c) } /// 消去 function destroy(i, c) { if (i in memory) for (var n = 0, block = memory[i]; n < block.length; n++) if (block[n] == c) block.splice(n--, 1) } /// 検索 function search(i) { return (index in memory) ? memory[index].join('\3') : "" } // 辞書の初期設定 study("かんじ", "漢字") study("かんじ", "幹事") study("かんじ", "監事") study("かんじ", "感じ") study("へぶんじょうたい", "ヘブン状態!!") study("あへがおだぶるぴーす", "アヘ顔ダブルピース") study("にんじゃすれいやー", "ニンジャスレイヤー\2ネオサイタマ炎上") var id, index, candidate, attrib // メイン for (;;) { id = Gate.Sync(myself) // 要求が来るまで待つ // 負の数の場合は必ず終了する (停止要求受信時 -1 / 二重起動検出時 -2) if (id < 0) { if (id == -2) { Shell.Popup("停止します") Gate.Sync(-1, myself) } break } switch (id) { case 0: // 変換 index = Gate.Get() attrib = Gate.Get(2) if (attrib >= 8) break // 特殊変換を除外 result = search(index).split(/\3|$/) for (var i in result) { var one = result[i] Gate.Put(one) } break case 2: // 学習 index = Gate.Get() candidate = Gate.Get(1) attrib = Gate.Get(2) if (attrib) break // 偽装確定を除外 study(index, candidate) break case 3: // 削除 index = Gate.Get() candidate = Gate.Get(1) attrib = Gate.Get(2) destroy(index, candidate) break } }