Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / jsbuilder / src / Parser / Statement.js
diff --git a/jsbuilder/src/Parser/Statement.js b/jsbuilder/src/Parser/Statement.js
new file mode 100644 (file)
index 0000000..9c327fa
--- /dev/null
@@ -0,0 +1,103 @@
+Loader.require('Logger');
+
+Parser.Statement = Ext.extend(Object, {
+    isInverted: false,
+    properties: {},
+    buffer: '',
+    parent: null,
+
+    constructor: function(properties, isInverted) {
+        if (properties === undefined) {
+            properties = {};
+        }
+
+        if (isInverted === undefined) {
+            isInverted = false;
+        }
+
+        this.properties = properties;
+        this.isInverted = isInverted;
+    },
+
+    setProperty: function(name, value) {
+        this.properties[name] = value;
+    },
+
+    getProperty: function(name) {
+        return this.properties.hasOwnProperty(name) ? this.properties[name] : null;
+    },
+
+    removeProperty: function(name) {
+        delete this.properties[name];
+    },
+
+    isEnd: function(line, stream) {
+        return Parser.isCloseOf(line, this);
+    },
+
+    pushBuffer: function(content, withNewLine) {
+        if (withNewLine === undefined) {
+            withNewLine = false;
+        }
+
+        this.buffer += content + ((withNewLine) ? "\n" : "");
+    },
+
+    resetBuffer: function() {
+        this.buffer = '';
+    },
+
+    parse: function(stream) {
+        var line, subStatementData, subStatement;
+
+        while (!stream.eof) {
+            line = stream.readLine();
+
+            if (this.isEnd(line, stream)) {
+                break;
+            }
+
+            if ((subStatementData = Parser.parseStatement(line)) && (subStatement = Parser.Statement.factory(subStatementData))) {
+                subStatement.parent = this;
+                this.onSubStatement(subStatement, stream);
+            } else {
+                this.pushBuffer(line, !stream.eof);
+            }
+        }
+
+        return this.buffer;
+    },
+
+    onSubStatement: function(statement, stream) {
+        this.pushBuffer(statement.parse(stream));
+    }
+});
+
+Ext.apply(Parser.Statement, {
+    factory: function(type, properties, isInverted) {
+        var capitalizedType, statementClass, statement;
+
+        if (Ext.isObject(type)) {
+            properties = type.properties;
+            isInverted = type.isInverted;
+            type = type.type;
+        }
+
+        type = type.toLowerCase();
+        capitalizedType = type.charAt(0).toUpperCase() + type.slice(1);
+
+        Loader.require('Parser.Statement.' + capitalizedType, false);
+        statementClass = Parser.Statement[capitalizedType];
+
+        if (!statementClass) {
+            // Not supported
+            Logger.log("[NOTICE][Parser.Statement.factory] Statement type '" + type + "' is currently not supported, ignored");
+            return false;
+        }
+
+        statement = new statementClass(properties, isInverted);
+        statement.type = type;
+
+        return statement;
+    }
+});