chrono-node 1.3.5 → 1.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -67
- package/bower.json +1 -1
- package/chrono.js +1249 -1076
- package/chrono.map.json +1 -1
- package/chrono.min.js +101 -101
- package/package.json +11 -15
- package/src/chrono.js +2 -3
- package/src/options.js +3 -3
- package/src/parsers/{DE → de}/DECasualDateParser.js +0 -0
- package/src/parsers/{DE → de}/DEDeadlineFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DEMonthNameLittleEndianParser.js +0 -0
- package/src/parsers/{DE → de}/DEMonthNameParser.js +0 -0
- package/src/parsers/{DE → de}/DESlashDateFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DETimeAgoFormatParser.js +0 -0
- package/src/parsers/{DE → de}/DETimeExpressionParser.js +0 -0
- package/src/parsers/{DE → de}/DEWeekdayParser.js +4 -4
- package/src/parsers/{EN → en}/ENCasualDateParser.js +0 -0
- package/src/parsers/en/ENCasualTimeParser.js +60 -0
- package/src/parsers/{EN → en}/ENDeadlineFormatParser.js +6 -6
- package/src/parsers/{EN → en}/ENISOFormatParser.js +0 -0
- package/src/parsers/{EN → en}/ENMonthNameLittleEndianParser.js +21 -23
- package/src/parsers/{EN → en}/ENMonthNameMiddleEndianParser.js +2 -2
- package/src/parsers/{EN → en}/ENMonthNameParser.js +1 -1
- package/src/parsers/{EN → en}/ENRelativeDateFormatParser.js +40 -2
- package/src/parsers/{EN → en}/ENSlashDateFormatParser.js +5 -1
- package/src/parsers/{EN → en}/ENSlashDateFormatStartWithYearParser.js +8 -2
- package/src/parsers/{EN → en}/ENSlashMonthFormatParser.js +0 -0
- package/src/parsers/en/ENTimeAgoFormatParser.js +69 -0
- package/src/parsers/{EN → en}/ENTimeExpressionParser.js +24 -11
- package/src/parsers/en/ENTimeLaterFormatParser.js +77 -0
- package/src/parsers/{EN → en}/ENWeekdayParser.js +0 -0
- package/src/parsers/{ES → es}/ESCasualDateParser.js +0 -0
- package/src/parsers/{ES → es}/ESDeadlineFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESMonthNameLittleEndianParser.js +2 -2
- package/src/parsers/{ES → es}/ESSlashDateFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESTimeAgoFormatParser.js +0 -0
- package/src/parsers/{ES → es}/ESTimeExpressionParser.js +0 -0
- package/src/parsers/{ES → es}/ESWeekdayParser.js +1 -1
- package/src/parsers/{FR → fr}/FRCasualDateParser.js +0 -0
- package/src/parsers/{FR → fr}/FRDeadlineFormatParser.js +0 -0
- package/src/parsers/{FR → fr}/FRMonthNameLittleEndianParser.js +0 -0
- package/src/parsers/{FR → fr}/FRRelativeDateFormatParser.js +0 -0
- package/src/parsers/{FR → fr}/FRSlashDateFormatParser.js +41 -11
- package/src/parsers/{FR → fr}/FRTimeAgoFormatParser.js +0 -0
- package/src/parsers/{FR → fr}/FRTimeExpressionParser.js +0 -0
- package/src/parsers/{FR → fr}/FRWeekdayParser.js +1 -1
- package/src/parsers/{JP → ja}/JPCasualDateParser.js +0 -0
- package/src/parsers/{JP → ja}/JPStandardParser.js +0 -0
- package/src/parsers/parser.js +50 -50
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantCasualDateParser.js +18 -2
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDateParser.js +0 -0
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDeadlineFormatParser.js +0 -0
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantTimeExpressionParser.js +36 -4
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantWeekdayParser.js +1 -1
- package/src/refiners/ExtractTimezoneAbbrRefiner.js +19 -10
- package/src/refiners/ForwardDateRefiner.js +1 -1
- package/src/refiners/{DE → de}/DEMergeDateRangeRefiner.js +1 -1
- package/src/refiners/{DE → de}/DEMergeDateTimeRefiner.js +3 -3
- package/src/refiners/{EN → en}/ENMergeDateRangeRefiner.js +0 -0
- package/src/refiners/{EN → en}/ENMergeDateTimeRefiner.js +15 -2
- package/src/refiners/{EN → en}/ENMergeWeekdayRefiner.js +0 -0
- package/src/refiners/{EN → en}/ENPrioritizeSpecificDateRefiner.js +0 -0
- package/src/refiners/{FR → fr}/FRMergeDateRangeRefiner.js +0 -0
- package/src/refiners/{FR → fr}/FRMergeDateTimeRefiner.js +1 -1
- package/src/refiners/{JP → ja}/JPMergeDateRangeRefiner.js +1 -1
- package/src/refiners/refiner.js +12 -12
- package/src/result.js +3 -1
- package/src/timezone.js +2 -0
- package/src/utils/EN.js +68 -2
- package/test/de/de.test.js +51 -0
- package/test/de/de_casual.test.js +432 -0
- package/test/de/de_dash.test.js +6 -0
- package/test/de/de_deadline.test.js +244 -0
- package/test/de/de_little_endian.test.js +459 -0
- package/test/de/de_time_ago.test.js +313 -0
- package/test/de/de_time_exp.test.js +166 -0
- package/test/de/de_weekday.test.js +235 -0
- package/test/en/en.test.js +250 -0
- package/test/en/en_casual.test.js +461 -0
- package/test/en/en_dash.test.js +31 -0
- package/test/en/en_deadline.test.js +366 -0
- package/test/{test_example.js → en/en_example.test.js} +7 -18
- package/test/en/en_inter_std.test.js +269 -0
- package/test/en/en_little_endian.test.js +566 -0
- package/test/en/en_middle_endian.test.js +552 -0
- package/test/en/en_month.test.js +113 -0
- package/test/en/en_option_forward.test.js +156 -0
- package/test/en/en_relative.test.js +228 -0
- package/test/en/en_slash.test.js +450 -0
- package/test/en/en_time_ago.test.js +374 -0
- package/test/en/en_time_exp.test.js +722 -0
- package/test/en/en_time_from_now.test.js +371 -0
- package/test/en/en_time_later.test.js +95 -0
- package/test/en/en_weekday.test.js +301 -0
- package/test/es/es_casual.test.js +258 -0
- package/test/es/es_dash.test.js +13 -0
- package/test/es/es_deadline.test.js +85 -0
- package/test/es/es_little_endian.test.js +350 -0
- package/test/es/es_slash.test.js +24 -0
- package/test/es/es_time_ago.test.js +137 -0
- package/test/es/es_time_exp.test.js +240 -0
- package/test/fr/fr_casual.test.js +454 -0
- package/test/fr/fr_dash.test.js +26 -0
- package/test/fr/fr_deadline.test.js +244 -0
- package/test/fr/fr_little_endian.test.js +576 -0
- package/test/fr/fr_relative.test.js +198 -0
- package/test/fr/fr_slash.test.js +62 -0
- package/test/fr/fr_time_ago.test.js +194 -0
- package/test/fr/fr_time_exp.test.js +960 -0
- package/test/fr/fr_weekday.test.js +200 -0
- package/test/ja/ja_casual.test.js +51 -0
- package/test/ja/ja_standard.test.js +170 -0
- package/test/system.test.js +207 -0
- package/test/zh/zh_hant_casual.test.js +340 -0
- package/test/zh/zh_hant_date.test.js +118 -0
- package/test/zh/zh_hant_deadline.test.js +213 -0
- package/test/zh/zh_hant_time_exp.test.js +226 -0
- package/test/zh/zh_hant_weekday.test.js +160 -0
- package/.npmignore +0 -11
- package/src/parsers/EN/ENCasualTimeParser.js +0 -53
- package/src/parsers/EN/ENTimeAgoFormatParser.js +0 -130
- package/src/parsers/EN/ENTimeFromNowFormatParser.js +0 -119
- package/test/test_de.js +0 -62
- package/test/test_de_casual.js +0 -443
- package/test/test_de_dash.js +0 -17
- package/test/test_de_deadline.js +0 -255
- package/test/test_de_little_endian.js +0 -470
- package/test/test_de_time_ago.js +0 -324
- package/test/test_de_time_exp.js +0 -177
- package/test/test_de_weekday.js +0 -246
- package/test/test_en.js +0 -249
- package/test/test_en_casual.js +0 -448
- package/test/test_en_dash.js +0 -42
- package/test/test_en_deadline.js +0 -311
- package/test/test_en_inter_std.js +0 -272
- package/test/test_en_little_endian.js +0 -529
- package/test/test_en_middle_endian.js +0 -563
- package/test/test_en_month.js +0 -124
- package/test/test_en_option_forward.js +0 -167
- package/test/test_en_relative.js +0 -206
- package/test/test_en_slash.js +0 -370
- package/test/test_en_time_ago.js +0 -385
- package/test/test_en_time_exp.js +0 -663
- package/test/test_en_time_from_now.js +0 -345
- package/test/test_en_weekday.js +0 -312
- package/test/test_es_casual.js +0 -269
- package/test/test_es_dash.js +0 -24
- package/test/test_es_deadline.js +0 -96
- package/test/test_es_little_endian.js +0 -361
- package/test/test_es_slash.js +0 -35
- package/test/test_es_time_ago.js +0 -148
- package/test/test_es_time_exp.js +0 -251
- package/test/test_fr_casual.js +0 -465
- package/test/test_fr_dash.js +0 -37
- package/test/test_fr_deadline.js +0 -255
- package/test/test_fr_little_endian.js +0 -568
- package/test/test_fr_relative.js +0 -209
- package/test/test_fr_slash.js +0 -54
- package/test/test_fr_time_ago.js +0 -205
- package/test/test_fr_time_exp.js +0 -971
- package/test/test_fr_weekday.js +0 -211
- package/test/test_jp_casual.js +0 -62
- package/test/test_jp_standard.js +0 -181
- package/test/test_system.js +0 -178
- package/test/test_zh_hant_casual.js +0 -329
- package/test/test_zh_hant_date.js +0 -129
- package/test/test_zh_hant_deadline.js +0 -224
- package/test/test_zh_hant_time_exp.js +0 -210
- package/test/test_zh_hant_weekday.js +0 -171
package/package.json
CHANGED
|
@@ -6,8 +6,12 @@
|
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/berryboy/chrono.git"
|
|
8
8
|
},
|
|
9
|
+
"jest": {
|
|
10
|
+
"verbose": true,
|
|
11
|
+
"testURL": "http://localhost/"
|
|
12
|
+
},
|
|
9
13
|
"license": "MIT",
|
|
10
|
-
"version": "1.3.
|
|
14
|
+
"version": "1.3.11",
|
|
11
15
|
"directories": {
|
|
12
16
|
"source": "./src",
|
|
13
17
|
"test": "./test"
|
|
@@ -15,27 +19,19 @@
|
|
|
15
19
|
"main": "./src/chrono",
|
|
16
20
|
"devDependencies": {
|
|
17
21
|
"browserify": "^14.3.0",
|
|
18
|
-
"coveralls": "^
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"karma-browserify": "^5.1.1",
|
|
22
|
-
"karma-chrome-launcher": "~2.1.1",
|
|
23
|
-
"karma-firefox-launcher": "~1.0.1",
|
|
24
|
-
"karma-qunit": "^1.2.1",
|
|
25
|
-
"minifyify": "^7.0.6",
|
|
26
|
-
"qunit": "^1.0.0",
|
|
27
|
-
"watchify": "^3.9.0"
|
|
22
|
+
"coveralls": "^3.0.2",
|
|
23
|
+
"jest": "^22.0.4",
|
|
24
|
+
"minifyify": "^7.0.6"
|
|
28
25
|
},
|
|
29
26
|
"scripts": {
|
|
30
27
|
"make-bundle": "browserify src/chrono.js -d --s chrono -o chrono.js",
|
|
31
28
|
"make-minify": "browserify src/chrono.js -d --s chrono -d -p [minifyify --output chrono.map.json] -o chrono.min.js",
|
|
32
29
|
"make": "npm run make-bundle & npm run make-minify",
|
|
33
|
-
"watch": "
|
|
34
|
-
"
|
|
35
|
-
"test": "qunit -l '{summary:true, tests: true}' -c chrono:src/chrono.js -p src -t test/*.js --cov --timeout 10000",
|
|
30
|
+
"watch": "jest --watch",
|
|
31
|
+
"test": "jest --coverage && npm audit --audit-level high",
|
|
36
32
|
"coveralls": "npm run test && cat coverage/lcov.info | coveralls"
|
|
37
33
|
},
|
|
38
34
|
"dependencies": {
|
|
39
|
-
"moment": "
|
|
35
|
+
"moment": "2.21.0"
|
|
40
36
|
}
|
|
41
37
|
}
|
package/src/chrono.js
CHANGED
|
@@ -14,8 +14,6 @@ exports.ParsedComponents = require('./result').ParsedComponents;
|
|
|
14
14
|
var Chrono = function(option) {
|
|
15
15
|
|
|
16
16
|
option = option || exports.options.casualOption();
|
|
17
|
-
|
|
18
|
-
this.option = option;
|
|
19
17
|
this.parsers = new Object(option.parsers);
|
|
20
18
|
this.refiners = new Object(option.refiners);
|
|
21
19
|
};
|
|
@@ -25,7 +23,8 @@ Chrono.prototype.parse = function(text, refDate, opt) {
|
|
|
25
23
|
|
|
26
24
|
refDate = refDate || new Date();
|
|
27
25
|
opt = opt || {};
|
|
28
|
-
|
|
26
|
+
opt.forwardDate = opt.forwardDate || opt.forwardDate;
|
|
27
|
+
|
|
29
28
|
var allResults = [];
|
|
30
29
|
|
|
31
30
|
this.parsers.forEach(function (parser) {
|
package/src/options.js
CHANGED
|
@@ -56,7 +56,7 @@ exports.commonPostProcessing = function() {
|
|
|
56
56
|
exports.strictOption = function () {
|
|
57
57
|
var strictConfig = {
|
|
58
58
|
strict: true
|
|
59
|
-
}
|
|
59
|
+
};
|
|
60
60
|
|
|
61
61
|
return exports.mergeOptions([
|
|
62
62
|
exports.en(strictConfig),
|
|
@@ -129,7 +129,7 @@ exports.en = function(config) {
|
|
|
129
129
|
new parser.ENSlashDateFormatStartWithYearParser(config),
|
|
130
130
|
new parser.ENSlashMonthFormatParser(config),
|
|
131
131
|
new parser.ENTimeAgoFormatParser(config),
|
|
132
|
-
new parser.
|
|
132
|
+
new parser.ENTimeLaterFormatParser(config),
|
|
133
133
|
new parser.ENTimeExpressionParser(config)
|
|
134
134
|
],
|
|
135
135
|
refiners: [
|
|
@@ -149,7 +149,7 @@ exports.en.casual = function(config) {
|
|
|
149
149
|
config.strict = false;
|
|
150
150
|
var option = exports.en(config);
|
|
151
151
|
|
|
152
|
-
//
|
|
152
|
+
// en
|
|
153
153
|
option.parsers.unshift(new parser.ENCasualDateParser());
|
|
154
154
|
option.parsers.unshift(new parser.ENCasualTimeParser());
|
|
155
155
|
option.parsers.unshift(new parser.ENWeekdayParser());
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -60,17 +60,17 @@ exports.Parser = function DEWeekdayParser() {
|
|
|
60
60
|
} else if (/n(?:ä|ae)chste/.test(norm)) {
|
|
61
61
|
startMoment.day(offset + 7);
|
|
62
62
|
} else if (/diese/.test(norm)) {
|
|
63
|
-
if ( opt.
|
|
63
|
+
if ( opt.forwardDate && refOffset > offset ) {
|
|
64
64
|
startMoment.day(offset + 7);
|
|
65
65
|
} else {
|
|
66
66
|
startMoment.day(offset);
|
|
67
67
|
}
|
|
68
68
|
} else {
|
|
69
|
-
if ( opt.
|
|
69
|
+
if ( opt.forwardDate && refOffset > offset ) {
|
|
70
70
|
startMoment.day(offset + 7);
|
|
71
|
-
} else if (!opt.
|
|
71
|
+
} else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {
|
|
72
72
|
startMoment.day(offset - 7);
|
|
73
|
-
} else if (!opt.
|
|
73
|
+
} else if (!opt.forwardDate && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {
|
|
74
74
|
startMoment.day(offset + 7);
|
|
75
75
|
} else {
|
|
76
76
|
startMoment.day(offset);
|
|
File without changes
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
var moment = require('moment');
|
|
7
|
+
var Parser = require('../parser').Parser;
|
|
8
|
+
var ParsedResult = require('../../result').ParsedResult;
|
|
9
|
+
|
|
10
|
+
var PATTERN = /(\W|^)((this)?\s*(morning|afternoon|evening|noon|night))/i;
|
|
11
|
+
|
|
12
|
+
var TIME_MATCH = 4;
|
|
13
|
+
|
|
14
|
+
exports.Parser = function ENCasualTimeParser(){
|
|
15
|
+
|
|
16
|
+
Parser.apply(this, arguments);
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
this.pattern = function() { return PATTERN; }
|
|
20
|
+
|
|
21
|
+
this.extract = function(text, ref, match, opt){
|
|
22
|
+
|
|
23
|
+
var text = match[0].substr(match[1].length);
|
|
24
|
+
var index = match.index + match[1].length;
|
|
25
|
+
var result = new ParsedResult({
|
|
26
|
+
index: index,
|
|
27
|
+
text: text,
|
|
28
|
+
ref: ref,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
if(!match[TIME_MATCH]) TIME_MATCH = 3;
|
|
32
|
+
|
|
33
|
+
switch (match[TIME_MATCH].toLowerCase()) {
|
|
34
|
+
|
|
35
|
+
case 'afternoon':
|
|
36
|
+
result.start.imply('meridiem', 1);
|
|
37
|
+
result.start.imply('hour', 15);
|
|
38
|
+
break;
|
|
39
|
+
|
|
40
|
+
case 'evening':
|
|
41
|
+
case 'night':
|
|
42
|
+
result.start.imply('meridiem', 1);
|
|
43
|
+
result.start.imply('hour', 20);
|
|
44
|
+
break;
|
|
45
|
+
|
|
46
|
+
case 'morning':
|
|
47
|
+
result.start.imply('meridiem', 0);
|
|
48
|
+
result.start.imply('hour', 6);
|
|
49
|
+
break;
|
|
50
|
+
|
|
51
|
+
case 'noon':
|
|
52
|
+
result.start.imply('meridiem', 0);
|
|
53
|
+
result.start.imply('hour', 12);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
result.tags['ENCasualTimeParser'] = true;
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
@@ -67,9 +67,9 @@ exports.Parser = function ENDeadlineFormatParser(){
|
|
|
67
67
|
date.add(num, 'year');
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
result.start.
|
|
71
|
-
result.start.
|
|
72
|
-
result.start.
|
|
70
|
+
result.start.imply('year', date.year());
|
|
71
|
+
result.start.imply('month', date.month() + 1);
|
|
72
|
+
result.start.imply('day', date.date());
|
|
73
73
|
return result;
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -89,9 +89,9 @@ exports.Parser = function ENDeadlineFormatParser(){
|
|
|
89
89
|
result.start.imply('year', date.year());
|
|
90
90
|
result.start.imply('month', date.month() + 1);
|
|
91
91
|
result.start.imply('day', date.date());
|
|
92
|
-
result.start.
|
|
93
|
-
result.start.
|
|
94
|
-
result.start.
|
|
92
|
+
result.start.imply('hour', date.hour());
|
|
93
|
+
result.start.imply('minute', date.minute());
|
|
94
|
+
result.start.imply('second', date.second());
|
|
95
95
|
result.tags['ENDeadlineFormatParser'] = true;
|
|
96
96
|
return result;
|
|
97
97
|
};
|
|
File without changes
|
|
@@ -18,11 +18,13 @@ var PATTERN = new RegExp('(\\W|^)' +
|
|
|
18
18
|
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +
|
|
19
19
|
')?' +
|
|
20
20
|
'(?:-|\/|\\s*(?:of)?\\s*)' +
|
|
21
|
-
'(
|
|
21
|
+
'(' + util.MONTH_PATTERN + ')' +
|
|
22
22
|
'(?:' +
|
|
23
23
|
'(?:-|\/|,?\\s*)' +
|
|
24
|
-
'(
|
|
25
|
-
|
|
24
|
+
'((?:' +
|
|
25
|
+
'[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|' +
|
|
26
|
+
'[1-2][0-9]{3}' +
|
|
27
|
+
')(?![^\\s]\\d))' +
|
|
26
28
|
')?' +
|
|
27
29
|
'(?=\\W|$)', 'i'
|
|
28
30
|
);
|
|
@@ -34,7 +36,6 @@ var DATE_TO_GROUP = 5;
|
|
|
34
36
|
var DATE_TO_NUM_GROUP = 6;
|
|
35
37
|
var MONTH_NAME_GROUP = 7;
|
|
36
38
|
var YEAR_GROUP = 8;
|
|
37
|
-
var YEAR_BE_GROUP = 9;
|
|
38
39
|
|
|
39
40
|
exports.Parser = function ENMonthNameLittleEndianParser(){
|
|
40
41
|
Parser.apply(this, arguments);
|
|
@@ -59,26 +60,23 @@ exports.Parser = function ENMonthNameLittleEndianParser(){
|
|
|
59
60
|
var year = null;
|
|
60
61
|
if (match[YEAR_GROUP]) {
|
|
61
62
|
year = match[YEAR_GROUP];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
|
|
64
|
+
if (/BE/i.test(year)) {
|
|
65
|
+
// Buddhist Era
|
|
66
|
+
year = year.replace(/BE/i, '');
|
|
67
|
+
year = parseInt(year) - 543;
|
|
68
|
+
} else if (/BC/i.test(year)){
|
|
69
|
+
// Before Christ
|
|
70
|
+
year = year.replace(/BC/i, '');
|
|
71
|
+
year = -parseInt(year);
|
|
72
|
+
} else if (/AD/i.test(year)){
|
|
73
|
+
year = year.replace(/AD/i, '');
|
|
74
|
+
year = parseInt(year);
|
|
75
|
+
} else {
|
|
76
|
+
year = parseInt(year);
|
|
77
|
+
if (year < 100){
|
|
78
|
+
year = year + 2000;
|
|
72
79
|
}
|
|
73
|
-
|
|
74
|
-
} else if (year < 10) {
|
|
75
|
-
|
|
76
|
-
// require single digit years to always have BC/AD
|
|
77
|
-
return null;
|
|
78
|
-
|
|
79
|
-
} else if (year < 100){
|
|
80
|
-
|
|
81
|
-
year = year + 2000;
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
|
|
@@ -25,9 +25,9 @@ var PATTERN = new RegExp('(\\W|^)' +
|
|
|
25
25
|
'(?:on\\s*?)?' +
|
|
26
26
|
'(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\.?|Mon\\.?|Tue\\.?|Wed\\.?|Thu\\.?|Fri\\.?|Sat\\.?)' +
|
|
27
27
|
'\\s*,?\\s*)?' +
|
|
28
|
-
'(
|
|
28
|
+
'(' + util.MONTH_PATTERN + ')' +
|
|
29
29
|
'(?:-|\/|\\s*,?\\s*)' +
|
|
30
|
-
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')\\s*' +
|
|
30
|
+
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\s*(?:am|pm))\\s*' + '' +
|
|
31
31
|
'(?:' +
|
|
32
32
|
'(?:to|\\-)\\s*' +
|
|
33
33
|
'(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\s*' +
|
|
@@ -15,7 +15,7 @@ var ParsedResult = require('../../result').ParsedResult;
|
|
|
15
15
|
var util = require('../../utils/EN');
|
|
16
16
|
|
|
17
17
|
var PATTERN = new RegExp('(^|\\D\\s+|[^\\w\\s])' +
|
|
18
|
-
'(
|
|
18
|
+
'('+ util.MONTH_PATTERN +')' +
|
|
19
19
|
'\\s*' +
|
|
20
20
|
'(?:' +
|
|
21
21
|
'[,-]?\\s*([0-9]{4})(\\s*BE|AD|BC)?' +
|
|
@@ -9,7 +9,7 @@ var ParsedResult = require('../../result').ParsedResult;
|
|
|
9
9
|
var util = require('../../utils/EN');
|
|
10
10
|
|
|
11
11
|
var PATTERN = new RegExp('(\\W|^)' +
|
|
12
|
-
'(next|last|past)\\s*' +
|
|
12
|
+
'(this|next|last|past)\\s*' +
|
|
13
13
|
'('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\s*an?)?)?\\s*' +
|
|
14
14
|
'(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\s*)' +
|
|
15
15
|
'(?=\\W|$)', 'i'
|
|
@@ -52,8 +52,46 @@ exports.Parser = function ENRelativeDateFormatParser(){
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
num *= modifier;
|
|
55
|
-
|
|
56
55
|
var date = moment(ref);
|
|
56
|
+
|
|
57
|
+
if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {
|
|
58
|
+
|
|
59
|
+
if (match[MULTIPLIER_WORD_GROUP]) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {
|
|
64
|
+
|
|
65
|
+
// This week
|
|
66
|
+
if (match[RELATIVE_WORD_GROUP].match(/week/i)) {
|
|
67
|
+
date.add(-date.get('d'), 'd');
|
|
68
|
+
result.start.imply('day', date.date());
|
|
69
|
+
result.start.imply('month', date.month() + 1);
|
|
70
|
+
result.start.imply('year', date.year());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// This month
|
|
74
|
+
else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {
|
|
75
|
+
date.add(-date.date() + 1, 'd');
|
|
76
|
+
result.start.imply('day', date.date());
|
|
77
|
+
result.start.assign('year', date.year());
|
|
78
|
+
result.start.assign('month', date.month() + 1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// This year
|
|
82
|
+
else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {
|
|
83
|
+
date.add(-date.date() + 1, 'd');
|
|
84
|
+
date.add(-date.month(), 'month');
|
|
85
|
+
|
|
86
|
+
result.start.imply('day', date.date());
|
|
87
|
+
result.start.imply('month', date.month() + 1);
|
|
88
|
+
result.start.assign('year', date.year());
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
57
95
|
if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {
|
|
58
96
|
|
|
59
97
|
if (match[RELATIVE_WORD_GROUP].match(/day/i)) {
|
|
@@ -116,7 +116,11 @@ exports.Parser = function ENSlashDateFormatParser(config) {
|
|
|
116
116
|
|
|
117
117
|
result.start.assign('day', day);
|
|
118
118
|
result.start.assign('month', month);
|
|
119
|
-
|
|
119
|
+
if (match[YEAR_GROUP]) {
|
|
120
|
+
result.start.assign('year', year);
|
|
121
|
+
} else {
|
|
122
|
+
result.start.imply('year', year);
|
|
123
|
+
}
|
|
120
124
|
|
|
121
125
|
//Day of week
|
|
122
126
|
if(match[WEEKDAY_GROUP]) {
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
var moment = require('moment');
|
|
9
9
|
var Parser = require('../parser').Parser;
|
|
10
10
|
var ParsedResult = require('../../result').ParsedResult;
|
|
11
|
+
var util = require('../../utils/EN');
|
|
11
12
|
|
|
12
13
|
var PATTERN = new RegExp('(\\W|^)'
|
|
13
|
-
+ '([0-9]{4})[\\-\\.\\/]
|
|
14
|
+
+ '([0-9]{4})[\\-\\.\\/]'
|
|
15
|
+
+ '((?:' + util.MONTH_PATTERN + '|[0-9]{1,2}))[\\-\\.\\/]'
|
|
16
|
+
+ '([0-9]{1,2})'
|
|
14
17
|
+ '(?=\\W|$)', 'i');
|
|
15
18
|
|
|
16
19
|
var YEAR_NUMBER_GROUP = 2;
|
|
@@ -33,8 +36,11 @@ exports.Parser = function ENSlashDateFormatStartWithYearParser(){
|
|
|
33
36
|
ref: ref,
|
|
34
37
|
})
|
|
35
38
|
|
|
39
|
+
var month = match[MONTH_NUMBER_GROUP].toLowerCase();
|
|
40
|
+
month = util.MONTH_OFFSET[month] | month;
|
|
41
|
+
|
|
36
42
|
result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));
|
|
37
|
-
result.start.assign('month', parseInt(
|
|
43
|
+
result.start.assign('month', parseInt(month));
|
|
38
44
|
result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));
|
|
39
45
|
|
|
40
46
|
if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||
|
|
File without changes
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var moment = require('moment');
|
|
2
|
+
var Parser = require('../parser').Parser;
|
|
3
|
+
var ParsedResult = require('../../result').ParsedResult;
|
|
4
|
+
var util = require('../../utils/EN');
|
|
5
|
+
|
|
6
|
+
var PATTERN = new RegExp('' +
|
|
7
|
+
'(\\W|^)' +
|
|
8
|
+
'(?:within\\s*)?' +
|
|
9
|
+
'(' + util.TIME_UNIT_PATTERN + ')' +
|
|
10
|
+
'(?:ago|before|earlier)(?=(?:\\W|$))', 'i');
|
|
11
|
+
|
|
12
|
+
var STRICT_PATTERN = new RegExp('' +
|
|
13
|
+
'(\\W|^)' +
|
|
14
|
+
'(?:within\\s*)?' +
|
|
15
|
+
'(' + util.TIME_UNIT_STRICT_PATTERN + ')' +
|
|
16
|
+
'ago(?=(?:\\W|$))', 'i');
|
|
17
|
+
|
|
18
|
+
exports.Parser = function ENTimeAgoFormatParser(){
|
|
19
|
+
Parser.apply(this, arguments);
|
|
20
|
+
|
|
21
|
+
this.pattern = function() {
|
|
22
|
+
return this.isStrictMode()? STRICT_PATTERN : PATTERN;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
this.extract = function(text, ref, match, opt){
|
|
26
|
+
|
|
27
|
+
if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
|
|
28
|
+
|
|
29
|
+
var text = match[0];
|
|
30
|
+
text = match[0].substr(match[1].length, match[0].length - match[1].length);
|
|
31
|
+
var index = match.index + match[1].length;
|
|
32
|
+
|
|
33
|
+
var result = new ParsedResult({
|
|
34
|
+
index: index,
|
|
35
|
+
text: text,
|
|
36
|
+
ref: ref
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
var fragments = util.extractDateTimeUnitFragments(match[2]);
|
|
40
|
+
var date = moment(ref);
|
|
41
|
+
|
|
42
|
+
for (var key in fragments) {
|
|
43
|
+
date.add(-fragments[key], key);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {
|
|
47
|
+
result.start.assign('hour', date.hour());
|
|
48
|
+
result.start.assign('minute', date.minute());
|
|
49
|
+
result.start.assign('second', date.second());
|
|
50
|
+
result.tags['ENTimeAgoFormatParser'] = true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {
|
|
54
|
+
result.start.assign('day', date.date());
|
|
55
|
+
result.start.assign('month', date.month() + 1);
|
|
56
|
+
result.start.assign('year', date.year());
|
|
57
|
+
} else {
|
|
58
|
+
if (fragments['week'] > 0) {
|
|
59
|
+
result.start.imply('weekday', date.day());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
result.start.imply('day', date.date());
|
|
63
|
+
result.start.imply('month', date.month() + 1);
|
|
64
|
+
result.start.imply('year', date.year());
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -13,10 +13,10 @@ var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" +
|
|
|
13
13
|
"(?:" +
|
|
14
14
|
"(?:\\.|\\:|\\:)(\\d{1,2})" +
|
|
15
15
|
"(?:" +
|
|
16
|
-
"(?:\\:|\\:)(\\d{2})" +
|
|
16
|
+
"(?:\\:|\\:)(\\d{2})(?:\\.(\\d{1,6}))?" +
|
|
17
17
|
")?" +
|
|
18
18
|
")?" +
|
|
19
|
-
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM
|
|
19
|
+
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?|O\\W*CLOCK))?" +
|
|
20
20
|
"(?=\\W|$)", 'i');
|
|
21
21
|
|
|
22
22
|
|
|
@@ -26,16 +26,17 @@ var SECOND_REG_PATTERN = new RegExp("^\\s*" +
|
|
|
26
26
|
"(?:" +
|
|
27
27
|
"(?:\\.|\\:|\\:)(\\d{1,2})" +
|
|
28
28
|
"(?:" +
|
|
29
|
-
"(?:\\.|\\:|\\:)(\\d{1,2})" +
|
|
29
|
+
"(?:\\.|\\:|\\:)(\\d{1,2})(?:\\.(\\d{1,6}))?" +
|
|
30
30
|
")?" +
|
|
31
31
|
")?" +
|
|
32
|
-
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM
|
|
32
|
+
"(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?|O\\W*CLOCK))?" +
|
|
33
33
|
"(?=\\W|$)", 'i');
|
|
34
34
|
|
|
35
35
|
var HOUR_GROUP = 2;
|
|
36
36
|
var MINUTE_GROUP = 3;
|
|
37
37
|
var SECOND_GROUP = 4;
|
|
38
|
-
var
|
|
38
|
+
var MILLI_SECOND_GROUP = 5;
|
|
39
|
+
var AM_PM_HOUR_GROUP = 6;
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
exports.Parser = function ENTimeExpressionParser(){
|
|
@@ -45,7 +46,7 @@ exports.Parser = function ENTimeExpressionParser(){
|
|
|
45
46
|
|
|
46
47
|
this.extract = function(text, ref, match, opt){
|
|
47
48
|
|
|
48
|
-
// This pattern can be
|
|
49
|
+
// This pattern can be overlapped Ex. [12] AM, 1[2] AM
|
|
49
50
|
if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
|
|
50
51
|
var refMoment = moment(ref);
|
|
51
52
|
var result = new ParsedResult();
|
|
@@ -62,6 +63,14 @@ exports.Parser = function ENTimeExpressionParser(){
|
|
|
62
63
|
var minute = 0;
|
|
63
64
|
var meridiem = -1;
|
|
64
65
|
|
|
66
|
+
// ----- Millisecond
|
|
67
|
+
if(match[MILLI_SECOND_GROUP] != null){
|
|
68
|
+
var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
|
|
69
|
+
if(millisecond >= 1000) return null;
|
|
70
|
+
|
|
71
|
+
result.start.assign('millisecond', millisecond);
|
|
72
|
+
}
|
|
73
|
+
|
|
65
74
|
// ----- Second
|
|
66
75
|
if(match[SECOND_GROUP] != null){
|
|
67
76
|
var second = parseInt(match[SECOND_GROUP]);
|
|
@@ -127,16 +136,12 @@ exports.Parser = function ENTimeExpressionParser(){
|
|
|
127
136
|
result.start.imply('meridiem', 1);
|
|
128
137
|
}
|
|
129
138
|
}
|
|
130
|
-
|
|
139
|
+
|
|
131
140
|
// ==============================================================
|
|
132
141
|
// Extracting the 'to' chunk
|
|
133
142
|
// ==============================================================
|
|
134
143
|
match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));
|
|
135
144
|
if (!match) {
|
|
136
|
-
// Not accept number only result
|
|
137
|
-
if (result.text.match(/^\d+$/)) {
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
145
|
return result;
|
|
141
146
|
}
|
|
142
147
|
|
|
@@ -155,6 +160,14 @@ exports.Parser = function ENTimeExpressionParser(){
|
|
|
155
160
|
var minute = 0;
|
|
156
161
|
var meridiem = -1;
|
|
157
162
|
|
|
163
|
+
// ----- Millisecond
|
|
164
|
+
if(match[MILLI_SECOND_GROUP] != null){
|
|
165
|
+
var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
|
|
166
|
+
if(millisecond >= 1000) return null;
|
|
167
|
+
|
|
168
|
+
result.end.assign('millisecond', millisecond);
|
|
169
|
+
}
|
|
170
|
+
|
|
158
171
|
// ----- Second
|
|
159
172
|
if(match[SECOND_GROUP] != null){
|
|
160
173
|
var second = parseInt(match[SECOND_GROUP]);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var moment = require('moment');
|
|
2
|
+
var Parser = require('../parser').Parser;
|
|
3
|
+
var ParsedResult = require('../../result').ParsedResult;
|
|
4
|
+
var util = require('../../utils/EN');
|
|
5
|
+
|
|
6
|
+
var PATTERN = new RegExp('' +
|
|
7
|
+
/*match[1]*/ '(\\W|^)' +
|
|
8
|
+
/*match[2]*/ '(in )?' +
|
|
9
|
+
/*match[3]*/ '(' + util.TIME_UNIT_PATTERN + ')' +
|
|
10
|
+
/*match[4]*/ '(later|after|from now|henceforth|forward|out)?' +
|
|
11
|
+
/*match[5]*/ '(?=(?:\\W|$))',
|
|
12
|
+
'i');
|
|
13
|
+
|
|
14
|
+
var STRICT_PATTERN = new RegExp('' +
|
|
15
|
+
/*match[1]*/ '(\\W|^)' +
|
|
16
|
+
/*match[2]*/ '(in )?' +
|
|
17
|
+
/*match[3]*/ '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +
|
|
18
|
+
/*match[4]*/ '(later|from now)?' +
|
|
19
|
+
/*match[5]*/ '(?=(?:\\W|$))',
|
|
20
|
+
'i');
|
|
21
|
+
|
|
22
|
+
exports.Parser = function ENTimeLaterFormatParser(){
|
|
23
|
+
Parser.apply(this, arguments);
|
|
24
|
+
|
|
25
|
+
this.pattern = function() {
|
|
26
|
+
return this.isStrictMode()? STRICT_PATTERN : PATTERN;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
this.extract = function(text, ref, match, opt){
|
|
30
|
+
if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
|
|
31
|
+
|
|
32
|
+
var prefix = match[2];
|
|
33
|
+
var suffix = match[4];
|
|
34
|
+
if (!prefix && !suffix) return null;
|
|
35
|
+
|
|
36
|
+
var preamble = match[1];
|
|
37
|
+
|
|
38
|
+
var text = match[0];
|
|
39
|
+
text = match[0].substr(preamble.length, match[0].length - preamble.length);
|
|
40
|
+
index = match.index + preamble.length;
|
|
41
|
+
|
|
42
|
+
var result = new ParsedResult({
|
|
43
|
+
index: index,
|
|
44
|
+
text: text,
|
|
45
|
+
ref: ref
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
var fragments = util.extractDateTimeUnitFragments(match[3]);
|
|
49
|
+
var date = moment(ref);
|
|
50
|
+
for (var key in fragments) {
|
|
51
|
+
date.add(fragments[key], key);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {
|
|
55
|
+
result.start.assign('hour', date.hour());
|
|
56
|
+
result.start.assign('minute', date.minute());
|
|
57
|
+
result.start.assign('second', date.second());
|
|
58
|
+
result.tags['ENTimeAgoFormatParser'] = true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {
|
|
62
|
+
result.start.assign('day', date.date());
|
|
63
|
+
result.start.assign('month', date.month() + 1);
|
|
64
|
+
result.start.assign('year', date.year());
|
|
65
|
+
} else {
|
|
66
|
+
if (fragments['week'] > 0) {
|
|
67
|
+
result.start.imply('weekday', date.day());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
result.start.imply('day', date.date());
|
|
71
|
+
result.start.imply('month', date.month() + 1);
|
|
72
|
+
result.start.imply('year', date.year());
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|