X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/7a654f8d43fdb43d78b63d90528bed6e86b608cc..3789b528d8dd8aad4558e38e22d775bcab1cbd36:/jsbuilder/src/Parser/Statement.js diff --git a/jsbuilder/src/Parser/Statement.js b/jsbuilder/src/Parser/Statement.js new file mode 100644 index 00000000..9c327fa2 --- /dev/null +++ b/jsbuilder/src/Parser/Statement.js @@ -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; + } +});