2 * typical morph information
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.typical;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.EnumMap;
15 import java.util.HashMap;
16 import java.util.List;
18 import javax.xml.parsers.ParserConfigurationException;
19 import jp.sourceforge.mikutoga.pmd.MorphType;
20 import org.w3c.dom.Element;
21 import org.w3c.dom.NodeList;
22 import org.xml.sax.SAXException;
27 * <p>各モーフ情報はひとつ以上のプライマリ名(≒日本語名)と
28 * ゼロ個以上のグローバル名(≒英語名)を持つ。
30 * <p>和英対訳はMMD Ver7.39の同梱モデルにほぼ準拠。
32 public final class TypicalMorph extends TypicalObject {
34 private static final Class<?> THISCLASS = TypicalMorph.class;
35 private static final String MORPH_XML = "resources/typicalMorph.xml";
37 private static final List<TypicalMorph> EMPTY = Collections.emptyList();
39 private static final Map<MorphType, List<TypicalMorph>> TYPED_MAP =
40 new EnumMap<MorphType, List<TypicalMorph>>(MorphType.class);
42 private static final Map<String, TypicalMorph> PRIMARY_MAP =
43 new HashMap<String, TypicalMorph>();
44 private static final Map<String, TypicalMorph> GLOBAL_MAP =
45 new HashMap<String, TypicalMorph>();
49 InputStream is = THISCLASS.getResourceAsStream(MORPH_XML);
52 top = TypicalObject.loadXml(is);
53 }catch(ParserConfigurationException e){
54 throw new ExceptionInInitializerError(e);
55 }catch(SAXException e){
56 throw new ExceptionInInitializerError(e);
57 }catch(IOException e){
58 throw new ExceptionInInitializerError(e);
67 private final MorphType type;
72 * <p>各初期数が0以下の場合は、状況に応じて伸長する連結リストが用意される。
74 * @param primaryNo プライマリ名初期数。
75 * @param globalNo グローバル名初期数。
77 private TypicalMorph(MorphType type, int primaryNo, int globalNo){
78 super(primaryNo, globalNo);
88 private static void parse(Element top) {
89 NodeList groupList = top.getElementsByTagName("morphGroup");
90 int groupNo = groupList.getLength();
91 for(int idx = 0; idx < groupNo; idx++){
92 Element group = (Element) groupList.item(idx);
97 for(MorphType morphType : MorphType.values()){
98 if( ! TYPED_MAP.containsKey(morphType) ){
99 TYPED_MAP.put(morphType, EMPTY);
108 * @param group morphGroup要素
110 private static void parseGroup(Element group){
111 String typeAttr = group.getAttribute("type");
112 MorphType morphType = MorphType.valueOf(typeAttr);
114 NodeList morphList = group.getElementsByTagName("morph");
115 int morphNo = morphList.getLength();
116 List<TypicalMorph> groupedList = new ArrayList<TypicalMorph>(morphNo);
118 for(int idx = 0; idx < morphNo; idx++){
119 Element morph = (Element) morphList.item(idx);
120 TypicalMorph common = parseMorph(morph, morphType);
121 groupedList.add(common);
124 TYPED_MAP.put(morphType, Collections.unmodifiableList(groupedList));
131 * @param morph morph要素
135 private static TypicalMorph parseMorph(Element morph, MorphType mtype){
136 NodeList primaryNodes = morph.getElementsByTagName("primary");
137 NodeList globalNodes = morph.getElementsByTagName("global");
138 int primaryNo = primaryNodes.getLength();
139 int globalNo = globalNodes.getLength();
141 TypicalMorph typMorph = new TypicalMorph(mtype, primaryNo, globalNo);
143 for(int idx = 0; idx < primaryNo; idx++){
144 Element primary = (Element) primaryNodes.item(idx);
145 String name = primary.getAttribute("name");
146 typMorph.primaryList.add(name);
149 for(int idx = 0; idx < globalNo; idx++){
150 Element global = (Element) globalNodes.item(idx);
151 String name = global.getAttribute("name");
152 typMorph.globalList.add(name);
155 for(String primaryName : typMorph.primaryList){
156 PRIMARY_MAP.put(primaryName, typMorph);
159 for(String globalName : typMorph.globalList){
160 GLOBAL_MAP.put(globalName, typMorph);
167 * 全モーフ情報を一意に順序付ける設定を行う。
168 * <p>同一グループ内ではXMLでの定義順が反映される。
170 private static void numbering(){
172 for(MorphType morphType : MorphType.values()){
173 for(TypicalMorph common : TYPED_MAP.get(morphType)){
174 common.orderNo = order++;
183 * 種別ごとのモーフ情報リストを取得する。
184 * @param morphType モーフ種別
187 public static List<TypicalMorph> getTypedMorphList(MorphType morphType){
188 List<TypicalMorph> result = TYPED_MAP.get(morphType);
193 * プライマリ名の合致するモーフ情報を返す。
194 * @param primaryName プライマリ名
195 * @return モーフ情報。見つからなければnull
197 public static TypicalMorph findWithPrimary(String primaryName){
198 TypicalMorph result = PRIMARY_MAP.get(primaryName);
203 * グローバル名の合致するモーフ情報を返す。
204 * @param globalName グローバル名
205 * @return モーフ情報。見つからなければnull
207 public static TypicalMorph findWithGlobal(String globalName){
208 TypicalMorph result = GLOBAL_MAP.get(globalName);
213 * プライマリ名をグローバル名に変換する。
214 * @param primaryName プライマリ名
215 * @return グローバル名。見つからなければnull
217 public static String primary2global(String primaryName){
218 TypicalMorph morph = findWithPrimary(primaryName);
219 if(morph == null) return null;
220 String global = morph.getTopGlobalName();
225 * グローバル名をプライマリ名へ変換する。
226 * @param globalName グローバル名
227 * @return プライマリ名。見つからなければnull
229 public static String global2primary(String globalName){
230 TypicalMorph morph = findWithGlobal(globalName);
231 if(morph == null) return null;
232 String primary = morph.getTopPrimaryName();
240 public MorphType getMorphType(){