Created
December 21, 2013 12:43
-
-
Save padolsey/8068894 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var vic = require('./vic').vic; | |
var singular = require('./singularValidators'); | |
var DateRange = require('./DateRange'); | |
var Date = require('./Date'); | |
var NativeDate = Date.NativeDate; | |
// Regexes adaped/used in the regexBuilder (r) | |
// Flag hard-set to 'i'; | |
var YEAR = /(\d{2,4})/; | |
var MONTH = /(\d{1,2})/; | |
var DAY = /(\d{1,2}\s*(?:[a-z]{2}(?![a-z]))?)/; | |
var WORD = /\b([A-Z]+)/; | |
var DASH = /(-|–)/; | |
var SEP = /(,|\.|\/|\||-|–)/; // i.e. Date Numerical separators | |
var COMMA = /(;|,|\s+)/; | |
var TIME = /(\d{1,2}(?:[:,.-]\d{1,2})?\s*(?:AM|PM)?)/; | |
function isValidDay(oneBasedDay, zeroBasedMonth, year) { | |
// If Day is > than next month's zeroth day (i.e. its previous months last) | |
// then we can say it is invalid | |
return oneBasedDay > 0 && oneBasedDay <= new NativeDate(year, zeroBasedMonth + 1, 0).getDate(); | |
} | |
function r() { // regex builder | |
// NOTE: This will discard flags of the regexes: | |
var r = ''; | |
for (var i = 0, l = arguments.length; i < l; ++i) { | |
var a = arguments[i]; | |
r += (a instanceof RegExp ? a.source : a); | |
// Separate each component by optional whitespace characters: | |
r += '\\s*'; | |
} | |
return RegExp(r, 'i'); | |
} | |
/** | |
* All parsers for Dates and Date Ranges | |
*/ | |
module.exports = [ | |
/********** | |
* RANGES * | |
**********/ | |
// * 01 January - Tue 31 December 2013 | |
vic(r(DAY, WORD, DASH, WORD, DAY, WORD, YEAR), { | |
1: singular.day, | |
2: singular.monthName, | |
5: singular.day, | |
6: singular.monthName, | |
7: singular.year | |
}, function(startDay, startMonth, _a, _b, endDay, endMonth, year) { | |
if ( | |
(startMonth > endMonth) || | |
(startMonth === endMonth && startDay >= endDay) | |
) { | |
return false; | |
} | |
if (!isValidDay(startDay, startMonth, year) || !isValidDay(endDay, endMonth, year)) { | |
return false; | |
} | |
return new DateRange( | |
new Date(year, startMonth, startDay), | |
new Date(year, endMonth, endDay) | |
); | |
}), | |
// 20 April, 2013 - 12:00 to 18:00 | |
vic(r(DAY, WORD, COMMA, YEAR, DASH, TIME, /(to)/, TIME), { | |
1: singular.day, | |
2: singular.monthName, | |
4: singular.year, | |
6: singular.time, | |
8: singular.time | |
}, function(day, month, _a, year, _b, startTime, _c, endTime) { | |
if ( | |
startTime.h > endTime.h || | |
(startTime.h === endTime.h && startTime.m > endTime.m) | |
) { | |
return false; | |
} | |
if (!isValidDay(day, month, year)) { | |
return false; | |
} | |
return new DateRange( | |
new Date(year, month, day, startTime.h, startTime.m, startTime.s), | |
new Date(year, month, day, endTime.h, endTime.m, endTime.s) | |
); | |
}), | |
// 27 February 2012 – 19 May 2013 | |
vic(r(DAY, WORD, YEAR, DASH, DAY, WORD, YEAR), { | |
1: singular.day, | |
2: singular.monthName, | |
3: singular.year, | |
5: singular.day, | |
6: singular.monthName, | |
7: singular.year | |
}, function(startDay, startMonth, startYear, _dash, endDay, endMonth, endYear) { | |
if ( | |
startYear > endYear || | |
(startYear === endYear && startMonth >= endMonth) || | |
(startYear === endYear && startMonth === endMonth && startDay >= endDay) | |
) { | |
return false; | |
} | |
if (!isValidDay(startDay, startMonth, startYear) || !isValidDay(endDay, endMonth, endYear)) { | |
return false; | |
} | |
return new DateRange( | |
new Date(startYear, startMonth, startDay), | |
new Date(endYear, endMonth, endDay) | |
); | |
}), | |
// 27 February – 19 May 2013 | |
vic(r(DAY, WORD, DASH, DAY, WORD, YEAR), { | |
1: singular.day, | |
2: singular.monthName, | |
4: singular.day, | |
5: singular.monthName, | |
6: singular.year | |
}, function(startDay, startMonth, _dash, endDay, endMonth, year) { | |
if (startMonth > endMonth || (startMonth === endMonth && startDay >= endDay)) { | |
return false; | |
} | |
if (!isValidDay(startDay, startMonth, year) || !isValidDay(endDay, endMonth, year)) { | |
return false; | |
} | |
return new DateRange( | |
new Date(year, startMonth, startDay), | |
new Date(year, endMonth, endDay) | |
); | |
}), | |
// 01 - 02 April 2013 | |
vic(r(DAY, DASH, DAY, WORD, YEAR), { | |
1: singular.day, | |
3: singular.day, | |
4: singular.monthName, | |
5: singular.year | |
}, function(startDay, _dash, endDay, month, year) { | |
if (startDay >= endDay) { | |
return false; | |
} | |
if (!isValidDay(startDay, month, year) || !isValidDay(endDay, month, year)) { | |
return false; | |
} | |
return new DateRange( | |
new Date(year, month, startDay), | |
new Date(year, month, endDay) | |
); | |
}), | |
/************* | |
* SINGLULAR * | |
*************/ | |
// 13 April 2013, 12:00 PM | |
vic(r(DAY, WORD, YEAR, COMMA, TIME), { | |
1: singular.day, | |
2: singular.monthName, | |
3: singular.year, | |
5: singular.time | |
}, function(day, month, year, _c, time) { | |
if (!isValidDay(day, month, year)) { | |
return false; | |
} | |
var d = new Date(year, month, day, time.h, time.m, time.s); | |
d.setIsSpecificTime(true); | |
return d; | |
}), | |
// 20:00 19/04/13 | |
vic(r(TIME, DAY, SEP, MONTH, SEP, YEAR), { | |
1: singular.time, | |
2: singular.day, | |
4: singular.month, | |
6: singular.year | |
}, function(time, day, _a, month, _b, year) { | |
if (!isValidDay(day, month, year)) { | |
return false; | |
} | |
var d = new Date(year, month, day, time.h, time.m, time.s); | |
d.setIsSpecificTime(true); | |
return d; | |
}), | |
// 13 April 2013 | |
vic(r(DAY, WORD, YEAR), { | |
1: singular.day, | |
2: singular.monthName, | |
3: singular.year | |
}, function(day, month, year) { | |
if (!isValidDay(day, month, year)) { | |
return false; | |
} | |
return new Date(year, month, day); | |
}) | |
]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment