4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
10 import java.io.IOException;
11 import jp.sfjp.mikutoga.corelib.I18nText;
12 import jp.sfjp.mikutoga.math.MkPos3D;
13 import jp.sfjp.mikutoga.pmd.Rad3d;
14 import jp.sfjp.mikutoga.pmd.model.SerialNumbered;
15 import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
16 import jp.sfjp.mikutoga.xml.XmlExporter;
21 class ExtraExporter extends ProxyXmlExporter {
23 static final String PFX_SURFACEGROUP = "sg";
24 static final String PFX_TOONFILE = "tf";
25 static final String PFX_VERTEX = "vtx";
26 static final String PFX_BONE = "bn";
27 static final String PFX_RIGID = "rd";
28 static final String PFX_RIGIDGROUP = "rg";
30 private static final char CAP_BASIC_LATIN = '\u007f';
37 ExtraExporter(XmlExporter delegate){
44 * 任意の文字列がBasicLatin文字のみから構成されるか判定する。
46 * @return null、長さ0もしくはBasicLatin文字のみから構成されるならtrue
48 static boolean hasOnlyBasicLatin(CharSequence seq){
49 if(seq == null) return true;
50 int length = seq.length();
51 for(int pos = 0; pos < length; pos++){
52 char ch = seq.charAt(pos);
53 if(ch > CAP_BASIC_LATIN) return false;
60 * 文字参照によるエスケープを補佐するためのコメントを出力する。
62 * @throws IOException 出力エラー
64 void putUnescapedComment(CharSequence seq)
66 if( ! isBasicLatinOnlyOut() ) return;
67 if(hasOnlyBasicLatin(seq)) return;
68 sp().putLineComment(seq);
73 * 多言語識別名属性のローカルな名前をコメント出力する。
75 * @throws IOException 出力エラー
77 void putLocalNameComment(I18nText name)
79 String localName = name.getText();
80 if(localName.isEmpty()){
81 localName = "[NAMELESS]";
83 ind().putLineComment(localName);
88 * 多言語識別名属性のプライマリな名前を出力する。
91 * @throws IOException 出力エラー
93 void putPrimaryNameAttr(PmdAttr attr, I18nText name)
95 String attrName = attr.attr();
96 String primaryName = name.getPrimaryText();
97 putAttr(attrName, primaryName);
105 * @throws IOException 出力エラー
107 void putI18nName(I18nText text) throws IOException{
108 for(String lang639 : text.lang639CodeList()){
109 if(lang639.equals(I18nText.CODE639_PRIMARY)) continue;
110 String name = text.getI18nText(lang639);
111 ind().putOpenSTag(PmdTag.I18N_NAME.tag()).sp();
112 putAttr(PmdAttr.LANG.attr(), lang639).sp();
113 putAttr(PmdAttr.NAME.attr(), name).sp();
115 putUnescapedComment(name);
122 * 番号付けされたID(IDREF)属性を出力する。
124 * @param prefix IDプレフィクス
126 * @throws IOException 出力エラー
128 void putNumberedIdAttr(PmdAttr attr,
132 String attrName = attr.attr();
133 putRawText(attrName).putRawCh('=');
135 putRawText(prefix).putXsdInt(num);
141 * 番号付けされたID(IDREF)属性を出力する。
143 * @param prefix IDプレフィクス
144 * @param numbered 番号付けされたオブジェクト
145 * @throws IOException 出力エラー
147 void putNumberedIdAttr(PmdAttr attr,
149 SerialNumbered numbered )
151 putNumberedIdAttr(attr, prefix, numbered.getSerialNumber());
157 * @param position 位置情報
158 * @throws IOException 出力エラー
160 void putPosition(MkPos3D position)
162 putOpenSTag("position").sp();
164 putFloatAttr(PmdAttr.X.attr(),
165 (float) position.getXpos()).sp();
166 putFloatAttr(PmdAttr.Y.attr(),
167 (float) position.getYpos()).sp();
168 putFloatAttr(PmdAttr.Z.attr(),
169 (float) position.getZpos()).sp();
178 * @param rotation 姿勢情報
179 * @throws IOException 出力エラー
181 void putRadRotation(Rad3d rotation)
183 putOpenSTag("radRotation").sp();
185 putFloatAttr(PmdAttr.X_RAD.attr(), rotation.getXRad()).sp();
186 putFloatAttr(PmdAttr.Y_RAD.attr(), rotation.getYRad()).sp();
187 putFloatAttr(PmdAttr.Z_RAD.attr(), rotation.getZRad()).sp();