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
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
const quarterOfYear = require('dayjs/plugin/quarterOfYear');
|
|
2
|
+
const dayjs = require('dayjs');
|
|
3
|
+
dayjs.extend(quarterOfYear);
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
var moment = require('moment');
|
|
7
5
|
var Parser = require('../parser').Parser;
|
|
8
6
|
var ParsedResult = require('../../result').ParsedResult;
|
|
9
7
|
var util = require('../../utils/FR');
|
|
10
8
|
|
|
11
|
-
// Force load fr localization data from moment for the locale files to be linkded durning browserify.
|
|
12
|
-
// NOTE: The function moment.defineLocale() also has a side effect that it change global locale
|
|
13
|
-
// We also need to save and restore the previous locale (see. moment.js, loadLocale)
|
|
14
|
-
var originalLocale = moment.locale();
|
|
15
|
-
require('moment/locale/fr');
|
|
16
|
-
moment.locale(originalLocale);
|
|
17
|
-
|
|
18
9
|
var PATTERN = new RegExp('(\\W|^)' +
|
|
19
10
|
'(?:les?|la|l\'|du|des?)\\s*' +
|
|
20
11
|
'('+ util.INTEGER_WORDS_PATTERN + '|\\d+)?\\s*' +
|
|
@@ -78,51 +69,50 @@ exports.Parser = function FRRelativeDateFormatParser(){
|
|
|
78
69
|
|
|
79
70
|
var total = multiplier * modifierFactor;
|
|
80
71
|
|
|
81
|
-
var dateFrom =
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
dateTo.locale('fr');
|
|
72
|
+
var dateFrom = dayjs(ref);
|
|
73
|
+
var dateTo = dayjs(ref);
|
|
74
|
+
|
|
85
75
|
var relative = match[RELATIVE_WORD_GROUP];
|
|
86
76
|
var startOf;
|
|
87
77
|
switch(true) {
|
|
88
78
|
case /secondes?/.test(relative):
|
|
89
|
-
dateFrom.add(total, 's');
|
|
90
|
-
dateTo.add(modifierFactor, 's');
|
|
79
|
+
dateFrom = dateFrom.add(total, 's');
|
|
80
|
+
dateTo = dateTo.add(modifierFactor, 's');
|
|
91
81
|
startOf = 'second';
|
|
92
82
|
break;
|
|
93
83
|
case /min(?:ute)?s?/.test(relative):
|
|
94
|
-
dateFrom.add(total, 'm');
|
|
95
|
-
dateTo.add(modifierFactor, 'm');
|
|
84
|
+
dateFrom = dateFrom.add(total, 'm');
|
|
85
|
+
dateTo = dateTo.add(modifierFactor, 'm');
|
|
96
86
|
startOf = 'minute';
|
|
97
87
|
break;
|
|
98
88
|
case /heures?/.test(relative):
|
|
99
|
-
dateFrom.add(total, 'h');
|
|
100
|
-
dateTo.add(modifierFactor, 'h');
|
|
89
|
+
dateFrom = dateFrom.add(total, 'h');
|
|
90
|
+
dateTo = dateTo.add(modifierFactor, 'h');
|
|
101
91
|
startOf = 'hour';
|
|
102
92
|
break;
|
|
103
93
|
case /jours?/.test(relative):
|
|
104
|
-
dateFrom.add(total, 'd');
|
|
105
|
-
dateTo.add(modifierFactor, 'd');
|
|
94
|
+
dateFrom = dateFrom.add(total, 'd');
|
|
95
|
+
dateTo = dateTo.add(modifierFactor, 'd');
|
|
106
96
|
startOf = 'day';
|
|
107
97
|
break;
|
|
108
98
|
case /semaines?/.test(relative):
|
|
109
|
-
dateFrom.add(total, 'w');
|
|
110
|
-
dateTo.add(modifierFactor, 'w');
|
|
99
|
+
dateFrom = dateFrom.add(total, 'w');
|
|
100
|
+
dateTo = dateTo.add(modifierFactor, 'w');
|
|
111
101
|
startOf = 'week';
|
|
112
102
|
break;
|
|
113
103
|
case /mois?/.test(relative):
|
|
114
|
-
dateFrom.add(total, 'M');
|
|
115
|
-
dateTo.add(modifierFactor, 'M');
|
|
104
|
+
dateFrom = dateFrom.add(total, 'M');
|
|
105
|
+
dateTo = dateTo.add(modifierFactor, 'M');
|
|
116
106
|
startOf = 'month';
|
|
117
107
|
break;
|
|
118
108
|
case /trimestres?/.test(relative):
|
|
119
|
-
dateFrom.add(total, 'Q');
|
|
120
|
-
dateTo.add(modifierFactor, 'Q');
|
|
109
|
+
dateFrom = dateFrom.add(total, 'Q');
|
|
110
|
+
dateTo = dateTo.add(modifierFactor, 'Q');
|
|
121
111
|
startOf = 'quarter';
|
|
122
112
|
break;
|
|
123
113
|
case /années?/.test(relative):
|
|
124
|
-
dateFrom.add(total, 'y');
|
|
125
|
-
dateTo.add(modifierFactor, 'y');
|
|
114
|
+
dateFrom = dateFrom.add(total, 'y');
|
|
115
|
+
dateTo = dateTo.add(modifierFactor, 'y');
|
|
126
116
|
startOf = 'year';
|
|
127
117
|
break;
|
|
128
118
|
}
|
|
@@ -135,8 +125,13 @@ exports.Parser = function FRRelativeDateFormatParser(){
|
|
|
135
125
|
}
|
|
136
126
|
|
|
137
127
|
// Get start and end of dates
|
|
138
|
-
dateFrom.startOf(startOf);
|
|
139
|
-
dateTo.endOf(startOf);
|
|
128
|
+
dateFrom = dateFrom.startOf(startOf);
|
|
129
|
+
dateTo = dateTo.endOf(startOf);
|
|
130
|
+
if (startOf == 'week') { // Weekday in FR start on Sat?
|
|
131
|
+
dateFrom = dateFrom.add(1, 'd')
|
|
132
|
+
dateTo = dateTo.add(1, 'd')
|
|
133
|
+
}
|
|
134
|
+
|
|
140
135
|
|
|
141
136
|
// Assign results
|
|
142
137
|
result.start.assign('year', dateFrom.year());
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
- 3/11/2015
|
|
5
5
|
- 3/11
|
|
6
6
|
*/
|
|
7
|
-
var
|
|
8
|
-
var Parser = require('../parser').Parser;
|
|
7
|
+
var parser = require('../parser');
|
|
9
8
|
var ParsedResult = require('../../result').ParsedResult;
|
|
10
9
|
|
|
11
10
|
var PATTERN = new RegExp('(\\W|^)' +
|
|
@@ -34,7 +33,7 @@ var MONTH_GROUP = 4;
|
|
|
34
33
|
var YEAR_GROUP = 5;
|
|
35
34
|
|
|
36
35
|
exports.Parser = function FRSlashDateFormatParser(argument) {
|
|
37
|
-
Parser.apply(this, arguments);
|
|
36
|
+
parser.Parser.apply(this, arguments);
|
|
38
37
|
|
|
39
38
|
this.pattern = function () { return PATTERN; };
|
|
40
39
|
this.extract = function(text, ref, match, opt){
|
|
@@ -65,13 +64,21 @@ exports.Parser = function FRSlashDateFormatParser(argument) {
|
|
|
65
64
|
if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;
|
|
66
65
|
|
|
67
66
|
var date = null;
|
|
68
|
-
var year = match[YEAR_GROUP] || moment(ref).year() + '';
|
|
69
67
|
var month = match[MONTH_GROUP];
|
|
70
68
|
var day = match[DAY_GROUP];
|
|
71
69
|
|
|
72
70
|
day = parseInt(day);
|
|
73
71
|
month = parseInt(month);
|
|
74
|
-
|
|
72
|
+
|
|
73
|
+
var year = null;
|
|
74
|
+
if (match[YEAR_GROUP]) {
|
|
75
|
+
year = match[YEAR_GROUP];
|
|
76
|
+
year = parseInt(year);
|
|
77
|
+
|
|
78
|
+
if (year < 100){
|
|
79
|
+
year = year + 2000;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
75
82
|
|
|
76
83
|
if(month < 1 || month > 12) {
|
|
77
84
|
if(month > 12) {
|
|
@@ -88,20 +95,20 @@ exports.Parser = function FRSlashDateFormatParser(argument) {
|
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
}
|
|
98
|
+
|
|
91
99
|
if(day < 1 || day > 31) return null;
|
|
92
100
|
|
|
93
|
-
if(year
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
101
|
+
if(year){
|
|
102
|
+
result.start.assign('day', day);
|
|
103
|
+
result.start.assign('month', month);
|
|
104
|
+
result.start.assign('year', year);
|
|
105
|
+
} else {
|
|
106
|
+
year = parser.findYearClosestToRef(ref, day, month)
|
|
107
|
+
result.start.assign('day', day);
|
|
108
|
+
result.start.assign('month', month);
|
|
109
|
+
result.start.imply('year', year);
|
|
99
110
|
}
|
|
100
111
|
|
|
101
|
-
result.start.assign('day', day);
|
|
102
|
-
result.start.assign('month', month);
|
|
103
|
-
result.start.assign('year', year);
|
|
104
|
-
|
|
105
112
|
// Day of week
|
|
106
113
|
if(match[WEEKDAY_GROUP]) {
|
|
107
114
|
result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);
|
|
@@ -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
|
|
|
@@ -40,16 +35,16 @@ exports.Parser = function FRTimeAgoFormatParser(){
|
|
|
40
35
|
}
|
|
41
36
|
}
|
|
42
37
|
|
|
43
|
-
var date =
|
|
38
|
+
var date = dayjs(ref);
|
|
44
39
|
|
|
45
40
|
if (match[3].match(/heure/) || match[3].match(/minute/)) {
|
|
46
41
|
if (match[3].match(/heure/)) {
|
|
47
42
|
|
|
48
|
-
date.add(-num, 'hour');
|
|
43
|
+
date = date.add(-num, 'hour');
|
|
49
44
|
|
|
50
45
|
} else if (match[3].match(/minute/)) {
|
|
51
46
|
|
|
52
|
-
date.add(-num, 'minute');
|
|
47
|
+
date = date.add(-num, 'minute');
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
result.start.imply('day', date.date());
|
|
@@ -62,7 +57,7 @@ exports.Parser = function FRTimeAgoFormatParser(){
|
|
|
62
57
|
}
|
|
63
58
|
|
|
64
59
|
if (match[3].match(/semaine/)) {
|
|
65
|
-
date.add(-num, 'week');
|
|
60
|
+
date = date.add(-num, 'week');
|
|
66
61
|
|
|
67
62
|
result.start.imply('day', date.date());
|
|
68
63
|
result.start.imply('month', date.month() + 1);
|
|
@@ -72,16 +67,15 @@ exports.Parser = function FRTimeAgoFormatParser(){
|
|
|
72
67
|
}
|
|
73
68
|
|
|
74
69
|
if (match[3].match(/jour/)) {
|
|
75
|
-
date.add(-num, 'd');
|
|
70
|
+
date = date.add(-num, 'd');
|
|
76
71
|
}
|
|
77
72
|
|
|
78
73
|
if (match[3].match(/mois/)) {
|
|
79
|
-
date.add(-num, 'month');
|
|
74
|
+
date = date.add(-num, 'month');
|
|
80
75
|
}
|
|
81
76
|
|
|
82
77
|
if (match[3].match(/années?|ans?/)) {
|
|
83
|
-
|
|
84
|
-
date.add(-num, 'year');
|
|
78
|
+
date = date.add(-num, 'year');
|
|
85
79
|
}
|
|
86
80
|
|
|
87
81
|
result.start.assign('day', date.date());
|
|
@@ -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 ParsedComponents = require('../../result').ParsedComponents;
|
|
@@ -47,7 +42,7 @@ exports.Parser = function FRTimeExpressionParser(){
|
|
|
47
42
|
|
|
48
43
|
// This pattern can be overlaped Ex. [12] AM, 1[2] AM
|
|
49
44
|
if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
|
|
50
|
-
var refMoment =
|
|
45
|
+
var refMoment = dayjs(ref);
|
|
51
46
|
var result = new ParsedResult();
|
|
52
47
|
result.ref = ref;
|
|
53
48
|
result.index = match.index + match[1].length;
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
var moment = require('moment');
|
|
6
1
|
var Parser = require('../parser').Parser;
|
|
7
2
|
var ParsedResult = require('../../result').ParsedResult;
|
|
8
|
-
var updateParsedComponent = require('../
|
|
3
|
+
var updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;
|
|
9
4
|
|
|
10
5
|
var DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,
|
|
11
6
|
'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};
|
|
@@ -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
|
|
|
@@ -25,8 +20,8 @@ exports.Parser = function JPCasualDateParser(){
|
|
|
25
20
|
ref: ref,
|
|
26
21
|
});
|
|
27
22
|
|
|
28
|
-
var refMoment =
|
|
29
|
-
var startMoment = refMoment
|
|
23
|
+
var refMoment = dayjs(ref);
|
|
24
|
+
var startMoment = refMoment;
|
|
30
25
|
|
|
31
26
|
if(text == '今夜' || text == '今夕' || text == '今晩'){
|
|
32
27
|
// Normally means this coming midnight
|
|
@@ -37,12 +32,12 @@ exports.Parser = function JPCasualDateParser(){
|
|
|
37
32
|
|
|
38
33
|
// Check not "Tomorrow" on late night
|
|
39
34
|
if(refMoment.hour() > 4) {
|
|
40
|
-
startMoment.add(1, 'day');
|
|
35
|
+
startMoment = startMoment.add(1, 'day');
|
|
41
36
|
}
|
|
42
37
|
|
|
43
38
|
} else if(text == '昨日') {
|
|
44
39
|
|
|
45
|
-
startMoment.add(-1, 'day');
|
|
40
|
+
startMoment = startMoment.add(-1, 'day');
|
|
46
41
|
|
|
47
42
|
} else if (text.match("今朝")) {
|
|
48
43
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const dayjs = require('dayjs');
|
|
2
|
+
const parser = require('../parser');
|
|
3
|
+
const ParsedResult = require('../../result').ParsedResult;
|
|
4
|
+
|
|
5
|
+
const util = require('../../utils/JP');
|
|
6
|
+
|
|
7
|
+
const PATTERN = /(?:(同|今|本|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i;
|
|
8
|
+
const SPECIAL_YEAR_GROUP = 1;
|
|
9
|
+
const TYPICAL_YEAR_GROUP = 2;
|
|
10
|
+
const ERA_GROUP = 3;
|
|
11
|
+
const YEAR_NUMBER_GROUP = 4;
|
|
12
|
+
const MONTH_GROUP = 5;
|
|
13
|
+
const DAY_GROUP = 6;
|
|
14
|
+
|
|
15
|
+
exports.Parser = function JPStandardParser(){
|
|
16
|
+
parser.Parser.apply(this, arguments);
|
|
17
|
+
|
|
18
|
+
this.pattern = function() { return PATTERN; }
|
|
19
|
+
|
|
20
|
+
this.extract = function(text, ref, match, opt){
|
|
21
|
+
var result = new ParsedResult({
|
|
22
|
+
text: match[0],
|
|
23
|
+
index: match.index,
|
|
24
|
+
ref: ref,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
var month = match[MONTH_GROUP];
|
|
28
|
+
month = util.toHankaku(month);
|
|
29
|
+
month = parseInt(month);
|
|
30
|
+
|
|
31
|
+
var day = match[DAY_GROUP];
|
|
32
|
+
day = util.toHankaku(day);
|
|
33
|
+
day = parseInt(day);
|
|
34
|
+
|
|
35
|
+
result.start.assign('day', day);
|
|
36
|
+
result.start.assign('month', month);
|
|
37
|
+
|
|
38
|
+
if (match[TYPICAL_YEAR_GROUP]) {
|
|
39
|
+
|
|
40
|
+
var year = match[YEAR_NUMBER_GROUP];
|
|
41
|
+
if (year == '元') {
|
|
42
|
+
year = 1;
|
|
43
|
+
} else {
|
|
44
|
+
year = util.toHankaku(year);
|
|
45
|
+
year = parseInt(year);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (match[ERA_GROUP] == '令和') {
|
|
49
|
+
year += 2018;
|
|
50
|
+
} else if (match[ERA_GROUP] == '平成') {
|
|
51
|
+
year += 1988;
|
|
52
|
+
} else if (match[ERA_GROUP] == '昭和') {
|
|
53
|
+
year += 1925;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
result.start.assign('year', year);
|
|
57
|
+
|
|
58
|
+
} else if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match('同|今|本')) {
|
|
59
|
+
const moment = dayjs(ref)
|
|
60
|
+
result.start.assign('year', moment.year());
|
|
61
|
+
} else {
|
|
62
|
+
const year = parser.findYearClosestToRef(ref, day, month);
|
|
63
|
+
result.start.imply('year', year);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
result.tags['JPStandardParser'] = true;
|
|
67
|
+
return result;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
package/src/parsers/parser.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
const dayjs = require('dayjs');
|
|
1
2
|
|
|
2
|
-
function
|
|
3
|
+
exports.Parser = function (config) {
|
|
3
4
|
|
|
4
5
|
config = config || {};
|
|
5
6
|
var strictMode = config.strict;
|
|
@@ -51,55 +52,81 @@ function Parser(config) {
|
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
exports.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
exports.
|
|
76
|
-
exports.
|
|
77
|
-
exports.
|
|
78
|
-
exports.
|
|
79
|
-
exports.
|
|
80
|
-
exports.
|
|
81
|
-
exports.
|
|
82
|
-
|
|
83
|
-
exports.
|
|
84
|
-
exports.
|
|
85
|
-
exports.
|
|
86
|
-
exports.
|
|
87
|
-
exports.
|
|
88
|
-
exports.
|
|
89
|
-
|
|
90
|
-
exports.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
exports.
|
|
94
|
-
exports.
|
|
95
|
-
exports.
|
|
96
|
-
exports.
|
|
97
|
-
|
|
98
|
-
exports.
|
|
99
|
-
exports.
|
|
100
|
-
|
|
101
|
-
exports.
|
|
102
|
-
exports.
|
|
103
|
-
exports.
|
|
104
|
-
exports.
|
|
105
|
-
exports.
|
|
55
|
+
exports.findYearClosestToRef = function (ref, day, month) {
|
|
56
|
+
//Find the most appropriated year
|
|
57
|
+
const refMoment = dayjs(ref);
|
|
58
|
+
var dateMoment = refMoment;
|
|
59
|
+
dateMoment = dateMoment.month(month - 1);
|
|
60
|
+
dateMoment = dateMoment.date(day);
|
|
61
|
+
dateMoment = dateMoment.year(refMoment.year())
|
|
62
|
+
|
|
63
|
+
const nextYear = dateMoment.add(1, 'y');
|
|
64
|
+
const lastYear = dateMoment.add(-1, 'y');
|
|
65
|
+
if( Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment)) ){
|
|
66
|
+
dateMoment = nextYear;
|
|
67
|
+
}
|
|
68
|
+
else if( Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment)) ){
|
|
69
|
+
dateMoment = lastYear;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return dateMoment.year();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
exports.ENISOFormatParser = require('./en/ENISOFormatParser').Parser;
|
|
76
|
+
exports.ENDeadlineFormatParser = require('./en/ENDeadlineFormatParser').Parser;
|
|
77
|
+
exports.ENRelativeDateFormatParser = require('./en/ENRelativeDateFormatParser').Parser;
|
|
78
|
+
exports.ENMonthNameLittleEndianParser = require('./en/ENMonthNameLittleEndianParser').Parser;
|
|
79
|
+
exports.ENMonthNameMiddleEndianParser = require('./en/ENMonthNameMiddleEndianParser').Parser;
|
|
80
|
+
exports.ENMonthNameParser = require('./en/ENMonthNameParser').Parser;
|
|
81
|
+
exports.ENSlashDateFormatParser = require('./en/ENSlashDateFormatParser').Parser;
|
|
82
|
+
exports.ENSlashDateFormatStartWithYearParser = require('./en/ENSlashDateFormatStartWithYearParser').Parser;
|
|
83
|
+
exports.ENSlashMonthFormatParser = require('./en/ENSlashMonthFormatParser').Parser;
|
|
84
|
+
exports.ENTimeAgoFormatParser = require('./en/ENTimeAgoFormatParser').Parser;
|
|
85
|
+
exports.ENTimeExpressionParser = require('./en/ENTimeExpressionParser').Parser;
|
|
86
|
+
exports.ENTimeLaterFormatParser = require('./en/ENTimeLaterFormatParser').Parser;
|
|
87
|
+
exports.ENWeekdayParser = require('./en/ENWeekdayParser').Parser;
|
|
88
|
+
exports.ENCasualDateParser = require('./en/ENCasualDateParser').Parser;
|
|
89
|
+
exports.ENCasualTimeParser = require('./en/ENCasualTimeParser').Parser;
|
|
90
|
+
|
|
91
|
+
exports.JPStandardParser = require('./ja/JPStandardParser').Parser;
|
|
92
|
+
exports.JPCasualDateParser = require('./ja/JPCasualDateParser').Parser;
|
|
93
|
+
|
|
94
|
+
exports.PTCasualDateParser = require('./pt/PTCasualDateParser').Parser;
|
|
95
|
+
exports.PTDeadlineFormatParser = require('./pt/PTDeadlineFormatParser').Parser;
|
|
96
|
+
exports.PTMonthNameLittleEndianParser = require('./pt/PTMonthNameLittleEndianParser').Parser;
|
|
97
|
+
exports.PTSlashDateFormatParser = require('./pt/PTSlashDateFormatParser').Parser;
|
|
98
|
+
exports.PTTimeAgoFormatParser = require('./pt/PTTimeAgoFormatParser').Parser;
|
|
99
|
+
exports.PTTimeExpressionParser = require('./pt/PTTimeExpressionParser').Parser;
|
|
100
|
+
exports.PTWeekdayParser = require('./pt/PTWeekdayParser').Parser;
|
|
101
|
+
|
|
102
|
+
exports.ESCasualDateParser = require('./es/ESCasualDateParser').Parser;
|
|
103
|
+
exports.ESDeadlineFormatParser = require('./es/ESDeadlineFormatParser').Parser;
|
|
104
|
+
exports.ESTimeAgoFormatParser = require('./es/ESTimeAgoFormatParser').Parser;
|
|
105
|
+
exports.ESTimeExpressionParser = require('./es/ESTimeExpressionParser').Parser;
|
|
106
|
+
exports.ESWeekdayParser = require('./es/ESWeekdayParser').Parser;
|
|
107
|
+
exports.ESMonthNameLittleEndianParser = require('./es/ESMonthNameLittleEndianParser').Parser;
|
|
108
|
+
exports.ESSlashDateFormatParser = require('./es/ESSlashDateFormatParser').Parser;
|
|
109
|
+
|
|
110
|
+
exports.FRCasualDateParser = require('./fr/FRCasualDateParser').Parser;
|
|
111
|
+
exports.FRDeadlineFormatParser = require('./fr/FRDeadlineFormatParser').Parser;
|
|
112
|
+
exports.FRMonthNameLittleEndianParser = require('./fr/FRMonthNameLittleEndianParser').Parser;
|
|
113
|
+
exports.FRSlashDateFormatParser = require('./fr/FRSlashDateFormatParser').Parser;
|
|
114
|
+
exports.FRTimeAgoFormatParser = require('./fr/FRTimeAgoFormatParser').Parser;
|
|
115
|
+
exports.FRTimeExpressionParser = require('./fr/FRTimeExpressionParser').Parser;
|
|
116
|
+
exports.FRWeekdayParser = require('./fr/FRWeekdayParser').Parser;
|
|
117
|
+
exports.FRRelativeDateFormatParser = require('./fr/FRRelativeDateFormatParser').Parser;
|
|
118
|
+
|
|
119
|
+
exports.ZHHantDateParser = require('./zh-Hant/ZHHantDateParser').Parser;
|
|
120
|
+
exports.ZHHantWeekdayParser = require('./zh-Hant/ZHHantWeekdayParser').Parser;
|
|
121
|
+
exports.ZHHantTimeExpressionParser = require('./zh-Hant/ZHHantTimeExpressionParser').Parser;
|
|
122
|
+
exports.ZHHantCasualDateParser = require('./zh-Hant/ZHHantCasualDateParser').Parser;
|
|
123
|
+
exports.ZHHantDeadlineFormatParser = require('./zh-Hant/ZHHantDeadlineFormatParser').Parser;
|
|
124
|
+
|
|
125
|
+
exports.DEDeadlineFormatParser = require('./de/DEDeadlineFormatParser').Parser;
|
|
126
|
+
exports.DEMonthNameLittleEndianParser = require('./de/DEMonthNameLittleEndianParser').Parser;
|
|
127
|
+
exports.DEMonthNameParser = require('./de/DEMonthNameParser').Parser;
|
|
128
|
+
exports.DESlashDateFormatParser = require('./de/DESlashDateFormatParser').Parser;
|
|
129
|
+
exports.DETimeAgoFormatParser = require('./de/DETimeAgoFormatParser').Parser;
|
|
130
|
+
exports.DETimeExpressionParser = require('./de/DETimeExpressionParser').Parser;
|
|
131
|
+
exports.DEWeekdayParser = require('./de/DEWeekdayParser').Parser;
|
|
132
|
+
exports.DECasualDateParser = require('./de/DECasualDateParser').Parser;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const dayjs = require('dayjs');
|
|
2
|
+
var Parser = require('../parser').Parser;
|
|
3
|
+
var ParsedResult = require('../../result').ParsedResult;
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
Valid patterns:
|
|
7
|
+
- esta manhã -> today in the morning
|
|
8
|
+
- esta tarde -> today in the afternoon/evening
|
|
9
|
+
- esta noite -> tonight
|
|
10
|
+
- ontem de -> yesterday in the morning
|
|
11
|
+
- ontem a tarde -> yesterday in the afternoon/evening
|
|
12
|
+
- ontem a noite -> yesterday at night
|
|
13
|
+
- amanhã de manhã -> tomorrow in the morning
|
|
14
|
+
- amanhã a tarde -> tomorrow in the afternoon/evening
|
|
15
|
+
- amanhã a noite -> tomorrow at night
|
|
16
|
+
- hoje -> today
|
|
17
|
+
- ontem -> yesterday
|
|
18
|
+
- amanhã -> tomorrow
|
|
19
|
+
*/
|
|
20
|
+
var PATTERN = /(\W|^)(agora|esta\s*(manhã|tarde|noite)|(ontem|amanhã)\s*(de|à)\s*(manhã|tarde|noite)|hoje|amanhã|ontem|noite)(?=\W|$)/i;
|
|
21
|
+
|
|
22
|
+
exports.Parser = function PTCasualDateParser(){
|
|
23
|
+
|
|
24
|
+
Parser.apply(this, arguments);
|
|
25
|
+
|
|
26
|
+
this.pattern = function() { return PATTERN; }
|
|
27
|
+
|
|
28
|
+
this.extract = function(text, ref, match, opt){
|
|
29
|
+
|
|
30
|
+
var text = match[0].substr(match[1].length);
|
|
31
|
+
var index = match.index + match[1].length;
|
|
32
|
+
var result = new ParsedResult({
|
|
33
|
+
index: index,
|
|
34
|
+
text: text,
|
|
35
|
+
ref: ref,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
var refMoment = dayjs(ref);
|
|
39
|
+
var startMoment = refMoment;
|
|
40
|
+
var lowerText = text.toLowerCase().replace(/\s+/g, ' ');
|
|
41
|
+
|
|
42
|
+
if(lowerText == 'amanhã'){
|
|
43
|
+
|
|
44
|
+
// Check not "Tomorrow" on late night
|
|
45
|
+
if(refMoment.hour() > 1) {
|
|
46
|
+
startMoment = startMoment.add(1, 'day');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
} else if(lowerText == 'ontem') {
|
|
50
|
+
|
|
51
|
+
startMoment = startMoment.add(-1, 'day');
|
|
52
|
+
}
|
|
53
|
+
else if(lowerText == 'noite') {
|
|
54
|
+
|
|
55
|
+
result.start.imply('hour', 0);
|
|
56
|
+
if (refMoment.hour() > 6) {
|
|
57
|
+
startMoment = startMoment.add(-1, 'day');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
} else if (lowerText.match("esta")) {
|
|
61
|
+
|
|
62
|
+
var secondMatch = match[3].toLowerCase();
|
|
63
|
+
if (secondMatch == "tarde") {
|
|
64
|
+
|
|
65
|
+
result.start.imply('hour', 18);
|
|
66
|
+
|
|
67
|
+
} else if (secondMatch == "manhã") {
|
|
68
|
+
|
|
69
|
+
result.start.imply('hour', 6);
|
|
70
|
+
|
|
71
|
+
} else if (secondMatch == "noite") {
|
|
72
|
+
|
|
73
|
+
// Normally means this coming midnight
|
|
74
|
+
result.start.imply('hour', 22);
|
|
75
|
+
result.start.imply('meridiem', 1);
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
} else if (lowerText.match(/de|à/)) {
|
|
79
|
+
|
|
80
|
+
var firstMatch = match[4].toLowerCase();
|
|
81
|
+
if (firstMatch === 'ontem') {
|
|
82
|
+
|
|
83
|
+
startMoment = startMoment.add(-1, 'day');
|
|
84
|
+
|
|
85
|
+
} else if (firstMatch === 'amanhã') {
|
|
86
|
+
|
|
87
|
+
startMoment = startMoment.add(1, 'day');
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
var secondMatch = match[6].toLowerCase();
|
|
92
|
+
if (secondMatch == "tarde") {
|
|
93
|
+
|
|
94
|
+
result.start.imply('hour', 18);
|
|
95
|
+
|
|
96
|
+
} else if (secondMatch == "manhã") {
|
|
97
|
+
|
|
98
|
+
result.start.imply('hour', 9);
|
|
99
|
+
|
|
100
|
+
} else if (secondMatch == "noite") {
|
|
101
|
+
|
|
102
|
+
// Normally means this coming midnight
|
|
103
|
+
result.start.imply('hour', 22);
|
|
104
|
+
result.start.imply('meridiem', 1);
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
} else if (lowerText.match("agora")) {
|
|
109
|
+
|
|
110
|
+
result.start.imply('hour', refMoment.hour());
|
|
111
|
+
result.start.imply('minute', refMoment.minute());
|
|
112
|
+
result.start.imply('second', refMoment.second());
|
|
113
|
+
result.start.imply('millisecond', refMoment.millisecond());
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
result.start.assign('day', startMoment.date())
|
|
118
|
+
result.start.assign('month', startMoment.month() + 1)
|
|
119
|
+
result.start.assign('year', startMoment.year())
|
|
120
|
+
result.tags['PTCasualDateParser'] = true;
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
}
|