Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / jsbuilder / src / Parser / Statement.js
1 Loader.require('Logger');
2
3 Parser.Statement = Ext.extend(Object, {
4     isInverted: false,
5     properties: {},
6     buffer: '',
7     parent: null,
8
9     constructor: function(properties, isInverted) {
10         if (properties === undefined) {
11             properties = {};
12         }
13
14         if (isInverted === undefined) {
15             isInverted = false;
16         }
17
18         this.properties = properties;
19         this.isInverted = isInverted;
20     },
21
22     setProperty: function(name, value) {
23         this.properties[name] = value;
24     },
25
26     getProperty: function(name) {
27         return this.properties.hasOwnProperty(name) ? this.properties[name] : null;
28     },
29
30     removeProperty: function(name) {
31         delete this.properties[name];
32     },
33
34     isEnd: function(line, stream) {
35         return Parser.isCloseOf(line, this);
36     },
37
38     pushBuffer: function(content, withNewLine) {
39         if (withNewLine === undefined) {
40             withNewLine = false;
41         }
42
43         this.buffer += content + ((withNewLine) ? "\n" : "");
44     },
45
46     resetBuffer: function() {
47         this.buffer = '';
48     },
49
50     parse: function(stream) {
51         var line, subStatementData, subStatement;
52
53         while (!stream.eof) {
54             line = stream.readLine();
55
56             if (this.isEnd(line, stream)) {
57                 break;
58             }
59
60             if ((subStatementData = Parser.parseStatement(line)) && (subStatement = Parser.Statement.factory(subStatementData))) {
61                 subStatement.parent = this;
62                 this.onSubStatement(subStatement, stream);
63             } else {
64                 this.pushBuffer(line, !stream.eof);
65             }
66         }
67
68         return this.buffer;
69     },
70
71     onSubStatement: function(statement, stream) {
72         this.pushBuffer(statement.parse(stream));
73     }
74 });
75
76 Ext.apply(Parser.Statement, {
77     factory: function(type, properties, isInverted) {
78         var capitalizedType, statementClass, statement;
79
80         if (Ext.isObject(type)) {
81             properties = type.properties;
82             isInverted = type.isInverted;
83             type = type.type;
84         }
85
86         type = type.toLowerCase();
87         capitalizedType = type.charAt(0).toUpperCase() + type.slice(1);
88
89         Loader.require('Parser.Statement.' + capitalizedType, false);
90         statementClass = Parser.Statement[capitalizedType];
91
92         if (!statementClass) {
93             // Not supported
94             Logger.log("[NOTICE][Parser.Statement.factory] Statement type '" + type + "' is currently not supported, ignored");
95             return false;
96         }
97
98         statement = new statementClass(properties, isInverted);
99         statement.type = type;
100
101         return statement;
102     }
103 });