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