UNPKG

react-microspreadsheet

Version:

A pluggable spreadsheet component.

139 lines (133 loc) 5.08 kB
// Generated by CoffeeScript 1.8.0 var Mori, identifyPattern, store, utils; Mori = require('mori'); utils = require('./utils'); store = require('./cells-store'); module.exports = function() { var base, column, generator, i, j, magnitude, row, s, si, sj, vector, _i, _j, _k, _l, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _results, _results1; base = [utils.firstCellFromMulti(store.multi), utils.lastCellFromMulti(store.multi)]; vector = store.strapVector; magnitude = vector[2]; if (vector[0] === 0) { _results = []; for (j = _i = _ref = base[0][1], _ref1 = base[1][1]; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; j = _ref <= _ref1 ? ++_i : --_i) { column = []; for (i = _j = _ref2 = base[1 - vector[1]][0], _ref3 = base[vector[1]][0]; _ref2 <= _ref3 ? _j <= _ref3 : _j >= _ref3; i = _ref2 <= _ref3 ? ++_j : --_j) { column.push(Mori.get_in(store.cells, [i, j, 'raw'])); } generator = identifyPattern(column, vector[0]); _results.push((function() { var _k, _ref4, _results1; _results1 = []; for (s = _k = _ref4 = magnitude / Math.abs(magnitude); _ref4 <= magnitude ? _k <= magnitude : _k >= magnitude; s = _ref4 <= magnitude ? ++_k : --_k) { si = base[vector[1]][vector[0]] + s; _results1.push(store.cells = Mori.assoc_in(store.cells, [si, j, 'raw'], generator(s))); } return _results1; })()); } return _results; } else if (vector[0] === 1) { _results1 = []; for (i = _k = _ref4 = base[0][0], _ref5 = base[1][0]; _ref4 <= _ref5 ? _k <= _ref5 : _k >= _ref5; i = _ref4 <= _ref5 ? ++_k : --_k) { row = []; for (j = _l = _ref6 = base[1 - vector[1]][1], _ref7 = base[vector[1]][1]; _ref6 <= _ref7 ? _l <= _ref7 : _l >= _ref7; j = _ref6 <= _ref7 ? ++_l : --_l) { row.push(Mori.get_in(store.cells, [i, j, 'raw'])); } generator = identifyPattern(row, vector[0]); _results1.push((function() { var _m, _ref8, _results2; _results2 = []; for (s = _m = _ref8 = magnitude / Math.abs(magnitude); _ref8 <= magnitude ? _m <= magnitude : _m >= magnitude; s = _ref8 <= magnitude ? ++_m : --_m) { sj = base[vector[1]][vector[0]] + s; _results2.push(store.cells = Mori.assoc_in(store.cells, [i, sj, 'raw'], generator(s))); } return _results2; })()); } return _results1; } }; identifyPattern = function(values, dir) { var baseValues, direction, fn, n, rateFn, rateFns, rateGeneratorFns, rateName, rateValue, rateValues, _i, _j, _len, _ref, _ref1; direction = dir === 0 ? 'vertical' : 'horizontal'; baseValues = values; rateGeneratorFns = { arit: function(r) { return function(a, delta) { return parseFloat(a) + (r * delta); }; }, geom: function(r) { return function(a, delta) { return parseFloat(a) * (r * delta); }; } }; if (values.length > 1) { rateFns = { arit: function(a, b) { return parseFloat(a) - parseFloat(b); }, geom: function(a, b) { return parseFloat(a) / parseFloat(b); } }; rateValues = {}; for (rateName in rateFns) { fn = rateFns[rateName]; rateValues[rateName] = fn(values[1], values[0]); } if (values.length > 2) { for (n = _i = 2, _ref = values.length - 1; 2 <= _ref ? _i <= _ref : _i >= _ref; n = 2 <= _ref ? ++_i : --_i) { for (rateName in rateValues) { rateValue = rateValues[rateName]; if (rateFns[rateName](values[n], values[n - 1]) !== rateValue) { delete rateValues[rateName]; } } } } _ref1 = ['arit', 'geom', 'expo']; for (_j = 0, _len = _ref1.length; _j < _len; _j++) { rateName = _ref1[_j]; if (rateValues[rateName]) { rateValue = rateValues[rateName]; rateFn = rateGeneratorFns[rateName](rateValue); break; } } } else if (!isNaN(parseInt(values[0]))) { rateFn = rateGeneratorFns.arit(1); } else if (values[0].charCodeAt && values[0].length === 1) { rateFn = function(a, delta) { return String.fromCharCode(a.charCodeAt() + delta); }; } else { rateFn = null; } return function(delta) { var baseValue, value; baseValue = baseValues[(Math.abs(delta) - 1) % baseValues.length]; value = baseValue; if ('horizontal' === direction) { value = baseValue.toString().replace(/(\$?[A-Za-z])(\$?\d{1,2})/g, function(_, letter, number) { if (letter[0] !== '$') { letter = String.fromCharCode(letter.charCodeAt() + delta); } return letter + number; }); } else if ('vertical' === direction) { value = baseValue.toString().replace(/([\$?A-Za-z])(\$?\d{1,2})/g, function(_, letter, number) { if (number[0] !== '$') { number = parseInt(number) + delta; } return letter + number; }); } if (rateFn) { value = rateFn(baseValues.slice(-1)[0], Math.abs(delta)); } return value; }; };