OSDN Git Service

Merge release/v1.203.2
[mikutoga/Pmd2XML.git] / src / main / java / jp / sfjp / mikutoga / pmd / model / xml / SaxModelListener.java
1 /*
2  * model listener from XML
3  *
4  * License : The MIT License
5  * Copyright(c) 2013 MikuToga Partners
6  */
7
8 package jp.sfjp.mikutoga.pmd.model.xml;
9
10 import jp.sfjp.mikutoga.corelib.I18nText;
11
12 /*
13     + pmdModel
14         + i18nName
15         + description
16         + license
17         + credits
18         + meta
19         .....
20 */
21
22 /**
23  * モデル関連のXML要素出現イベントを受信する。
24  */
25 class SaxModelListener extends SaxListener{
26
27     private String currentLang = null;
28     private StringBuilder currentBredTxt = null;
29
30
31     /**
32      * コンストラクタ。
33      */
34     SaxModelListener() {
35         super();
36         return;
37     }
38
39
40     /**
41      * CharData出現の通知。
42      * @param ch 文字配列
43      * @param start 開始位置
44      * @param length 長さ
45      */
46     @Override
47     void addCharData(char[] ch, int start, int length){
48         if(this.currentBredTxt == null) return;
49
50         for(int idx = 0; idx < length; idx++){
51             int pos = start + idx;
52             char chData = ch[pos];
53             if(chData == '\n') continue;
54             if(chData == '\r') continue;
55             this.currentBredTxt.append(chData);
56         }
57
58         return;
59     }
60
61     /**
62      * pmdModelタグ開始の通知を受け取る。
63      */
64     @OpenXmlMark(PmdTag.PMD_MODEL)
65     void openPmdModel(){
66         I18nText modelName = getPmdModel().getModelName();
67
68         String name = getStringAttr(PmdAttr.NAME);
69         modelName.setPrimaryText(name);
70
71         return;
72     }
73
74     /**
75      * i18nTextタグ開始の通知を受け取る。
76      */
77     @OpenXmlMark(PmdTag.I18N_NAME)
78     void openI18nText(){
79         String lang = getStringAttr(PmdAttr.LANG);
80         String name = getStringAttr(PmdAttr.NAME);
81
82         I18nText modelName = getPmdModel().getModelName();
83         modelName.setI18nText(lang, name);
84
85         return;
86     }
87
88     /**
89      * descriptionタグ開始の通知を受け取る。
90      */
91     @OpenXmlMark(PmdTag.DESCRIPTION)
92     void openDescription(){
93         this.currentLang = getStringAttr(PmdAttr.LANG);
94         this.currentBredTxt = new StringBuilder();
95         return;
96     }
97
98     /**
99      * descriptionタグ終了の通知を受け取る。
100      */
101     @CloseXmlMark(PmdTag.DESCRIPTION)
102     void closeDescription(){
103         String bredText = this.currentBredTxt.toString();
104
105         I18nText desc = getPmdModel().getDescription();
106         if(this.currentLang == null){
107             desc.setPrimaryText(bredText);
108         }else{
109             desc.setI18nText(this.currentLang, bredText);
110         }
111
112         this.currentLang = null;
113         this.currentBredTxt = null;
114
115         return;
116     }
117
118     /**
119      * brタグ開始の通知を受け取る。
120      */
121     @OpenXmlMark(PmdTag.BR)
122     void openBr(){
123         if(this.currentBredTxt == null) return;
124         this.currentBredTxt.append('\n');
125         return;
126     }
127
128 }