react-microspreadsheet
Version:
A pluggable spreadsheet component.
139 lines (133 loc) • 5.08 kB
JavaScript
// 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;
};
};