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
						
					
					
				
			
		
		
	
	
							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
 |