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
			| 
											2 years ago
										 | '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
 |