OSDN Git Service

8344c57be64a18cfb00b024a141bbed63be21210
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / pmd / parser / PmdParserExt1.java
1 /*
2  * pmd parser extension 1
3  *
4  * License : The MIT License
5  * Copyright(c) 2010 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd.parser;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
13
14 /**
15  * PMDモデルファイルのパーサ拡張その1。
16  * <p>※ 英名対応
17  */
18 public class PmdParserExt1 extends PmdParserBase {
19
20     private PmdEngHandler engHandler = NullHandler.HANDLER;
21     private boolean hasEnglishInfo = true;
22
23     /**
24      * コンストラクタ。
25      * @param source 入力ソース
26      */
27     public PmdParserExt1(InputStream source){
28         super(source);
29         return;
30     }
31
32     /**
33      * 英語ハンドラを登録する。
34      * @param handler ハンドラ
35      */
36     public void setEngHandler(PmdEngHandler handler){
37         if(handler == null){
38             this.engHandler = NullHandler.HANDLER;
39         }else{
40             this.engHandler = handler;
41         }
42         return;
43     }
44
45     /**
46      * {@inheritDoc}
47      * @throws IOException {@inheritDoc}
48      * @throws MmdFormatException {@inheritDoc}
49      */
50     @Override
51     protected void parseBody()
52             throws IOException, MmdFormatException{
53         super.parseBody();
54
55         if(hasMore()){
56             parseEngHeader();
57             if(this.hasEnglishInfo){
58                 parseEngBoneList();
59                 parseEngMorphName();
60                 parseEngBoneGroupName();
61             }
62         }
63
64         return;
65     }
66
67     /**
68      * PMDモデル英語基本情報のパースと通知。
69      * @throws IOException IOエラー
70      * @throws MmdFormatException フォーマットエラー
71      */
72     private void parseEngHeader()
73             throws IOException, MmdFormatException{
74         this.hasEnglishInfo = parseBoolean();
75
76         this.engHandler.pmdEngEnabled(this.hasEnglishInfo);
77         if( ! this.hasEnglishInfo ) return;
78
79         String modelName =
80                 parsePmdText(PmdLimits.MAXBYTES_MODELNAME);
81         String description =
82                 parsePmdText(PmdLimits.MAXBYTES_MODELDESC);
83         description = description.replace(CRLF, LF);
84
85         this.engHandler.pmdEngModelInfo(modelName, description);
86
87         return;
88     }
89
90     /**
91      * PMDモデル英語ボーン名のパースと通知。
92      * @throws IOException IOエラー
93      * @throws MmdFormatException フォーマットエラー
94      */
95     private void parseEngBoneList()
96             throws IOException, MmdFormatException{
97         int boneNum = getBoneCount();
98
99         this.engHandler.loopStart(PmdEngHandler.ENGBONE_LIST, boneNum);
100
101         for(int ct = 0; ct < boneNum; ct++){
102             String boneName =
103                     parsePmdText(PmdLimits.MAXBYTES_BONENAME);
104             this.engHandler.pmdEngBoneInfo(boneName);
105
106             this.engHandler.loopNext(PmdEngHandler.ENGBONE_LIST);
107         }
108
109         this.engHandler.loopEnd(PmdEngHandler.ENGBONE_LIST);
110
111         return;
112     }
113
114     /**
115      * PMDモデル英語モーフ名のパースと通知。
116      * @throws IOException IOエラー
117      * @throws MmdFormatException フォーマットエラー
118      */
119     private void parseEngMorphName()
120             throws IOException, MmdFormatException{
121         int morphNum = getMorphCount() - 1;  // base は英名なし
122
123         this.engHandler.loopStart(PmdEngHandler.ENGMORPH_LIST, morphNum);
124
125         for(int ct = 0; ct < morphNum; ct++){
126             String morphName =
127                     parsePmdText(PmdLimits.MAXBYTES_MORPHNAME);
128             this.engHandler.pmdEngMorphInfo(morphName);
129
130             this.engHandler.loopNext(PmdEngHandler.ENGMORPH_LIST);
131         }
132
133         this.engHandler.loopEnd(PmdEngHandler.ENGMORPH_LIST);
134
135         return;
136     }
137
138     /**
139      * PMDモデル英語ボーングループ名のパースと通知。
140      * @throws IOException IOエラー
141      * @throws MmdFormatException フォーマットエラー
142      */
143     private void parseEngBoneGroupName()
144             throws IOException, MmdFormatException{
145         int groupNum = getBoneGroupCount();
146
147         this.engHandler.loopStart(PmdEngHandler.ENGBONEGROUP_LIST, groupNum);
148
149         for(int ct = 0; ct < groupNum; ct++){
150             String boneGroupName =
151                     parsePmdText(PmdLimits.MAXBYTES_BONEGROUPNAME);
152             this.engHandler.pmdEngBoneGroupInfo(boneGroupName);
153
154             this.engHandler.loopNext(PmdEngHandler.ENGBONEGROUP_LIST);
155         }
156
157         this.engHandler.loopEnd(PmdEngHandler.ENGBONEGROUP_LIST);
158
159         return;
160     }
161
162 }