From 8e5be22fe37352046cf92d8bc295ac25ed59f610 Mon Sep 17 00:00:00 2001 From: Borys Levytskyi Date: Fri, 3 Apr 2015 18:55:39 +0300 Subject: [PATCH] implemented dispatcher commands --- app/bitwise/expression.js | 5 ++- app/controllers.js | 9 ++--- app/dispatcher.js | 85 +++++++++++++++++++++++++++++++++++++-- components/htmlBuilder.js | 9 +++++ components/is.js | 27 +++++++++++++ index.html | 55 +++++-------------------- 6 files changed, 136 insertions(+), 54 deletions(-) create mode 100644 components/is.js diff --git a/app/bitwise/expression.js b/app/bitwise/expression.js index 523e160..d51db03 100644 --- a/app/bitwise/expression.js +++ b/app/bitwise/expression.js @@ -1,8 +1,11 @@ (function() { - var twoOperandsRegex = /^(\d+)(<<|>>|\||\&|\^)(\d+)$/; + var twoOperandsRegex = /^(\d+)\s*(<<|>>|\||\&|\^)\s*(\d+)$/; var numbersList = /^((\d*)+\s?)+$/; app.service('expression', { + canParse: function(string) { + return twoOperandsRegex.test(string) || numbersList.test(string); + }, parse: function(string) { var trimmed = string.replace(/^\s+|\s+$/, ''); var matches = twoOperandsRegex.exec(trimmed); diff --git a/app/controllers.js b/app/controllers.js index 3178c39..9b86ff5 100644 --- a/app/controllers.js +++ b/app/controllers.js @@ -1,4 +1,4 @@ -(function(app){ +(function(app, is){ app.controller('expressionInputCtrl', { $dispatcher:null, @@ -25,9 +25,8 @@ onViewAttached: function(el) { var r = 1; }, - display: function (input, model) { - var result = new app.models.DisplayResult(input, model); - var view = app.buildViewFor(result); + display: function ( model) { + var view = app.buildViewFor(model); var vw = this.viewElement; if(vw.childNodes.length == 0) { @@ -41,4 +40,4 @@ app.controller('resultViewCtrl', app.service('resultView')); -})(window.app); +})(window.app, window.is); diff --git a/app/dispatcher.js b/app/dispatcher.js index 3d0ac6e..b2a64a0 100644 --- a/app/dispatcher.js +++ b/app/dispatcher.js @@ -1,11 +1,88 @@ -(function(app){ +(function(app, is){ + + var handlers = []; var dispatcher = { - dispatch: function(input) { - app.command('dispatchInput').execute({input:input}); + $resultView:null, + debug:true, + dispatch: function(rawInput) { + var input = rawInput.trim(); + var handler = this.findHandler(input); + + if(handler != null) { + + if(this.debug) { + this.invokeHandler(input, handler); + } else { + try { + this.invokeHandler(input, handler); + } catch (e) { + this.displayCommandError(input, "Error: " + e); + } + } + } + else { + this.displayCommandError(input, "Unknown expression: " + input.trim()); + } + + // app.command('dispatchInput').execute({input:input}); + }, + command: function(cmd, handler) { + var h = this.createHandler(cmd, handler); + if(h == null){ + console.warn('unexpected set of arguments: ', Array.prototype.splice.call(arguments)); + return; + } + + if(!is.aFunction(h.canHandle)) { + console.warn('handler is missing "canHandle" function. registration denied.'); + return; + } + + if(!is.aFunction(h.handle)) { + console.warn('handler is missing "handle" function. registration denied.'); + return; + } + + app.di.resolveProperties(h); + handlers.push(h); + }, + createHandler: function(cmd, handler) { + if(is.plainObject(cmd)) { + return cmd; + } + + if(is.string(cmd)) { + return { canHandle: function (input) { return input === cmd; }, handle: handler }; + } + + return null; + }, + findHandler: function (input) { + var i= 0, h; + for(i;i + @@ -38,58 +39,24 @@ (function(){ var app = window.app; - var html = app.service('html'); - var resultView = app.service('resultView'); - - // Expression - app.command('dispatchInput', { - $expression: null, - $resultView: null, - execute:function(cmdArgs) { - - var expr = this.$expression.parse(cmdArgs.input); - if(expr == null) { - return; - } - - this.$resultView.display(cmdArgs.input, expr); - - cmdArgs.commandHandled = true; - } - }); - - // Help - app.command('dispatchInput', function(cmdArgs){ - if(cmdArgs.input.toLowerCase() !== 'help') { - return; - } + var dispatcher = app.get('dispatcher'); + dispatcher.command('help', function() { var commands = [ + { name: '1>>2', description: 'Displays result of expression'}, { name: 'help', description: 'Displays help'}, { name: 'clear', description: 'Clears console'} ]; - var model = new app.models.HelpResult(commands); - - resultView.display(cmdArgs.input, model); - cmdArgs.commandHandled = true; + return new app.models.HelpResult(commands); }); - // Clear - app.command('dispatchInput', function(cmdArgs){ - if(cmdArgs.input.toLowerCase() !== 'clear') { - return; - } - - resultView.clear(); - - cmdArgs.commandHandled = true; - }); - - // Unknown Expression - app.command('dispatchInput', function(cmdArgs){ - cmdArgs.commandHandled = true; - resultView.display(cmdArgs.input, new app.models.ErrorResult("Unknown expression: " + cmdArgs.input)) + dispatcher.command({ + $expression:null, + canHandle: function(input) { return this.$expression.canParse(input); }, + handle: function(input) { + return this.$expression.parse(input); + } }); app.bootstrap(document.getElementById('rootView'));