// Expression View app.compose(function () { "use strict"; var formatter = app.get('formatter'); var calc = app.get('calc'); var html = app.get('html'); var cmdConfig = app.get('cmdConfig'); var expression = app.get('expression'); // TODO: move to protojs String.prototype.padLeft = function(size, char) { return formatter.padLeft(this, size, char); } app.modelView(app.models.BitwiseOperation, function() { function getTemplateId(model) { switch (model.sign) { case '<<': case '>>': case '>>>': return 'shiftExpressionView'; case '~': return 'notExpressionView'; default: return 'binaryExpressionView'; } } return { renderView: function(expr) { // TODO: move all this to expression var result = expression.createOperand(calc.calcExpression(expr), getResultMode([expr.operand1, expr.operand2])); var maxLen = getBinaryLength([expr.operand1.value, expr.operand2 != null ? expr.operand2.value : 0, result.value]); var model = Object.create(expr); model.bitsSize = maxLen; model.result = result; var templateId = getTemplateId(model); var template = app.template(templateId); return colorizeBits(template.render(model)); } } }); app.modelView(app.models.BitwiseNumbers, { renderView: function(model) { model.bitsSize = getBinaryLength(model.numbers); return colorizeBits(app.template('numbersList').render(model)); } }); app.modelView(app.models.ViewResult, { renderView: function(model) { var template = app.template(model.template); return template.render(); } }); app.modelView(app.models.ErrorResult, { renderView: function(model) { return html.element('
{message}
', model); } }); app.modelView(app.models.DisplayResult, { renderView: function(model) { var resultView = app.template('resultView').render(model); var contentView = app.buildViewFor(model.content); resultView.querySelector('.content').appendChild(contentView); return resultView; } }); function getBinaryLength(arr) { var bits = calc.maxNumberOfBits(arr); if(cmdConfig.emphasizeBytes && bits % 8 != 0) { if(bits < 8) { return 8; } var n = bits - (bits % 8); return n + 8; } return bits; } function colorizeBits(container) { var list = container.querySelectorAll('.bin'); Array.prototype.forEach.call(list, function(el){ var bin = el.textContent; el.innerHTML = bin .replace(/(\d{8})/g, '$1') .replace(/0/g, '0') .replace(/1/g, '1'); }); return container; } function getResultMode(operands) { for(var i=0; i