Skip to content

Instantly share code, notes, and snippets.

@padolsey
Created December 21, 2013 12:43
Show Gist options
  • Save padolsey/8068894 to your computer and use it in GitHub Desktop.
Save padolsey/8068894 to your computer and use it in GitHub Desktop.
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