diff options
Diffstat (limited to 'bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/refiners/en/ENMergeDateRangeRefiner.js')
-rw-r--r-- | bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/refiners/en/ENMergeDateRangeRefiner.js | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/refiners/en/ENMergeDateRangeRefiner.js b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/refiners/en/ENMergeDateRangeRefiner.js new file mode 100644 index 00000000..18b24b80 --- /dev/null +++ b/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/src/refiners/en/ENMergeDateRangeRefiner.js @@ -0,0 +1,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; + } +}; + |