OSDN Git Service

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