1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*
*/
var Refiner = require('../refiner').Refiner;
exports.Refiner = function ENMergeDateRangeRefiner() {
Refiner.call(this);
this.pattern = function () { return /^\s*(to|\-)\s*$/i };
this.refine = function(text, results, opt) {
if (results.length < 2) return results;
var mergedResult = [];
var currResult = null;
var prevResult = null;
for (var i=1; i<results.length; i++){
currResult = results[i];
prevResult = results[i-1];
if (!prevResult.end && !currResult.end
&& this.isAbleToMerge(text, prevResult, currResult)) {
prevResult = this.mergeResult(text, prevResult, currResult);
currResult = null;
i += 1;
}
mergedResult.push(prevResult);
}
if (currResult != null) {
mergedResult.push(currResult);
}
return mergedResult;
};
this.isAbleToMerge = function(text, result1, result2) {
var begin = result1.index + result1.text.length;
var end = result2.index;
var textBetween = text.substring(begin,end);
return textBetween.match(this.pattern());
};
this.isWeekdayResult = function (result) {
return result.start.isCertain('weekday') && !result.start.isCertain('day');
};
this.mergeResult = function(text, fromResult, toResult) {
if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {
var timeKeys = {'hour': true, 'minute': true, 'second': true};
for (var key in toResult.start.knownValues) {
if (!fromResult.start.isCertain(key)) {
fromResult.start.assign(key, toResult.start.get(key));
}
}
for (var key in fromResult.start.knownValues) {
if (!toResult.start.isCertain(key)) {
toResult.start.assign(key, fromResult.start.get(key));
}
}
}
if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {
var fromMoment = fromResult.start.moment();
var toMoment = toResult.start.moment();
if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) {
fromMoment = fromMoment.add(-7, 'days');
fromResult.start.imply('day', fromMoment.date());
fromResult.start.imply('month', fromMoment.month() + 1);
fromResult.start.imply('year', fromMoment.year());
} else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) {
toMoment = toMoment.add(7, 'days');
toResult.start.imply('day', toMoment.date());
toResult.start.imply('month', toMoment.month() + 1);
toResult.start.imply('year', toMoment.year());
} else {
var tmp = toResult;
toResult = fromResult;
fromResult = tmp;
}
}
fromResult.end = toResult.start;
for (var tag in toResult.tags) {
fromResult.tags[tag] = true;
}
var startIndex = Math.min(fromResult.index, toResult.index);
var endIndex = Math.max(
fromResult.index + fromResult.text.length,
toResult.index + toResult.text.length);
fromResult.index = startIndex;
fromResult.text = text.substring(startIndex, endIndex);
fromResult.tags[this.constructor.name] = true;
return fromResult;
}
};
|