root/as3/sain/trank/src/org/libspark/mezumona/sain/handler/MultilineValueHandler.as

リビジョン 4527, 4.0 kB (コミッタ: mezumona, コミット時期: 2 年 前)
  • パラメーター代入行のコメントに ; が含まれているとコメントの範囲がずれるバグを修正
  • トークン処理をフィルターするクラス (WrapperHandler?) を追加
  • 複数行値を代入できるフィルター (MultilineValueHandler?) を追加
Line 
1 package org.libspark.mezumona.sain.handler
2 {
3         import org.libspark.mezumona.sain.SAINParseError;
4
5
6
7 /**
8  * MultilineValueHandler クラスは...クラスです.
9  */
10 public class MultilineValueHandler extends WrapperHandler
11 {
12         /*/////////////////////////////////////////////////////////////////////////////////////////////
13                 Constants
14         /////////////////////////////////////////////////////////////////////////////////////////////*/
15
16        
17
18
19
20         /*/////////////////////////////////////////////////////////////////////////////////////////////
21                 Constructor / Destructor
22         /////////////////////////////////////////////////////////////////////////////////////////////*/
23
24         /**
25          * MultilineValueHandler オブジェクトを生成します.
26          */
27         public function MultilineValueHandler(content:IContentHandler, error:IErrorHandler = null)
28         {
29                 super(content, error);
30         }
31
32         private function initializeMultilineSystem():void
33         {
34                 isPossibleMultilineValue_ = false;
35                 isParsingMultilineValue_ = false;
36                 multilineParametor_ = null;
37                 multilineSpacer_ = null;
38                 multilineBuffer_.length = 0;
39                 eosToken_ = null;
40         }
41
42
43
44         /*/////////////////////////////////////////////////////////////////////////////////////////////
45                 Properties (& Public Fields)
46         /////////////////////////////////////////////////////////////////////////////////////////////*/
47
48        
49
50
51
52         /*/////////////////////////////////////////////////////////////////////////////////////////////
53                 Methods
54         /////////////////////////////////////////////////////////////////////////////////////////////*/
55
56         /** @inheritDoc */
57         override public function endContent():void
58         {
59                 checkMultilineValue();
60                 super.endContent();
61         }
62
63         /** @inheritDoc */
64         override public function endSection(name:String):void
65         {
66                 checkMultilineValue();
67                 super.endSection(name);
68         }
69
70         /** @inheritDoc */
71         override public function setParameter(name:String, value:String):void
72         {
73                 checkMultilineValue();
74
75                 if (value == "") {
76                         isPossibleMultilineValue_ = true;
77                         multilineParametor_ = name;
78                 }
79                 super.setParameter(name, value);
80         }
81
82         /** @inheritDoc */
83         override public function comment(data:String):void
84         {
85                 // 複数行値解析中 -------------------------------------------------------------------------
86                 if (isParsingMultilineValue_) {
87                         if (data == eosToken_) {
88                                 flush();
89                         }
90                         else {
91                                 var buffer:Vector.<String> = multilineBuffer_;
92                                 buffer[buffer.length] = data;
93                         }
94                         return;
95                 }
96
97                 // 直前で複数行値の可能性がある -----------------------------------------------------------
98                 if (isPossibleMultilineValue_) {
99                         // コメントが複数行値開始マーク
100                         if (data.search(/^>>;/) == 0) {
101                                 eosToken_ = data.substr(3);
102                                 isPossibleMultilineValue_ = false;
103                                 isParsingMultilineValue_ = true;
104                         }
105                         // 通常のコメント
106                         else {
107                                 var paramName:String = multilineParametor_;
108                                 initializeMultilineSystem();
109                                 super.setParameter(paramName, "");
110                                 super.comment(data);
111                         }
112                 }
113                 // 通常のコメント -------------------------------------------------------------------------
114                 else {
115                         super.comment(data);
116                 }
117         }
118
119         private function checkMultilineValue():void
120         {
121                 if (isPossibleMultilineValue_) {
122                         isPossibleMultilineValue_ = false;
123                 }
124                 else if (isParsingMultilineValue_) {
125                         warning(
126                                 new SAINParseError(
127                                         "複数行値終了トークン '" + eosToken_ + "が来る前に文章が終了しました。"
128                                 )
129                         );
130                         flush();
131                 }
132         }
133
134         private function flush():void
135         {
136                 super.setParameter(multilineParametor_, multilineBuffer_.join(multilineSpacer_));
137                 initializeMultilineSystem();
138         }
139
140
141
142         /*/////////////////////////////////////////////////////////////////////////////////////////////
143                 Private Fields
144         /////////////////////////////////////////////////////////////////////////////////////////////*/
145
146         private var isPossibleMultilineValue_:Boolean = false;
147         private var isParsingMultilineValue_:Boolean = false;
148         private var multilineParametor_:String = null;
149         private var multilineSpacer_:String = "\n";
150         private var multilineBuffer_:Vector.<String> = new Vector.<String>();
151         private var eosToken_:String = null;
152
153
154
155 }
156
157 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。