Exemplo n.º 1
0
        //----------------------------------------------------------------------
        // 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());
        }
Exemplo n.º 2
0
        //------------------------------------------------------------------
        // 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
Exemplo n.º 3
0
        //---------------------------------------------------------------------
        //    辞書引きのメインのサーチメソッド。
        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);
        }