OSDN Git Service

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