--- /dev/null
+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;
+ }
+});