spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← Commit log
commit
message
Ading timestamp capture to a couple more date regular expressions
author
Ben Vogt <[email protected]>
date
2017-04-01 18:01:08
stats
3 file(s) changed, 77 insertions(+), 8 deletions(-)
files
src/RawFormulas/Date.ts
src/RawFormulas/Utils.ts
tests/DateFormulasTest.ts
  1diff --git a/src/RawFormulas/Date.ts b/src/RawFormulas/Date.ts
  2index 465e524..ef7d362 100644
  3--- a/src/RawFormulas/Date.ts
  4+++ b/src/RawFormulas/Date.ts
  5@@ -50,8 +50,8 @@ const YEAR_MONTHDIG_DAY = DateRegExBuilder.DateRegExBuilder()
  6   .build();
  7 const MONTHDIG_DAY_YEAR = DateRegExBuilder.DateRegExBuilder()
  8   .start()
  9-  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().MM().FLEX_DELIMITER().DD().FLEX_DELIMITER().YYYY14()
 10-  .end()
 11+  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().MM().FLEX_DELIMITER().DD().FLEX_DELIMITER().YYYY14_W_SPACE().OPTIONAL_TIMESTAMP_CAPTURE_GROUP()
 12+  .simpleEnd()
 13   .build();
 14 const DAY_MONTHNAME_YEAR = DateRegExBuilder.DateRegExBuilder()
 15   .start()
 16@@ -60,18 +60,18 @@ const DAY_MONTHNAME_YEAR = DateRegExBuilder.DateRegExBuilder()
 17   .build();
 18 const YEAR_MONTHDIG = DateRegExBuilder.DateRegExBuilder()
 19   .start()
 20-  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().YYYY14().FLEX_DELIMITER().MM()
 21-  .end()
 22+  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().YYYY14().FLEX_DELIMITER().MM_W_SPACE().OPTIONAL_TIMESTAMP_CAPTURE_GROUP()
 23+  .simpleEnd()
 24   .build();
 25 const MONTHDIG_YEAR = DateRegExBuilder.DateRegExBuilder()
 26   .start()
 27-  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().MM().FLEX_DELIMITER().YYYY14()
 28-  .end()
 29+  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().MM().FLEX_DELIMITER().YYYY14_W_SPACE().OPTIONAL_TIMESTAMP_CAPTURE_GROUP()
 30+  .simpleEnd()
 31   .build();
 32 const YEAR_MONTHNAME = DateRegExBuilder.DateRegExBuilder()
 33   .start()
 34-  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().YYYY14().FLEX_DELIMITER().MONTHNAME()
 35-  .end()
 36+  .OPTIONAL_DAYNAME().OPTIONAL_COMMA().YYYY14().FLEX_DELIMITER().MONTHNAME_W_SPACE().OPTIONAL_TIMESTAMP_CAPTURE_GROUP()
 37+  .simpleEnd()
 38   .build();
 39 const MONTHNAME_YEAR = DateRegExBuilder.DateRegExBuilder()
 40   .start()
 41@@ -120,6 +120,9 @@ var DATEVALUE = function (...values) : number {
 42   if (m === undefined) {
 43     var matches = dateString.match(YEAR_MONTHDIG);
 44     if (matches && matches.length >= 6) {
 45+      if (matches[6] !== undefined) {
 46+        console.log("YEAR_MONTHDIG matched timestamp", matches[6]);
 47+      }
 48       var years = parseInt(matches[3]);
 49       var months = parseInt(matches[5]) - 1; // Months are zero indexed.
 50       m = createMoment(years, months, 0);
 51@@ -149,6 +152,9 @@ var DATEVALUE = function (...values) : number {
 52   if (m === undefined) {
 53     var matches = dateString.match(MONTHDIG_YEAR);
 54     if (matches && matches.length >= 6) {
 55+      if (matches[6] !== undefined) {
 56+        console.log("MONTHDIG_YEAR matched timestamp", matches[6]);
 57+      }
 58       var years = parseInt(matches[5]);
 59       var months = parseInt(matches[3]) - 1; // Months are zero indexed.
 60       m = createMoment(years, months, 0);
 61@@ -159,6 +165,9 @@ var DATEVALUE = function (...values) : number {
 62   if (m === undefined) {
 63     var matches = dateString.match(MONTHDIG_DAY_YEAR);
 64     if (matches && matches.length >= 8) {
 65+      if (matches.length >= 9 && matches[8] !== undefined) {
 66+        console.log("MONTHDIG_DAY_YEAR matched timestamp", matches[8]);
 67+      }
 68       // Check delimiters. If they're not the same, throw error.
 69       if (matches[4].replace(/\s*/g, '') !== matches[6].replace(/\s*/g, '')) {
 70         throw new CellError(VALUE_ERROR, "DATEVALUE parameter '" + dateString + "' cannot be parsed to date/time.");
 71@@ -205,6 +214,9 @@ var DATEVALUE = function (...values) : number {
 72   if (m === undefined) {
 73     var matches = dateString.match(YEAR_MONTHNAME);
 74     if (matches && matches.length >= 6) {
 75+      if (matches[6] !== undefined) {
 76+        console.log("YEAR_MONTHNAME matched timestamp", matches[6]);
 77+      }
 78       var years = parseInt(matches[3]);
 79       var monthName = matches[5];
 80       m = createMoment(years, monthName, 0);
 81diff --git a/src/RawFormulas/Utils.ts b/src/RawFormulas/Utils.ts
 82index 75fc0b6..4e71f46 100644
 83--- a/src/RawFormulas/Utils.ts
 84+++ b/src/RawFormulas/Utils.ts
 85@@ -399,6 +399,11 @@ class DateRegExBuilder {
 86     return this;
 87   }
 88 
 89+  MONTHNAME_W_SPACE() : DateRegExBuilder {
 90+    this.regexString += "(january|february|march|april|may|june|july|august|september|october|november|december|jan|feb|mar|apr|jun|jul|aug|sep|oct|nov|dec|january\\s+|february\\s+|march\\s+|april\\s+|may\\s+|june\\s+|july\\s+|august\\s+|september\\s+|october\\s+|november\\s+|december\\s+|jan\\s+|feb\\s+|mar\\s+|apr\\s+|jun\\s+|jul\\s+|aug\\s+|sep\\s+|oct\\s+|nov\\s+|dec\\s+)";
 91+    return this;
 92+  }
 93+
 94   OPTIONAL_DAYNAME() : DateRegExBuilder {
 95     this.regexString += "(sunday|monday|tuesday|wednesday|thursday|friday|saturday|sun|mon|tue|wed|thu|fri|sat)?";
 96     return this;
 97@@ -414,6 +419,11 @@ class DateRegExBuilder {
 98     return this;
 99   }
100 
101+  MM_W_SPACE() : DateRegExBuilder {
102+    this.regexString += "([1-9]|0[1-9]|1[0-2]|[1-9]\\s+|0[1-9]\\s+|1[0-2]\\s+)";
103+    return this;
104+  }
105+
106   DD() : DateRegExBuilder {
107     this.regexString += "(0?[0-9]|1[0-9]|2[0-9]|3[0-1])";
108     return this;
109diff --git a/tests/DateFormulasTest.ts b/tests/DateFormulasTest.ts
110index f3edf7a..2864ac4 100644
111--- a/tests/DateFormulasTest.ts
112+++ b/tests/DateFormulasTest.ts
113@@ -107,6 +107,17 @@ catchAndAssertEquals(function() {
114 catchAndAssertEquals(function() {
115   DATEVALUE("1/44/2005");
116 }, ERRORS.VALUE_ERROR);
117+// timestamp test
118+assertEquals(DATEVALUE("6-24-92 10am"), 33779); // TODO: come back to these. right now just testing to make sure they don't break anything.
119+assertEquals(DATEVALUE("6-24-92 10:10"), 33779);
120+assertEquals(DATEVALUE("6-24-92 10:10am"), 33779);
121+assertEquals(DATEVALUE("6-24-92 10:10:10"), 33779);
122+assertEquals(DATEVALUE("6-24-92 10:10:10am"), 33779);
123+assertEquals(DATEVALUE("6-24-92  10  am"), 33779);
124+assertEquals(DATEVALUE("6-24-92 10: 10 "), 33779);
125+assertEquals(DATEVALUE("6-24-92 10: 10 pm"), 33779);
126+assertEquals(DATEVALUE("6-24-92 10: 10: 10"), 33779);
127+assertEquals(DATEVALUE("6-24-92  101120: 10: 10    am  "), 33779);
128 // YEAR_MONTHDIG_DAY, YYYY(fd)MM(fd)DD =================================================================================
129 assertEquals(DATEVALUE("1992/6/24"), 33779);
130 assertEquals(DATEVALUE("1992/06/24"), 33779);
131@@ -181,6 +192,7 @@ catchAndAssertEquals(function() {
132 catchAndAssertEquals(function() {
133   DATEVALUE("2005/1/44");
134 }, ERRORS.VALUE_ERROR);
135+// timestamp test
136 assertEquals(DATEVALUE("1992-6-24 10am"), 33779); // TODO: come back to these. right now just testing to make sure they don't break anything.
137 assertEquals(DATEVALUE("1992-6-24 10:10"), 33779);
138 assertEquals(DATEVALUE("1992-6-24 10:10am"), 33779);
139@@ -268,6 +280,17 @@ assertEquals(DATEVALUE("2017, 01"), 42736);
140 catchAndAssertEquals(function() {
141   DATEVALUE("2017,01");
142 }, ERRORS.VALUE_ERROR);
143+// timestamp test
144+assertEquals(DATEVALUE("2017-01 10am"), 42736); // TODO: come back to these. right now just testing to make sure they don't break anything.
145+assertEquals(DATEVALUE("2017-01 10:10"), 42736);
146+assertEquals(DATEVALUE("2017-01 10:10am"), 42736);
147+assertEquals(DATEVALUE("2017-01 10:10:10"), 42736);
148+assertEquals(DATEVALUE("2017-01 10:10:10am"), 42736);
149+assertEquals(DATEVALUE("2017-01  10  am"), 42736);
150+assertEquals(DATEVALUE("2017-01 10: 10 "), 42736);
151+assertEquals(DATEVALUE("2017-01 10: 10 pm"), 42736);
152+assertEquals(DATEVALUE("2017-01 10: 10: 10"), 42736);
153+assertEquals(DATEVALUE("2017-01  101120: 10: 10    am  "), 42736);
154 // MONTHDIG_YEAR, MM(fd)YYYY, '06/1992' ================================================================================
155 assertEquals(DATEVALUE("01/2017"), 42736);
156 assertEquals(DATEVALUE("02/2017"), 42767);
157@@ -296,6 +319,17 @@ catchAndAssertEquals(function() {
158 catchAndAssertEquals(function() {
159   DATEVALUE("0/2017");
160 }, ERRORS.VALUE_ERROR);
161+// timestamp test
162+assertEquals(DATEVALUE("01-2017 10am"), 42736); // TODO: come back to these. right now just testing to make sure they don't break anything.
163+assertEquals(DATEVALUE("01-2017 10:10"), 42736);
164+assertEquals(DATEVALUE("01-2017 10:10am"), 42736);
165+assertEquals(DATEVALUE("01-2017 10:10:10"), 42736);
166+assertEquals(DATEVALUE("01-2017 10:10:10am"), 42736);
167+assertEquals(DATEVALUE("01-2017  10  am"), 42736);
168+assertEquals(DATEVALUE("01-2017 10: 10 "), 42736);
169+assertEquals(DATEVALUE("01-2017 10: 10 pm"), 42736);
170+assertEquals(DATEVALUE("01-2017 10: 10: 10"), 42736);
171+assertEquals(DATEVALUE("01-2017  101120: 10: 10    am  "), 42736);
172 // YEAR_MONTHNAME, YYYY(fd)Month, '1992/Aug' ===========================================================================
173 assertEquals(DATEVALUE("2017 January"), 42736);
174 assertEquals(DATEVALUE("2017 February"), 42767);
175@@ -320,6 +354,17 @@ assertEquals(DATEVALUE("2017, January"), 42736);
176 catchAndAssertEquals(function() {
177   DATEVALUE("2017,January");
178 }, ERRORS.VALUE_ERROR);
179+// timestamp test
180+assertEquals(DATEVALUE("2017-January 10am"), 42736); // TODO: come back to these. right now just testing to make sure they don't break anything.
181+assertEquals(DATEVALUE("2017-January 10:10"), 42736);
182+assertEquals(DATEVALUE("2017-January 10:10am"), 42736);
183+assertEquals(DATEVALUE("2017-January 10:10:10"), 42736);
184+assertEquals(DATEVALUE("2017-January 10:10:10am"), 42736);
185+assertEquals(DATEVALUE("2017-January  10  am"), 42736);
186+assertEquals(DATEVALUE("2017-January 10: 10 "), 42736);
187+assertEquals(DATEVALUE("2017-January 10: 10 pm"), 42736);
188+assertEquals(DATEVALUE("2017-January 10: 10: 10"), 42736);
189+assertEquals(DATEVALUE("2017-January  101120: 10: 10    am  "), 42736);
190 // MONTHNAME_YEAR, Month(fd)YYYY, 'Aug 1992' ===========================================================================
191 assertEquals(DATEVALUE("January 2017"), 42736);
192 assertEquals(DATEVALUE("February 2017"), 42767);