// // 置換系ルーチン // // (C)2004 M-Fr net Michiaki Furusho // // // using System; // Hashtable用 using System.Collections; namespace furu { // 単純に出力だけの複置換クラス public class simple_put : f_conv_obj { public override string m_conv(string b, string param) { return b; } } // 複置換の基礎クラス abstract public class f_conv_obj { // 実際にはvirtualクラス //public string m_conv(string b_string, string param) { return "NG"; } abstract public string m_conv(string b_string, string param); } // 解析用基底クラス abstract public class f_conv_param_fnc { //public string run(f_conv_param pp) { return ""; } abstract public string run(f_conv_param pp); } // ファイル解析のために使う内部用クラス public class f_conv_param { public f_conv_param_fnc fnc; public string key; public string data; public string param; public string pcwk; // public n_nomal n_nomal_obj; public n_key n_key_obj; public m_nomal m_nomal_obj; public m_b_key m_b_key_obj; public m_param m_param_obj; public m_data m_data_obj; public t_nomal t_nomal_obj; public t_key t_key_obj; public t_param t_param_obj; // XXX 多分staticで何とかなるはず // XXX メモリがおかしな食い違いを見せたら下記に戻す /* public n_nomal n_nomal_obj = new n_nomal(); public n_key n_key_obj = new n_key(); public m_nomal m_nomal_obj = new m_nomal(); public m_b_key m_b_key_obj = new m_b_key(); public m_param m_param_obj = new m_param(); public m_data m_data_obj = new m_data(); public t_nomal t_nomal_obj = new t_nomal(); public t_key t_key_obj = new t_key(); public t_param t_param_obj = new t_param(); */ }; public class n_nomal : f_conv_param_fnc { public override string run(f_conv_param pp) { string ret; // %%%でなければ次に進む int ind = pp.pcwk.IndexOf("%%%"); //Console.WriteLine(ind); if (0 < ind) { ret = pp.pcwk.Substring(0, ind); pp.pcwk = pp.pcwk.Remove(0,ind); return ret; } // XXX if (-1 == ind) { ret = "" + pp.pcwk; pp.pcwk = ""; return ret; } // 解析モードスタートにする pp.fnc = pp.n_key_obj; pp.pcwk = pp.pcwk.Remove(0,3); return ""; } } // 解析モード public class n_key : f_conv_param_fnc { public override string run(f_conv_param pp) { //Console.WriteLine("in key"); // 一気にKeyの解析を行う while("" != pp.pcwk) { //cout << "key is " << pp->key << endl; // %%%がみつかったら解析終了 if ( pp.pcwk.StartsWith("%%%") ) { pp.pcwk = pp.pcwk.Remove(0,3); // "%%%"をとばす pp.fnc = pp.n_nomal_obj; return ""; } // それ以外なら pp.key += pp.pcwk[0]; // キーの文字を足しこむ pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ } // XXX ここにはこないはずだが、一応 return ""; } } public class m_nomal : f_conv_param_fnc { public override string run(f_conv_param pp) { string ret; // $$$でなければ次に進む int ind = pp.pcwk.IndexOf("$$$"); //Console.WriteLine(ind); if (0 < ind) { ret = pp.pcwk.Substring(0, ind); pp.pcwk = pp.pcwk.Remove(0,ind); return ret; } // XXX if (-1 == ind) { ret = "" + pp.pcwk; pp.pcwk = ""; return ret; } // 解析モードスタートにする pp.fnc = pp.m_b_key_obj; pp.pcwk = pp.pcwk.Remove(0,3); return ""; } } public class m_b_key : f_conv_param_fnc { public override string run(f_conv_param pp) { //cout << "in key" << endl; //Console.WriteLine("in key"); // 一気にKeyの解析を行う while("" != pp.pcwk) { // $$$ならdataモードに移行 if ( pp.pcwk.StartsWith("$$$") ) { pp.pcwk = pp.pcwk.Remove(0,3); // "$$$"をとばす pp.fnc = pp.m_data_obj; return ""; } // ':'が出てきたらparam解析モードに if (':' == pp.pcwk[0]) { pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ pp.fnc = pp.m_param_obj; return ""; } // それ以外なら pp.key += pp.pcwk[0]; // キーの文字を足しこむ pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ } // XXX ここにはこないはずだが、一応 return ""; } } // パラメタ解析モード public class m_param : f_conv_param_fnc { public override string run(f_conv_param pp) { //cout << "in param" << endl; // 一気にKeyの解析を行う while("" != pp.pcwk) { //cout << "param is " << pp->param << endl; //Console.WriteLine("param is " + pp.param); // $$$ならdataモードに移行 if ( pp.pcwk.StartsWith("$$$") ) { pp.pcwk = pp.pcwk.Remove(0,3); // "$$$"をとばす pp.fnc = pp.m_data_obj; return ""; } // それ以外なら pp.param += pp.pcwk[0]; // パラメタの文字を足しこむ pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ } // XXX ここにはこないはずだが、一応 return ""; } } public class m_data : f_conv_param_fnc { public override string run(f_conv_param pp) { string fk; int fk_len; //cout << "in data" << endl; //Console.WriteLine("in data"); // 終了キーの作成 fk = "$$$/" + pp.key + "$$$"; fk_len = fk.Length; // 終了キーが見つかるまで pp.data = ""; while("" != pp.pcwk) { //cout << " data is " << pp->data << endl; //Console.WriteLine("data is " + pp.data); // キーがみつからなければdataに文字列を加えてループ if (!(pp.pcwk.StartsWith(fk))) { pp.data += pp.pcwk[0]; pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ continue; } // キーが見つかった場合の処理 pp.pcwk = pp.pcwk.Remove(0,fk_len); // pcwkを先に進める pp.fnc = pp.m_nomal_obj; // 関数ポインタを元に戻す return ""; } // XXX ここにはこないはずだが、一応 pp.fnc = pp.m_nomal_obj; // 関数ポインタを元に戻す return ""; } } public class t_nomal : f_conv_param_fnc { public override string run(f_conv_param pp) { string ret; // ***でなければ次に進む int ind = pp.pcwk.IndexOf("***"); //Console.WriteLine(ind); if (0 < ind) { ret = pp.pcwk.Substring(0, ind); pp.pcwk = pp.pcwk.Remove(0,ind); return ret; } // XXX if (-1 == ind) { ret = "" + pp.pcwk; pp.pcwk = ""; return ret; } // 解析モードスタートにする pp.fnc = pp.t_key_obj; pp.pcwk = pp.pcwk.Remove(0,3); return ""; } } // 解析モードon public class t_key : f_conv_param_fnc { public override string run(f_conv_param pp) { //cout << "in t_key" << endl; // 一気にKeyの解析を行う while("" != pp.pcwk) { // ***がみつかったら解析終了 if ( pp.pcwk.StartsWith("***") ) { pp.pcwk = pp.pcwk.Remove(0,3); // "**"をとばす pp.fnc = pp.t_nomal_obj; //cout << "t_key fin(1)" << endl; return ""; } // ':'が出てきたらparam解析モードに if (':' == pp.pcwk[0]) { //cout << "go to t_param" << endl; pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ pp.fnc = pp.t_param_obj; return ""; } // それ以外なら pp.key += pp.pcwk[0]; // キーの文字を足しこむ pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ //cout << "t_key key is " << pp->key << endl; } // XXX ここにはこないはずだが、一応 return ""; } } public class t_param : f_conv_param_fnc { public override string run(f_conv_param pp) { //cout << "in t_param" << endl; // 一気にKeyの解析を行う while("" != pp.pcwk) { //cout << "param is " << pp->param << endl; // ***がみつかったら解析終了 if ( pp.pcwk.StartsWith("***") ) { pp.pcwk = pp.pcwk.Remove(0,3); // "**"をとばす pp.fnc = pp.t_nomal_obj; return ""; } // それ以外なら pp.param += pp.pcwk[0]; // パラメタの文字を足しこむ pp.pcwk = pp.pcwk.Remove(0,1); // 次の文字へ } // XXX ここにはこないはずだが、一応 return ""; } } ///////////////////////////////////////////// // // 置換クラス メイン // ///////////////////////////////////////////// public class f_conv { ////////////////////// // public: ////////////////////// // 内部変数のチェック public string T_string() { string ret; ICollection keys; // ret = "単置換\n"; keys = mono_.Keys; foreach (string k in keys) { ret = ret + k + ": " + mono_[k] + "\n"; } ret += "\n"; // ret += "複置換\n"; keys = fuku_.Keys; foreach (string k in keys) { ret = ret + k + ": " + "\n"; } ret += "\n"; // ret += "特殊置換\n"; keys = toku_.Keys; foreach (string k in keys) { ret += k + "\n"; } ret += "\n"; // ret += "T_put Fin"; // return ret; } public void init() { // 特殊置換 toku_.Clear(); toku_yes_.Clear(); toku_no_.Clear(); // 単置換用データ mono_.Clear(); // 複置換用データ fuku_.Clear(); } // 特殊置換系登録 public bool monoDicToku(string name, string y, string n, ArrayList d) { if ("" == name) { return false; } // セット toku_[name] = d; toku_yes_[name] = y; toku_no_[name] = n; // return true; } // 単置換 public bool monoDic(string name, string value) { if ("" == name) { return false; } // mono_[name] = value; // return true; } // 複置換系 public bool multiDic(string name, f_conv_obj obj) { if ("" == name) { return false; } // fuku_[name] = obj; // return true; } // 置換 ラッパー public string conv_file(string filename) { string s = ""; try { System.IO.StreamReader sw = new System.IO.StreamReader(filename, System.Text.Encoding.GetEncoding("Shift_JIS") ); s = sw.ReadToEnd(); sw.Close(); } catch { s = "no serach file."; } // return this.conv(s); } /////////////////// // 置換本体 /////////////////// public string conv(string basedata) { string m_ret = ""; string t_ret = ""; string ret = ""; string buf = ""; f_conv_param pp = new f_conv_param(); // 置換用パラメタ編集 pp.n_nomal_obj = n_nomal_obj; pp.n_key_obj = n_key_obj; pp.m_nomal_obj = m_nomal_obj; pp.m_b_key_obj = m_b_key_obj; pp.m_param_obj = m_param_obj; pp.m_data_obj = m_data_obj; pp.t_nomal_obj = t_nomal_obj; pp.t_key_obj = t_key_obj; pp.t_param_obj = t_param_obj; // 初期処理 pp.pcwk = basedata; pp.fnc = pp.m_nomal_obj; pp.key = ""; pp.param = ""; pp.data = ""; // 複置換処理 ////////////////////////// //Console.WriteLine("$$"); while( "" != pp.pcwk) { buf = (pp.fnc).run(pp); //cout << "1:" << buf << endl; //Console.WriteLine("1:" + (pp.pcwk.Length).ToString() ); if ("" != pp.data) { if (!(fuku_.ContainsKey(pp.key))) { // keyが存在しない場合 //cout << "not find key..." << pp.key << endl; pp.data = ""; pp.param = ""; pp.key = ""; continue; } // keyがあればオブジェクトをcall // オブジェクトを取得 f_conv_obj obj = (f_conv_obj) fuku_[pp.key]; //Console.WriteLine( "call function " + pp.key + "(" + pp.param + ")" ); // オブジェクトのメソッドをcall buf = obj.m_conv(pp.data, pp.param); //Console.WriteLine( buf ); // pp.data = ""; pp.param = ""; pp.key = ""; } // 合算 if ("" != buf) { m_ret += buf; } } // 特殊置換処理 ////////////////////////// // 初期処理 pp.pcwk = m_ret; //Console.WriteLine("-----------------"); //Console.WriteLine(m_ret); //Console.WriteLine("-----------------"); pp.fnc = pp.t_nomal_obj; pp.key = ""; bool t_flg = false; ArrayList v = new ArrayList(); //Console.WriteLine("**"); while( "" != pp.pcwk) { buf = (pp.fnc).run(pp); // if ("" != pp.param) { //Console.WriteLine("main:: param is " + pp.param); // 特殊置換処理 if (!(toku_.ContainsKey(pp.key))) { // keyが存在しない場合 // 空の文字列を代入 //cout << "main:: not find key" << endl; v.Add(""); } else { v = (ArrayList)toku_[pp.key]; //cout << "main:: find key" << endl; } // パラメタとデータの突合せ t_flg = false; foreach (string s in v) { //cout << "main:: values " << s << endl; if (pp.param == s) { //cout << "main:: param == values" << endl; t_flg = true; break; } } //cout << "main:: Trap1" << endl; // データの設定 if (true == t_flg) { //cout << "main:: yes" << endl; // Yesのパターン if (!(toku_yes_.ContainsKey(pp.key))) { // keyが存在しない場合 //cout << "not find key..." << pp.key << endl; pp.key = ""; pp.param = ""; continue; } else { buf = (string)toku_yes_[pp.key]; } } else { //cout << "main:: no" << endl; // Noのパターン if (!(toku_no_.ContainsKey(pp.key))) { // keyが存在しない場合 //cout << "not find key..." << pp.key << endl; pp.key = ""; pp.param = ""; continue; } else { buf = (string)toku_no_[pp.key]; } } pp.key = ""; pp.param = ""; } // 合算 if ("" != buf) { t_ret += buf; } } // 単置換処理 ////////////////////////// // 初期処理 pp.pcwk = t_ret; pp.fnc = pp.n_nomal_obj; pp.key = ""; //Console.WriteLine("%%"); while( "" != pp.pcwk) { buf = (pp.fnc).run(pp); //cout << "::" << buf << endl; // if ("" != pp.key) { // 単置換処理 if (!(mono_.ContainsKey(pp.key))) { // keyが存在しない場合 //cout << "not find key..." << pp.key << endl; pp.key = ""; continue; } // データを取得 buf = (string)mono_[pp.key]; // pp.key = ""; } // 合算 if ("" != buf) { ret += buf; } } // return ret; } ////////////////////////////// // private: ////////////////////////////// // 特殊置換用データ private Hashtable toku_ = new Hashtable(); private Hashtable toku_yes_= new Hashtable(); // 値が一致したときの設定データ private Hashtable toku_no_= new Hashtable(); // 値が一致しないときの設定データ // 単置換用データ private Hashtable mono_= new Hashtable(); // 複置換用データ private Hashtable fuku_= new Hashtable(); // 分析用 public static n_nomal n_nomal_obj = new n_nomal(); public static n_key n_key_obj = new n_key(); public static m_nomal m_nomal_obj = new m_nomal(); public static m_b_key m_b_key_obj = new m_b_key(); public static m_param m_param_obj = new m_param(); public static m_data m_data_obj = new m_data(); public static t_nomal t_nomal_obj = new t_nomal(); public static t_key t_key_obj = new t_key(); public static t_param t_param_obj = new t_param(); } } // end of nameclass