chrono-node 1.3.5 → 1.4.4
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/.travis.yml +2 -0
- package/README.md +100 -86
- package/dist/chrono.js +7865 -0
- package/dist/chrono.js.map +1 -0
- package/dist/chrono.min.js +3 -0
- package/dist/chrono.min.js.LICENSE.txt +19 -0
- package/dist/chrono.min.js.map +1 -0
- package/package.json +20 -22
- package/src/chrono.js +5 -3
- package/src/options.js +33 -3
- package/src/parsers/{DE → de}/DECasualDateParser.js +18 -21
- package/src/parsers/{DE → de}/DEDeadlineFormatParser.js +9 -9
- package/src/parsers/{DE → de}/DEMonthNameLittleEndianParser.js +15 -36
- package/src/parsers/{DE → de}/DEMonthNameParser.js +12 -27
- package/src/parsers/{DE → de}/DESlashDateFormatParser.js +2 -3
- package/src/parsers/{DE → de}/DETimeAgoFormatParser.js +9 -14
- package/src/parsers/{DE → de}/DETimeExpressionParser.js +2 -2
- package/src/parsers/{DE → de}/DEWeekdayParser.js +14 -14
- package/src/parsers/{EN → en}/ENCasualDateParser.js +6 -11
- package/src/parsers/en/ENCasualTimeParser.js +54 -0
- package/src/parsers/{EN → en}/ENDeadlineFormatParser.js +15 -20
- package/src/parsers/{EN → en}/ENISOFormatParser.js +3 -3
- package/src/parsers/{EN → en}/ENMonthNameLittleEndianParser.js +25 -49
- package/src/parsers/{EN → en}/ENMonthNameMiddleEndianParser.js +6 -23
- package/src/parsers/{EN → en}/ENMonthNameParser.js +5 -22
- package/src/parsers/{EN → en}/ENRelativeDateFormatParser.js +48 -15
- package/src/parsers/{EN → en}/ENSlashDateFormatParser.js +7 -3
- package/src/parsers/{EN → en}/ENSlashDateFormatStartWithYearParser.js +12 -5
- package/src/parsers/{EN → en}/ENSlashMonthFormatParser.js +2 -5
- package/src/parsers/en/ENTimeAgoFormatParser.js +69 -0
- package/src/parsers/{EN → en}/ENTimeExpressionParser.js +26 -17
- package/src/parsers/en/ENTimeLaterFormatParser.js +75 -0
- package/src/parsers/{EN → en}/ENWeekdayParser.js +8 -12
- package/src/parsers/{ES → es}/ESCasualDateParser.js +8 -13
- package/src/parsers/{ES → es}/ESDeadlineFormatParser.js +5 -11
- package/src/parsers/{ES → es}/ESMonthNameLittleEndianParser.js +6 -28
- package/src/parsers/{ES → es}/ESSlashDateFormatParser.js +2 -2
- package/src/parsers/{ES → es}/ESTimeAgoFormatParser.js +8 -13
- package/src/parsers/{ES → es}/ESTimeExpressionParser.js +2 -7
- package/src/parsers/{ES → es}/ESWeekdayParser.js +1 -6
- package/src/parsers/{FR → fr}/FRCasualDateParser.js +6 -11
- package/src/parsers/{FR → fr}/FRDeadlineFormatParser.js +9 -14
- package/src/parsers/{FR → fr}/FRMonthNameLittleEndianParser.js +4 -26
- package/src/parsers/{FR → fr}/FRRelativeDateFormatParser.js +29 -34
- package/src/parsers/{FR → fr}/FRSlashDateFormatParser.js +22 -15
- package/src/parsers/{FR → fr}/FRTimeAgoFormatParser.js +8 -14
- package/src/parsers/{FR → fr}/FRTimeExpressionParser.js +2 -7
- package/src/parsers/{FR → fr}/FRWeekdayParser.js +1 -6
- package/src/parsers/{JP → ja}/JPCasualDateParser.js +5 -10
- package/src/parsers/ja/JPStandardParser.js +71 -0
- package/src/parsers/parser.js +80 -53
- package/src/parsers/pt/PTCasualDateParser.js +123 -0
- package/src/parsers/pt/PTDeadlineFormatParser.js +61 -0
- package/src/parsers/pt/PTMonthNameLittleEndianParser.js +86 -0
- package/src/parsers/pt/PTSlashDateFormatParser.js +114 -0
- package/src/parsers/pt/PTTimeAgoFormatParser.js +87 -0
- package/src/parsers/pt/PTTimeExpressionParser.js +234 -0
- package/src/parsers/pt/PTWeekdayParser.js +60 -0
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantCasualDateParser.js +30 -19
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDateParser.js +2 -7
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDeadlineFormatParser.js +14 -19
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantTimeExpressionParser.js +38 -11
- package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantWeekdayParser.js +1 -7
- package/src/refiners/ExtractTimezoneAbbrRefiner.js +19 -10
- package/src/refiners/ForwardDateRefiner.js +10 -15
- 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 +5 -9
- 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 +47 -19
- package/src/timezone.js +2 -0
- package/src/utils/EN.js +68 -2
- package/src/utils/PT.js +62 -0
- 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 +156 -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 +81 -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 +344 -0
- package/test/pt/pt_casual.test.js +258 -0
- package/test/pt/pt_dash.test.js +13 -0
- package/test/pt/pt_deadline.test.js +85 -0
- package/test/pt/pt_little_endian.test.js +350 -0
- package/test/pt/pt_slash.test.js +44 -0
- package/test/pt/pt_time_ago.test.js +137 -0
- package/test/pt/pt_time_exp.test.js +240 -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/webpack.config.js +39 -0
- package/.npmignore +0 -11
- package/bower.json +0 -24
- package/chrono.js +0 -11892
- package/chrono.map.json +0 -1
- package/chrono.min.js +0 -148
- package/chrono.min.json +0 -1
- package/karma.conf.js +0 -68
- 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/src/parsers/JP/JPStandardParser.js +0 -88
- 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/timezone.js +0 -9
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var Parser = require('../parser').Parser;
|
|
2
|
+
var ParsedResult = require('../../result').ParsedResult;
|
|
3
|
+
|
|
4
|
+
var PATTERN = /(\W|^)((this)?\s*(morning|afternoon|evening|noon|night))/i;
|
|
5
|
+
|
|
6
|
+
var TIME_MATCH = 4;
|
|
7
|
+
|
|
8
|
+
exports.Parser = function ENCasualTimeParser(){
|
|
9
|
+
|
|
10
|
+
Parser.apply(this, arguments);
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
this.pattern = function() { return PATTERN; }
|
|
14
|
+
|
|
15
|
+
this.extract = function(text, ref, match, opt){
|
|
16
|
+
|
|
17
|
+
var text = match[0].substr(match[1].length);
|
|
18
|
+
var index = match.index + match[1].length;
|
|
19
|
+
var result = new ParsedResult({
|
|
20
|
+
index: index,
|
|
21
|
+
text: text,
|
|
22
|
+
ref: ref,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if(!match[TIME_MATCH]) TIME_MATCH = 3;
|
|
26
|
+
|
|
27
|
+
switch (match[TIME_MATCH].toLowerCase()) {
|
|
28
|
+
|
|
29
|
+
case 'afternoon':
|
|
30
|
+
result.start.imply('meridiem', 1);
|
|
31
|
+
result.start.imply('hour', 15);
|
|
32
|
+
break;
|
|
33
|
+
|
|
34
|
+
case 'evening':
|
|
35
|
+
case 'night':
|
|
36
|
+
result.start.imply('meridiem', 1);
|
|
37
|
+
result.start.imply('hour', 20);
|
|
38
|
+
break;
|
|
39
|
+
|
|
40
|
+
case 'morning':
|
|
41
|
+
result.start.imply('meridiem', 0);
|
|
42
|
+
result.start.imply('hour', 6);
|
|
43
|
+
break;
|
|
44
|
+
|
|
45
|
+
case 'noon':
|
|
46
|
+
result.start.imply('meridiem', 0);
|
|
47
|
+
result.start.imply('hour', 12);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
result.tags['ENCasualTimeParser'] = true;
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
var moment = require('moment');
|
|
1
|
+
const dayjs = require('dayjs');
|
|
7
2
|
var Parser = require('../parser').Parser;
|
|
8
3
|
var ParsedResult = require('../../result').ParsedResult;
|
|
9
4
|
var util = require('../../utils/EN');
|
|
@@ -54,44 +49,44 @@ exports.Parser = function ENDeadlineFormatParser(){
|
|
|
54
49
|
num = parseInt(num);
|
|
55
50
|
}
|
|
56
51
|
|
|
57
|
-
var date =
|
|
52
|
+
var date = dayjs(ref);
|
|
58
53
|
if (match[4].match(/day|week|month|year/i)) {
|
|
59
54
|
|
|
60
55
|
if (match[4].match(/day/i)) {
|
|
61
|
-
date.add(num, 'd');
|
|
56
|
+
date = date.add(num, 'd');
|
|
62
57
|
} else if (match[4].match(/week/i)) {
|
|
63
|
-
date.add(num * 7, 'd');
|
|
58
|
+
date = date.add(num * 7, 'd');
|
|
64
59
|
} else if (match[4].match(/month/i)) {
|
|
65
|
-
date.add(num, 'month');
|
|
60
|
+
date = date.add(num, 'month');
|
|
66
61
|
} else if (match[4].match(/year/i)) {
|
|
67
|
-
date.add(num, 'year');
|
|
62
|
+
date = date.add(num, 'year');
|
|
68
63
|
}
|
|
69
64
|
|
|
70
|
-
result.start.
|
|
71
|
-
result.start.
|
|
72
|
-
result.start.
|
|
65
|
+
result.start.imply('year', date.year());
|
|
66
|
+
result.start.imply('month', date.month() + 1);
|
|
67
|
+
result.start.imply('day', date.date());
|
|
73
68
|
return result;
|
|
74
69
|
}
|
|
75
70
|
|
|
76
71
|
if (match[4].match(/hour/i)) {
|
|
77
72
|
|
|
78
|
-
date.add(num, 'hour');
|
|
73
|
+
date = date.add(num, 'hour');
|
|
79
74
|
|
|
80
75
|
} else if (match[4].match(/min/i)) {
|
|
81
76
|
|
|
82
|
-
date.add(num, 'minute');
|
|
77
|
+
date = date.add(num, 'minute');
|
|
83
78
|
|
|
84
79
|
} else if (match[4].match(/second/i)) {
|
|
85
80
|
|
|
86
|
-
date.add(num, 'second');
|
|
81
|
+
date = date.add(num, 'second');
|
|
87
82
|
}
|
|
88
83
|
|
|
89
84
|
result.start.imply('year', date.year());
|
|
90
85
|
result.start.imply('month', date.month() + 1);
|
|
91
86
|
result.start.imply('day', date.date());
|
|
92
|
-
result.start.
|
|
93
|
-
result.start.
|
|
94
|
-
result.start.
|
|
87
|
+
result.start.imply('hour', date.hour());
|
|
88
|
+
result.start.imply('minute', date.minute());
|
|
89
|
+
result.start.imply('second', date.second());
|
|
95
90
|
result.tags['ENDeadlineFormatParser'] = true;
|
|
96
91
|
return result;
|
|
97
92
|
};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- YYYY-MM-DDThh:mm:ss.sTZD
|
|
8
8
|
- TZD = (Z or +hh:mm or -hh:mm)
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
const dayjs = require('dayjs');
|
|
11
11
|
var Parser = require('../parser').Parser;
|
|
12
12
|
var ParsedResult = require('../../result').ParsedResult;
|
|
13
13
|
|
|
@@ -50,8 +50,8 @@ exports.Parser = function ENISOFormatParser(){
|
|
|
50
50
|
result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));
|
|
51
51
|
result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));
|
|
52
52
|
|
|
53
|
-
if (
|
|
54
|
-
|
|
53
|
+
if (dayjs(result.start.get('month')) > 12 || dayjs(result.start.get('month')) < 1 ||
|
|
54
|
+
dayjs(result.start.get('day')) > 31 || dayjs(result.start.get('day')) < 1) {
|
|
55
55
|
return null;
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
var moment = require('moment');
|
|
7
|
-
|
|
8
|
-
var Parser = require('../parser').Parser;
|
|
1
|
+
const parser = require('../parser');
|
|
9
2
|
var ParsedResult = require('../../result').ParsedResult;
|
|
10
3
|
var util = require('../../utils/EN');
|
|
11
4
|
|
|
@@ -18,11 +11,13 @@ var PATTERN = new RegExp('(\\W|^)' +
|
|
|
18
11
|
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +
|
|
19
12
|
')?' +
|
|
20
13
|
'(?:-|\/|\\s*(?:of)?\\s*)' +
|
|
21
|
-
'(
|
|
14
|
+
'(' + util.MONTH_PATTERN + ')' +
|
|
22
15
|
'(?:' +
|
|
23
16
|
'(?:-|\/|,?\\s*)' +
|
|
24
|
-
'(
|
|
25
|
-
|
|
17
|
+
'((?:' +
|
|
18
|
+
'[1-9][0-9]{0,3}\\s*(?:BE|AD|BC)|' +
|
|
19
|
+
'[1-2][0-9]{3}' +
|
|
20
|
+
')(?![^\\s]\\d))' +
|
|
26
21
|
')?' +
|
|
27
22
|
'(?=\\W|$)', 'i'
|
|
28
23
|
);
|
|
@@ -34,10 +29,9 @@ var DATE_TO_GROUP = 5;
|
|
|
34
29
|
var DATE_TO_NUM_GROUP = 6;
|
|
35
30
|
var MONTH_NAME_GROUP = 7;
|
|
36
31
|
var YEAR_GROUP = 8;
|
|
37
|
-
var YEAR_BE_GROUP = 9;
|
|
38
32
|
|
|
39
33
|
exports.Parser = function ENMonthNameLittleEndianParser(){
|
|
40
|
-
Parser.apply(this, arguments);
|
|
34
|
+
parser.Parser.apply(this, arguments);
|
|
41
35
|
|
|
42
36
|
this.pattern = function() { return PATTERN; }
|
|
43
37
|
|
|
@@ -59,26 +53,23 @@ exports.Parser = function ENMonthNameLittleEndianParser(){
|
|
|
59
53
|
var year = null;
|
|
60
54
|
if (match[YEAR_GROUP]) {
|
|
61
55
|
year = match[YEAR_GROUP];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
|
|
57
|
+
if (/BE/i.test(year)) {
|
|
58
|
+
// Buddhist Era
|
|
59
|
+
year = year.replace(/BE/i, '');
|
|
60
|
+
year = parseInt(year) - 543;
|
|
61
|
+
} else if (/BC/i.test(year)){
|
|
62
|
+
// Before Christ
|
|
63
|
+
year = year.replace(/BC/i, '');
|
|
64
|
+
year = -parseInt(year);
|
|
65
|
+
} else if (/AD/i.test(year)){
|
|
66
|
+
year = year.replace(/AD/i, '');
|
|
67
|
+
year = parseInt(year);
|
|
68
|
+
} else {
|
|
69
|
+
year = parseInt(year);
|
|
70
|
+
if (year < 100){
|
|
71
|
+
year = year + 2000;
|
|
72
72
|
}
|
|
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
73
|
}
|
|
83
74
|
}
|
|
84
75
|
|
|
@@ -87,25 +78,10 @@ exports.Parser = function ENMonthNameLittleEndianParser(){
|
|
|
87
78
|
result.start.assign('month', month);
|
|
88
79
|
result.start.assign('year', year);
|
|
89
80
|
} else {
|
|
90
|
-
|
|
91
|
-
//Find the most appropriated year
|
|
92
|
-
var refMoment = moment(ref);
|
|
93
|
-
refMoment.month(month - 1);
|
|
94
|
-
refMoment.date(day);
|
|
95
|
-
refMoment.year(moment(ref).year());
|
|
96
|
-
|
|
97
|
-
var nextYear = refMoment.clone().add(1, 'y');
|
|
98
|
-
var lastYear = refMoment.clone().add(-1, 'y');
|
|
99
|
-
if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
100
|
-
refMoment = nextYear;
|
|
101
|
-
}
|
|
102
|
-
else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
103
|
-
refMoment = lastYear;
|
|
104
|
-
}
|
|
105
|
-
|
|
81
|
+
year = parser.findYearClosestToRef(ref, day, month);
|
|
106
82
|
result.start.assign('day', day);
|
|
107
83
|
result.start.assign('month', month);
|
|
108
|
-
result.start.imply('year',
|
|
84
|
+
result.start.imply('year', year);
|
|
109
85
|
}
|
|
110
86
|
|
|
111
87
|
// Weekday component
|
|
@@ -13,10 +13,7 @@
|
|
|
13
13
|
- January 12.44
|
|
14
14
|
- January 1222344
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
var moment = require('moment');
|
|
18
|
-
|
|
19
|
-
var Parser = require('../parser').Parser;
|
|
16
|
+
var parser = require('../parser');
|
|
20
17
|
var ParsedResult = require('../../result').ParsedResult;
|
|
21
18
|
var util = require('../../utils/EN');
|
|
22
19
|
|
|
@@ -25,9 +22,9 @@ var PATTERN = new RegExp('(\\W|^)' +
|
|
|
25
22
|
'(?:on\\s*?)?' +
|
|
26
23
|
'(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\.?|Mon\\.?|Tue\\.?|Wed\\.?|Thu\\.?|Fri\\.?|Sat\\.?)' +
|
|
27
24
|
'\\s*,?\\s*)?' +
|
|
28
|
-
'(
|
|
25
|
+
'(' + util.MONTH_PATTERN + ')' +
|
|
29
26
|
'(?:-|\/|\\s*,?\\s*)' +
|
|
30
|
-
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')\\s*' +
|
|
27
|
+
'(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\s*(?:am|pm))\\s*' + '' +
|
|
31
28
|
'(?:' +
|
|
32
29
|
'(?:to|\\-)\\s*' +
|
|
33
30
|
'(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\s*' +
|
|
@@ -50,7 +47,7 @@ var YEAR_GROUP2 = 10;
|
|
|
50
47
|
var YEAR_BE_GROUP2 = 11;
|
|
51
48
|
|
|
52
49
|
exports.Parser = function ENMonthNameMiddleEndianParser(){
|
|
53
|
-
Parser.apply(this, arguments);
|
|
50
|
+
parser.Parser.apply(this, arguments);
|
|
54
51
|
|
|
55
52
|
this.pattern = function() { return PATTERN; }
|
|
56
53
|
|
|
@@ -94,24 +91,10 @@ exports.Parser = function ENMonthNameMiddleEndianParser(){
|
|
|
94
91
|
result.start.assign('month', month);
|
|
95
92
|
result.start.assign('year', year);
|
|
96
93
|
} else {
|
|
97
|
-
|
|
98
|
-
//Find the most appropriated year
|
|
99
|
-
var refMoment = moment(ref);
|
|
100
|
-
refMoment.month(month - 1);
|
|
101
|
-
refMoment.date(day);
|
|
102
|
-
|
|
103
|
-
var nextYear = refMoment.clone().add(1, 'y');
|
|
104
|
-
var lastYear = refMoment.clone().add(-1, 'y');
|
|
105
|
-
if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
106
|
-
refMoment = nextYear;
|
|
107
|
-
}
|
|
108
|
-
else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
109
|
-
refMoment = lastYear;
|
|
110
|
-
}
|
|
111
|
-
|
|
94
|
+
year = parser.findYearClosestToRef(ref, day, month)
|
|
112
95
|
result.start.assign('day', day);
|
|
113
96
|
result.start.assign('month', month);
|
|
114
|
-
result.start.imply('year',
|
|
97
|
+
result.start.imply('year', year);
|
|
115
98
|
}
|
|
116
99
|
|
|
117
100
|
// Weekday component
|
|
@@ -7,15 +7,12 @@
|
|
|
7
7
|
- January 2012
|
|
8
8
|
- January, 2012
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
|
-
var moment = require('moment');
|
|
12
|
-
|
|
13
|
-
var Parser = require('../parser').Parser;
|
|
10
|
+
var parser = require('../parser');
|
|
14
11
|
var ParsedResult = require('../../result').ParsedResult;
|
|
15
12
|
var util = require('../../utils/EN');
|
|
16
13
|
|
|
17
14
|
var PATTERN = new RegExp('(^|\\D\\s+|[^\\w\\s])' +
|
|
18
|
-
'(
|
|
15
|
+
'('+ util.MONTH_PATTERN +')' +
|
|
19
16
|
'\\s*' +
|
|
20
17
|
'(?:' +
|
|
21
18
|
'[,-]?\\s*([0-9]{4})(\\s*BE|AD|BC)?' +
|
|
@@ -27,7 +24,7 @@ var YEAR_GROUP = 3;
|
|
|
27
24
|
var YEAR_BE_GROUP = 4;
|
|
28
25
|
|
|
29
26
|
exports.Parser = function ENMonthNameParser(){
|
|
30
|
-
Parser.apply(this, arguments);
|
|
27
|
+
parser.Parser.apply(this, arguments);
|
|
31
28
|
|
|
32
29
|
this.pattern = function() { return PATTERN; }
|
|
33
30
|
|
|
@@ -69,24 +66,10 @@ exports.Parser = function ENMonthNameParser(){
|
|
|
69
66
|
result.start.assign('month', month);
|
|
70
67
|
result.start.assign('year', year);
|
|
71
68
|
} else {
|
|
72
|
-
|
|
73
|
-
//Find the most appropriated year
|
|
74
|
-
var refMoment = moment(ref);
|
|
75
|
-
refMoment.month(month - 1);
|
|
76
|
-
refMoment.date(day);
|
|
77
|
-
|
|
78
|
-
var nextYear = refMoment.clone().add(1, 'y');
|
|
79
|
-
var lastYear = refMoment.clone().add(-1, 'y');
|
|
80
|
-
if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
81
|
-
refMoment = nextYear;
|
|
82
|
-
}
|
|
83
|
-
else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){
|
|
84
|
-
refMoment = lastYear;
|
|
85
|
-
}
|
|
86
|
-
|
|
69
|
+
year = parser.findYearClosestToRef(ref, day, month)
|
|
87
70
|
result.start.imply('day', day);
|
|
88
71
|
result.start.assign('month', month);
|
|
89
|
-
result.start.imply('year',
|
|
72
|
+
result.start.imply('year', year);
|
|
90
73
|
}
|
|
91
74
|
|
|
92
75
|
result.tags['ENMonthNameParser'] = true;
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
var moment = require('moment');
|
|
1
|
+
const dayjs = require('dayjs');
|
|
7
2
|
var Parser = require('../parser').Parser;
|
|
8
3
|
var ParsedResult = require('../../result').ParsedResult;
|
|
9
4
|
var util = require('../../utils/EN');
|
|
10
5
|
|
|
11
6
|
var PATTERN = new RegExp('(\\W|^)' +
|
|
12
|
-
'(next|last|past)\\s*' +
|
|
7
|
+
'(this|next|last|past)\\s*' +
|
|
13
8
|
'('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\s*an?)?)?\\s*' +
|
|
14
9
|
'(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\s*)' +
|
|
15
10
|
'(?=\\W|$)', 'i'
|
|
@@ -52,30 +47,68 @@ exports.Parser = function ENRelativeDateFormatParser(){
|
|
|
52
47
|
}
|
|
53
48
|
|
|
54
49
|
num *= modifier;
|
|
50
|
+
var date = dayjs(ref);
|
|
51
|
+
|
|
52
|
+
if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {
|
|
55
53
|
|
|
56
|
-
|
|
54
|
+
if (match[MULTIPLIER_WORD_GROUP]) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {
|
|
59
|
+
|
|
60
|
+
// This week
|
|
61
|
+
if (match[RELATIVE_WORD_GROUP].match(/week/i)) {
|
|
62
|
+
date = date.add(-date.get('d'), 'd');
|
|
63
|
+
result.start.imply('day', date.date());
|
|
64
|
+
result.start.imply('month', date.month() + 1);
|
|
65
|
+
result.start.imply('year', date.year());
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// This month
|
|
69
|
+
else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {
|
|
70
|
+
date = date.add(-date.date() + 1, 'd');
|
|
71
|
+
result.start.imply('day', date.date());
|
|
72
|
+
result.start.assign('year', date.year());
|
|
73
|
+
result.start.assign('month', date.month() + 1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// This year
|
|
77
|
+
else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {
|
|
78
|
+
date = date.add(-date.date() + 1, 'd');
|
|
79
|
+
date = date.add(-date.month(), 'month');
|
|
80
|
+
|
|
81
|
+
result.start.imply('day', date.date());
|
|
82
|
+
result.start.imply('month', date.month() + 1);
|
|
83
|
+
result.start.assign('year', date.year());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
57
90
|
if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {
|
|
58
91
|
|
|
59
92
|
if (match[RELATIVE_WORD_GROUP].match(/day/i)) {
|
|
60
|
-
date.add(num, 'd');
|
|
93
|
+
date = date.add(num, 'd');
|
|
61
94
|
result.start.assign('year', date.year());
|
|
62
95
|
result.start.assign('month', date.month() + 1);
|
|
63
96
|
result.start.assign('day', date.date());
|
|
64
97
|
} else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {
|
|
65
|
-
date.add(num * 7, 'd');
|
|
98
|
+
date = date.add(num * 7, 'd');
|
|
66
99
|
// We don't know the exact date for next/last week so we imply
|
|
67
100
|
// them
|
|
68
101
|
result.start.imply('day', date.date());
|
|
69
102
|
result.start.imply('month', date.month() + 1);
|
|
70
103
|
result.start.imply('year', date.year());
|
|
71
104
|
} else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {
|
|
72
|
-
date.add(num, 'month');
|
|
105
|
+
date = date.add(num, 'month');
|
|
73
106
|
// We don't know the exact day for next/last month
|
|
74
107
|
result.start.imply('day', date.date());
|
|
75
108
|
result.start.assign('year', date.year());
|
|
76
109
|
result.start.assign('month', date.month() + 1);
|
|
77
110
|
} else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {
|
|
78
|
-
date.add(num, 'year');
|
|
111
|
+
date = date.add(num, 'year');
|
|
79
112
|
// We don't know the exact day for month on next/last year
|
|
80
113
|
result.start.imply('day', date.date());
|
|
81
114
|
result.start.imply('month', date.month() + 1);
|
|
@@ -87,19 +120,19 @@ exports.Parser = function ENRelativeDateFormatParser(){
|
|
|
87
120
|
|
|
88
121
|
if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {
|
|
89
122
|
|
|
90
|
-
date.add(num, 'hour');
|
|
123
|
+
date = date.add(num, 'hour');
|
|
91
124
|
result.start.imply('minute', date.minute());
|
|
92
125
|
result.start.imply('second', date.second());
|
|
93
126
|
|
|
94
127
|
} else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {
|
|
95
128
|
|
|
96
|
-
date.add(num, 'minute');
|
|
129
|
+
date = date.add(num, 'minute');
|
|
97
130
|
result.start.assign('minute', date.minute());
|
|
98
131
|
result.start.imply('second', date.second());
|
|
99
132
|
|
|
100
133
|
} else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {
|
|
101
134
|
|
|
102
|
-
date.add(num, 'second');
|
|
135
|
+
date = date.add(num, 'second');
|
|
103
136
|
result.start.assign('second', date.second());
|
|
104
137
|
result.start.assign('minute', date.minute());
|
|
105
138
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
If "littleEndian" config is set, the parser will try the little-endian first.
|
|
13
13
|
- 11/3/2015 = March 11th, 2015
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
const dayjs = require('dayjs');
|
|
16
16
|
var Parser = require('../parser').Parser;
|
|
17
17
|
var ParsedResult = require('../../result').ParsedResult;
|
|
18
18
|
|
|
@@ -80,7 +80,7 @@ exports.Parser = function ENSlashDateFormatParser(config) {
|
|
|
80
80
|
if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;
|
|
81
81
|
|
|
82
82
|
var date = null;
|
|
83
|
-
var year = match[YEAR_GROUP] ||
|
|
83
|
+
var year = match[YEAR_GROUP] || dayjs(ref).year() + '';
|
|
84
84
|
var month = match[MONTH_GROUP];
|
|
85
85
|
var day = match[DAY_GROUP];
|
|
86
86
|
|
|
@@ -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]) {
|
|
@@ -5,12 +5,15 @@
|
|
|
5
5
|
- YYYY-MM-DD
|
|
6
6
|
- YYYY.MM.DD
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
const dayjs = require('dayjs');
|
|
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,12 +36,16 @@ 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
|
-
if (
|
|
41
|
-
|
|
46
|
+
if (
|
|
47
|
+
dayjs(result.start.get('month')) > 12 || dayjs(result.start.get('month')) < 1 ||
|
|
48
|
+
dayjs(result.start.get('day')) > 31 || dayjs(result.start.get('day')) < 1) {
|
|
42
49
|
return null;
|
|
43
50
|
}
|
|
44
51
|
|
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
- 11/05
|
|
4
4
|
- 06/2005
|
|
5
5
|
*/
|
|
6
|
-
var moment = require('moment');
|
|
7
6
|
var Parser = require('../parser').Parser;
|
|
8
7
|
var ParsedResult = require('../../result').ParsedResult;
|
|
9
8
|
|
|
10
9
|
var PATTERN = new RegExp('(^|[^\\d/]\\s+|[^\\w\\s])' +
|
|
11
10
|
'([0-9]|0[1-9]|1[012])/([0-9]{4})' +
|
|
12
|
-
'([^\\d/]|$)', 'i');
|
|
11
|
+
'(?=[^\\d/]|$)', 'i');
|
|
13
12
|
|
|
14
13
|
var OPENNING_GROUP = 1;
|
|
15
|
-
var ENDING_GROUP = 4;
|
|
16
14
|
|
|
17
15
|
var MONTH_GROUP = 2;
|
|
18
16
|
var YEAR_GROUP = 3;
|
|
@@ -24,7 +22,7 @@ exports.Parser = function ENSlashMonthFormatParser(argument) {
|
|
|
24
22
|
this.extract = function(text, ref, match, opt){
|
|
25
23
|
|
|
26
24
|
var index = match.index + match[OPENNING_GROUP].length;
|
|
27
|
-
var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length
|
|
25
|
+
var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length).trim();
|
|
28
26
|
|
|
29
27
|
var result = new ParsedResult({
|
|
30
28
|
text: text,
|
|
@@ -32,7 +30,6 @@ exports.Parser = function ENSlashMonthFormatParser(argument) {
|
|
|
32
30
|
ref: ref,
|
|
33
31
|
});
|
|
34
32
|
|
|
35
|
-
var date = null;
|
|
36
33
|
var year = match[YEAR_GROUP] ;
|
|
37
34
|
var month = match[MONTH_GROUP];
|
|
38
35
|
var day = 1;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const dayjs = require('dayjs');
|
|
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 = dayjs(ref);
|
|
41
|
+
|
|
42
|
+
for (var key in fragments) {
|
|
43
|
+
date = 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
|
+
}
|