UNPKG

hyperformula-dc

Version:

HyperFormula is a JavaScript engine for efficient processing of spreadsheet-like data and formulas

750 lines (628 loc) 24.5 kB
"use strict"; require("core-js/modules/es.object.get-prototype-of.js"); require("core-js/modules/es.reflect.construct.js"); exports.__esModule = true; exports.isSimpleCellRange = isSimpleCellRange; exports.AbsoluteRowRange = exports.AbsoluteColumnRange = exports.AbsoluteCellRange = exports.simpleCellRange = exports.WRONG_RANGE_SIZE = void 0; require("regenerator-runtime/runtime.js"); require("core-js/modules/es.number.is-finite.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.symbol.js"); require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.symbol.iterator.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); var _Cell = require("./Cell"); var _errors = require("./errors"); var _parser = require("./parser"); var _Span = require("./Span"); function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } 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; } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var WRONG_RANGE_SIZE = 'AbsoluteCellRange: Wrong range size'; exports.WRONG_RANGE_SIZE = WRONG_RANGE_SIZE; function isSimpleCellRange(obj) { if (obj && (_typeof(obj) === 'object' || typeof obj === 'function')) { return 'start' in obj && (0, _Cell.isSimpleCellAddress)(obj.start) && 'end' in obj && (0, _Cell.isSimpleCellAddress)(obj.end); } else { return false; } } var simpleCellRange = function simpleCellRange(start, end) { return { start: start, end: end }; }; exports.simpleCellRange = simpleCellRange; var AbsoluteCellRange = /*#__PURE__*/function () { function AbsoluteCellRange(start, end) { _classCallCheck(this, AbsoluteCellRange); if (start.sheet !== end.sheet) { throw new _errors.SheetsNotEqual(start.sheet, end.sheet); } this.start = (0, _Cell.simpleCellAddress)(start.sheet, start.col, start.row); this.end = (0, _Cell.simpleCellAddress)(end.sheet, end.col, end.row); } _createClass(AbsoluteCellRange, [{ key: "sheet", get: function get() { return this.start.sheet; } }, { key: "isFinite", value: function isFinite() { return Number.isFinite(this.size()); } }, { key: "doesOverlap", value: function doesOverlap(other) { if (this.start.sheet != other.start.sheet) { return false; } if (this.end.row < other.start.row || this.start.row > other.end.row) { return false; } if (this.end.col < other.start.col || this.start.col > other.end.col) { return false; } return true; } }, { key: "addressInRange", value: function addressInRange(address) { if (this.sheet !== address.sheet) { return false; } return this.start.row <= address.row && this.end.row >= address.row && this.start.col <= address.col && this.end.col >= address.col; } }, { key: "columnInRange", value: function columnInRange(address) { if (this.sheet !== address.sheet) { return false; } return this.start.col <= address.col && this.end.col >= address.col; } }, { key: "rowInRange", value: function rowInRange(address) { if (this.sheet !== address.sheet) { return false; } return this.start.row <= address.row && this.end.row >= address.row; } }, { key: "containsRange", value: function containsRange(range) { return this.addressInRange(range.start) && this.addressInRange(range.end); } }, { key: "intersectionWith", value: function intersectionWith(other) { if (this.sheet !== other.start.sheet) { return undefined; } var startRow = Math.max(this.start.row, other.start.row); var endRow = Math.min(this.end.row, other.end.row); var startCol = Math.max(this.start.col, other.start.col); var endCol = Math.min(this.end.col, other.end.col); if (startRow > endRow || startCol > endCol) { return undefined; } return new AbsoluteCellRange((0, _Cell.simpleCellAddress)(this.sheet, startCol, startRow), (0, _Cell.simpleCellAddress)(this.sheet, endCol, endRow)); } }, { key: "includesRow", value: function includesRow(row) { return this.start.row < row && this.end.row >= row; } }, { key: "includesColumn", value: function includesColumn(column) { return this.start.col < column && this.end.col >= column; } }, { key: "shiftByRows", value: function shiftByRows(numberOfRows) { this.start.row += numberOfRows; this.end.row += numberOfRows; } }, { key: "expandByRows", value: function expandByRows(numberOfRows) { this.end.row += numberOfRows; } }, { key: "shiftByColumns", value: function shiftByColumns(numberOfColumns) { this.start.col += numberOfColumns; this.end.col += numberOfColumns; } }, { key: "shifted", value: function shifted(byCols, byRows) { return AbsoluteCellRange.spanFrom((0, _Cell.simpleCellAddress)(this.sheet, this.start.col + byCols, this.start.row + byRows), this.width(), this.height()); } }, { key: "expandByColumns", value: function expandByColumns(numberOfColumns) { this.end.col += numberOfColumns; } }, { key: "moveToSheet", value: function moveToSheet(toSheet) { this.start.sheet = toSheet; this.end.sheet = toSheet; } }, { key: "removeSpan", value: function removeSpan(span) { if (span instanceof _Span.RowsSpan) { this.removeRows(span.start, span.end); } else { this.removeColumns(span.start, span.end); } } }, { key: "removeRows", value: function removeRows(rowStart, rowEnd) { if (rowStart > this.end.row) { return; } if (rowEnd < this.start.row) { var numberOfRows = rowEnd - rowStart + 1; return this.shiftByRows(-numberOfRows); } if (rowStart <= this.start.row) { this.start.row = rowStart; } this.end.row -= Math.min(rowEnd, this.end.row) - rowStart + 1; } }, { key: "removeColumns", value: function removeColumns(columnStart, columnEnd) { if (columnStart > this.end.col) { return; } if (columnEnd < this.start.col) { var numberOfColumns = columnEnd - columnStart + 1; return this.shiftByColumns(-numberOfColumns); } if (columnStart <= this.start.col) { this.start.col = columnStart; } this.end.col -= Math.min(columnEnd, this.end.col) - columnStart + 1; } }, { key: "shouldBeRemoved", value: function shouldBeRemoved() { return this.width() <= 0 || this.height() <= 0; } }, { key: "rangeWithSameWidth", value: function rangeWithSameWidth(startRow, numberOfRows) { return AbsoluteCellRange.spanFrom((0, _Cell.simpleCellAddress)(this.sheet, this.start.col, startRow), this.width(), numberOfRows); } }, { key: "rangeWithSameHeight", value: function rangeWithSameHeight(startColumn, numberOfColumns) { return AbsoluteCellRange.spanFrom((0, _Cell.simpleCellAddress)(this.sheet, startColumn, this.start.row), numberOfColumns, this.height()); } }, { key: "toString", value: function toString() { return "".concat(this.start.sheet, ",").concat(this.start.col, ",").concat(this.start.row, ",").concat(this.end.col, ",").concat(this.end.row); } }, { key: "width", value: function width() { return this.end.col - this.start.col + 1; } }, { key: "height", value: function height() { return this.end.row - this.start.row + 1; } }, { key: "size", value: function size() { return this.height() * this.width(); } }, { key: "arrayOfAddressesInRange", value: function arrayOfAddressesInRange() { var result = []; for (var y = 0; y < this.height(); ++y) { result[y] = []; for (var x = 0; x < this.width(); ++x) { var value = (0, _Cell.simpleCellAddress)(this.sheet, this.start.col + x, this.start.row + y); result[y].push(value); } } return result; } }, { key: "withStart", value: function withStart(newStart) { return new AbsoluteCellRange(newStart, this.end); } }, { key: "sameDimensionsAs", value: function sameDimensionsAs(other) { return this.width() === other.width() && this.height() === other.height(); } }, { key: "sameAs", value: function sameAs(other) { return (0, _Cell.equalSimpleCellAddress)(this.start, other.start) && (0, _Cell.equalSimpleCellAddress)(this.end, other.end); } }, { key: "addressesArrayMap", value: function addressesArrayMap(dependencyGraph, op) { var ret = []; var currentRow = this.start.row; while (currentRow <= this.effectiveEndRow(dependencyGraph)) { var currentColumn = this.start.col; var tmp = []; while (currentColumn <= this.effectiveEndColumn(dependencyGraph)) { tmp.push(op((0, _Cell.simpleCellAddress)(this.start.sheet, currentColumn, currentRow))); currentColumn++; } ret.push(tmp); currentRow++; } return ret; } }, { key: "addresses", value: function addresses(dependencyGraph) { var ret = []; var currentRow = this.start.row; var limitRow = this.effectiveEndRow(dependencyGraph); var limitColumn = this.effectiveEndColumn(dependencyGraph); while (currentRow <= limitRow) { var currentColumn = this.start.col; while (currentColumn <= limitColumn) { ret.push((0, _Cell.simpleCellAddress)(this.start.sheet, currentColumn, currentRow)); currentColumn++; } currentRow++; } return ret; } }, { key: "addressesWithDirection", value: /*#__PURE__*/regeneratorRuntime.mark(function addressesWithDirection(right, bottom, dependencyGraph) { var currentRow, currentColumn, _currentRow, _currentColumn, _currentRow2, _currentColumn2, _currentRow3, _currentColumn3; return regeneratorRuntime.wrap(function addressesWithDirection$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(right > 0)) { _context.next = 30; break; } if (!(bottom > 0)) { _context.next = 16; break; } currentRow = this.effectiveEndRow(dependencyGraph); case 3: if (!(currentRow >= this.start.row)) { _context.next = 14; break; } currentColumn = this.effectiveEndColumn(dependencyGraph); case 5: if (!(currentColumn >= this.start.col)) { _context.next = 11; break; } _context.next = 8; return (0, _Cell.simpleCellAddress)(this.start.sheet, currentColumn, currentRow); case 8: currentColumn -= 1; _context.next = 5; break; case 11: currentRow -= 1; _context.next = 3; break; case 14: _context.next = 28; break; case 16: _currentRow = this.start.row; case 17: if (!(_currentRow <= this.effectiveEndRow(dependencyGraph))) { _context.next = 28; break; } _currentColumn = this.effectiveEndColumn(dependencyGraph); case 19: if (!(_currentColumn >= this.start.col)) { _context.next = 25; break; } _context.next = 22; return (0, _Cell.simpleCellAddress)(this.start.sheet, _currentColumn, _currentRow); case 22: _currentColumn -= 1; _context.next = 19; break; case 25: _currentRow += 1; _context.next = 17; break; case 28: _context.next = 57; break; case 30: if (!(bottom > 0)) { _context.next = 45; break; } _currentRow2 = this.effectiveEndRow(dependencyGraph); case 32: if (!(_currentRow2 >= this.start.row)) { _context.next = 43; break; } _currentColumn2 = this.start.col; case 34: if (!(_currentColumn2 <= this.effectiveEndColumn(dependencyGraph))) { _context.next = 40; break; } _context.next = 37; return (0, _Cell.simpleCellAddress)(this.start.sheet, _currentColumn2, _currentRow2); case 37: _currentColumn2 += 1; _context.next = 34; break; case 40: _currentRow2 -= 1; _context.next = 32; break; case 43: _context.next = 57; break; case 45: _currentRow3 = this.start.row; case 46: if (!(_currentRow3 <= this.effectiveEndRow(dependencyGraph))) { _context.next = 57; break; } _currentColumn3 = this.start.col; case 48: if (!(_currentColumn3 <= this.effectiveEndColumn(dependencyGraph))) { _context.next = 54; break; } _context.next = 51; return (0, _Cell.simpleCellAddress)(this.start.sheet, _currentColumn3, _currentRow3); case 51: _currentColumn3 += 1; _context.next = 48; break; case 54: _currentRow3 += 1; _context.next = 46; break; case 57: case "end": return _context.stop(); } } }, addressesWithDirection, this); }) }, { key: "getAddress", value: function getAddress(col, row) { if (col < 0 || row < 0 || row > this.height() - 1 || col > this.width() - 1) { throw Error('Index out of bound'); } return (0, _Cell.simpleCellAddress)(this.start.sheet, this.start.col + col, this.start.row + row); } }, { key: "exceedsSheetSizeLimits", value: function exceedsSheetSizeLimits(maxColumns, maxRows) { return this.end.col >= maxColumns || this.end.row >= maxRows; } }, { key: "effectiveEndColumn", value: function effectiveEndColumn(_dependencyGraph) { return this.end.col; } }, { key: "effectiveEndRow", value: function effectiveEndRow(_dependencyGraph) { return this.end.row; } }], [{ key: "fromAst", value: function fromAst(ast, baseAddress) { if (ast.type === _parser.AstNodeType.CELL_RANGE) { return AbsoluteCellRange.fromCellRange(ast, baseAddress); } else if (ast.type === _parser.AstNodeType.COLUMN_RANGE) { return AbsoluteColumnRange.fromColumnRange(ast, baseAddress); } else { return AbsoluteRowRange.fromRowRangeAst(ast, baseAddress); } } }, { key: "fromCellRange", value: function fromCellRange(x, baseAddress) { return new AbsoluteCellRange(x.start.toSimpleCellAddress(baseAddress), x.end.toSimpleCellAddress(baseAddress)); } }, { key: "fromCellRangeOrUndef", value: function fromCellRangeOrUndef(x, baseAddress) { try { return new AbsoluteCellRange(x.start.toSimpleCellAddress(baseAddress), x.end.toSimpleCellAddress(baseAddress)); } catch (e) { return undefined; } } }, { key: "spanFrom", value: function spanFrom(topLeftCorner, width, height) { if (!Number.isFinite(width) && Number.isFinite(height)) { if (topLeftCorner.col !== 0) { throw new Error(WRONG_RANGE_SIZE); } return new AbsoluteRowRange(topLeftCorner.sheet, topLeftCorner.row, topLeftCorner.row + height - 1); } else if (!Number.isFinite(height) && Number.isFinite(width)) { if (topLeftCorner.row !== 0) { throw new Error(WRONG_RANGE_SIZE); } return new AbsoluteColumnRange(topLeftCorner.sheet, topLeftCorner.col, topLeftCorner.col + width - 1); } else if (Number.isFinite(height) && Number.isFinite(width)) { return new AbsoluteCellRange(topLeftCorner, (0, _Cell.simpleCellAddress)(topLeftCorner.sheet, topLeftCorner.col + width - 1, topLeftCorner.row + height - 1)); } throw new Error(WRONG_RANGE_SIZE); } }, { key: "fromCoordinates", value: function fromCoordinates(sheet, x1, y1, x2, y2) { return new AbsoluteCellRange((0, _Cell.simpleCellAddress)(sheet, x1, y1), (0, _Cell.simpleCellAddress)(sheet, x2, y2)); } }]); return AbsoluteCellRange; }(); exports.AbsoluteCellRange = AbsoluteCellRange; var AbsoluteColumnRange = /*#__PURE__*/function (_AbsoluteCellRange) { _inherits(AbsoluteColumnRange, _AbsoluteCellRange); var _super = _createSuper(AbsoluteColumnRange); function AbsoluteColumnRange(sheet, columnStart, columnEnd) { _classCallCheck(this, AbsoluteColumnRange); return _super.call(this, (0, _Cell.simpleCellAddress)(sheet, columnStart, 0), (0, _Cell.simpleCellAddress)(sheet, columnEnd, Number.POSITIVE_INFINITY)); } _createClass(AbsoluteColumnRange, [{ key: "shouldBeRemoved", value: function shouldBeRemoved() { return this.width() <= 0; } }, { key: "shiftByRows", value: function shiftByRows(_numberOfRows) { return; } }, { key: "expandByRows", value: function expandByRows(_numberOfRows) { return; } }, { key: "shifted", value: function shifted(byCols, _byRows) { return new AbsoluteColumnRange(this.sheet, this.start.col + byCols, this.end.col + byCols); } }, { key: "removeRows", value: function removeRows(_rowStart, _rowEnd) { return; } }, { key: "rangeWithSameHeight", value: function rangeWithSameHeight(startColumn, numberOfColumns) { return new AbsoluteColumnRange(this.sheet, startColumn, startColumn + numberOfColumns - 1); } }, { key: "exceedsSheetSizeLimits", value: function exceedsSheetSizeLimits(maxColumns, _maxRows) { return this.end.col >= maxColumns; } }, { key: "effectiveEndRow", value: function effectiveEndRow(dependencyGraph) { return dependencyGraph.getSheetHeight(this.sheet) - 1; } }], [{ key: "fromColumnRange", value: function fromColumnRange(x, baseAddress) { var start = x.start.toSimpleColumnAddress(baseAddress); var end = x.end.toSimpleColumnAddress(baseAddress); if (start.sheet !== end.sheet) { throw new _errors.SheetsNotEqual(start.sheet, end.sheet); } return new AbsoluteColumnRange(start.sheet, start.col, end.col); } }]); return AbsoluteColumnRange; }(AbsoluteCellRange); exports.AbsoluteColumnRange = AbsoluteColumnRange; var AbsoluteRowRange = /*#__PURE__*/function (_AbsoluteCellRange2) { _inherits(AbsoluteRowRange, _AbsoluteCellRange2); var _super2 = _createSuper(AbsoluteRowRange); function AbsoluteRowRange(sheet, rowStart, rowEnd) { _classCallCheck(this, AbsoluteRowRange); return _super2.call(this, (0, _Cell.simpleCellAddress)(sheet, 0, rowStart), (0, _Cell.simpleCellAddress)(sheet, Number.POSITIVE_INFINITY, rowEnd)); } _createClass(AbsoluteRowRange, [{ key: "shouldBeRemoved", value: function shouldBeRemoved() { return this.height() <= 0; } }, { key: "shiftByColumns", value: function shiftByColumns(_numberOfColumns) { return; } }, { key: "expandByColumns", value: function expandByColumns(_numberOfColumns) { return; } }, { key: "shifted", value: function shifted(byCols, byRows) { return new AbsoluteRowRange(this.sheet, this.start.row + byRows, this.end.row + byRows); } }, { key: "removeColumns", value: function removeColumns(_columnStart, _columnEnd) { return; } }, { key: "rangeWithSameWidth", value: function rangeWithSameWidth(startRow, numberOfRows) { return new AbsoluteRowRange(this.sheet, startRow, startRow + numberOfRows - 1); } }, { key: "exceedsSheetSizeLimits", value: function exceedsSheetSizeLimits(_maxColumns, maxRows) { return this.end.row >= maxRows; } }, { key: "effectiveEndColumn", value: function effectiveEndColumn(dependencyGraph) { return dependencyGraph.getSheetWidth(this.sheet) - 1; } }], [{ key: "fromRowRangeAst", value: function fromRowRangeAst(x, baseAddress) { var start = x.start.toSimpleRowAddress(baseAddress); var end = x.end.toSimpleRowAddress(baseAddress); if (start.sheet !== end.sheet) { throw new _errors.SheetsNotEqual(start.sheet, end.sheet); } return new AbsoluteRowRange(start.sheet, start.row, end.row); } }]); return AbsoluteRowRange; }(AbsoluteCellRange); exports.AbsoluteRowRange = AbsoluteRowRange;