UNPKG

donkey

Version:

EIP for JavaScript, node style

65 lines (53 loc) 1.98 kB
var util = require(process.binding('natives').util ? 'util' : 'sys'); var RouteBuilder = module.exports = function(){ process.EventEmitter.call(this); var modelFactory = require('../model/ModelFactory'); var self = this; var sax = require("sax"); var parser = this.parser = sax.parser(true); var nodeStack = []; var routes = []; parser.onerror = function (e) { // an error happened. }; parser.ontext = function (t) { // TODO need to handle empty text or text full of spaces/tabs better if(nodeStack.length>=1 && nodeStack[nodeStack.length-1].setText) nodeStack[nodeStack.length-1].setText(t); }; parser.onopentag = function (node) { //console.log("opening..."+JSON.stringify(node)); var ndef = modelFactory.create(node.name,node.attributes); var pidx = nodeStack.push(ndef)-2; }; parser.onclosetag = function (node) { //console.log("closing..."+node); var cnode = nodeStack.pop(); //if(cnode.init) cnode.init(); parent = nodeStack[nodeStack.length-1]; if(parent !== undefined){ parent[node](cnode); } else { routes.push(cnode); } }; parser.onattribute = function (attr) { // an attribute. attr has "name" and "value" }; parser.onend = function () { // parser stream is done, and ready to have more stuff written to it. self.emit('routes',routes); }; }; util.inherits(RouteBuilder, process.EventEmitter); RouteBuilder.prototype.configureRoute = function(filename){ //example read from file var parser = this.parser; var fs = require('fs'); fs.readFile(filename, 'utf8',function (err, data) { parser.write(data).close(); }); }; RouteBuilder.prototype.assemble = function(routes){ routes.forEach(function(route){route.assemble();}); };