OSDN Git Service

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