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.
Files changed (195) hide show
  1. package/.travis.yml +2 -0
  2. package/README.md +100 -86
  3. package/dist/chrono.js +7865 -0
  4. package/dist/chrono.js.map +1 -0
  5. package/dist/chrono.min.js +3 -0
  6. package/dist/chrono.min.js.LICENSE.txt +19 -0
  7. package/dist/chrono.min.js.map +1 -0
  8. package/package.json +20 -22
  9. package/src/chrono.js +5 -3
  10. package/src/options.js +33 -3
  11. package/src/parsers/{DE → de}/DECasualDateParser.js +18 -21
  12. package/src/parsers/{DE → de}/DEDeadlineFormatParser.js +9 -9
  13. package/src/parsers/{DE → de}/DEMonthNameLittleEndianParser.js +15 -36
  14. package/src/parsers/{DE → de}/DEMonthNameParser.js +12 -27
  15. package/src/parsers/{DE → de}/DESlashDateFormatParser.js +2 -3
  16. package/src/parsers/{DE → de}/DETimeAgoFormatParser.js +9 -14
  17. package/src/parsers/{DE → de}/DETimeExpressionParser.js +2 -2
  18. package/src/parsers/{DE → de}/DEWeekdayParser.js +14 -14
  19. package/src/parsers/{EN → en}/ENCasualDateParser.js +6 -11
  20. package/src/parsers/en/ENCasualTimeParser.js +54 -0
  21. package/src/parsers/{EN → en}/ENDeadlineFormatParser.js +15 -20
  22. package/src/parsers/{EN → en}/ENISOFormatParser.js +3 -3
  23. package/src/parsers/{EN → en}/ENMonthNameLittleEndianParser.js +25 -49
  24. package/src/parsers/{EN → en}/ENMonthNameMiddleEndianParser.js +6 -23
  25. package/src/parsers/{EN → en}/ENMonthNameParser.js +5 -22
  26. package/src/parsers/{EN → en}/ENRelativeDateFormatParser.js +48 -15
  27. package/src/parsers/{EN → en}/ENSlashDateFormatParser.js +7 -3
  28. package/src/parsers/{EN → en}/ENSlashDateFormatStartWithYearParser.js +12 -5
  29. package/src/parsers/{EN → en}/ENSlashMonthFormatParser.js +2 -5
  30. package/src/parsers/en/ENTimeAgoFormatParser.js +69 -0
  31. package/src/parsers/{EN → en}/ENTimeExpressionParser.js +26 -17
  32. package/src/parsers/en/ENTimeLaterFormatParser.js +75 -0
  33. package/src/parsers/{EN → en}/ENWeekdayParser.js +8 -12
  34. package/src/parsers/{ES → es}/ESCasualDateParser.js +8 -13
  35. package/src/parsers/{ES → es}/ESDeadlineFormatParser.js +5 -11
  36. package/src/parsers/{ES → es}/ESMonthNameLittleEndianParser.js +6 -28
  37. package/src/parsers/{ES → es}/ESSlashDateFormatParser.js +2 -2
  38. package/src/parsers/{ES → es}/ESTimeAgoFormatParser.js +8 -13
  39. package/src/parsers/{ES → es}/ESTimeExpressionParser.js +2 -7
  40. package/src/parsers/{ES → es}/ESWeekdayParser.js +1 -6
  41. package/src/parsers/{FR → fr}/FRCasualDateParser.js +6 -11
  42. package/src/parsers/{FR → fr}/FRDeadlineFormatParser.js +9 -14
  43. package/src/parsers/{FR → fr}/FRMonthNameLittleEndianParser.js +4 -26
  44. package/src/parsers/{FR → fr}/FRRelativeDateFormatParser.js +29 -34
  45. package/src/parsers/{FR → fr}/FRSlashDateFormatParser.js +22 -15
  46. package/src/parsers/{FR → fr}/FRTimeAgoFormatParser.js +8 -14
  47. package/src/parsers/{FR → fr}/FRTimeExpressionParser.js +2 -7
  48. package/src/parsers/{FR → fr}/FRWeekdayParser.js +1 -6
  49. package/src/parsers/{JP → ja}/JPCasualDateParser.js +5 -10
  50. package/src/parsers/ja/JPStandardParser.js +71 -0
  51. package/src/parsers/parser.js +80 -53
  52. package/src/parsers/pt/PTCasualDateParser.js +123 -0
  53. package/src/parsers/pt/PTDeadlineFormatParser.js +61 -0
  54. package/src/parsers/pt/PTMonthNameLittleEndianParser.js +86 -0
  55. package/src/parsers/pt/PTSlashDateFormatParser.js +114 -0
  56. package/src/parsers/pt/PTTimeAgoFormatParser.js +87 -0
  57. package/src/parsers/pt/PTTimeExpressionParser.js +234 -0
  58. package/src/parsers/pt/PTWeekdayParser.js +60 -0
  59. package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantCasualDateParser.js +30 -19
  60. package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDateParser.js +2 -7
  61. package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantDeadlineFormatParser.js +14 -19
  62. package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantTimeExpressionParser.js +38 -11
  63. package/src/parsers/{ZH-Hant → zh-Hant}/ZHHantWeekdayParser.js +1 -7
  64. package/src/refiners/ExtractTimezoneAbbrRefiner.js +19 -10
  65. package/src/refiners/ForwardDateRefiner.js +10 -15
  66. package/src/refiners/{DE → de}/DEMergeDateRangeRefiner.js +1 -1
  67. package/src/refiners/{DE → de}/DEMergeDateTimeRefiner.js +3 -3
  68. package/src/refiners/{EN → en}/ENMergeDateRangeRefiner.js +5 -9
  69. package/src/refiners/{EN → en}/ENMergeDateTimeRefiner.js +15 -2
  70. package/src/refiners/{EN → en}/ENMergeWeekdayRefiner.js +0 -0
  71. package/src/refiners/{EN → en}/ENPrioritizeSpecificDateRefiner.js +0 -0
  72. package/src/refiners/{FR → fr}/FRMergeDateRangeRefiner.js +0 -0
  73. package/src/refiners/{FR → fr}/FRMergeDateTimeRefiner.js +1 -1
  74. package/src/refiners/{JP → ja}/JPMergeDateRangeRefiner.js +1 -1
  75. package/src/refiners/refiner.js +12 -12
  76. package/src/result.js +47 -19
  77. package/src/timezone.js +2 -0
  78. package/src/utils/EN.js +68 -2
  79. package/src/utils/PT.js +62 -0
  80. package/test/de/de.test.js +51 -0
  81. package/test/de/de_casual.test.js +432 -0
  82. package/test/de/de_dash.test.js +6 -0
  83. package/test/de/de_deadline.test.js +244 -0
  84. package/test/de/de_little_endian.test.js +459 -0
  85. package/test/de/de_time_ago.test.js +313 -0
  86. package/test/de/de_time_exp.test.js +166 -0
  87. package/test/de/de_weekday.test.js +235 -0
  88. package/test/en/en.test.js +250 -0
  89. package/test/en/en_casual.test.js +461 -0
  90. package/test/en/en_dash.test.js +31 -0
  91. package/test/en/en_deadline.test.js +366 -0
  92. package/test/{test_example.js → en/en_example.test.js} +7 -18
  93. package/test/en/en_inter_std.test.js +269 -0
  94. package/test/en/en_little_endian.test.js +566 -0
  95. package/test/en/en_middle_endian.test.js +552 -0
  96. package/test/en/en_month.test.js +156 -0
  97. package/test/en/en_option_forward.test.js +156 -0
  98. package/test/en/en_relative.test.js +228 -0
  99. package/test/en/en_slash.test.js +450 -0
  100. package/test/en/en_time_ago.test.js +374 -0
  101. package/test/en/en_time_exp.test.js +722 -0
  102. package/test/en/en_time_from_now.test.js +371 -0
  103. package/test/en/en_time_later.test.js +95 -0
  104. package/test/en/en_weekday.test.js +301 -0
  105. package/test/es/es_casual.test.js +258 -0
  106. package/test/es/es_dash.test.js +13 -0
  107. package/test/es/es_deadline.test.js +85 -0
  108. package/test/es/es_little_endian.test.js +350 -0
  109. package/test/es/es_slash.test.js +24 -0
  110. package/test/es/es_time_ago.test.js +137 -0
  111. package/test/es/es_time_exp.test.js +240 -0
  112. package/test/fr/fr_casual.test.js +454 -0
  113. package/test/fr/fr_dash.test.js +26 -0
  114. package/test/fr/fr_deadline.test.js +244 -0
  115. package/test/fr/fr_little_endian.test.js +576 -0
  116. package/test/fr/fr_relative.test.js +198 -0
  117. package/test/fr/fr_slash.test.js +81 -0
  118. package/test/fr/fr_time_ago.test.js +194 -0
  119. package/test/fr/fr_time_exp.test.js +960 -0
  120. package/test/fr/fr_weekday.test.js +200 -0
  121. package/test/ja/ja_casual.test.js +51 -0
  122. package/test/ja/ja_standard.test.js +344 -0
  123. package/test/pt/pt_casual.test.js +258 -0
  124. package/test/pt/pt_dash.test.js +13 -0
  125. package/test/pt/pt_deadline.test.js +85 -0
  126. package/test/pt/pt_little_endian.test.js +350 -0
  127. package/test/pt/pt_slash.test.js +44 -0
  128. package/test/pt/pt_time_ago.test.js +137 -0
  129. package/test/pt/pt_time_exp.test.js +240 -0
  130. package/test/system.test.js +207 -0
  131. package/test/zh/zh_hant_casual.test.js +340 -0
  132. package/test/zh/zh_hant_date.test.js +118 -0
  133. package/test/zh/zh_hant_deadline.test.js +213 -0
  134. package/test/zh/zh_hant_time_exp.test.js +226 -0
  135. package/test/zh/zh_hant_weekday.test.js +160 -0
  136. package/webpack.config.js +39 -0
  137. package/.npmignore +0 -11
  138. package/bower.json +0 -24
  139. package/chrono.js +0 -11892
  140. package/chrono.map.json +0 -1
  141. package/chrono.min.js +0 -148
  142. package/chrono.min.json +0 -1
  143. package/karma.conf.js +0 -68
  144. package/src/parsers/EN/ENCasualTimeParser.js +0 -53
  145. package/src/parsers/EN/ENTimeAgoFormatParser.js +0 -130
  146. package/src/parsers/EN/ENTimeFromNowFormatParser.js +0 -119
  147. package/src/parsers/JP/JPStandardParser.js +0 -88
  148. package/test/test_de.js +0 -62
  149. package/test/test_de_casual.js +0 -443
  150. package/test/test_de_dash.js +0 -17
  151. package/test/test_de_deadline.js +0 -255
  152. package/test/test_de_little_endian.js +0 -470
  153. package/test/test_de_time_ago.js +0 -324
  154. package/test/test_de_time_exp.js +0 -177
  155. package/test/test_de_weekday.js +0 -246
  156. package/test/test_en.js +0 -249
  157. package/test/test_en_casual.js +0 -448
  158. package/test/test_en_dash.js +0 -42
  159. package/test/test_en_deadline.js +0 -311
  160. package/test/test_en_inter_std.js +0 -272
  161. package/test/test_en_little_endian.js +0 -529
  162. package/test/test_en_middle_endian.js +0 -563
  163. package/test/test_en_month.js +0 -124
  164. package/test/test_en_option_forward.js +0 -167
  165. package/test/test_en_relative.js +0 -206
  166. package/test/test_en_slash.js +0 -370
  167. package/test/test_en_time_ago.js +0 -385
  168. package/test/test_en_time_exp.js +0 -663
  169. package/test/test_en_time_from_now.js +0 -345
  170. package/test/test_en_weekday.js +0 -312
  171. package/test/test_es_casual.js +0 -269
  172. package/test/test_es_dash.js +0 -24
  173. package/test/test_es_deadline.js +0 -96
  174. package/test/test_es_little_endian.js +0 -361
  175. package/test/test_es_slash.js +0 -35
  176. package/test/test_es_time_ago.js +0 -148
  177. package/test/test_es_time_exp.js +0 -251
  178. package/test/test_fr_casual.js +0 -465
  179. package/test/test_fr_dash.js +0 -37
  180. package/test/test_fr_deadline.js +0 -255
  181. package/test/test_fr_little_endian.js +0 -568
  182. package/test/test_fr_relative.js +0 -209
  183. package/test/test_fr_slash.js +0 -54
  184. package/test/test_fr_time_ago.js +0 -205
  185. package/test/test_fr_time_exp.js +0 -971
  186. package/test/test_fr_weekday.js +0 -211
  187. package/test/test_jp_casual.js +0 -62
  188. package/test/test_jp_standard.js +0 -181
  189. package/test/test_system.js +0 -178
  190. package/test/test_zh_hant_casual.js +0 -329
  191. package/test/test_zh_hant_date.js +0 -129
  192. package/test/test_zh_hant_deadline.js +0 -224
  193. package/test/test_zh_hant_time_exp.js +0 -210
  194. package/test/test_zh_hant_weekday.js +0 -171
  195. 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 = moment(ref);
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.assign('year', date.year());
71
- result.start.assign('month', date.month() + 1);
72
- result.start.assign('day', date.date());
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.assign('hour', date.hour());
93
- result.start.assign('minute', date.minute());
94
- result.start.assign('second', date.second());
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
- var moment = require('moment');
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 (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||
54
- moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {
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
- '(Jan(?:uary|\\.)?|Feb(?:ruary|\\.)?|Mar(?:ch|\\.)?|Apr(?:il|\\.)?|May|Jun(?:e|\\.)?|Jul(?:y|\\.)?|Aug(?:ust|\\.)?|Sep(?:tember|\\.)?|Oct(?:ober|\\.)?|Nov(?:ember|\\.)?|Dec(?:ember|\\.)?)' +
14
+ '(' + util.MONTH_PATTERN + ')' +
22
15
  '(?:' +
23
16
  '(?:-|\/|,?\\s*)' +
24
- '([0-9]{1,4}(?![^\\s]\\d))' +
25
- '(\\s*(?:BE|AD|BC))?' +
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
- year = parseInt(year);
63
-
64
- if(match[YEAR_BE_GROUP]){
65
-
66
- if (/BE/i.test(match[YEAR_BE_GROUP])) {
67
- // Buddhist Era
68
- year = year - 543;
69
- } else if (/BC/i.test(match[YEAR_BE_GROUP])) {
70
- // Before Christ
71
- year = -year;
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', refMoment.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
- '(Jan\\.?|January|Feb\\.?|February|Mar\\.?|March|Apr\\.?|April|May\\.?|Jun\\.?|June|Jul\\.?|July|Aug\\.?|August|Sep\\.?|Sept\\.?|September|Oct\\.?|October|Nov\\.?|November|Dec\\.?|December)' +
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', refMoment.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
- '(Jan\\.?|January|Feb\\.?|February|Mar\\.?|March|Apr\\.?|April|May\\.?|Jun\\.?|June|Jul\\.?|July|Aug\\.?|August|Sep\\.?|Sept\\.?|September|Oct\\.?|October|Nov\\.?|November|Dec\\.?|December)' +
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', refMoment.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
- var date = moment(ref);
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
- var moment = require('moment');
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] || moment(ref).year() + '';
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
- result.start.assign('year', year);
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
- var moment = require('moment');
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})[\\-\\.\\/]([0-9]{1,2})[\\-\\.\\/]([0-9]{1,2})'
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(match[MONTH_NUMBER_GROUP]));
43
+ result.start.assign('month', parseInt(month));
38
44
  result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));
39
45
 
40
- if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||
41
- moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {
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 - (1 + match[ENDING_GROUP].length)).trim();
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
+ }