chrono-node 1.3.2 → 1.3.11

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