--- /dev/null
+Parser = {
+ isBuild: function(builds) {
+ return builds.split('|').indexOf(this.build) != -1;
+ },
+
+ parse: function(file, build) {
+ var line,
+ trimmed,
+ o = this.output = [];
+
+ this.build = build;
+
+ file = new Stream(file);
+ while (!file.eof) {
+ line = file.readLine();
+ trimmed = line.trim();
+ if (this.isStatement(trimmed)) {
+ this.handleStatement(this.parseStatement(trimmed), file);
+ }
+ else {
+ this.output.push(line);
+ this.checkExtraComma();
+ }
+ }
+ file.close();
+ return this.output.join('\n');
+ },
+
+ checkExtraComma: function() {
+ var output = this.output,
+ ln = output.length - 1,
+ line = output[ln],
+ trimmed = line.trim(),
+ prevLine;
+
+ if (trimmed[0] == '}') {
+ while (output[--ln].trim() == '') {
+ output.splice(ln, 1);
+ }
+ prevLine = output[ln];
+ if (prevLine.trim().slice( - 1) == ',') {
+ output[ln] = prevLine.slice(0, prevLine.lastIndexOf(','));
+ }
+ }
+ },
+
+ isStatement: function(line) {
+ return line.substr(0, 3) == '//[' && line.substr( - 1) == ']';
+ },
+
+ handleStatement: function(statement, file) {
+ switch (statement.type) {
+ case 'if':
+ case 'elseif':
+ this.handleIf(file, statement.condition);
+ break;
+
+ case 'else':
+ this.handleElse(file);
+ break;
+ }
+ },
+
+ parseStatement: function(statement) {
+ var parts = statement.substring(3, statement.length - 1).split(' ');
+ return {
+ type: parts[0],
+ condition: parts[1]
+ };
+ },
+
+ handleIf: function(file, condition) {
+ if (this.isBuild(condition)) {
+ var next = this.getNextStatement(file);
+ this.output.push(next.buffer);
+ this.toEndIf(file, next);
+ }
+ else {
+ this.handleStatement(this.getNextStatement(file), file);
+ }
+ },
+
+ handleElse: function(file) {
+ var next = this.toEndIf(file);
+ this.output.push(next.buffer);
+ },
+
+ toEndIf: function(file, next) {
+ next = next || this.getNextStatement(file);
+ while (next && next.type != 'endif') {
+ next = this.getNextStatement(file);
+ }
+ return next;
+ },
+
+ getNextStatement: function(file) {
+ var buffer = [],
+ line,
+ trimmed,
+ ret;
+
+ while (!file.eof) {
+ line = file.readLine();
+ trimmed = line.trim();
+ if (!this.isStatement(trimmed)) {
+ buffer.push(line);
+ }
+ else {
+ ret = this.parseStatement(trimmed);
+ ret.buffer = buffer.join('\n');
+ return ret;
+ }
+ }
+ return null;
+ }
+};
\ No newline at end of file