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,61 @@
1
+ const dayjs = require('dayjs');
2
+ var Parser = require('../parser').Parser;
3
+ var ParsedResult = require('../../result').ParsedResult;
4
+
5
+ var PATTERN = /(\W|^)(dentro\s*de|em|em*até)\s*([0-9]+|mei[oa]|uma?)\s*(minutos?|horas?|dias?)\s*(?=(?:\W|$))/i;
6
+
7
+ exports.Parser = function PTDeadlineFormatParser(){
8
+ Parser.apply(this, arguments);
9
+
10
+ this.pattern = function() { return PATTERN; }
11
+
12
+ this.extract = function(text, ref, match, opt){
13
+
14
+ var index = match.index + match[1].length;
15
+ var text = match[0];
16
+ text = match[0].substr(match[1].length, match[0].length - match[1].length);
17
+
18
+ var result = new ParsedResult({
19
+ index: index,
20
+ text: text,
21
+ ref: ref,
22
+ });
23
+
24
+ var num = parseInt(match[3]);
25
+ if (isNaN(num)) {
26
+ if (match[3].match(/(meio|meia)/)) {
27
+ num = 0.5;
28
+ } else {
29
+ num = 1;
30
+ }
31
+ }
32
+
33
+ var date = dayjs(ref);
34
+ if (match[4].match(/dia/)) {
35
+ date = date.add(num, 'd');
36
+
37
+ result.start.assign('year', date.year());
38
+ result.start.assign('month', date.month() + 1);
39
+ result.start.assign('day', date.date());
40
+ return result;
41
+ }
42
+
43
+
44
+ if (match[4].match(/hora/)) {
45
+
46
+ date = date.add(num, 'hour');
47
+
48
+ } else if (match[4].match(/minuto/)) {
49
+
50
+ date = date.add(num, 'minute');
51
+ }
52
+
53
+ result.start.imply('year', date.year());
54
+ result.start.imply('month', date.month() + 1);
55
+ result.start.imply('day', date.date());
56
+ result.start.assign('hour', date.hour());
57
+ result.start.assign('minute', date.minute());
58
+ result.tags['PTDeadlineFormatParser'] = true;
59
+ return result;
60
+ };
61
+ }
@@ -0,0 +1,86 @@
1
+ var parser = require('../parser');
2
+ var ParsedResult = require('../../result').ParsedResult;
3
+
4
+ var util = require('../../utils/PT');
5
+
6
+ var DAYS_OFFSET = util.WEEKDAY_OFFSET;
7
+
8
+ var PATTERN = new RegExp('(\\W|^)' +
9
+ '(?:(domingo|segunda|segunda-feira|terça|terça-feira|quarta|quarta-feira|quinta|quinta-feira|sexta|sexta-feira|sábado|sabado|dom|seg|ter|qua|qui|sex|sab)\\s*,?\\s*)?' +
10
+ '([0-9]{1,2})(?:º|ª|°)?' +
11
+ '(?:\\s*(?:desde|de|\\-|\\–|ao?|\\s)\\s*([0-9]{1,2})(?:º|ª|°)?)?\\s*(?:de)?\\s*' +
12
+ '(Jan(?:eiro|\\.)?|Fev(?:ereiro|\\.)?|Mar(?:ço|\\.)?|Abr(?:il|\\.)?|Mai(?:o|\\.)?|Jun(?:ho|\\.)?|Jul(?:ho|\\.)?|Ago(?:sto|\\.)?|Set(?:embro|\\.)?|Out(?:ubro|\\.)?|Nov(?:embro|\\.)?|Dez(?:embro|\\.)?)' +
13
+ '(?:\\s*(?:de?)?(\\s*[0-9]{1,4}(?![^\\s]\\d))(\\s*[ad]\\.?\\s*c\\.?|a\\.?\\s*d\\.?)?)?' +
14
+ '(?=\\W|$)', 'i'
15
+ );
16
+
17
+ var WEEKDAY_GROUP = 2;
18
+ var DATE_GROUP = 3;
19
+ var DATE_TO_GROUP = 4;
20
+ var MONTH_NAME_GROUP = 5;
21
+ var YEAR_GROUP = 6;
22
+ var YEAR_BE_GROUP = 7;
23
+
24
+ exports.Parser = function PTMonthNameLittleEndianParser(){
25
+ parser.Parser.apply(this, arguments);
26
+
27
+ this.pattern = function() { return PATTERN; }
28
+
29
+ this.extract = function(text, ref, match, opt){
30
+
31
+ var result = new ParsedResult({
32
+ text: match[0].substr(match[1].length, match[0].length - match[1].length),
33
+ index: match.index + match[1].length,
34
+ ref: ref,
35
+ });
36
+
37
+ var month = match[MONTH_NAME_GROUP];
38
+ month = util.MONTH_OFFSET[month.toLowerCase()];
39
+
40
+ var day = match[DATE_GROUP];
41
+ day = parseInt(day);
42
+
43
+ var year = null;
44
+ if (match[YEAR_GROUP]) {
45
+ year = match[YEAR_GROUP];
46
+ year = parseInt(year);
47
+
48
+ if(match[YEAR_BE_GROUP]){
49
+ if (/a\.?\s*c\.?/i.test(match[YEAR_BE_GROUP])) {
50
+ // antes de Cristo
51
+ year = -year;
52
+ }
53
+ } else if (year < 100){
54
+
55
+ year = year + 2000;
56
+ }
57
+ }
58
+
59
+ if(year){
60
+ result.start.assign('day', day);
61
+ result.start.assign('month', month);
62
+ result.start.assign('year', year);
63
+ } else {
64
+ year = parser.findYearClosestToRef(ref, day, month);
65
+ result.start.assign('day', day);
66
+ result.start.assign('month', month);
67
+ result.start.imply('year', year);
68
+ }
69
+
70
+ // Weekday component
71
+ if (match[WEEKDAY_GROUP]) {
72
+ var weekday = match[WEEKDAY_GROUP];
73
+ weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]
74
+ result.start.assign('weekday', weekday);
75
+ }
76
+
77
+ // Text can be 'range' value. Such as '12 - 13 January 2012'
78
+ if (match[DATE_TO_GROUP]) {
79
+ result.end = result.start.clone();
80
+ result.end.assign('day', parseInt(match[DATE_TO_GROUP]));
81
+ }
82
+
83
+ result.tags['PTMonthNameLittleEndianParser'] = true;
84
+ return result;
85
+ };
86
+ }
@@ -0,0 +1,114 @@
1
+ /*
2
+ Date format with slash "/" (also "-" and ".") between numbers
3
+ - Martes 3/11/2015
4
+ - 3/11/2015
5
+ - 3/11
6
+ */
7
+ const dayjs = require('dayjs');
8
+ var Parser = require('../parser').Parser;
9
+ var ParsedResult = require('../../result').ParsedResult;
10
+
11
+ var PATTERN = new RegExp('(\\W|^)' +
12
+ '(?:' +
13
+ '((?:domingo|dom|segunda|segunda-feira|seg|terça|terça-feira|ter|quarta|quarta-feira|qua|quinta|quinta-feira|qui|sexta|sexta-feira|sex|s[áa]bado|sab))' +
14
+ '\\s*\\,?\\s*' +
15
+ ')?' +
16
+ '([0-1]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})' +
17
+ '(?:' +
18
+ '[\\/\\.\\-]' +
19
+ '([0-9]{4}\s*\,?\s*|[0-9]{2}\s*\,?\s*)' +
20
+ ')?' +
21
+ '(\\W|$)', 'i');
22
+
23
+ var DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'segunda': 1, 'segunda-feira': 1, 'seg': 1, 'terça': 2, 'terça-feira': 2, 'ter': 2, 'quarta': 3, 'quarta-feira': 3, 'qua': 3,
24
+ 'quinta': 4, 'quinta-feira': 4, 'qui': 4, 'sexta': 5, 'sexta-feira': 5, 'sex': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}
25
+
26
+
27
+ var OPENNING_GROUP = 1;
28
+ var ENDING_GROUP = 6;
29
+
30
+ // in Spanish we use day/month/year
31
+ var WEEKDAY_GROUP = 2;
32
+ var MONTH_GROUP = 4;
33
+ var DAY_GROUP = 3;
34
+ var YEAR_GROUP = 5;
35
+
36
+ exports.Parser = function PTSlashDateFormatParser(argument) {
37
+ Parser.apply(this, arguments);
38
+
39
+ this.pattern = function () { return PATTERN; };
40
+ this.extract = function(text, ref, match, opt){
41
+
42
+ if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {
43
+ // Long skip, if there is some overlapping like:
44
+ // XX[/YY/ZZ]
45
+ // [XX/YY/]ZZ
46
+ match.index += match[0].length
47
+ return;
48
+ }
49
+
50
+ var index = match.index + match[OPENNING_GROUP].length;
51
+ var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);
52
+
53
+
54
+ var result = new ParsedResult({
55
+ text: text,
56
+ index: index,
57
+ ref: ref,
58
+ });
59
+
60
+ if(text.match(/^\d\.\d$/)) return;
61
+ if(text.match(/^\d\.\d{1,2}\.\d{1,2}$/)) return;
62
+
63
+ // MM/dd -> OK
64
+ // MM.dd -> NG
65
+ if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;
66
+
67
+ var date = null;
68
+ var year = match[YEAR_GROUP] || dayjs(ref).year() + '';
69
+ var month = match[MONTH_GROUP];
70
+ var day = match[DAY_GROUP];
71
+
72
+ month = parseInt(month);
73
+ day = parseInt(day);
74
+ year = parseInt(year);
75
+
76
+ if(month < 1 || month > 12) {
77
+ if(month > 12) {
78
+ // dd/mm/yyyy date format if day looks like a month, and month
79
+ // looks like a day.
80
+ if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {
81
+ // unambiguous
82
+ var tday = month;
83
+ month = day;
84
+ day = tday;
85
+ }
86
+ else {
87
+ // both month and day are <= 12
88
+ return null;
89
+ }
90
+ }
91
+ }
92
+ if(day < 1 || day > 31) return null;
93
+
94
+ if(year < 100){
95
+ if(year > 50){
96
+ year = year + 1900;
97
+ }else{
98
+ year = year + 2000;
99
+ }
100
+ }
101
+
102
+ result.start.assign('day', day);
103
+ result.start.assign('month', month);
104
+ result.start.assign('year', year);
105
+
106
+ //Day of week
107
+ if(match[WEEKDAY_GROUP]) {
108
+ result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);
109
+ }
110
+
111
+ result.tags['PTSlashDateFormatParser'] = true;
112
+ return result;
113
+ };
114
+ };
@@ -0,0 +1,87 @@
1
+ const dayjs = require('dayjs');
2
+ var Parser = require('../parser').Parser;
3
+ var ParsedResult = require('../../result').ParsedResult;
4
+
5
+ var PATTERN = /(\W|^)há\s*([0-9]+|mei[oa]|uma?)\s*(minutos?|horas?|semanas?|dias?|mes(es)?|anos?)(?=(?:\W|$))/i;
6
+
7
+ exports.Parser = function PTTimeAgoFormatParser(){
8
+ Parser.apply(this, arguments);
9
+
10
+ this.pattern = function() {
11
+ return PATTERN;
12
+ }
13
+
14
+ this.extract = function(text, ref, match, opt){
15
+
16
+ if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
17
+
18
+ var text = match[0];
19
+ text = match[0].substr(match[1].length, match[0].length - match[1].length);
20
+ index = match.index + match[1].length;
21
+
22
+ var result = new ParsedResult({
23
+ index: index,
24
+ text: text,
25
+ ref: ref,
26
+ });
27
+
28
+ var num = parseInt(match[2]);
29
+ if (isNaN(num)) {
30
+ if (match[2].match(/mei/)) {
31
+ num = 0.5;
32
+ } else {
33
+ num = 1;
34
+ }
35
+ }
36
+
37
+ var date = dayjs(ref);
38
+
39
+ if (match[3].match(/hora/) || match[3].match(/minuto/)) {
40
+ if (match[3].match(/hora/)) {
41
+
42
+ date = date.add(-num, 'hour');
43
+
44
+ } else if (match[3].match(/minuto/)) {
45
+
46
+ date = date.add(-num, 'minute');
47
+ }
48
+
49
+ result.start.imply('day', date.date());
50
+ result.start.imply('month', date.month() + 1);
51
+ result.start.imply('year', date.year());
52
+ result.start.assign('hour', date.hour());
53
+ result.start.assign('minute', date.minute());
54
+ result.tags['PTTimeAgoFormatParser'] = true;
55
+ return result;
56
+ }
57
+
58
+ if (match[3].match(/semana/)) {
59
+ date = date.add(-num, 'week');
60
+
61
+ result.start.imply('day', date.date());
62
+ result.start.imply('month', date.month() + 1);
63
+ result.start.imply('year', date.year());
64
+ result.start.imply('weekday', date.day());
65
+ return result;
66
+ }
67
+
68
+ if (match[3].match(/dia/)) {
69
+ date = date.add(-num, 'd');
70
+ }
71
+
72
+ if (match[3].match(/mes/)) {
73
+ date = date.add(-num, 'month');
74
+ }
75
+
76
+ if (match[3].match(/ano/)) {
77
+
78
+ date = date.add(-num, 'year');
79
+ }
80
+
81
+ result.start.assign('day', date.date());
82
+ result.start.assign('month', date.month() + 1);
83
+ result.start.assign('year', date.year());
84
+ return result;
85
+
86
+ };
87
+ }
@@ -0,0 +1,234 @@
1
+ const dayjs = require('dayjs');
2
+ var Parser = require('../parser').Parser;
3
+ var ParsedResult = require('../../result').ParsedResult;
4
+ var ParsedComponents = require('../../result').ParsedComponents;
5
+
6
+ var FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" +
7
+ "(?:(?:ao?|às?|das|da|do)\\s*)?" +
8
+ "(\\d{1,4}|meio-dia|meia-noite|meio dia|meia noite)" +
9
+ "(?:" +
10
+ "(?:\\.|\\:|\\:)(\\d{1,2})" +
11
+ "(?:" +
12
+ "(?:\\:|\\:)(\\d{2})" +
13
+ ")?" +
14
+ ")?" +
15
+ "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" +
16
+ "(?=\\W|$)", 'i');
17
+
18
+
19
+ var SECOND_REG_PATTERN = new RegExp("^\\s*" +
20
+ "(\\-|\\–|\\~|\\〜|a(?:o)?|\\?)\\s*" +
21
+ "(\\d{1,4})" +
22
+ "(?:" +
23
+ "(?:\\.|\\:|\\:)(\\d{1,2})" +
24
+ "(?:" +
25
+ "(?:\\.|\\:|\\:)(\\d{1,2})" +
26
+ ")?" +
27
+ ")?" +
28
+ "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" +
29
+ "(?=\\W|$)", 'i');
30
+
31
+ var HOUR_GROUP = 2;
32
+ var MINUTE_GROUP = 3;
33
+ var SECOND_GROUP = 4;
34
+ var AM_PM_HOUR_GROUP = 5;
35
+
36
+ exports.Parser = function PTTimeExpressionParser(){
37
+ Parser.apply(this, arguments);
38
+
39
+ this.pattern = function() { return FIRST_REG_PATTERN; }
40
+
41
+ this.extract = function(text, ref, match, opt){
42
+
43
+ // This pattern can be overlaped Ex. [12] AM, 1[2] AM
44
+ if (match.index > 0 && text[match.index-1].match(/\w/)) return null;
45
+ var refMoment = dayjs(ref);
46
+ var result = new ParsedResult();
47
+ result.ref = ref;
48
+ result.index = match.index + match[1].length;
49
+ result.text = match[0].substring(match[1].length);
50
+ result.tags['PTTimeExpressionParser'] = true;
51
+
52
+ result.start.imply('day', refMoment.date());
53
+ result.start.imply('month', refMoment.month()+1);
54
+ result.start.imply('year', refMoment.year());
55
+
56
+ var hour = 0;
57
+ var minute = 0;
58
+ var meridiem = -1;
59
+
60
+ // ----- Second
61
+ if(match[SECOND_GROUP] != null){
62
+ var second = parseInt(match[SECOND_GROUP]);
63
+ if(second >= 60) return null;
64
+
65
+ result.start.assign('second', second);
66
+ }
67
+
68
+ // ----- Hours
69
+ if (match[HOUR_GROUP].toLowerCase().match(/meio\-di/)){
70
+ meridiem = 1;
71
+ hour = 12;
72
+ } else if (match[HOUR_GROUP].toLowerCase() == "meia-noite") {
73
+ meridiem = 0;
74
+ hour = 0;
75
+ } else {
76
+ hour = parseInt(match[HOUR_GROUP]);
77
+ }
78
+
79
+ // ----- Minutes
80
+ if(match[MINUTE_GROUP] != null){
81
+ minute = parseInt(match[MINUTE_GROUP]);
82
+ } else if(hour > 100) {
83
+ minute = hour%100;
84
+ hour = parseInt(hour/100);
85
+ }
86
+
87
+ if(minute >= 60) {
88
+ return null;
89
+ }
90
+
91
+ if(hour > 24) {
92
+ return null;
93
+ }
94
+ if (hour >= 12) {
95
+ meridiem = 1;
96
+ }
97
+
98
+ // ----- AM & PM
99
+ if(match[AM_PM_HOUR_GROUP] != null) {
100
+ if(hour > 12) return null;
101
+ var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
102
+ if(ampm == "a"){
103
+ meridiem = 0;
104
+ if(hour == 12) hour = 0;
105
+ }
106
+
107
+ if(ampm == "p"){
108
+ meridiem = 1;
109
+ if(hour != 12) hour += 12;
110
+ }
111
+ }
112
+ result.start.assign('hour', hour);
113
+ result.start.assign('minute', minute);
114
+ if (meridiem >= 0) {
115
+ result.start.assign('meridiem', meridiem);
116
+ }
117
+
118
+ // ==============================================================
119
+ // Extracting the 'to' chunk
120
+ // ==============================================================
121
+ match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));
122
+ if (!match) {
123
+ // Not accept number only result
124
+ if (result.text.match(/^\d+$/)) {
125
+ return null;
126
+ }
127
+ return result;
128
+ }
129
+
130
+
131
+
132
+ // Pattern "YY.YY -XXXX" is more like timezone offset
133
+ if (match[0].match(/^\s*(\+|\-)\s*\d{3,4}$/)) {
134
+ return result;
135
+ }
136
+
137
+ if(result.end == null){
138
+ result.end = new ParsedComponents(null, result.start.date());
139
+ }
140
+
141
+ var hour = 0;
142
+ var minute = 0;
143
+ var meridiem = -1;
144
+
145
+ // ----- Second
146
+ if(match[SECOND_GROUP] != null){
147
+ var second = parseInt(match[SECOND_GROUP]);
148
+ if(second >= 60) return null;
149
+
150
+ result.end.assign('second', second);
151
+ }
152
+
153
+ hour = parseInt(match[2]);
154
+
155
+ // ----- Minute
156
+ if (match[MINUTE_GROUP]!= null) {
157
+
158
+ minute = parseInt(match[MINUTE_GROUP]);
159
+ if(minute >= 60) return result;
160
+
161
+ } else if (hour > 100) {
162
+
163
+ minute = hour%100;
164
+ hour = parseInt(hour/100);
165
+ }
166
+
167
+ if(minute >= 60) {
168
+ return null;
169
+ }
170
+
171
+ if(hour > 24) {
172
+ return null;
173
+ }
174
+ if (hour >= 12) {
175
+ meridiem = 1;
176
+ }
177
+
178
+ // ----- AM & PM
179
+ if (match[AM_PM_HOUR_GROUP] != null){
180
+
181
+ if (hour > 12) return null;
182
+
183
+ if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == "a"){
184
+ meridiem = 0;
185
+ if(hour == 12) {
186
+ hour = 0;
187
+ if (!result.end.isCertain('day')) {
188
+ result.end.imply('day', result.end.get('day') + 1);
189
+ }
190
+ }
191
+ }
192
+
193
+ if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == "p"){
194
+ meridiem = 1;
195
+ if(hour != 12) hour += 12;
196
+ }
197
+
198
+ if (!result.start.isCertain('meridiem')) {
199
+ if (meridiem == 0) {
200
+
201
+ result.start.imply('meridiem', 0);
202
+
203
+ if (result.start.get('hour') == 12) {
204
+ result.start.assign('hour', 0);
205
+ }
206
+
207
+ } else {
208
+
209
+ result.start.imply('meridiem', 1);
210
+
211
+ if (result.start.get('hour') != 12) {
212
+ result.start.assign('hour', result.start.get('hour') + 12);
213
+ }
214
+ }
215
+ }
216
+
217
+ } else if(hour >= 12) {
218
+ meridiem = 1;
219
+ }
220
+
221
+ result.text = result.text + match[0];
222
+ result.end.assign('hour', hour);
223
+ result.end.assign('minute', minute);
224
+ if (meridiem >= 0) {
225
+ result.end.assign('meridiem', meridiem);
226
+ }
227
+
228
+ if (result.end.date().getTime() < result.start.date().getTime()) {
229
+ result.end.imply('day', result.end.get('day') + 1)
230
+ }
231
+
232
+ return result;
233
+ }
234
+ }
@@ -0,0 +1,60 @@
1
+ var Parser = require('../parser').Parser;
2
+ var ParsedResult = require('../../result').ParsedResult;
3
+ var updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;
4
+
5
+ var DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'segunda': 1, 'segunda-feira': 1, 'seg': 1, 'terça': 2, 'terça-feira': 2, 'ter': 2, 'quarta': 3, 'quarta-feira': 3, 'qua': 3,
6
+ 'quinta': 4, 'quinta-feira': 4, 'qui': 4, 'sexta': 5, 'sexta-feira': 5, 'sex': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}
7
+
8
+ var PATTERN = new RegExp('(\\W|^)' +
9
+ '(?:(?:\\,|\\(|\\()\\s*)?' +
10
+ '(?:(este|esta|passado|pr[oó]ximo)\\s*)?' +
11
+ '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +
12
+ '(?:\\s*(?:\\,|\\)|\\)))?' +
13
+ '(?:\\s*(este|esta|passado|pr[óo]ximo)\\s*semana)?' +
14
+ '(?=\\W|$)', 'i');
15
+
16
+ var PREFIX_GROUP = 2;
17
+ var WEEKDAY_GROUP = 3;
18
+ var POSTFIX_GROUP = 4;
19
+
20
+ exports.Parser = function PTWeekdayParser() {
21
+ Parser.apply(this, arguments);
22
+
23
+ this.pattern = function() { return PATTERN; }
24
+
25
+ this.extract = function(text, ref, match, opt){
26
+ var index = match.index + match[1].length;
27
+ var text = match[0].substr(match[1].length, match[0].length - match[1].length);
28
+ var result = new ParsedResult({
29
+ index: index,
30
+ text: text,
31
+ ref: ref
32
+ });
33
+
34
+ var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
35
+ var offset = DAYS_OFFSET[dayOfWeek];
36
+ if(offset === undefined) return null;
37
+
38
+ var modifier = null;
39
+ var prefix = match[PREFIX_GROUP];
40
+ var postfix = match[POSTFIX_GROUP];
41
+ if (prefix || postfix) {
42
+ var norm = prefix || postfix;
43
+ norm = norm.toLowerCase();
44
+
45
+ if(norm == 'passado') {
46
+ modifier = 'this';
47
+ }
48
+ else if(norm == 'próximo' || norm == 'proximo') {
49
+ modifier = 'next';
50
+ }
51
+ else if(norm== 'este') {
52
+ modifier = 'this';
53
+ }
54
+ }
55
+
56
+ updateParsedComponent(result, ref, offset, modifier);
57
+ result.tags['PTWeekdayParser'] = true;
58
+ return result;
59
+ }
60
+ }