Changeset 9410 for lang/java/NanikaKit

Show
Ignore:
Timestamp:
04/14/08 00:19:57 (5 years ago)
Author:
tarchan
Message:

lang/java/NanikaKit: 里々のトーク取得処理を追加

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/java/NanikaKit/trunk/src/test/com/mac/tarchan/nanika/NiseSatori.java

    r9407 r9410  
    1313import java.io.InputStreamReader; 
    1414import java.util.Arrays; 
    15 import java.util.HashMap; 
     15import java.util.LinkedHashMap; 
    1616import java.util.LinkedList; 
    1717import java.util.List; 
     
    1919import java.util.Random; 
    2020import java.util.Scanner; 
     21import java.util.regex.Matcher; 
    2122import java.util.regex.Pattern; 
    2223 
     
    4546 
    4647        /** トーク辞書 */ 
    47         private Map<String, List<String>> talks = new HashMap<String, List<String>>(); 
     48        private Map<String, List<String>> talks = new LinkedHashMap<String, List<String>>(); 
    4849 
    4950        /** 単語辞書 */ 
    50         private Map<String, List<String>> words = new HashMap<String, List<String>>(); 
     51        private Map<String, List<String>> words = new LinkedHashMap<String, List<String>>(); 
    5152 
    5253        /** 区切り文字 */ 
     
    7374                        loadDic(entry); 
    7475                } 
    75 //              load_dic(list[0]); 
     76                log.debug("トーク: " + talks.size() + "," + talks.keySet()); 
     77                log.debug("単語: " + words.size() + "," + words.keySet()); 
    7678 
    7779                return true; 
     
    120122                        } 
    121123 
    122 //                      while (s.hasNextLine()) 
    123 //                      { 
    124 //                              String line = s.nextLine(); 
    125 ////                            log.trace("line=" + line); 
    126 //                              if (line.startsWith("*")) 
    127 //                              { 
    128 //                                      scanTalk(s, line); 
    129 //                              } 
    130 //                              else if (line.startsWith("@")) 
    131 //                              { 
    132 //                                      scanWord(s, line); 
    133 //                              } 
    134 //                      } 
    135  
    136124                        reader.close(); 
    137125                } 
     
    186174                { 
    187175                        if (s.hasNextLine()) line = s.nextLine(); 
    188                         else 
    189                         { 
    190                                 line = null; 
    191                                 break; 
    192                         } 
     176                        else return null; 
    193177 
    194178                        // 単語を登録 
    195                         if (delimiter.matcher(line).matches()) break; 
     179                        if (delimiter.matcher(line).matches()) return line; 
    196180                        else putWord(key, line); 
    197181                } 
    198  
    199                 return line; 
    200182        } 
    201183 
     
    259241 
    260242        /** 
     243         * 単語を返します。 
     244         *  
     245         * @param key キー 
     246         * @return 単語 
     247         */ 
     248        private String getWord(String key) 
     249        { 
     250                List<String> list = words.get(key); 
     251                if (list == null) return null; 
     252 
     253                int len = list.size(); 
     254                int index = rand.nextInt(len); 
     255                String word = list.get(index); 
     256                return word; 
     257        } 
     258 
     259        /** 
    261260         * さくらスクリプトを返します。 
    262261         *  
     
    270269//              return "\\0\\s[0]こんにちは。\\1\\s[10]よぉ。\\e"; 
    271270                String talk = getTalk(""); 
     271                log.debug("里々=" + talk); 
     272                talk = eval(talk); 
     273                log.debug("さくら=" + talk); 
    272274                return talk; 
    273275        } 
     276 
     277        /** 
     278         * 里々スクリプトをさくらスクリプトに変換します。 
     279         *  
     280         * @param talk 里々スクリプト 
     281         * @return さくらスクリプト 
     282         */ 
     283        public String eval(String talk) 
     284        { 
     285                Scanner s = new Scanner(talk); 
     286                StringBuilder buf = new StringBuilder(); 
     287//              Pattern p = Pattern.compile("(?:|((.+)))"); 
     288//              while (s.hasNextLine()) 
     289                while (true) 
     290                { 
     291                        String find = s.findInLine(":|((.+?))|[^:(]+"); 
     292                        if (find == null) break; 
     293                        log.debug("find=" + find); 
     294 
     295                        if (find.startsWith(":")) 
     296                        { 
     297                                 
     298                        } 
     299                        else if (find.startsWith("(")) 
     300                        { 
     301                                String key = find.substring(1, find.length() - 1); 
     302                                String word = getWord(key); 
     303                                if (word == null) word = key; 
     304                                buf.append("{" + word + "}"); 
     305                        } 
     306                        else 
     307                        { 
     308                                buf.append(find); 
     309                        } 
     310                } 
     311 
     312                return buf.toString(); 
     313        } 
     314 
     315        /** 
     316         * テスト001 
     317         */ 
     318        public void test001() 
     319        { 
     320                String in = ":普通のポストで終わりたくないなぁ……\n:……っていうかお前、自分を普通だと思ってたのか。\n:え?"; 
     321                String out = "\\0\\s[0]\\1\\s[10]\\0普通のポストで終わりたくないなぁ…\\w2…\\w2\\n\\_w[126]\\n[half]\\1…\\w2…\\w2っていうかお前、\\_w[78]自分を普通だと思ってたのか。\\_w[84]\\n\\n[half]\\0え?\\e"; 
     322                if (eval(in).equals(out)) System.out.println("OK"); 
     323                else System.out.println("NG"); 
     324        } 
    274325}