//---------------------------------------------------------------------- // 1つの語のデータの表示 (通常のKJ_dict用) // private string DisplayResult(string searchword, DocumentData sd) { StringBuilder rtn_str = new StringBuilder(); rtn_str.Length = 0; string key_from = ""; // 検索語 string key_to = ""; string word_from = ""; string word_to = ""; string detail = ""; string ex = ""; string cost = ""; string src = ""; string pos = ""; // 品詞情報、格変化 (暫定) String indent = ""; // 入力がハングルならfromがkey1(ハングル) // 入力が漢字・ひらがな・カタカナならfromがkey2(日本語) // // 入力が数字・英語の場合は,OSに依存。 // ・OSが"ja-JP"ならfromがkey1(ハングル) // ・OSが"ja-JP"以外ならfromがkey2(日本語) if (this.inputIsHangul) { key_from = sd.GetData("key1"); key_to = sd.GetData("key2"); word_from = sd.GetData("word1"); word_to = sd.GetData("word2"); ex = sd.GetData("ex1"); cost = sd.GetData("cost2"); } else { key_from = sd.GetData("key2"); // Jp key_to = sd.GetData("key1"); // Kr word_from = sd.GetData("word2"); word_to = sd.GetData("word1"); ex = sd.GetData("ex2"); cost = sd.GetData("cost1"); } // 表示の見た目を整える。インデントつけたり、括弧をつけたり。 // 入力語の表示 rtn_str.Append(key_from); if (word_from != "") { // 詳細情報は以下の場合だけ // ・韓国OSのとき // または // ・デバッグ情報表示時 if (this.cultureName == "ko-KR" || CodeCheck.IsKanji(word_from) || Setting.debugInfo) { // 詳細情報。ハングルの旧漢字、日本語の読み rtn_str.Append(" 〔 " + word_from + " 〕"); } } rtn_str.Append("\n"); // K-->Jの時の入力ハングルのカナ表記の表示 if (this.Setting.withPronunciation) { if (this.inputIsHangul) { if (this.Setting.PronunciationType == 1) { string kana = Hangul.Hangul2Kana(key_from); rtn_str.Append(" (" + kana + ")\n"); } else { rtn_str.Append(indent + " (" + sd.GetData("pronun1") + ")\n"); } } } // もしあれば品詞情報 pos = MakePosString(sd); if (pos != null && pos != "") { rtn_str.Append(indent + "【 " + pos + " 】\n"); } // もしあれば原形表示 string root = ""; if (inputIsHangul) { root = sd.GetData("root1"); } else { root = sd.GetData("root2"); } if (root != "") { string rootname = Pos.conjugationName("conjugation_root"); rtn_str.Append(indent + "〔(" + rootname + ") " + root + "〕\n"); } // 結果の表示 rtn_str.Append(indent + key_to); // 詳細情報は以下の場合だけ // ・韓国OSのとき // または // ・デバッグ情報表示時 if (word_to != "") { if (this.cultureName == "ko-KR" || CodeCheck.IsKanji(word_to) || Setting.debugInfo) { rtn_str.Append(" 〔 " + word_to + " 〕"); // 詳細情報。ハングルの旧漢字、日本語の読み } } rtn_str.Append("\n"); // J-->Kの時の結果ハングルのカナ表記の表示 if (this.Setting.withPronunciation) { // 表示の設定がされているときだけ if (!this.inputIsHangul) { if (this.Setting.PronunciationType == 1) { string kana = Hangul.Hangul2Kana(key_to); rtn_str.Append(indent + " (" + kana + ")\n"); } else { rtn_str.Append(indent + " (" + sd.GetData("pronun1") + ")\n"); } } } // その他付加情報 detail = MakeDetailString(sd); if (detail != null && detail != "") { rtn_str.Append(indent + "( " + detail + " )\n"); } if (ex != "") { rtn_str.Append(indent + "Ex. " + ex + "\n"); } // 「デバッグ情報表示」 を選んだ場合 if (Setting.debugInfo) { src = sd.GetData("src"); if (src != "") { rtn_str.Append(indent + "src:" + src + "\n"); } if (cost != "") { rtn_str.Append(indent + "cost:" + cost + "\n"); } string pos2 = sd.GetPos(); // posの生データ if (pos2 != "") { rtn_str.Append(indent + "pos:" + pos2 + "\n"); } } rtn_str.Append("\n"); prev_keyword = key_from; // 記憶 return(rtn_str.ToString()); }
//------------------------------------------------------------------ // 1つの語のデータを,表示用のstringに整形する。(edict用) // private string DisplayResult(string searchword, DocumentData sd) { StringBuilder rtn_str = new StringBuilder(); rtn_str.Length = 0; string key_from = ""; // 検索語 string key_to = ""; string word_from = ""; string word_to = ""; // string pos=""; // 品詞情報、格変化 (暫定) // String indent = ""; // 入力がアルファベットならfromがkey1(英語) // 入力が漢字・ひらがな・カタカナならfromがkey2(日本語) // // 入力が数字・英語の場合は,OSに依存。 // ・OSが"ja-JP"ならfromがkey1(英語) // ・OSが"ja-JP"以外ならfromがkey2(日本語) if (this.inputIsHangul) { key_from = sd.GetData("key1"); key_to = sd.GetData("key2"); word_from = sd.GetData("word1"); word_to = sd.GetData("word2"); } else { key_from = sd.GetData("key2"); // Jp key_to = sd.GetData("key1"); // Kr word_from = sd.GetData("word2"); word_to = sd.GetData("word1"); } // 表示の見た目を整える。インデントつけたり、括弧をつけたり。 if (prev_keyword != key_from && prev_keyword != "") { rtn_str.Append("\n\n"); } // 入力語の表示 if (prev_keyword != key_from) { rtn_str.Append(key_from); rtn_str.Append("\n"); } else { // 見出し語が一緒なら結果を ","で繋いで束ねる。 if (key_to != prev_answer) { rtn_str.Append(","); } } // 結果の表示 if (prev_keyword == key_from && key_to == prev_answer) { // NOP 重複する結果は表示しない } else { rtn_str.Append(key_to); } // もしあれば品詞情報 [2011/01/15 19:18:52] //edictの品詞情報は日本語についているので, //表示してもあまり意味がない。そのため表示しない。 // pos = MakePosString(sd); // if(pos != null && pos != ""){ // rtn_str.Append(indent + "【 " + pos + " 】\n"); // } // ~2011.01.15(old type) // // もしあれば品詞情報 // string pos = sd.GetData("pos"); // if(pos != null && pos != ""){ // rtn_str.Append("\n" + pos); // } // もしあれば補足情報 string detail1 = sd.GetData("detail1"); if (detail1 != null && detail1 != "") { rtn_str.Append("\n" + detail1); } prev_keyword = key_from; // 記憶 prev_answer = key_to; return(rtn_str.ToString()); } // end of DisplayResult_edict
//--------------------------------------------------------------------- // 辞書引きのメインのサーチメソッド。 public SearchResult Search(SearchType searchtype, String search_word) { SearchResult result = new SearchResult(); #if DEBUG_DICTLOG KJ_dict.WriteDebugLog ("------------------------------------------------------------"); KJ_dict.WriteDebugLog("Search Start"); #endif // 条件にマッチするarrayの要素の先頭番号を調べる long match_top = bsearch_top(searchtype, search_word); #if DEBUG_DICTLOG KJ_dict.WriteDebugLog("Search End"); #endif if (match_top == -1) { result.return_code = -1; result.documents = new ArrayList(); return(result); // 検索ができなかった } // マッチした先頭から順に取り出し,resultにつなぐ result.return_code = 0; result.documents = new ArrayList(); long index = match_top; int cnt = 0; while (true) { // suffix arrayのindex番目の語を取り出す String word = KJ_SuffixArray.GetWord(this.dict_fs, this.array_reader, index); // 取り出した語は検索条件にマッチするか? if (this.dictword.Compare(searchtype, search_word, word)) { // マッチするならその語を含むドキュメント全体を取り出す long dict_pointer = KJ_SuffixArray.GetSeekPointer(this.array_reader, index); DocumentData docdata = KJ_yaml.GetBlock(this.dict_fs, dict_pointer); // 既出でないならresultに追加 if (!result.IsExist(docdata)) { // 絞込みのフィルタ if (this.dictFilter(docdata)) { result.documents.Add(docdata); // 戻り値として追加 } else { // フィルタにマッチしないなら返さない cnt--; // adhocだが、先に1減じておく } } else { // 既出ならcntしない cnt--; // adhocだが、先に1減じておく } } else { break; // 一致しなければ終了 } index++; // suffix arrayの次へ if (index > array_index_max) { break; } // 検索語の数をカウント cnt++; if (cnt > 100) { result.return_code = 1; // 100個を越えたら中断 break; } } // 返すべき値がなければ戻り値を -1に if (cnt == 0) { result.return_code = -1; } // 検索結果を返す return(result); }