From ba3d7f1c75990573fc0a964e555da716ed09260f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Kretzschmar?= Date: Wed, 3 Aug 2022 15:52:59 +0200 Subject: [PATCH] fix(ranges): allow dollar signs --- formulas/helpers.js | 2 +- grammar/dependency/utils.js | 2 +- grammar/lexing.js | 3 +-- grammar/utils.js | 2 +- test/grammar/depParser.js | 16 ++++++++++++++++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/formulas/helpers.js b/formulas/helpers.js index 6e3b3b25..57117b16 100644 --- a/formulas/helpers.js +++ b/formulas/helpers.js @@ -397,7 +397,7 @@ const Address = { }, columnNameToNumber: (columnName) => { - columnName = columnName.toUpperCase(); + columnName = columnName.replace("$","").toUpperCase(); const len = columnName.length; let number = 0; for (let i = 0; i < len; i++) { diff --git a/grammar/dependency/utils.js b/grammar/dependency/utils.js index 9445b85c..e1cea763 100644 --- a/grammar/dependency/utils.js +++ b/grammar/dependency/utils.js @@ -255,7 +255,7 @@ class Utils { * @return {number} */ toNumber(number) { - return Number(number); + return Number(number.replace("$","")); } /** diff --git a/grammar/lexing.js b/grammar/lexing.js index 96613aa1..f3108280 100644 --- a/grammar/lexing.js +++ b/grammar/lexing.js @@ -59,7 +59,7 @@ const Cell = createToken({ const Number = createToken({ name: 'Number', - pattern: /[0-9]+[.]?[0-9]*([eE][+\-][0-9]+)?/ + pattern: /[$]?[0-9]+[.]?[0-9]*([eE][+\-][0-9]+)?/ }); const Boolean = createToken({ @@ -73,7 +73,6 @@ const Column = createToken({ longer_alt: Name }); - /** * Symbols and operators */ diff --git a/grammar/utils.js b/grammar/utils.js index 852a7559..5881a875 100644 --- a/grammar/utils.js +++ b/grammar/utils.js @@ -354,7 +354,7 @@ class Utils { * @return {number} */ toNumber(number) { - return Number(number); + return Number(number.replace("$","")); } /** diff --git a/test/grammar/depParser.js b/test/grammar/depParser.js index 38ffa566..6c96d09d 100644 --- a/test/grammar/depParser.js +++ b/test/grammar/depParser.js @@ -48,6 +48,22 @@ describe('Dependency parser', () => { expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 3, col: 16384}}]); }); + it('should parse special ranges', () => { + actual = depParser.parse('$A:$C', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 1048576, col: 3}}]); + actual = depParser.parse('A:$C', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 1048576, col: 3}}]); + actual = depParser.parse('$A:C', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 1048576, col: 3}}]); + + actual = depParser.parse('$1:$3', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 3, col: 16384}}]); + actual = depParser.parse('1:$3', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 3, col: 16384}}]); + actual = depParser.parse('$1:3', position); + expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 3, col: 16384}}]); + }); + it('should parse variable', function () { let actual = depParser.parse('aaaa', position); expect(actual).to.deep.eq([{sheet: 'Sheet1', from: {row: 1, col: 1}, to: {row: 2, col: 2}}]);