1 Loader.require('Logger');
3 Parser.Statement = Ext.extend(Object, {
9 constructor: function(properties, isInverted) {
10 if (properties === undefined) {
14 if (isInverted === undefined) {
18 this.properties = properties;
19 this.isInverted = isInverted;
22 setProperty: function(name, value) {
23 this.properties[name] = value;
26 getProperty: function(name) {
27 return this.properties.hasOwnProperty(name) ? this.properties[name] : null;
30 removeProperty: function(name) {
31 delete this.properties[name];
34 isEnd: function(line, stream) {
35 return Parser.isCloseOf(line, this);
38 pushBuffer: function(content, withNewLine) {
39 if (withNewLine === undefined) {
43 this.buffer += content + ((withNewLine) ? "\n" : "");
46 resetBuffer: function() {
50 parse: function(stream) {
51 var line, subStatementData, subStatement;
54 line = stream.readLine();
56 if (this.isEnd(line, stream)) {
60 if ((subStatementData = Parser.parseStatement(line)) && (subStatement = Parser.Statement.factory(subStatementData))) {
61 subStatement.parent = this;
62 this.onSubStatement(subStatement, stream);
64 this.pushBuffer(line, !stream.eof);
71 onSubStatement: function(statement, stream) {
72 this.pushBuffer(statement.parse(stream));
76 Ext.apply(Parser.Statement, {
77 factory: function(type, properties, isInverted) {
78 var capitalizedType, statementClass, statement;
80 if (Ext.isObject(type)) {
81 properties = type.properties;
82 isInverted = type.isInverted;
86 type = type.toLowerCase();
87 capitalizedType = type.charAt(0).toUpperCase() + type.slice(1);
89 Loader.require('Parser.Statement.' + capitalizedType, false);
90 statementClass = Parser.Statement[capitalizedType];
92 if (!statementClass) {
94 Logger.log("[NOTICE][Parser.Statement.factory] Statement type '" + type + "' is currently not supported, ignored");
98 statement = new statementClass(properties, isInverted);
99 statement.type = type;