You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
7.0 KiB

'use strict';
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var _ = require('../utils/under-dash');
var colCache = require('../utils/col-cache');
var CellMatrix = require('../utils/cell-matrix');
var Range = require('./range');
var rangeRegexp = /[$](\w+)[$](\d+)(:[$](\w+)[$](\d+))?/;
var DefinedNames = /*#__PURE__*/function () {
function DefinedNames() {
_classCallCheck(this, DefinedNames);
this.matrixMap = {};
}
_createClass(DefinedNames, [{
key: "getMatrix",
value: function getMatrix(name) {
var matrix = this.matrixMap[name] || (this.matrixMap[name] = new CellMatrix());
return matrix;
} // add a name to a cell. locStr in the form SheetName!$col$row or SheetName!$c1$r1:$c2:$r2
}, {
key: "add",
value: function add(locStr, name) {
var location = colCache.decodeEx(locStr);
this.addEx(location, name);
}
}, {
key: "addEx",
value: function addEx(location, name) {
var matrix = this.getMatrix(name);
if (location.top) {
for (var col = location.left; col <= location.right; col++) {
for (var row = location.top; row <= location.bottom; row++) {
var address = {
sheetName: location.sheetName,
address: colCache.n2l(col) + row,
row: row,
col: col
};
matrix.addCellEx(address);
}
}
} else {
matrix.addCellEx(location);
}
}
}, {
key: "remove",
value: function remove(locStr, name) {
var location = colCache.decodeEx(locStr);
this.removeEx(location, name);
}
}, {
key: "removeEx",
value: function removeEx(location, name) {
var matrix = this.getMatrix(name);
matrix.removeCellEx(location);
}
}, {
key: "removeAllNames",
value: function removeAllNames(location) {
_.each(this.matrixMap, function (matrix) {
matrix.removeCellEx(location);
});
}
}, {
key: "forEach",
value: function forEach(callback) {
_.each(this.matrixMap, function (matrix, name) {
matrix.forEach(function (cell) {
callback(name, cell);
});
});
} // get all the names of a cell
}, {
key: "getNames",
value: function getNames(addressStr) {
return this.getNamesEx(colCache.decodeEx(addressStr));
}
}, {
key: "getNamesEx",
value: function getNamesEx(address) {
return _.map(this.matrixMap, function (matrix, name) {
return matrix.findCellEx(address) && name;
}).filter(Boolean);
}
}, {
key: "_explore",
value: function _explore(matrix, cell) {
cell.mark = false;
var sheetName = cell.sheetName;
var range = new Range(cell.row, cell.col, cell.row, cell.col, sheetName);
var x;
var y; // grow vertical - only one col to worry about
function vGrow(yy, edge) {
var c = matrix.findCellAt(sheetName, yy, cell.col);
if (!c || !c.mark) {
return false;
}
range[edge] = yy;
c.mark = false;
return true;
}
for (y = cell.row - 1; vGrow(y, 'top'); y--) {
;
}
for (y = cell.row + 1; vGrow(y, 'bottom'); y++) {
;
} // grow horizontal - ensure all rows can grow
function hGrow(xx, edge) {
var cells = [];
for (y = range.top; y <= range.bottom; y++) {
var c = matrix.findCellAt(sheetName, y, xx);
if (c && c.mark) {
cells.push(c);
} else {
return false;
}
}
range[edge] = xx;
for (var i = 0; i < cells.length; i++) {
cells[i].mark = false;
}
return true;
}
for (x = cell.col - 1; hGrow(x, 'left'); x--) {
;
}
for (x = cell.col + 1; hGrow(x, 'right'); x++) {
;
}
return range;
}
}, {
key: "getRanges",
value: function getRanges(name, matrix) {
var _this = this;
matrix = matrix || this.matrixMap[name];
if (!matrix) {
return {
name: name,
ranges: []
};
} // mark and sweep!
matrix.forEach(function (cell) {
cell.mark = true;
});
var ranges = matrix.map(function (cell) {
return cell.mark && _this._explore(matrix, cell);
}).filter(Boolean).map(function (range) {
return range.$shortRange;
});
return {
name: name,
ranges: ranges
};
}
}, {
key: "normaliseMatrix",
value: function normaliseMatrix(matrix, sheetName) {
// some of the cells might have shifted on specified sheet
// need to reassign rows, cols
matrix.forEachInSheet(sheetName, function (cell, row, col) {
if (cell) {
if (cell.row !== row || cell.col !== col) {
cell.row = row;
cell.col = col;
cell.address = colCache.n2l(col) + row;
}
}
});
}
}, {
key: "spliceRows",
value: function spliceRows(sheetName, start, numDelete, numInsert) {
var _this2 = this;
_.each(this.matrixMap, function (matrix) {
matrix.spliceRows(sheetName, start, numDelete, numInsert);
_this2.normaliseMatrix(matrix, sheetName);
});
}
}, {
key: "spliceColumns",
value: function spliceColumns(sheetName, start, numDelete, numInsert) {
var _this3 = this;
_.each(this.matrixMap, function (matrix) {
matrix.spliceColumns(sheetName, start, numDelete, numInsert);
_this3.normaliseMatrix(matrix, sheetName);
});
}
}, {
key: "model",
get: function get() {
var _this4 = this;
// To get names per cell - just iterate over all names finding cells if they exist
return _.map(this.matrixMap, function (matrix, name) {
return _this4.getRanges(name, matrix);
}).filter(function (definedName) {
return definedName.ranges.length;
});
},
set: function set(value) {
// value is [ { name, ranges }, ... ]
var matrixMap = this.matrixMap = {};
value.forEach(function (definedName) {
var matrix = matrixMap[definedName.name] = new CellMatrix();
definedName.ranges.forEach(function (rangeStr) {
if (rangeRegexp.test(rangeStr.split('!').pop() || '')) {
matrix.addCell(rangeStr);
}
});
});
}
}]);
return DefinedNames;
}();
module.exports = DefinedNames;
//# sourceMappingURL=defined-names.js.map