chrono-node 1.4.3 → 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.
- package/README.md +3 -29
- package/dist/chrono.js +7865 -0
- package/dist/chrono.js.map +1 -0
- package/dist/chrono.min.js +3 -0
- package/dist/chrono.min.js.LICENSE.txt +19 -0
- package/dist/chrono.min.js.map +1 -0
- package/package.json +9 -7
- package/src/parsers/en/ENSlashMonthFormatParser.js +2 -3
- package/test/en/en_month.test.js +43 -0
- package/webpack.config.js +39 -0
- package/bower.json +0 -24
- package/chrono.js +0 -8101
- package/chrono.map.json +0 -1
- package/chrono.min.js +0 -163
- package/chrono.min.json +0 -1
- package/karma.conf.js +0 -68
- package/timezone.js +0 -9
package/chrono.map.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/dayjs/dayjs.min.js","node_modules/dayjs/plugin/quarterOfYear.js","src/chrono.js","src/options.js","src/parsers/de/DECasualDateParser.js","src/parsers/de/DEDeadlineFormatParser.js","src/parsers/de/DEMonthNameLittleEndianParser.js","src/parsers/de/DEMonthNameParser.js","src/parsers/de/DESlashDateFormatParser.js","src/parsers/de/DETimeAgoFormatParser.js","src/parsers/de/DETimeExpressionParser.js","src/parsers/de/DEWeekdayParser.js","src/parsers/en/ENCasualDateParser.js","src/parsers/en/ENCasualTimeParser.js","src/parsers/en/ENDeadlineFormatParser.js","src/parsers/en/ENISOFormatParser.js","src/parsers/en/ENMonthNameLittleEndianParser.js","src/parsers/en/ENMonthNameMiddleEndianParser.js","src/parsers/en/ENMonthNameParser.js","src/parsers/en/ENRelativeDateFormatParser.js","src/parsers/en/ENSlashDateFormatParser.js","src/parsers/en/ENSlashDateFormatStartWithYearParser.js","src/parsers/en/ENSlashMonthFormatParser.js","src/parsers/en/ENTimeAgoFormatParser.js","src/parsers/en/ENTimeExpressionParser.js","src/parsers/en/ENTimeLaterFormatParser.js","src/parsers/en/ENWeekdayParser.js","src/parsers/es/ESCasualDateParser.js","src/parsers/es/ESDeadlineFormatParser.js","src/parsers/es/ESMonthNameLittleEndianParser.js","src/parsers/es/ESSlashDateFormatParser.js","src/parsers/es/ESTimeAgoFormatParser.js","src/parsers/es/ESTimeExpressionParser.js","src/parsers/es/ESWeekdayParser.js","src/parsers/fr/FRCasualDateParser.js","src/parsers/fr/FRDeadlineFormatParser.js","src/parsers/fr/FRMonthNameLittleEndianParser.js","src/parsers/fr/FRRelativeDateFormatParser.js","src/parsers/fr/FRSlashDateFormatParser.js","src/parsers/fr/FRTimeAgoFormatParser.js","src/parsers/fr/FRTimeExpressionParser.js","src/parsers/fr/FRWeekdayParser.js","src/parsers/ja/JPCasualDateParser.js","src/parsers/ja/JPStandardParser.js","src/parsers/parser.js","src/parsers/pt/PTCasualDateParser.js","src/parsers/pt/PTDeadlineFormatParser.js","src/parsers/pt/PTMonthNameLittleEndianParser.js","src/parsers/pt/PTSlashDateFormatParser.js","src/parsers/pt/PTTimeAgoFormatParser.js","src/parsers/pt/PTTimeExpressionParser.js","src/parsers/pt/PTWeekdayParser.js","src/parsers/zh-Hant/ZHHantCasualDateParser.js","src/parsers/zh-Hant/ZHHantDateParser.js","src/parsers/zh-Hant/ZHHantDeadlineFormatParser.js","src/parsers/zh-Hant/ZHHantTimeExpressionParser.js","src/parsers/zh-Hant/ZHHantWeekdayParser.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/de/DEMergeDateRangeRefiner.js","src/refiners/de/DEMergeDateTimeRefiner.js","src/refiners/en/ENMergeDateRangeRefiner.js","src/refiners/en/ENMergeDateTimeRefiner.js","src/refiners/en/ENPrioritizeSpecificDateRefiner.js","src/refiners/fr/FRMergeDateRangeRefiner.js","src/refiners/fr/FRMergeDateTimeRefiner.js","src/refiners/ja/JPMergeDateRangeRefiner.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/PT.js","src/utils/ZH-Hant.js"],"names":["t","n","exports","module","define","amd","dayjs","this","e","r","i","s","u","o","a","h","f","c","String","length","Array","join","d","z","utcOffset","Math","abs","floor","m","year","month","clone","add","Number","ceil","p","M","y","w","ms","Q","toLowerCase","replace","$","name","weekdays","split","months","l","v","g","format","pl","date","D","locale","$L","utc","$u","$offset","parse","prototype","$d","Date","NaN","test","match","UTC","init","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","set","day","hour","minute","second","millisecond","unix","valueOf","getTime","toDate","apply","slice","$locale","weekStart","$set","min","daysInMonth","get","round","subtract","substr","meridiem","YY","YYYY","MM","MMM","monthsShort","MMMM","DD","dd","weekdaysMin","ddd","weekdaysShort","dddd","H","HH","hh","A","mm","ss","SSS","Z","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","extend","isDayjs","en","Ls","dayjs_plugin_quarterOfYear","quarter","bind","options","require","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","Object","refiners","text","refDate","opt","forwardDate","allResults","forEach","results","execute","concat","sort","b","index","refine","parseDate","start","strict","strictOption","casual","mergeOptions","commonPostProcessing","en_GB","de","pt","es","fr","ja","arguments","addedTypes","mergedOption","call","constructor","push","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","config","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeLaterFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","PTTimeAgoFormatParser","PTDeadlineFormatParser","PTTimeExpressionParser","PTMonthNameLittleEndianParser","PTSlashDateFormatParser","PTCasualDateParser","PTWeekdayParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","RegExp","pattern","extract","ref","result","refMoment","lowerText","startMoment","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","undefined","INTEGER_WORDS","parseInt","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","findYearClosestToRef","weekday","WEEKDAY_OFFSET","end","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","indexOf","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","exec","isCertain","keys","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","offset","prefix","postfix","refOffset","norm","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","MONTH_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","trim","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","TIME_UNIT_PATTERN","TIME_UNIT_STRICT_PATTERN","fragments","extractDateTimeUnitFragments","key","MILLI_SECOND_GROUP","suffix","preamble","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","isNaN","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","quarterOfYear","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","total","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","SPECIAL_YEAR_GROUP","TYPICAL_YEAR_GROUP","ERA_GROUP","toHankaku","moment","strictMode","regex","remainingText","hasPossibleDates","dateMoment","nextYear","lastYear","segunda","segunda-feira","seg","terça","terça-feira","ter","quarta","quarta-feira","qua","quinta","quinta-feira","qui","sexta","sexta-feira","sex","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","number","string","unit","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","TIMEZONE_NAME_PATTERN","DEFAULT_TIMEZONE_ABBR_MAP","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CDT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CST","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EDT","EEST","EET","EGST","EGT","EST","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GMT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MDT","MESZ","MEZ","MHT","MMT","MSD","MSK","MST","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PDT","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PST","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","timezones","timezoneAbbr","toUpperCase","timezoneOffset","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","isOnlyDayMonthComponent","isOnlyWeekdayComponent","filteredResults","prevResult","isAbleToMerge","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","max","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","fromResult","toResult","isOnlyWeekday","knownValues","fromMoment","toMoment","tmp","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","isWeekdayResult","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","isOnlyDayMonth","component","value","adjustTimezoneOffset","currentTimezoneOffset","targetTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","collectDateTimeFragment","parseFloat","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","timeunitText","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","fromCharCode","alphaNum","token","charCodeAt","toZenkaku","terca","terca-feira","janeiro","fevereiro","março","maio","mai.","junho","julho","setembro","set.","outubro","out","out.","novembro","dezembro","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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O,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,GAAGC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,OAAS,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,EAAEC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,EAAEC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,GAAGC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,GAAGC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,IAAM,IAAIC,KAAO,GAAGC,IAAM,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,KAAO,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,IAAM,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM,IAAIC,MAAQ,IAAIC,MAAQ,IAAIC,KAAO,IAAIC,KAAO,IAAIC,IAAM,IAAIC,IAAM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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):t.dayjs=n()}(this,function(){\"use strict\";var t=\"millisecond\",n=\"second\",e=\"minute\",r=\"hour\",i=\"day\",s=\"week\",u=\"month\",o=\"quarter\",a=\"year\",h=/^(\\d{4})-?(\\d{1,2})-?(\\d{0,2})[^0-9]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?.?(\\d{1,3})?$/,f=/\\[([^\\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,n,e){var r=String(t);return!r||r.length>=n?t:\"\"+Array(n+1-r.length).join(e)+t},d={s:c,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),r=Math.floor(e/60),i=e%60;return(n<=0?\"+\":\"-\")+c(r,2,\"0\")+\":\"+c(i,2,\"0\")},m:function(t,n){var e=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(e,u),i=n-r<0,s=t.clone().add(e+(i?-1:1),u);return Number(-(e+(n-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,h:r,m:e,s:n,ms:t,Q:o}[h]||String(h||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},$={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")},l=\"en\",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,n,e){var r;if(!t)return l;if(\"string\"==typeof t)m[t]&&(r=t),n&&(m[t]=n,r=t);else{var i=t.name;m[i]=t,r=i}return e||(l=r),r},g=function(t,n,e){if(y(t))return t.clone();var r=n?\"string\"==typeof n?{format:n,pl:e}:n:{};return r.date=t,new v(r)},D=d;D.l=M,D.i=y,D.w=function(t,n){return g(t,{locale:n.$L,utc:n.$u,$offset:n.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(D.u(n))return new Date;if(n instanceof Date)return new Date(n);if(\"string\"==typeof n&&!/Z$/i.test(n)){var r=n.match(h);if(r)return e?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(n)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!(\"Invalid Date\"===this.$d.toString())},d.isSame=function(t,n){var e=g(t);return this.startOf(n)<=e&&e<=this.endOf(n)},d.isAfter=function(t,n){return g(t)<this.startOf(n)},d.isBefore=function(t,n){return this.endOf(n)<g(t)},d.$g=function(t,n,e){return D.u(t)?this[n]:this.set(e,t)},d.year=function(t){return this.$g(t,\"$y\",a)},d.month=function(t){return this.$g(t,\"$M\",u)},d.day=function(t){return this.$g(t,\"$W\",i)},d.date=function(t){return this.$g(t,\"$D\",\"date\")},d.hour=function(t){return this.$g(t,\"$H\",r)},d.minute=function(t){return this.$g(t,\"$m\",e)},d.second=function(t){return this.$g(t,\"$s\",n)},d.millisecond=function(n){return this.$g(n,\"$ms\",t)},d.unix=function(){return Math.floor(this.valueOf()/1e3)},d.valueOf=function(){return this.$d.getTime()},d.startOf=function(t,o){var h=this,f=!!D.u(o)||o,c=D.p(t),d=function(t,n){var e=D.w(h.$u?Date.UTC(h.$y,n,t):new Date(h.$y,n,t),h);return f?e:e.endOf(i)},$=function(t,n){return D.w(h.toDate()[t].apply(h.toDate(),(f?[0,0,0,0]:[23,59,59,999]).slice(n)),h)},l=this.$W,m=this.$M,y=this.$D,M=\"set\"+(this.$u?\"UTC\":\"\");switch(c){case a:return f?d(1,0):d(31,11);case u:return f?d(1,m):d(0,m+1);case s:var g=this.$locale().weekStart||0,v=(l<g?l+7:l)-g;return d(f?y-v:y+(6-v),m);case i:case\"date\":return $(M+\"Hours\",0);case r:return $(M+\"Minutes\",1);case e:return $(M+\"Seconds\",2);case n:return $(M+\"Milliseconds\",3);default:return this.clone()}},d.endOf=function(t){return this.startOf(t,!1)},d.$set=function(s,o){var h,f=D.p(s),c=\"set\"+(this.$u?\"UTC\":\"\"),d=(h={},h[i]=c+\"Date\",h.date=c+\"Date\",h[u]=c+\"Month\",h[a]=c+\"FullYear\",h[r]=c+\"Hours\",h[e]=c+\"Minutes\",h[n]=c+\"Seconds\",h[t]=c+\"Milliseconds\",h)[f],$=f===i?this.$D+(o-this.$W):o;if(f===u||f===a){var l=this.clone().set(\"date\",1);l.$d[d]($),l.init(),this.$d=l.set(\"date\",Math.min(this.$D,l.daysInMonth())).toDate()}else d&&this.$d[d]($);return this.init(),this},d.set=function(t,n){return this.clone().$set(t,n)},d.get=function(t){return this[D.p(t)]()},d.add=function(t,o){var h,f=this;t=Number(t);var c=D.p(o),d=function(n){var e=g(f);return D.w(e.date(e.date()+Math.round(n*t)),f)};if(c===u)return this.set(u,this.$M+t);if(c===a)return this.set(a,this.$y+t);if(c===i)return d(1);if(c===s)return d(7);var $=(h={},h[e]=6e4,h[r]=36e5,h[n]=1e3,h)[c]||1,l=this.$d.getTime()+t*$;return D.w(l,this)},d.subtract=function(t,n){return this.add(-1*t,n)},d.format=function(t){var n=this;if(!this.isValid())return\"Invalid Date\";var e=t||\"YYYY-MM-DDTHH:mm:ssZ\",r=D.z(this),i=this.$locale(),s=this.$H,u=this.$m,o=this.$M,a=i.weekdays,h=i.months,c=function(t,r,i,s){return t&&(t[r]||t(n,e))||i[r].substr(0,s)},d=function(t){return D.s(s%12||12,t,\"0\")},$=i.meridiem||function(t,n,e){var r=t<12?\"AM\":\"PM\";return e?r.toLowerCase():r},l={YY:String(this.$y).slice(-2),YYYY:this.$y,M:o+1,MM:D.s(o+1,2,\"0\"),MMM:c(i.monthsShort,o,h,3),MMMM:h[o]||h(this,e),D:this.$D,DD:D.s(this.$D,2,\"0\"),d:String(this.$W),dd:c(i.weekdaysMin,this.$W,a,2),ddd:c(i.weekdaysShort,this.$W,a,3),dddd:a[this.$W],H:String(s),HH:D.s(s,2,\"0\"),h:d(1),hh:d(2),a:$(s,u,!0),A:$(s,u,!1),m:String(u),mm:D.s(u,2,\"0\"),s:String(this.$s),ss:D.s(this.$s,2,\"0\"),SSS:D.s(this.$ms,3,\"0\"),Z:r};return e.replace(f,function(t,n){return n||l[t]||r.replace(\":\",\"\")})},d.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},d.diff=function(t,h,f){var c,d=D.p(h),$=g(t),l=6e4*($.utcOffset()-this.utcOffset()),m=this-$,y=D.m(this,$);return y=(c={},c[a]=y/12,c[u]=y,c[o]=y/3,c[s]=(m-l)/6048e5,c[i]=(m-l)/864e5,c[r]=m/36e5,c[e]=m/6e4,c[n]=m/1e3,c)[d]||m,f?y:D.a(y)},d.daysInMonth=function(){return this.endOf(u).$D},d.$locale=function(){return m[this.$L]},d.locale=function(t,n){if(!t)return this.$L;var e=this.clone(),r=M(t,n,!0);return r&&(e.$L=r),e},d.clone=function(){return D.w(this.$d,this)},d.toDate=function(){return new Date(this.valueOf())},d.toJSON=function(){return this.isValid()?this.toISOString():null},d.toISOString=function(){return this.$d.toISOString()},d.toString=function(){return this.$d.toUTCString()},c}();return g.prototype=v.prototype,g.extend=function(t,n){return t(n,v,g),g},g.locale=M,g.isDayjs=y,g.unix=function(t){return g(1e3*t)},g.en=m[l],g.Ls=m,g});\n","!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):t.dayjs_plugin_quarterOfYear=n()}(this,function(){\"use strict\";var t=\"month\",n=\"quarter\";return function(r,i){var e=i.prototype;e.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var u=e.add;e.add=function(r,i){return r=Number(r),this.$utils().p(i)===n?this.add(3*r,t):u.bind(this)(r,i)};var s=e.startOf;e.startOf=function(r,i){var e=this.$utils(),u=!!e.u(i)||i;if(e.p(r)===n){var a=this.quarter()-1;return u?this.month(3*a).startOf(t).startOf(\"day\"):this.month(3*a+2).endOf(t).endOf(\"day\")}return s.bind(this)(r,i)}}});\n","\nvar options = exports.options = require('./options');\n\nexports.parser = require('./parsers/parser');\nexports.refiner = require('./refiners/refiner');\n\nexports.Parser = exports.parser.Parser;\nexports.Refiner = exports.refiner.Refiner;\nexports.Filter = exports.refiner.Filter;\n\nexports.ParsedResult = require('./result').ParsedResult;\nexports.ParsedComponents = require('./result').ParsedComponents;\n\nvar Chrono = function(option) {\n\n option = option || exports.options.casualOption();\n this.parsers = new Object(option.parsers);\n this.refiners = new Object(option.refiners);\n};\n\n\nChrono.prototype.parse = function(text, refDate, opt) {\n\n refDate = refDate || new Date();\n opt = opt || {};\n opt.forwardDate = opt.forwardDate || opt.forwardDate;\n \n var allResults = [];\n\n this.parsers.forEach(function (parser) {\n var results = parser.execute(text, refDate, opt);\n allResults = allResults.concat(results);\n });\n\n allResults.sort(function(a, b) {\n return a.index - b.index;\n });\n\n this.refiners.forEach(function (refiner) {\n allResults = refiner.refine(text, allResults, opt);\n });\n \n return allResults;\n};\n\n\nChrono.prototype.parseDate = function(text, refDate, opt) {\n var results = this.parse(text, refDate, opt);\n if (results.length > 0) {\n return results[0].start.date();\n }\n return null;\n};\n\nexports.Chrono = Chrono;\nexports.strict = new Chrono( options.strictOption() );\nexports.casual = new Chrono( options.casualOption() );\n\nexports.en = new Chrono( options.mergeOptions([\n options.en.casual, options.commonPostProcessing]));\n\nexports.en_GB = new Chrono( options.mergeOptions([\n options.en_GB.casual, options.commonPostProcessing]));\n\nexports.de = new Chrono( options.mergeOptions([\n options.de.casual, options.en, options.commonPostProcessing]));\n\nexports.pt = new Chrono( options.mergeOptions([\n options.pt.casual, options.en, options.commonPostProcessing]));\n\nexports.es = new Chrono( options.mergeOptions([\n options.es.casual, options.en, options.commonPostProcessing]));\n\nexports.fr = new Chrono( options.mergeOptions([\n options.fr.casual, options.en, options.commonPostProcessing]));\n\nexports.ja = new Chrono( options.mergeOptions([ \n options.ja.casual, options.en, options.commonPostProcessing]));\n\n\nexports.parse = function () {\n return exports.casual.parse.apply(exports.casual, arguments);\n};\n\nexports.parseDate = function () {\n return exports.casual.parseDate.apply(exports.casual, arguments);\n};\n\n\n\n\n","var parser = require('./parsers/parser');\nvar refiner = require('./refiners/refiner');\n\n\nexports.mergeOptions = function(options) {\n\n var addedTypes = {};\n var mergedOption = {\n parsers: [],\n refiners: []\n };\n\n options.forEach(function (option) {\n\n if (option.call) {\n option = option.call();\n }\n\n if (option.parsers) {\n option.parsers.forEach(function (p) {\n if (!addedTypes[p.constructor]) {\n mergedOption.parsers.push(p);\n addedTypes[p.constructor] = true;\n }\n });\n }\n\n if (option.refiners) {\n option.refiners.forEach(function (r) {\n if (!addedTypes[r.constructor]) {\n mergedOption.refiners.push(r);\n addedTypes[r.constructor] = true;\n }\n });\n }\n });\n\n return mergedOption;\n};\n\n\nexports.commonPostProcessing = function() {\n return {\n refiners: [\n // These should be after all other refiners\n new refiner.ExtractTimezoneOffsetRefiner(),\n new refiner.ExtractTimezoneAbbrRefiner(),\n new refiner.UnlikelyFormatFilter()\n ]\n }\n};\n\n\n// -------------------------------------------------------------\n\nexports.strictOption = function () {\n var strictConfig = {\n strict: true\n };\n\n return exports.mergeOptions([\n exports.en(strictConfig),\n exports.de(strictConfig),\n exports.pt(strictConfig),\n exports.es(strictConfig),\n exports.fr(strictConfig),\n exports.ja(strictConfig),\n exports.zh,\n exports.commonPostProcessing\n ]);\n};\n\nexports.casualOption = function () {\n return exports.mergeOptions([\n exports.en.casual,\n // Some German abbriviate overlap with common English\n exports.de({ strict: true }), \n exports.pt.casual,\n exports.es.casual,\n exports.fr.casual,\n exports.ja.casual,\n exports.zh,\n exports.commonPostProcessing\n ]);\n};\n\n// -------------------------------------------------------------\n\nexports.de = function(config) {\n return {\n parsers: [\n new parser.DEDeadlineFormatParser(config),\n new parser.DEMonthNameLittleEndianParser(config),\n new parser.DEMonthNameParser(config),\n new parser.DESlashDateFormatParser(config),\n new parser.DETimeAgoFormatParser(config),\n new parser.DETimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.DEMergeDateTimeRefiner(),\n new refiner.DEMergeDateRangeRefiner()\n ]\n }\n};\n\nexports.de.casual = function() {\n var option = exports.de({\n strict: false\n });\n option.parsers.unshift(new parser.DECasualDateParser());\n option.parsers.unshift(new parser.DEWeekdayParser());\n return option;\n};\n\n\n\n// -------------------------------------------------------------\n\n\nexports.en = function(config) {\n return {\n parsers: [\n new parser.ENISOFormatParser(config),\n new parser.ENDeadlineFormatParser(config),\n new parser.ENMonthNameLittleEndianParser(config),\n new parser.ENMonthNameMiddleEndianParser(config),\n new parser.ENMonthNameParser(config),\n new parser.ENSlashDateFormatParser(config),\n new parser.ENSlashDateFormatStartWithYearParser(config),\n new parser.ENSlashMonthFormatParser(config),\n new parser.ENTimeAgoFormatParser(config),\n new parser.ENTimeLaterFormatParser(config),\n new parser.ENTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n\n // English\n new refiner.ENMergeDateTimeRefiner(),\n new refiner.ENMergeDateRangeRefiner(),\n new refiner.ENPrioritizeSpecificDateRefiner()\n ]\n }\n};\n\nexports.en.casual = function(config) {\n config = config || {};\n config.strict = false;\n var option = exports.en(config);\n\n // en\n option.parsers.unshift(new parser.ENCasualDateParser());\n option.parsers.unshift(new parser.ENCasualTimeParser());\n option.parsers.unshift(new parser.ENWeekdayParser());\n option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n return option;\n};\n\n\nexports.en_GB = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n config = config || {};\n config.littleEndian = true;\n return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n return {\n parsers: [\n new parser.JPStandardParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.JPMergeDateRangeRefiner()\n ]\n }\n};\n\nexports.ja.casual = function() {\n var option = exports.ja();\n option.parsers.unshift(new parser.JPCasualDateParser());\n return option;\n};\n\n// -------------------------------------------------------------\n\n\nexports.pt = function(config) {\n return {\n parsers: [\n new parser.PTTimeAgoFormatParser(config),\n new parser.PTDeadlineFormatParser(config),\n new parser.PTTimeExpressionParser(config),\n new parser.PTMonthNameLittleEndianParser(config),\n new parser.PTSlashDateFormatParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};\n\nexports.pt.casual = function() {\n var option = exports.pt({ \n strict: false \n });\n\n option.parsers.unshift(new parser.PTCasualDateParser());\n option.parsers.unshift(new parser.PTWeekdayParser());\n return option;\n};\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n return {\n parsers: [\n new parser.ESTimeAgoFormatParser(config),\n new parser.ESDeadlineFormatParser(config),\n new parser.ESTimeExpressionParser(config),\n new parser.ESMonthNameLittleEndianParser(config),\n new parser.ESSlashDateFormatParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};\n\nexports.es.casual = function() {\n var option = exports.es({ \n strict: false \n });\n\n option.parsers.unshift(new parser.ESCasualDateParser());\n option.parsers.unshift(new parser.ESWeekdayParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n return {\n parsers: [\n new parser.FRDeadlineFormatParser(config),\n new parser.FRMonthNameLittleEndianParser(config),\n new parser.FRSlashDateFormatParser(config),\n new parser.FRTimeAgoFormatParser(config),\n new parser.FRTimeExpressionParser(config)\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner(),\n new refiner.FRMergeDateRangeRefiner(),\n new refiner.FRMergeDateTimeRefiner()\n ]\n }\n};\n\nexports.fr.casual = function() {\n var option = exports.fr({\n strict: false\n });\n\n option.parsers.unshift(new parser.FRCasualDateParser());\n option.parsers.unshift(new parser.FRWeekdayParser());\n option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n return {\n parsers: [\n new parser.ZHHantDateParser(),\n new parser.ZHHantWeekdayParser(),\n new parser.ZHHantTimeExpressionParser(),\n new parser.ZHHantCasualDateParser(),\n new parser.ZHHantDeadlineFormatParser()\n ],\n refiners: [\n new refiner.OverlapRemovalRefiner(),\n new refiner.ForwardDateRefiner()\n ]\n }\n};","var dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n '(\\\\W|^)(' +\n 'jetzt|' +\n '(?:heute|diesen)\\\\s*(morgen|vormittag|mittag|nachmittag|abend)|' +\n '(?:heute|diese)\\\\s*nacht|' +\n 'heute|' +\n '(?:(?:ü|ue)ber)?morgen(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n '(?:vor)?gestern(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n 'letzte\\\\s*nacht' +\n ')(?=\\\\W|$)', 'i');\n\nexports.Parser = function DECasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt) {\n text = match[0].substr(match[1].length);\n \n const index = match.index + match[1].length;\n const result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n const refMoment = dayjs(ref);\n const lowerText = text.toLowerCase();\n\n var startMoment = refMoment;\n\n if (/(?:heute|diese)\\s*nacht/.test(lowerText)) {\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (/^(?:ü|ue)bermorgen/.test(lowerText)) {\n startMoment = startMoment.add(refMoment.hour() > 1 ? 2 : 1, 'day');\n } else if (/^morgen/.test(lowerText)) {\n // Check not \"Tomorrow\" on late night\n if (refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n } else if (/^gestern/.test(lowerText)) {\n startMoment = startMoment.add(-1, 'day');\n } else if (/^vorgestern/.test(lowerText)) {\n startMoment = startMoment.add(-2, 'day');\n } else if (/letzte\\s*nacht/.test(lowerText)) {\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment = startMoment.add(-1, 'day');\n }\n } else if (lowerText === 'jetzt') {\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n }\n\n var secondMatch = match[3] || match[4] || match[5];\n if (secondMatch) {\n switch (secondMatch.toLowerCase()) {\n case 'morgen':\n result.start.imply('hour', 6);\n break;\n case 'vormittag':\n result.start.imply('hour', 9);\n break;\n case 'mittag':\n result.start.imply('hour', 12);\n break;\n case 'nachmittag':\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n break;\n case 'abend':\n result.start.imply('hour', 18);\n result.start.imply('meridiem', 1);\n break;\n case 'nacht':\n result.start.imply('hour', 0);\n break;\n }\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['DECasualDateParser'] = true;\n return result;\n }\n}\n","/*\n\n\n*/\n\nvar dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(in|nach)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n '(sekunden?|min(?:ute)?n?|stunden?|tag(?:en)?|wochen?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n '(in|nach)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|eine(?:r|m)?)\\\\s*' +\n '(sekunden?|minuten?|stunden?|tag(?:en)?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function DEDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'einer' || num === 'einem') {\n num = 1;\n } else if (num === 'einigen') {\n num = 3;\n } else if (/halben/.test(num)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = dayjs(ref);\n if (/tag|woche|monat|jahr/i.test(match[4])) {\n\n if (/tag/i.test(match[4])) {\n date = date.add(num, 'd');\n } else if (/woche/i.test(match[4])) {\n date = date.add(num * 7, 'd');\n } else if (/monat/i.test(match[4])) {\n date = date.add(num, 'month');\n } else if (/jahr/i.test(match[4])) {\n date = date.add(num, 'year');\n }\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n if (/stunde/i.test(match[4])) {\n\n date = date.add(num, 'hour');\n\n } else if (/min/i.test(match[4])) {\n\n date = date.add(num, 'minute');\n\n } else if (/sekunde/i.test(match[4])) {\n\n date = date.add(num, 'second');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['DEDeadlineFormatParser'] = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nconst parser = require('../parser');\nconst ParsedResult = require('../../result').ParsedResult;\nconst util = require('../../utils/DE');\n\nconst PATTERN = new RegExp('(\\\\W|^)' +\n '(?:am\\\\s*?)?' +\n '(?:(Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|So|Mo|Di|Mi|Do|Fr|Sa)\\\\s*,?\\\\s*)?' +\n '(?:den\\\\s*)?' +\n '([0-9]{1,2})\\\\.' +\n '(?:\\\\s*(?:bis(?:\\\\s*(?:am|zum))?|\\\\-|\\\\–|\\\\s)\\\\s*([0-9]{1,2})\\\\.)?\\\\s*' +\n '(Jan(?:uar|\\\\.)?|Feb(?:ruar|\\\\.)?|Mär(?:z|\\\\.)?|Maerz|Mrz\\\\.?|Apr(?:il|\\\\.)?|Mai|Jun(?:i|\\\\.)?|Jul(?:i|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:t|t\\\\.|tember|\\\\.)?|Okt(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dez(?:ember|\\\\.)?)' +\n '(?:' +\n ',?\\\\s*([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n '(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?' +\n ')?' +\n '(?=\\\\W|$)', 'i'\n );\n\nconst WEEKDAY_GROUP = 2;\nconst DATE_GROUP = 3;\nconst DATE_TO_GROUP = 4;\nconst MONTH_NAME_GROUP = 5;\nconst YEAR_GROUP = 6;\nconst YEAR_BE_GROUP = 7;\n\nexports.Parser = function DEMonthNameLittleEndianParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n const result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_GROUP];\n day = parseInt(day);\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (/v/i.test(match[YEAR_BE_GROUP])) {\n // v.Chr.\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month);\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n result.end = result.start.clone();\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n }\n\n result.tags['DEMonthNameLittleEndianParser'] = true;\n return result;\n };\n}\n","/*\n \n The parser for parsing month name and year.\n \n EX. \n - Januar\n - Januar 2012\n*/\n\nconst parser = require('../parser');\nconst ParsedResult = require('../../result').ParsedResult;\nconst util = require('../../utils/DE');\n\nconst PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n '(Jan\\\\.?|Januar|Feb\\\\.?|Februar|Mär\\\\.?|M(?:ä|ae)rz|Mrz\\\\.?|Apr\\\\.?|April|Mai\\\\.?|Jun\\\\.?|Juni|Jul\\\\.?|Juli|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Okt\\\\.?|Oktober|Nov\\\\.?|November|Dez\\\\.?|Dezember)' + \n '\\\\s*' +\n '(?:' +\n ',?\\\\s*(?:([0-9]{4})(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?|([0-9]{1,4})\\\\s*([vn]\\\\.?\\\\s*C(?:hr)?\\\\.?))' +\n ')?' +\n '(?=[^\\\\s\\\\w]|$)', 'i');\n\nconst MONTH_NAME_GROUP = 2;\nconst YEAR_GROUP = 3;\nconst YEAR_BE_GROUP = 4;\nconst YEAR_GROUP2 = 5;\nconst YEAR_BE_GROUP2 = 6;\n\nexports.Parser = function ENMonthNameParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n \n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = 1;\n\n var year = null;\n if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n year = parseInt(year);\n\n if (match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2]) {\n if (/v/i.test(match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2])) {\n // v.Chr.\n year = -year;\n }\n\n } else if (year < 100){ \n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n \n year = parser.findYearClosestToRef(ref, day, month);\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n result.tags['DEMonthNameParser'] = true;\n return result;\n }\n}\n\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Tuesday 11/3/2015\n - 11/3/2015\n - 11/3\n*/\nvar dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:am\\\\s*?)?' +\n '((?:sonntag|so|montag|mo|dienstag|di|mittwoch|mi|donnerstag|do|freitag|fr|samstag|sa))' +\n '\\\\s*\\\\,?\\\\s*' +\n '(?:den\\\\s*)?' +\n ')?' +\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = {\n 'sonntag': 0, 'so': 0,\n 'montag': 1, 'mo': 1,\n 'dienstag': 2, 'di': 2,\n 'mittwoch': 3, 'mi': 3,\n 'donnerstag': 4, 'do': 4,\n 'freitag': 5, 'fr': 5,\n 'samstag': 6, 'sa': 6\n};\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\nvar DAY_GROUP = 3;\nvar MONTH_GROUP = 4;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function DESlashDateFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var year = match[YEAR_GROUP] || dayjs(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if (month < 1 || month > 12) return null;\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if (year > 50) {\n year = year + 1900;\n } else {\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['DESlashDateFormatParser'] = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/DE');\n\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)vor\\\\s*' +\n '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n '(sekunden?|min(?:ute)?n?|stunden?|wochen?|tag(?:en)?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n '(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)vor\\\\s*' +\n '([0-9]+|eine(?:r|m))\\\\s*' +\n '(sekunden?|minuten?|stunden?|tag(?:en)?)' +\n '(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function DETimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[2].toLowerCase() ;\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'einer' || num === 'einem') {\n num = 1;\n } else if (num === 'einigen') {\n num = 3;\n } else if (/halben/.test(num)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = dayjs(ref);\n\n if (/stunde|min|sekunde/i.test(match[3])) {\n if (/stunde/i.test(match[3])) {\n\n date = date.add(-num, 'hour');\n\n } else if (/min/i.test(match[3])) {\n\n date = date.add(-num, 'minute');\n\n } else if (/sekunde/i.test(match[3])) {\n\n date = date.add(-num, 'second');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['DETimeAgoFormatParser'] = true;\n return result;\n }\n\n if (/woche/i.test(match[3])) {\n date = date.add(-num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (/tag/i.test(match[3])) {\n date = date.add(-num, 'd');\n }\n\n if (/monat/i.test(match[3])) {\n date = date.add(-num, 'month');\n }\n\n if (/jahr/i.test(match[3])) {\n\n date = date.add(-num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","/*\n\n\n*/\n\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:um|von)\\\\s*)?\" + \n \"(\\\\d{1,4}|mittags?|mitternachts?)\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\:|\\\\:)(\\\\d{2})\" + \n \")?\" + \n \")?\" +\n \"(?:\\\\s*uhr)?\" +\n \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n \"(\\\\-|\\\\–|\\\\~|\\\\〜|bis|\\\\?)\\\\s*\" + \n \"(\\\\d{1,4})\" +\n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function DETimeExpressionParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = dayjs(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['DETimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n \n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n \n // ----- Hours\n if (/mittags?/i.test(match[HOUR_GROUP])) {\n meridiem = 1; \n hour = 12;\n } else if (/mitternachts?/i.test(match[HOUR_GROUP])) {\n meridiem = 0; \n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n \n // ----- Minutes\n if(match[MINUTE_GROUP] != null){ \n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) { \n minute = hour%100;\n hour = parseInt(hour/100);\n } \n \n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n\n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm === 'morgens' || ampm === 'vormittags') {\n meridiem = 0; \n if(hour == 12) hour = 0;\n } else {\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n } \n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n \n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) { \n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n \n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n \n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n \n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n \n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null) {\n\n if (hour > 12) return null;\n\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm === 'morgens' || ampm === 'vormittags') {\n meridiem = 0; \n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n } else {\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n \n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n \n result.start.imply('meridiem', 0);\n \n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n \n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12); \n }\n }\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n \n return result;\n }\n}\n","/*\n\n\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = {\n 'sonntag': 0, 'so': 0,\n 'montag': 1, 'mo': 1,\n 'dienstag': 2, 'di': 2,\n 'mittwoch': 3, 'mi': 3,\n 'donnerstag': 4, 'do': 4,\n 'freitag': 5, 'fr': 5,\n 'samstag': 6, 'sa': 6\n};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:a[mn]\\\\s*?)?' +\n '(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(diese|letzte|n(?:ä|ae)chste)\\\\s*woche)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function DEWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var startMoment = dayjs(ref);\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n\n var refOffset = startMoment.day();\n var norm = prefix || postfix;\n norm = norm || '';\n norm = norm.toLowerCase();\n if (/letzte/.test(norm)) {\n startMoment = startMoment.day(offset - 7);\n } else if (/n(?:ä|ae)chste/.test(norm)) {\n startMoment = startMoment.day(offset + 7);\n } else if (/diese/.test(norm)) {\n if ( opt.forwardDate && refOffset > offset ) {\n startMoment = startMoment.day(offset + 7);\n } else {\n startMoment = startMoment.day(offset);\n }\n } else {\n if ( opt.forwardDate && refOffset > offset ) {\n startMoment = startMoment.day(offset + 7);\n } else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment = startMoment.day(offset - 7);\n } else if (!opt.forwardDate && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment = startMoment.day(offset + 7);\n } else {\n startMoment = startMoment.day(offset);\n }\n }\n\n result.start.assign('weekday', offset);\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n return result;\n }\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(now|today|tonight|last\\s*night|(?:tomorrow|tmr|yesterday)\\s*|tomorrow|tmr|yesterday)(?=\\W|$)/i;\n\nexports.Parser = function ENCasualDateParser(){\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = dayjs(ref);\n var startMoment = refMoment;\n var lowerText = text.toLowerCase();\n\n if(lowerText == 'tonight'){\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n } else if (/^tomorrow|^tmr/.test(lowerText)) {\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n\n } else if (/^yesterday/.test(lowerText)) {\n\n startMoment = startMoment.add(-1, 'day');\n\n } else if(lowerText.match(/last\\s*night/)) {\n\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment = startMoment.add(-1, 'day');\n }\n\n } else if (lowerText.match(\"now\")) {\n\n result.start.assign('hour', refMoment.hour());\n result.start.assign('minute', refMoment.minute());\n result.start.assign('second', refMoment.second());\n result.start.assign('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['ENCasualDateParser'] = true;\n return result;\n }\n}\n","var Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon|night))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n Parser.apply(this, arguments);\n\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n if(!match[TIME_MATCH]) TIME_MATCH = 3;\n \n switch (match[TIME_MATCH].toLowerCase()) {\n\n case 'afternoon':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 15);\n break;\n\n case 'evening':\n case 'night':\n result.start.imply('meridiem', 1);\n result.start.imply('hour', 20);\n break;\n\n case 'morning':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 6);\n break;\n\n case 'noon':\n result.start.imply('meridiem', 0);\n result.start.imply('hour', 12);\n break;\n }\n \n result.tags['ENCasualTimeParser'] = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(within|in)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n '(within|in)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?)\\\\s*' +\n '(seconds?|minutes?|hours?|days?)\\\\s*' +\n '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function ENDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var num = match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/i)){\n num = 3;\n } else if (num.match(/half/i)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n var date = dayjs(ref);\n if (match[4].match(/day|week|month|year/i)) {\n\n if (match[4].match(/day/i)) {\n date = date.add(num, 'd');\n } else if (match[4].match(/week/i)) {\n date = date.add(num * 7, 'd');\n } else if (match[4].match(/month/i)) {\n date = date.add(num, 'month');\n } else if (match[4].match(/year/i)) {\n date = date.add(num, 'year');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n return result;\n }\n\n if (match[4].match(/hour/i)) {\n\n date = date.add(num, 'hour');\n\n } else if (match[4].match(/min/i)) {\n\n date = date.add(num, 'minute');\n\n } else if (match[4].match(/second/i)) {\n\n date = date.add(num, 'second');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.imply('hour', date.hour());\n result.start.imply('minute', date.minute());\n result.start.imply('second', date.second());\n result.tags['ENDeadlineFormatParser'] = true;\n return result;\n };\n};\n","/*\n ISO 8601\n http://www.w3.org/TR/NOTE-datetime\n - YYYY-MM-DD\n - YYYY-MM-DDThh:mmTZD\n - YYYY-MM-DDThh:mm:ssTZD\n - YYYY-MM-DDThh:mm:ss.sTZD \n - TZD = (Z or +hh:mm or -hh:mm)\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n + '([0-9]{4})\\\\-([0-9]{1,2})\\\\-([0-9]{1,2})'\n + '(?:T' //..\n + '([0-9]{1,2}):([0-9]{1,2})' // hh:mm\n + '(?::([0-9]{1,2})(?:\\\\.(\\\\d{1,4}))?)?' // :ss.s\n + '(?:Z|([+-]\\\\d{2}):?(\\\\d{2})?)?' // TZD (Z or ±hh:mm or ±hhmm or ±hh)\n + ')?' //..\n + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP = 4;\nvar HOUR_NUMBER_GROUP = 5;\nvar MINUTE_NUMBER_GROUP = 6;\nvar SECOND_NUMBER_GROUP = 7;\nvar MILLISECOND_NUMBER_GROUP = 8;\nvar TZD_HOUR_OFFSET_GROUP = 9;\nvar TZD_MINUTE_OFFSET_GROUP = 10;\n\nexports.Parser = function ENISOFormatParser(){\n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n })\n \n result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n if (dayjs(result.start.get('month')) > 12 || dayjs(result.start.get('month')) < 1 ||\n dayjs(result.start.get('day')) > 31 || dayjs(result.start.get('day')) < 1) {\n return null;\n }\n\n if (match[HOUR_NUMBER_GROUP] != null) {\n \n result.start.assign('hour',\n parseInt(match[HOUR_NUMBER_GROUP]));\n result.start.assign('minute',\n parseInt(match[MINUTE_NUMBER_GROUP]));\n\n if (match[SECOND_NUMBER_GROUP] != null) {\n\n result.start.assign('second',\n parseInt(match[SECOND_NUMBER_GROUP]));\n }\n\n if (match[MILLISECOND_NUMBER_GROUP] != null) {\n\n result.start.assign('millisecond',\n parseInt(match[MILLISECOND_NUMBER_GROUP]));\n }\n\n if (match[TZD_HOUR_OFFSET_GROUP] == null) {\n\n result.start.assign('timezoneOffset', 0);\n } else {\n\n var minuteOffset = 0;\n var hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);\n if (match[TZD_MINUTE_OFFSET_GROUP] != null)\n minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);\n\n var offset = hourOffset * 60;\n if (offset < 0) {\n offset -= minuteOffset;\n } else {\n offset += minuteOffset;\n }\n\n result.start.assign('timezoneOffset', offset);\n }\n }\n \n result.tags['ENISOFormatParser'] = true;\n return result;\n };\n\n}\n\n","const parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:on\\\\s*?)?' +\n '(?:(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\\\s*,?\\\\s*)?' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n '(?:\\\\s*' +\n '(?:to|\\\\-|\\\\–|until|through|till|\\\\s)\\\\s*' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n ')?' + \n '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n '(' + util.MONTH_PATTERN + ')' +\n '(?:' +\n '(?:-|\\/|,?\\\\s*)' +\n '((?:' + \n '[1-9][0-9]{0,3}\\\\s*(?:BE|AD|BC)|' +\n '[1-2][0-9]{3}' + \n ')(?![^\\\\s]\\\\d))' +\n ')?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n \n if (/BE/i.test(year)) {\n // Buddhist Era\n year = year.replace(/BE/i, '');\n year = parseInt(year) - 543;\n } else if (/BC/i.test(year)){\n // Before Christ\n year = year.replace(/BC/i, '');\n year = -parseInt(year);\n } else if (/AD/i.test(year)){\n year = year.replace(/AD/i, '');\n year = parseInt(year);\n } else {\n year = parseInt(year);\n if (year < 100){\n year = year + 2000;\n }\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month);\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n parseInt(match[DATE_TO_NUM_GROUP]):\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameLittleEndianParser'] = true;\n return result;\n };\n};\n","/*\n\n The parser for parsing US's date format that begin with month's name.\n\n EX.\n - January 13\n - January 13, 2012\n - January 13 - 15, 2012\n - Tuesday, January 13, 2012\n\n Watch out for:\n - January 12:00\n - January 12.44\n - January 1222344\n*/\nvar parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:on\\\\s*?)?' +\n '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n '\\\\s*,?\\\\s*)?' +\n '(' + util.MONTH_PATTERN + ')' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\\\s*(?:am|pm))\\\\s*' + '' + \n '(?:' +\n '(?:to|\\\\-)\\\\s*' +\n '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n ')?' +\n '(?:' +\n '(?:-|\\/|\\\\s*,?\\\\s*)' +\n '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n ')?' +\n '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n var day = match[DATE_NUM_GROUP] ?\n parseInt(match[DATE_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n var year = null;\n if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n year = parseInt(year);\n\n var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n if (yearBE) {\n if (/BE/i.test(yearBE)) {\n // Buddhist Era\n year = year - 543;\n } else if (/BC/i.test(yearBE)) {\n // Before Christ\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month)\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n if (match[DATE_TO_GROUP]) {\n var endDate = match[DATE_TO_NUM_GROUP] ?\n endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n result.end = result.start.clone();\n result.end.assign('day', endDate);\n }\n\n result.tags['ENMonthNameMiddleEndianParser'] = true;\n return result;\n }\n};","/*\n \n The parser for parsing month name and year.\n \n EX. \n - January\n - January 2012\n - January, 2012\n*/\nvar parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n '('+ util.MONTH_PATTERN +')' + \n '\\\\s*' +\n '(?:' +\n '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n ')?' +\n '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n \n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = 1;\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (match[YEAR_BE_GROUP].match(/BE/)) {\n // Buddhist Era\n year = year - 543;\n } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n // Before Christ\n year = -year;\n }\n\n } else if (year < 100){ \n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month)\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n result.tags['ENMonthNameParser'] = true;\n return result;\n }\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(this|next|last|past)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\\\s*an?)?)?\\\\s*' +\n '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\\\s*)' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar MODIFIER_WORD_GROUP = 2;\nvar MULTIPLIER_WORD_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\n\nexports.Parser = function ENRelativeDateFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var modifier = match[MODIFIER_WORD_GROUP].toLowerCase().match(/^next/) ? 1 : -1;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n result.tags['ENRelativeDateFormatParser'] = true;\n\n var num = match[MULTIPLIER_WORD_GROUP] === undefined ? '' : match[3].toLowerCase();\n if (util.INTEGER_WORDS[num] !== undefined) {\n num = util.INTEGER_WORDS[num];\n } else if (num === ''){\n num = 1;\n } else if (num.match(/few/i)){\n num = 3;\n } else if (num.match(/half/i)) {\n num = 0.5;\n } else {\n num = parseInt(num);\n }\n\n num *= modifier;\n var date = dayjs(ref);\n\n if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {\n\n if (match[MULTIPLIER_WORD_GROUP]) {\n return null;\n }\n\n if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n \n // This week\n if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n date = date.add(-date.get('d'), 'd');\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n } \n \n // This month\n else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n date = date.add(-date.date() + 1, 'd');\n result.start.imply('day', date.date());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n } \n\n // This year\n else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n date = date.add(-date.date() + 1, 'd');\n date = date.add(-date.month(), 'month');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.assign('year', date.year());\n } \n\n return result;\n }\n }\n \n if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n\n if (match[RELATIVE_WORD_GROUP].match(/day/i)) {\n date = date.add(num, 'd');\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n } else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n date = date.add(num * 7, 'd');\n // We don't know the exact date for next/last week so we imply\n // them\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n } else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n date = date.add(num, 'month');\n // We don't know the exact day for next/last month\n result.start.imply('day', date.date());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n } else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n date = date.add(num, 'year');\n // We don't know the exact day for month on next/last year\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.assign('year', date.year());\n }\n\n return result;\n }\n\n if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {\n\n date = date.add(num, 'hour');\n result.start.imply('minute', date.minute());\n result.start.imply('second', date.second());\n\n } else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {\n\n date = date.add(num, 'minute');\n result.start.assign('minute', date.minute());\n result.start.imply('second', date.second());\n\n } else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {\n\n date = date.add(num, 'second');\n result.start.assign('second', date.second());\n result.start.assign('minute', date.minute());\n }\n\n result.start.assign('hour', date.hour());\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n };\n};\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Tuesday 11/3/2015 \n - 11/3/2015\n - 11/3\n\n By default the paser us \"middle-endien\" format (US English),\n then fallback to little-endian if failed.\n - 11/3/2015 = November 3rd, 2015\n - 23/4/2015 = April 23th, 2015\n\n If \"littleEndian\" config is set, the parser will try the little-endian first. \n - 11/3/2015 = March 11th, 2015\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '(?:on\\\\s*?)?' +\n '((?:sun|mon|tues?|wed(?:nes)?|thu(?:rs?)?|fri|sat(?:ur)?)(?:day)?)' +\n '\\\\s*\\\\,?\\\\s*' +\n ')?' +\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'wednesday': 3, 'wed': 3,\n 'thursday': 4, 'thur': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\n\n\nvar FIRST_NUMBERS_GROUP = 3;\nvar SECOND_NUMBERS_GROUP = 4;\n\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ENSlashDateFormatParser(config) {\n Parser.apply(this, arguments);\n config = config || {};\n var littleEndian = config.littleEndian;\n var MONTH_GROUP = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;\n var DAY_GROUP = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || dayjs(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if(month < 1 || month > 12) {\n if(month > 12) {\n // dd/mm/yyyy date format if day looks like a month, and month\n // looks like a day.\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n // unambiguous\n var tday = month;\n month = day;\n day = tday;\n }\n else {\n // both month and day are <= 12\n return null;\n }\n }\n }\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if (year > 50) {\n year = year + 1900;\n } else {\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n if (match[YEAR_GROUP]) {\n result.start.assign('year', year);\n } else {\n result.start.imply('year', year);\n }\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['ENSlashDateFormatParser'] = true;\n return result;\n };\n};\n","/*\n Date format with slash \"/\" between numbers like ENSlashDateFormatParser,\n but this parser expect year before month and date. \n - YYYY/MM/DD\n - YYYY-MM-DD\n - YYYY.MM.DD\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n + '([0-9]{4})[\\\\-\\\\.\\\\/]'\n + '((?:' + util.MONTH_PATTERN + '|[0-9]{1,2}))[\\\\-\\\\.\\\\/]'\n + '([0-9]{1,2})'\n + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP = 4;\n\nexports.Parser = function ENSlashDateFormatStartWithYearParser(){\n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n })\n \n var month = match[MONTH_NUMBER_GROUP].toLowerCase();\n month = util.MONTH_OFFSET[month] | month;\n\n result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n result.start.assign('month', parseInt(month));\n result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n if (\n dayjs(result.start.get('month')) > 12 || dayjs(result.start.get('month')) < 1 || \n dayjs(result.start.get('day')) > 31 || dayjs(result.start.get('day')) < 1) {\n return null;\n }\n \n result.tags['ENDateFormatParser'] = true;\n return result;\n };\n}\n","/*\n Month/Year date format with slash \"/\" (also \"-\" and \".\") between numbers \n - 11/05\n - 06/2005\n*/\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(^|[^\\\\d/]\\\\s+|[^\\\\w\\\\s])' +\n '([0-9]|0[1-9]|1[012])/([0-9]{4})' + \n '([^\\\\d/]|$)', 'i');\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 4;\n\nvar MONTH_GROUP = 2;\nvar YEAR_GROUP = 3;\n\nexports.Parser = function ENSlashMonthFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n \n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - (1 + match[ENDING_GROUP].length)).trim();\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n var year = match[YEAR_GROUP] ;\n var month = match[MONTH_GROUP];\n var day = 1;\n \n month = parseInt(month);\n year = parseInt(year);\n\n result.start.imply('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n result.tags['ENSlashMonthFormatParser'] = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.TIME_UNIT_PATTERN + ')' +\n '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n '(\\\\W|^)' +\n '(?:within\\\\s*)?' +\n '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n 'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = util.extractDateTimeUnitFragments(match[2]);\n var date = dayjs(ref);\n\n for (var key in fragments) {\n date = date.add(-fragments[key], key);\n }\n\n if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeAgoFormatParser'] = true;\n } \n \n if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n } else {\n if (fragments['week'] > 0) {\n result.start.imply('weekday', date.day());\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n }\n\n return result;\n };\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:at|from)\\\\s*)??\" + \n \"(\\\\d{1,4}|noon|midnight)\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\:|\\\\:)(\\\\d{2})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n \"(\\\\d{1,4})\" +\n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n \"(?:\" + \n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})(?:\\\\.(\\\\d{1,6}))?\" + \n \")?\" + \n \")?\" + \n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar MILLI_SECOND_GROUP = 5;\nvar AM_PM_HOUR_GROUP = 6;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n // This pattern can be overlapped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = dayjs(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['ENTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n \n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.start.assign('millisecond', millisecond);\n }\n\n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n \n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n meridiem = 1; \n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n meridiem = 0; \n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n \n // ----- Minutes\n if(match[MINUTE_GROUP] != null){ \n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) { \n minute = hour%100;\n hour = parseInt(hour/100);\n } \n \n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n\n // ----- AM & PM \n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) hour = 0;\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n } \n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Millisecond\n if(match[MILLI_SECOND_GROUP] != null){ \n var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n if(millisecond >= 1000) return null;\n \n result.end.assign('millisecond', millisecond);\n }\n \n // ----- Second\n if(match[SECOND_GROUP] != null){ \n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n \n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n \n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n \n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) { \n meridiem = 1;\n }\n \n // ----- AM & PM \n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0; \n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n \n if(ampm == \"p\"){\n meridiem = 1; \n if(hour != 12) hour += 12;\n }\n \n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n \n result.start.imply('meridiem', 0);\n \n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n \n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12); \n }\n }\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n \n return result;\n }\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_PATTERN + ')' +\n /*match[4]*/ '(later|after|from now|henceforth|forward|out)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n /*match[1]*/ '(\\\\W|^)' +\n /*match[2]*/ '(in )?' +\n /*match[3]*/ '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n /*match[4]*/ '(later|from now)?' +\n /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nexports.Parser = function ENTimeLaterFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n };\n\n this.extract = function(text, ref, match, opt){\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var prefix = match[2];\n var suffix = match[4];\n if (!prefix && !suffix) return null;\n\n var preamble = match[1];\n \n var text = match[0];\n text = match[0].substr(preamble.length, match[0].length - preamble.length);\n index = match.index + preamble.length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var fragments = util.extractDateTimeUnitFragments(match[3]);\n var date = dayjs(ref);\n for (var key in fragments) {\n date = date.add(fragments[key], key);\n }\n\n if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags['ENTimeAgoFormatParser'] = true;\n } \n \n if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n } else {\n if (fragments['week'] > 0) {\n result.start.imply('weekday', date.day());\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n }\n\n return result;\n };\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n 'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:on\\\\s*?)?' +\n '(?:(this|last|past|next)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n var startMoment = dayjs(ref);\n var startMomentFixed = false;\n var refOffset = startMoment.day();\n\n if(modifier == 'last' || modifier == 'past') {\n startMoment =startMoment.day(offset - 7);\n startMomentFixed = true;\n } else if(modifier == 'next') {\n startMoment = startMoment.day(offset + 7);\n startMomentFixed = true;\n } else if(modifier == 'this') {\n startMoment = startMoment.day(offset);\n } else {\n if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment = startMoment.day(offset - 7);\n } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n startMoment = startMoment.day(offset + 7);\n } else {\n startMoment = startMoment.day(offset);\n }\n }\n\n result.start.assign('weekday', offset);\n if (startMomentFixed) {\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else {\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n }\n\n return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) {\n return null;\n }\n\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n var norm = prefix || postfix;\n norm = norm || '';\n norm = norm.toLowerCase();\n\n exports.updateParsedComponent(result, ref, offset, norm);\n result.tags['ENWeekdayParser'] = true;\n\n return result;\n }\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n Valid patterns:\n - esta mañana -> today in the morning\n - esta tarde -> today in the afternoon/evening\n - esta noche -> tonight\n - ayer por la mañana -> yesterday in the morning\n - ayer por la tarde -> yesterday in the afternoon/evening\n - ayer por la noche -> yesterday at night\n - mañana por la mañana -> tomorrow in the morning\n - mañana por la tarde -> tomorrow in the afternoon/evening\n - mañana por la noche -> tomorrow at night\n - anoche -> tomorrow at night\n - hoy -> today\n - ayer -> yesterday\n - mañana -> tomorrow\n */\nvar PATTERN = /(\\W|^)(ahora|esta\\s*(mañana|tarde|noche)|(ayer|mañana)\\s*por\\s*la\\s*(mañana|tarde|noche)|hoy|mañana|ayer|anoche)(?=\\W|$)/i;\n\nexports.Parser = function ESCasualDateParser(){\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = dayjs(ref);\n var startMoment = refMoment;\n var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n if(lowerText == 'mañana'){\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n\n } else if(lowerText == 'ayer') {\n\n startMoment = startMoment.add(-1, 'day');\n }\n else if(lowerText == 'anoche') {\n\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment = startMoment.add(-1, 'day');\n }\n\n } else if (lowerText.match(\"esta\")) {\n\n var secondMatch = match[3].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"mañana\") {\n\n result.start.imply('hour', 6);\n\n } else if (secondMatch == \"noche\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n } else if (lowerText.match(/por\\s*la/)) {\n\n var firstMatch = match[4].toLowerCase();\n if (firstMatch === 'ayer') {\n\n startMoment = startMoment.add(-1, 'day');\n\n } else if (firstMatch === 'mañana') {\n\n startMoment = startMoment.add(1, 'day');\n\n }\n\n var secondMatch = match[5].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"mañana\") {\n\n result.start.imply('hour', 9);\n\n } else if (secondMatch == \"noche\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n\n } else if (lowerText.match(\"ahora\")) {\n\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['ESCasualDateParser'] = true;\n return result;\n }\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|en)\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|d[ií]as?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function ESDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[3]);\n if (isNaN(num)) {\n if (match[3].match(/medi/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = dayjs(ref);\n if (match[4].match(/d[ií]a/)) {\n date = date.add(num, 'd');\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n\n if (match[4].match(/hora/)) {\n\n date = date.add(num, 'hour');\n\n } else if (match[4].match(/minuto/)) {\n\n date = date.add(num, 'minute');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['ESDeadlineFormatParser'] = true;\n return result;\n };\n}\n","var parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ES');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(Domingo|Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Dom|Lun|Mar|Mie|Jue|Vie|Sab)\\\\s*,?\\\\s*)?' +\n '([0-9]{1,2})(?:º|ª|°)?' +\n '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|al?|hasta|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n '(Ene(?:ro|\\\\.)?|Feb(?:rero|\\\\.)?|Mar(?:zo|\\\\.)?|Abr(?:il|\\\\.)?|May(?:o|\\\\.)?|Jun(?:io|\\\\.)?|Jul(?:io|\\\\.)?|Ago(?:sto|\\\\.)?|Sep(?:tiembre|\\\\.)?|Set(?:iembre|\\\\.)?|Oct(?:ubre|\\\\.)?|Nov(?:iembre|\\\\.)?|Dic(?:iembre|\\\\.)?)' +\n '(?:\\\\s*(?:del?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function ESMonthNameLittleEndianParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_GROUP];\n day = parseInt(day);\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n // antes de Cristo\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month);\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n result.end = result.start.clone();\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n }\n\n result.tags['ESMonthNameLittleEndianParser'] = true;\n return result;\n };\n}\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Martes 3/11/2015\n - 3/11/2015\n - 3/11\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '((?:domingo|dom|lunes|lun|martes|mar|mi[ée]rcoles|mie|jueves|jue|viernes|vie|s[áa]bado|sab))' +\n '\\\\s*\\\\,?\\\\s*' +\n ')?' +\n '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar': 2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n 'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ESSlashDateFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || dayjs(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if(month < 1 || month > 12) {\n if(month > 12) {\n // dd/mm/yyyy date format if day looks like a month, and month\n // looks like a day.\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n // unambiguous\n var tday = month;\n month = day;\n day = tday;\n }\n else {\n // both month and day are <= 12\n return null;\n }\n }\n }\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if(year > 50){\n year = year + 1900;\n }else{\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['ESSlashDateFormatParser'] = true;\n return result;\n };\n};","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)hace\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|semanas?|d[ií]as?|mes(es)?|años?)(?=(?:\\W|$))/i;\n\nexports.Parser = function ESTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n }\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[2]);\n if (isNaN(num)) {\n if (match[2].match(/medi/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = dayjs(ref);\n\n if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n if (match[3].match(/hora/)) {\n\n date = date.add(-num, 'hour');\n\n } else if (match[3].match(/minuto/)) {\n\n date = date.add(-num, 'minute');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['ESTimeAgoFormatParser'] = true;\n return result;\n }\n\n if (match[3].match(/semana/)) {\n date = date.add(-num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (match[3].match(/d[ií]a/)) {\n date = date.add(-num, 'd');\n }\n\n if (match[3].match(/mes/)) {\n date = date.add(-num, 'month');\n }\n\n if (match[3].match(/año/)) {\n\n date = date.add(-num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:a las?|al?|desde|de)\\\\s*)?\" +\n \"(\\\\d{1,4}|mediod[ií]a|medianoche)\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\:|\\\\:)(\\\\d{2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:\\s*las)?|\\\\?)\\\\s*\" +\n \"(\\\\d{1,4})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function ESTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = dayjs(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['ESTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n\n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase().match(/mediod/)){\n meridiem = 1;\n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"medianoche\") {\n meridiem = 0;\n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if(match[MINUTE_GROUP] != null){\n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) {\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0;\n if(hour == 12) hour = 0;\n }\n\n if(ampm == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n }\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) {\n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n\n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n\n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n\n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n meridiem = 0;\n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n\n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n\n result.start.imply('meridiem', 0);\n\n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n\n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12);\n }\n }\n }\n\n } else if(hour >= 12) {\n meridiem = 1;\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n\n return result;\n }\n}\n","var Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar':2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n 'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sabado': 6, 'sábado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:(este|pasado|pr[oó]ximo)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(este|pasado|pr[óo]ximo)\\\\s*week)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function ESWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var modifier = null;\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n if (prefix || postfix) {\n var norm = prefix || postfix;\n norm = norm.toLowerCase();\n\n if(norm == 'pasado') {\n modifier = 'this';\n }\n else if(norm == 'próximo' || norm == 'proximo') {\n modifier = 'next';\n }\n else if(norm== 'este') {\n modifier = 'this';\n }\n }\n\n updateParsedComponent(result, ref, offset, modifier);\n result.tags['ESWeekdayParser'] = true;\n return result;\n }\n}\n","const dayjs = require('dayjs');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)(maintenant|aujourd'hui|ajd|cette\\s*nuit|la\\s*veille|(demain|hier)(\\s*(matin|soir|aprem|après-midi))?|ce\\s*(matin|soir)|cet\\s*(après-midi|aprem))(?=\\W|$)/i;\r\n\r\nexports.Parser = function FRCasualDateParser(){\r\n\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var text = match[0].substr(match[1].length);\r\n var index = match.index + match[1].length;\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref,\r\n });\r\n\r\n var refMoment = dayjs(ref);\r\n var startMoment = refMoment;\r\n var lowerText = text.toLowerCase();\r\n\r\n if(lowerText.match(/demain/)){\r\n // Check not \"Tomorrow\" on late night\r\n if(refMoment.hour() > 1) {\r\n startMoment = startMoment.add(1, 'day');\r\n }\r\n } \r\n\r\n if(lowerText.match(/hier/)) {\r\n startMoment = startMoment.add(-1, 'day');\r\n }\r\n\r\n if(lowerText.match(/cette\\s*nuit/)){\r\n // Normally means this coming midnight\r\n result.start.imply('hour', 22);\r\n result.start.imply('meridiem', 1);\r\n\r\n } else if(lowerText.match(/la\\s*veille/)) {\r\n\r\n result.start.imply('hour', 0);\r\n if (refMoment.hour() > 6) {\r\n startMoment = startMoment.add(-1, 'day');\r\n }\r\n\r\n } else if (lowerText.match(/(après-midi|aprem)/)) {\r\n\r\n result.start.imply('hour', 14);\r\n\r\n } else if (lowerText.match(/(soir)/)) {\r\n\r\n result.start.imply('hour', 18);\r\n\r\n } else if (lowerText.match(/matin/)) {\r\n\r\n result.start.imply('hour', 8);\r\n\r\n } else if (lowerText.match(\"maintenant\")) {\r\n\r\n result.start.imply('hour', refMoment.hour());\r\n result.start.imply('minute', refMoment.minute());\r\n result.start.imply('second', refMoment.second());\r\n result.start.imply('millisecond', refMoment.millisecond());\r\n\r\n }\r\n\r\n result.start.assign('day', startMoment.date())\r\n result.start.assign('month', startMoment.month() + 1)\r\n result.start.assign('year', startMoment.year())\r\n result.tags['FRCasualDateParser'] = true;\r\n return result;\r\n }\r\n}\r\n","const dayjs = require('dayjs');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar util = require('../../utils/FR');\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(dans|en)\\\\s*' +\r\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|une?|(?:\\\\s*quelques)?|demi(?:\\\\s*|-?)?)\\\\s*' +\r\n '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|années?)\\\\s*' +\r\n '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\r\n '(dans|en)\\\\s*' +\r\n '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|un?)\\\\s*' +\r\n '(secondes?|minutes?|heures?|jours?)\\\\s*' +\r\n '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nexports.Parser = function FRDeadlineFormatParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() {\r\n return this.isStrictMode()? STRICT_PATTERN : PATTERN;\r\n };\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var index = match.index + match[1].length;\r\n var text = match[0];\r\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref\r\n });\r\n\r\n var num = match[3];\r\n if (util.INTEGER_WORDS[num] !== undefined) {\r\n num = util.INTEGER_WORDS[num];\r\n } else if (num === 'un' || num === 'une'){\r\n num = 1;\r\n } else if (num.match(/quelques?/i)){\r\n num = 3;\r\n } else if (num.match(/demi-?/i)) {\r\n num = 0.5;\r\n } else {\r\n num = parseInt(num);\r\n }\r\n\r\n var date = dayjs(ref);\r\n if (match[4].match(/jour|semaine|mois|année/i)) {\r\n\r\n if (match[4].match(/jour/)) {\r\n date = date.add(num, 'd');\r\n } else if (match[4].match(/semaine/i)) {\r\n date = date.add(num * 7, 'd');\r\n } else if (match[4].match(/mois/i)) {\r\n date = date.add(num, 'month');\r\n } else if (match[4].match(/année/i)) {\r\n date = date.add(num, 'year');\r\n }\r\n\r\n result.start.assign('year', date.year());\r\n result.start.assign('month', date.month() + 1);\r\n result.start.assign('day', date.date());\r\n return result;\r\n }\r\n\r\n if (match[4].match(/heure/i)) {\r\n\r\n date = date.add(num, 'hour');\r\n\r\n } else if (match[4].match(/min/i)) {\r\n\r\n date = date.add(num, 'minutes');\r\n\r\n } else if (match[4].match(/secondes/i)) {\r\n\r\n date = date.add(num, 'second');\r\n }\r\n\r\n result.start.imply('year', date.year());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('day', date.date());\r\n result.start.assign('hour', date.hour());\r\n result.start.assign('minute', date.minute());\r\n result.start.assign('second', date.second());\r\n result.tags['FRDeadlineFormatParser'] = true;\r\n return result;\r\n };\r\n};\r\n","const parser = require('../parser');\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar util = require('../../utils/FR');\r\n\r\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(?:(Dimanche|Lundi|Mardi|mercredi|Jeudi|Vendredi|Samedi|Dim|Lun|Mar|Mer|Jeu|Ven|Sam)\\\\s*,?\\\\s*)?' +\r\n '([0-9]{1,2}|1er)' +\r\n '(?:\\\\s*(?:au|\\\\-|\\\\–|jusqu\\'au?|\\\\s)\\\\s*([0-9]{1,2})(?:er)?)?\\\\s*(?:de)?\\\\s*' +\r\n '(Jan(?:vier|\\\\.)?|F[ée]v(?:rier|\\\\.)?|Mars|Avr(?:il|\\\\.)?|Mai|Juin|Juil(?:let|\\\\.)?|Ao[uû]t|Sept(?:embre|\\\\.)?|Oct(?:obre|\\\\.)?|Nov(?:embre|\\\\.)?|d[ée]c(?:embre|\\\\.)?)' +\r\n '(?:\\\\s*(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(?:\\\\s*(AC|[ap]\\\\.?\\\\s*c(?:h(?:r)?)?\\\\.?\\\\s*n\\\\.?))?)?' +\r\n '(?=\\\\W|$)', 'i'\r\n );\r\n\r\nvar WEEKDAY_GROUP = 2;\r\nvar DATE_GROUP = 3;\r\nvar DATE_TO_GROUP = 4;\r\nvar MONTH_NAME_GROUP = 5;\r\nvar YEAR_GROUP = 6;\r\nvar YEAR_BE_GROUP = 7;\r\n\r\nexports.Parser = function FRMonthNameLittleEndianParser(){\r\n parser.Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n var result = new ParsedResult({\r\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\r\n index: match.index + match[1].length,\r\n ref: ref,\r\n });\r\n\r\n var month = match[MONTH_NAME_GROUP];\r\n month = util.MONTH_OFFSET[month.toLowerCase()];\r\n\r\n var day = match[DATE_GROUP];\r\n day = parseInt(day);\r\n\r\n var year = null;\r\n if (match[YEAR_GROUP]) {\r\n year = match[YEAR_GROUP];\r\n year = parseInt(year);\r\n\r\n if(match[YEAR_BE_GROUP]){\r\n if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n // Ante Christe natum\r\n year = -year;\r\n }\r\n } else if (year < 100){\r\n\r\n year = year + 2000;\r\n }\r\n }\r\n\r\n if(year){\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.assign('year', year);\r\n } else {\r\n year = parser.findYearClosestToRef(ref, day, month)\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.imply('year', year);\r\n }\r\n\r\n // Weekday component\r\n if (match[WEEKDAY_GROUP]) {\r\n var weekday = match[WEEKDAY_GROUP];\r\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\r\n result.start.assign('weekday', weekday);\r\n }\r\n\r\n // Text can be 'range' value. Such as '12 - 13 janvier 2012'\r\n if (match[DATE_TO_GROUP]) {\r\n result.end = result.start.clone();\r\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\r\n }\r\n\r\n result.tags['FRMonthNameLittleEndianParser'] = true;\r\n return result;\r\n };\r\n}\r\n","const quarterOfYear = require('dayjs/plugin/quarterOfYear');\nconst dayjs = require('dayjs');\ndayjs.extend(quarterOfYear);\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util = require('../../utils/FR');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:les?|la|l\\'|du|des?)\\\\s*' +\n '('+ util.INTEGER_WORDS_PATTERN + '|\\\\d+)?\\\\s*' +\n '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?\\\\s*' +\n '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|trimestres?|années?)\\\\s*' +\n '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?' +\n '(?=\\\\W|$)', 'i'\n);\n\nvar MULTIPLIER_GROUP = 2;\nvar MODIFIER_1_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\nvar MODIFIER_2_GROUP = 5;\n\nexports.Parser = function FRRelativeDateFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; };\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n // Multiplier\n var multiplier = match[MULTIPLIER_GROUP] === undefined ? '1' : match[MULTIPLIER_GROUP];\n if (util.INTEGER_WORDS[multiplier] !== undefined) {\n multiplier = util.INTEGER_WORDS[multiplier];\n } else {\n multiplier = parseInt(multiplier);\n }\n\n // Modifier\n var modifier = match[MODIFIER_1_GROUP] === undefined ?\n (match[MODIFIER_2_GROUP] === undefined ? '' : match[MODIFIER_2_GROUP].toLowerCase())\n : match[MODIFIER_1_GROUP].toLowerCase();\n if(!modifier) {\n // At least one modifier is mandatory to match this parser\n return;\n }\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n result.tags['FRRelativeDateFormatParser'] = true;\n\n var modifierFactor;\n switch(true) {\n case /prochaine?s?/.test(modifier):\n case /suivants?/.test(modifier):\n modifierFactor = 1;\n break;\n case /derni[eè]re?s?/.test(modifier):\n case /pass[ée]e?s?/.test(modifier):\n case /pr[ée]c[ée]dents?/.test(modifier):\n modifierFactor = -1;\n break;\n }\n\n var total = multiplier * modifierFactor;\n\n var dateFrom = dayjs(ref);\n var dateTo = dayjs(ref);\n\n var relative = match[RELATIVE_WORD_GROUP];\n var startOf;\n switch(true) {\n case /secondes?/.test(relative):\n dateFrom = dateFrom.add(total, 's');\n dateTo = dateTo.add(modifierFactor, 's');\n startOf = 'second';\n break;\n case /min(?:ute)?s?/.test(relative):\n dateFrom = dateFrom.add(total, 'm');\n dateTo = dateTo.add(modifierFactor, 'm');\n startOf = 'minute';\n break;\n case /heures?/.test(relative):\n dateFrom = dateFrom.add(total, 'h');\n dateTo = dateTo.add(modifierFactor, 'h');\n startOf = 'hour';\n break;\n case /jours?/.test(relative):\n dateFrom = dateFrom.add(total, 'd');\n dateTo = dateTo.add(modifierFactor, 'd');\n startOf = 'day';\n break;\n case /semaines?/.test(relative):\n dateFrom = dateFrom.add(total, 'w');\n dateTo = dateTo.add(modifierFactor, 'w');\n startOf = 'week';\n break;\n case /mois?/.test(relative):\n dateFrom = dateFrom.add(total, 'M');\n dateTo = dateTo.add(modifierFactor, 'M');\n startOf = 'month';\n break;\n case /trimestres?/.test(relative):\n dateFrom = dateFrom.add(total, 'Q');\n dateTo = dateTo.add(modifierFactor, 'Q');\n startOf = 'quarter';\n break;\n case /années?/.test(relative):\n dateFrom = dateFrom.add(total, 'y');\n dateTo = dateTo.add(modifierFactor, 'y');\n startOf = 'year';\n break;\n }\n\n // if we go forward, switch the start and end dates\n if(modifierFactor > 0) {\n var dateTmp = dateFrom;\n dateFrom = dateTo;\n dateTo = dateTmp;\n }\n\n // Get start and end of dates\n dateFrom = dateFrom.startOf(startOf);\n dateTo = dateTo.endOf(startOf);\n if (startOf == 'week') { // Weekday in FR start on Sat?\n dateFrom = dateFrom.add(1, 'd')\n dateTo = dateTo.add(1, 'd')\n }\n \n\n // Assign results\n result.start.assign('year', dateFrom.year());\n result.start.assign('month', dateFrom.month() + 1);\n result.start.assign('day', dateFrom.date());\n result.start.assign('minute', dateFrom.minute());\n result.start.assign('second', dateFrom.second());\n result.start.assign('hour', dateFrom.hour());\n result.start.assign('millisecond', dateFrom.millisecond());\n\n result.end = result.start.clone();\n result.end.assign('year', dateTo.year());\n result.end.assign('month', dateTo.month() + 1);\n result.end.assign('day', dateTo.date());\n result.end.assign('minute', dateTo.minute());\n result.end.assign('second', dateTo.second());\n result.end.assign('hour', dateTo.hour());\n result.end.assign('millisecond', dateTo.millisecond());\n return result;\n };\n};\n","/*\r\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\r\n - Martes 3/11/2015\r\n - 3/11/2015\r\n - 3/11\r\n*/\r\nvar parser = require('../parser');\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n '(?:' +\r\n '((?:dimanche|dim|lundi|lun|mardi|mar|mercredi|mer|jeudi|jeu|vendredi|ven|samedi|sam|le))' +\r\n '\\\\s*\\\\,?\\\\s*' +\r\n ')?' +\r\n '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\r\n '(?:' +\r\n '[\\\\/\\\\.\\\\-]' +\r\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\r\n ')?' +\r\n '(\\\\W|$)', 'i');\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n 'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\n\r\nvar OPENNING_GROUP = 1;\r\nvar ENDING_GROUP = 6;\r\n\r\n// In French we use day/month/year\r\nvar WEEKDAY_GROUP = 2;\r\nvar DAY_GROUP = 3;\r\nvar MONTH_GROUP = 4;\r\nvar YEAR_GROUP = 5;\r\nvar YEAR_BE_GROUP = 6;\r\n\r\nexports.Parser = function FRSlashDateFormatParser(argument) {\r\n parser.Parser.apply(this, arguments);\r\n\r\n this.pattern = function () { return PATTERN; };\r\n this.extract = function(text, ref, match, opt){\r\n\r\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\r\n // Long skip, if there is some overlapping like:\r\n // XX[/YY/ZZ]\r\n // [XX/YY/]ZZ\r\n match.index += match[0].length\r\n return;\r\n }\r\n\r\n var index = match.index + match[OPENNING_GROUP].length;\r\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\r\n\r\n\r\n var result = new ParsedResult({\r\n text: text,\r\n index: index,\r\n ref: ref,\r\n });\r\n\r\n if(text.match(/^\\d\\.\\d$/)) return;\r\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\r\n\r\n // MM/dd -> OK\r\n // MM.dd -> NG\r\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\r\n\r\n var date = null;\r\n var month = match[MONTH_GROUP];\r\n var day = match[DAY_GROUP];\r\n\r\n day = parseInt(day);\r\n month = parseInt(month);\r\n\r\n var year = null;\r\n if (match[YEAR_GROUP]) {\r\n year = match[YEAR_GROUP];\r\n year = parseInt(year);\r\n\r\n if(match[YEAR_BE_GROUP]){\r\n if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n // Ante Christe natum\r\n year = -year;\r\n }\r\n } else if (year < 100){\r\n\r\n year = year + 2000;\r\n }\r\n }\r\n\r\n if(month < 1 || month > 12) {\r\n if(month > 12) {\r\n // dd/mm/yyyy date format if day looks like a month, and month looks like a day.\r\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\r\n // unambiguous\r\n var tday = month;\r\n month = day;\r\n day = tday;\r\n }\r\n else {\r\n // both month and day are <= 12\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n if(day < 1 || day > 31) return null;\r\n\r\n if(year){\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.assign('year', year);\r\n } else {\r\n year = parser.findYearClosestToRef(ref, day, month)\r\n result.start.assign('day', day);\r\n result.start.assign('month', month);\r\n result.start.imply('year', year);\r\n }\r\n\r\n // Day of week\r\n if(match[WEEKDAY_GROUP]) {\r\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\r\n }\r\n\r\n result.tags['FRSlashDateFormatParser'] = true;\r\n return result;\r\n };\r\n};","const dayjs = require('dayjs');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)il y a\\s*([0-9]+|une?)\\s*(minutes?|heures?|semaines?|jours?|mois|années?|ans?)(?=(?:\\W|$))/i;\r\n\r\nexports.Parser = function FRTimeAgoFormatParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() {\r\n return PATTERN;\r\n }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n\r\n var text = match[0];\r\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n index = match.index + match[1].length;\r\n\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref,\r\n });\r\n result.tags['FRTimeAgoFormatParser'] = true;\r\n \r\n var num = parseInt(match[2]);\r\n if (isNaN(num)) {\r\n if (match[2].match(/demi/)) {\r\n num = 0.5;\r\n } else {\r\n num = 1;\r\n }\r\n }\r\n\r\n var date = dayjs(ref);\r\n\r\n if (match[3].match(/heure/) || match[3].match(/minute/)) {\r\n if (match[3].match(/heure/)) {\r\n\r\n date = date.add(-num, 'hour');\r\n\r\n } else if (match[3].match(/minute/)) {\r\n\r\n date = date.add(-num, 'minute');\r\n }\r\n\r\n result.start.imply('day', date.date());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('year', date.year());\r\n result.start.assign('hour', date.hour());\r\n result.start.assign('minute', date.minute());\r\n\r\n return result;\r\n }\r\n\r\n if (match[3].match(/semaine/)) {\r\n date = date.add(-num, 'week');\r\n\r\n result.start.imply('day', date.date());\r\n result.start.imply('month', date.month() + 1);\r\n result.start.imply('year', date.year());\r\n result.start.imply('weekday', date.day());\r\n return result;\r\n }\r\n\r\n if (match[3].match(/jour/)) {\r\n date = date.add(-num, 'd');\r\n }\r\n\r\n if (match[3].match(/mois/)) {\r\n date = date.add(-num, 'month');\r\n }\r\n\r\n if (match[3].match(/années?|ans?/)) {\r\n date = date.add(-num, 'year');\r\n }\r\n\r\n result.start.assign('day', date.date());\r\n result.start.assign('month', date.month() + 1);\r\n result.start.assign('year', date.year());\r\n return result;\r\n\r\n };\r\n}\r\n","const dayjs = require('dayjs');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\n\r\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\r\n \"(?:(?:[àa])\\\\s*)?\" +\r\n \"(\\\\d{1,2}(?:h)?|midi|minuit)\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n \"(?:\" +\r\n \"(?:\\\\:|\\\\:|m)(\\\\d{0,2})(?:s)?\" +\r\n \")?\" +\r\n \")?\" +\r\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n \"(?=\\\\W|$)\", 'i');\r\n\r\n\r\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\r\n \"(\\\\-|\\\\–|\\\\~|\\\\〜|[àa]|\\\\?)\\\\s*\" +\r\n \"(\\\\d{1,2}(?:h)?)\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n \"(?:\" +\r\n \"(?:\\\\.|\\\\:|\\\\:|m)(\\\\d{1,2})(?:s)?\" +\r\n \")?\" +\r\n \")?\" +\r\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n \"(?=\\\\W|$)\", 'i');\r\n\r\nvar HOUR_GROUP = 2;\r\nvar MINUTE_GROUP = 3;\r\nvar SECOND_GROUP = 4;\r\nvar AM_PM_HOUR_GROUP = 5;\r\n\r\nexports.Parser = function FRTimeExpressionParser(){\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return FIRST_REG_PATTERN; }\r\n\r\n this.extract = function(text, ref, match, opt){\r\n\r\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\r\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n var refMoment = dayjs(ref);\r\n var result = new ParsedResult();\r\n result.ref = ref;\r\n result.index = match.index + match[1].length;\r\n result.text = match[0].substring(match[1].length);\r\n result.tags['FRTimeExpressionParser'] = true;\r\n\r\n result.start.imply('day', refMoment.date());\r\n result.start.imply('month', refMoment.month()+1);\r\n result.start.imply('year', refMoment.year());\r\n\r\n var hour = 0;\r\n var minute = 0;\r\n var meridiem = -1;\r\n\r\n // ----- Second\r\n if(match[SECOND_GROUP] != null){\r\n var second = parseInt(match[SECOND_GROUP]);\r\n if(second >= 60) return null;\r\n\r\n result.start.assign('second', second);\r\n }\r\n\r\n // ----- Hours\r\n if (match[HOUR_GROUP].toLowerCase() == \"midi\"){\r\n meridiem = 1;\r\n hour = 12;\r\n } else if (match[HOUR_GROUP].toLowerCase() == \"minuit\") {\r\n meridiem = 0;\r\n hour = 0;\r\n } else {\r\n hour = parseInt(match[HOUR_GROUP]);\r\n }\r\n\r\n // ----- Minutes\r\n if(match[MINUTE_GROUP] != null){\r\n minute = parseInt(match[MINUTE_GROUP]);\r\n } else if(hour > 100) {\r\n minute = hour%100;\r\n hour = parseInt(hour/100);\r\n }\r\n\r\n if(minute >= 60) {\r\n return null;\r\n }\r\n\r\n if(hour > 24) {\r\n return null;\r\n }\r\n if (hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n // ----- AM & PM\r\n if(match[AM_PM_HOUR_GROUP] != null) {\r\n if(hour > 12) return null;\r\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\r\n if(ampm == \"a\"){\r\n meridiem = 0;\r\n if(hour == 12) hour = 0;\r\n }\r\n\r\n if(ampm == \"p\"){\r\n meridiem = 1;\r\n if(hour != 12) hour += 12;\r\n }\r\n }\r\n result.start.assign('hour', hour);\r\n result.start.assign('minute', minute);\r\n if (meridiem >= 0) {\r\n result.start.assign('meridiem', meridiem);\r\n }\r\n\r\n // ==============================================================\r\n // Extracting the 'to' chunk\r\n // ==============================================================\r\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\r\n if (!match) {\r\n // Not accept number only result\r\n if (result.text.match(/^\\d+$/)) {\r\n return null;\r\n }\r\n return result;\r\n }\r\n\r\n\r\n\r\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\r\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\r\n return result;\r\n }\r\n\r\n if(result.end == null){\r\n result.end = new ParsedComponents(null, result.start.date());\r\n }\r\n\r\n var hour = 0;\r\n var minute = 0;\r\n var meridiem = -1;\r\n\r\n // ----- Second\r\n if(match[SECOND_GROUP] != null){\r\n var second = parseInt(match[SECOND_GROUP]);\r\n if(second >= 60) return null;\r\n\r\n result.end.assign('second', second);\r\n }\r\n\r\n hour = parseInt(match[2]);\r\n\r\n // ----- Minute\r\n if (match[MINUTE_GROUP]!= null) {\r\n\r\n minute = parseInt(match[MINUTE_GROUP]);\r\n if(minute >= 60) return result;\r\n\r\n } else if (hour > 100) {\r\n\r\n minute = hour%100;\r\n hour = parseInt(hour/100);\r\n }\r\n\r\n if(minute >= 60) {\r\n return null;\r\n }\r\n\r\n if(hour > 24) {\r\n return null;\r\n }\r\n if (hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n // ----- AM & PM\r\n if (match[AM_PM_HOUR_GROUP] != null){\r\n\r\n if (hour > 12) return null;\r\n\r\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\r\n meridiem = 0;\r\n if(hour == 12) {\r\n hour = 0;\r\n if (!result.end.isCertain('day')) {\r\n result.end.imply('day', result.end.get('day') + 1);\r\n }\r\n }\r\n }\r\n\r\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\r\n meridiem = 1;\r\n if(hour != 12) hour += 12;\r\n }\r\n\r\n if (!result.start.isCertain('meridiem')) {\r\n if (meridiem == 0) {\r\n\r\n result.start.imply('meridiem', 0);\r\n\r\n if (result.start.get('hour') == 12) {\r\n result.start.assign('hour', 0);\r\n }\r\n\r\n } else {\r\n\r\n result.start.imply('meridiem', 1);\r\n\r\n if (result.start.get('hour') != 12) {\r\n result.start.assign('hour', result.start.get('hour') + 12);\r\n }\r\n }\r\n }\r\n\r\n } else if(hour >= 12) {\r\n meridiem = 1;\r\n }\r\n\r\n result.text = result.text + match[0];\r\n result.end.assign('hour', hour);\r\n result.end.assign('minute', minute);\r\n if (meridiem >= 0) {\r\n result.end.assign('meridiem', meridiem);\r\n }\r\n\r\n if (result.end.date().getTime() < result.start.date().getTime()) {\r\n result.end.imply('day', result.end.get('day') + 1)\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","var Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n 'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\nvar PATTERN = new RegExp('(\\\\s|^)' +\r\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\r\n '(?:(ce)\\\\s*)?' +\r\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\r\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\r\n '(?:\\\\s*(dernier|prochain)\\\\s*)?' +\r\n '(?=\\\\W|$)', 'i');\r\n\r\nvar PREFIX_GROUP = 2;\r\nvar WEEKDAY_GROUP = 3;\r\nvar POSTFIX_GROUP = 4;\r\n\r\nexports.Parser = function FRWeekdayParser() {\r\n Parser.apply(this, arguments);\r\n\r\n this.pattern = function() { return PATTERN; };\r\n\r\n this.extract = function(text, ref, match, opt){\r\n var index = match.index + match[1].length;\r\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n var result = new ParsedResult({\r\n index: index,\r\n text: text,\r\n ref: ref\r\n });\r\n\r\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\r\n var offset = DAYS_OFFSET[dayOfWeek];\r\n if(offset === undefined) return null;\r\n\r\n var modifier = null;\r\n var prefix = match[PREFIX_GROUP];\r\n var postfix = match[POSTFIX_GROUP];\r\n if (prefix || postfix) {\r\n var norm = prefix || postfix;\r\n norm = norm.toLowerCase();\r\n\r\n if(norm == 'dernier') {\r\n modifier = 'last';\r\n } else if(norm == 'prochain') {\r\n modifier = 'next';\r\n } else if(norm== 'ce') {\r\n modifier = 'this';\r\n }\r\n }\r\n\r\n updateParsedComponent(result, ref, offset, modifier);\r\n result.tags['FRWeekdayParser'] = true;\r\n return result;\r\n }\r\n};\r\n\r\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;\n\nexports.Parser = function JPCasualDateParser(){\n \n Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n \n var index = match.index;\n var text = match[0];\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = dayjs(ref);\n var startMoment = refMoment;\n\n if(text == '今夜' || text == '今夕' || text == '今晩'){\n // Normally means this coming midnight \n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n } else if(text == '明日'){\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 4) {\n startMoment = startMoment.add(1, 'day');\n }\n\n } else if(text == '昨日') {\n\n startMoment = startMoment.add(-1, 'day');\n\n } else if (text.match(\"今朝\")) {\n\n result.start.imply('hour', 6);\n result.start.imply('meridiem', 0);\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['JPCasualDateParser'] = true;\n return result;\n }\n}\n\n","const dayjs = require('dayjs');\nvar parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/JP'); \nvar PATTERN = /(?:(同|今|本|((昭和|平成|令和)?([0-90-9]{2,4}|元)))年\\s*)?([0-90-9]{1,2})月\\s*([0-90-9]{1,2})日/i;\n\nvar SPECIAL_YEAR_GROUP = 1;\nvar TYPICAL_YEAR_GROUP = 2;\nvar ERA_GROUP = 3;\nvar YEAR_NUMBER_GROUP = 4;\nvar MONTH_GROUP = 5;\nvar DAY_GROUP = 6;\n\nexports.Parser = function JPStandardParser(){\n parser.Parser.apply(this, arguments);\n \n this.pattern = function() { return PATTERN; }\n \n this.extract = function(text, ref, match, opt){ \n var result = new ParsedResult({\n text: match[0],\n index: match.index,\n ref: ref,\n });\n \n var month = match[MONTH_GROUP];\n month = util.toHankaku(month);\n month = parseInt(month);\n\n var day = match[DAY_GROUP];\n day = util.toHankaku(day);\n day = parseInt(day);\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n \n if (match[TYPICAL_YEAR_GROUP]) {\n\n var year = match[YEAR_NUMBER_GROUP];\n if (year == '元') {\n year = 1;\n } else {\n year = util.toHankaku(year);\n year = parseInt(year);\n }\n\n if (match[ERA_GROUP] == '令和') {\n year += 2018;\n } else if (match[ERA_GROUP] == '平成') {\n year += 1988;\n } else if (match[ERA_GROUP] == '昭和') {\n year += 1925;\n }\n\n result.start.assign('year', year);\n\n } else if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match('同|今|本')) {\n const moment = dayjs(ref)\n result.start.assign('year', moment.year());\n } else {\n const year = parser.findYearClosestToRef(ref, day, month);\n result.start.imply('year', year);\n }\n \n result.tags['JPStandardParser'] = true;\n return result;\n };\n\n}\n\n","const dayjs = require('dayjs');\n\nexports.Parser = function (config) {\n\n config = config || {};\n var strictMode = config.strict;\n\n this.isStrictMode = function() { return (strictMode == true) };\n\n this.pattern = function() { return /./i; }\n\n this.extract = function(text, ref, match, opt){ return null; }\n\n this.execute = function(text, ref, opt) {\n\n var results = [];\n var regex = this.pattern();\n\n var remainingText = text;\n var match = regex.exec(remainingText);\n\n while (match) {\n\n // Calculate match index on the full text;\n match.index += text.length - remainingText.length;\n\n var result = this.extract(text, ref, match, opt);\n if (result) {\n\n // If success, start from the end of the result\n remainingText = text.substring(result.index + result.text.length);\n\n if (!this.isStrictMode() || result.hasPossibleDates()) {\n results.push(result);\n }\n\n } else {\n // If fail, move on by 1\n remainingText = text.substring(match.index + 1);\n }\n\n match = regex.exec(remainingText);\n }\n\n if (this.refiners) {\n this.refiners.forEach(function () {\n results = refiner.refine(results, text, options);\n });\n }\n\n return results;\n }\n}\n\nexports.findYearClosestToRef = function (ref, day, month) {\n //Find the most appropriated year\n const refMoment = dayjs(ref);\n var dateMoment = refMoment;\n dateMoment = dateMoment.month(month - 1);\n dateMoment = dateMoment.date(day);\n dateMoment = dateMoment.year(refMoment.year())\n\n const nextYear = dateMoment.add(1, 'y');\n const lastYear = dateMoment.add(-1, 'y');\n if( Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment)) ){\n dateMoment = nextYear;\n }\n else if( Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment)) ){\n dateMoment = lastYear;\n }\n\n return dateMoment.year();\n}\n\nexports.ENISOFormatParser = require('./en/ENISOFormatParser').Parser;\nexports.ENDeadlineFormatParser = require('./en/ENDeadlineFormatParser').Parser;\nexports.ENRelativeDateFormatParser = require('./en/ENRelativeDateFormatParser').Parser;\nexports.ENMonthNameLittleEndianParser = require('./en/ENMonthNameLittleEndianParser').Parser;\nexports.ENMonthNameMiddleEndianParser = require('./en/ENMonthNameMiddleEndianParser').Parser;\nexports.ENMonthNameParser = require('./en/ENMonthNameParser').Parser;\nexports.ENSlashDateFormatParser = require('./en/ENSlashDateFormatParser').Parser;\nexports.ENSlashDateFormatStartWithYearParser = require('./en/ENSlashDateFormatStartWithYearParser').Parser;\nexports.ENSlashMonthFormatParser = require('./en/ENSlashMonthFormatParser').Parser;\nexports.ENTimeAgoFormatParser = require('./en/ENTimeAgoFormatParser').Parser;\nexports.ENTimeExpressionParser = require('./en/ENTimeExpressionParser').Parser;\nexports.ENTimeLaterFormatParser = require('./en/ENTimeLaterFormatParser').Parser;\nexports.ENWeekdayParser = require('./en/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./en/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./en/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./ja/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./ja/JPCasualDateParser').Parser;\n\nexports.PTCasualDateParser = require('./pt/PTCasualDateParser').Parser;\nexports.PTDeadlineFormatParser = require('./pt/PTDeadlineFormatParser').Parser;\nexports.PTMonthNameLittleEndianParser = require('./pt/PTMonthNameLittleEndianParser').Parser;\nexports.PTSlashDateFormatParser = require('./pt/PTSlashDateFormatParser').Parser;\nexports.PTTimeAgoFormatParser = require('./pt/PTTimeAgoFormatParser').Parser;\nexports.PTTimeExpressionParser = require('./pt/PTTimeExpressionParser').Parser;\nexports.PTWeekdayParser = require('./pt/PTWeekdayParser').Parser;\n\nexports.ESCasualDateParser = require('./es/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./es/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./es/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./es/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./es/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./es/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./es/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./fr/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./fr/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./fr/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./fr/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./fr/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./fr/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./fr/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./fr/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./zh-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./zh-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./zh-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./zh-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./zh-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./de/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./de/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./de/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./de/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./de/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./de/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./de/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./de/DECasualDateParser').Parser;\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n Valid patterns:\n - esta manhã -> today in the morning\n - esta tarde -> today in the afternoon/evening\n - esta noite -> tonight\n - ontem de -> yesterday in the morning\n - ontem a tarde -> yesterday in the afternoon/evening\n - ontem a noite -> yesterday at night\n - amanhã de manhã -> tomorrow in the morning\n - amanhã a tarde -> tomorrow in the afternoon/evening\n - amanhã a noite -> tomorrow at night\n - hoje -> today\n - ontem -> yesterday\n - amanhã -> tomorrow\n */\nvar PATTERN = /(\\W|^)(agora|esta\\s*(manhã|tarde|noite)|(ontem|amanhã)\\s*(de|à)\\s*(manhã|tarde|noite)|hoje|amanhã|ontem|noite)(?=\\W|$)/i;\n\nexports.Parser = function PTCasualDateParser(){\n\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var text = match[0].substr(match[1].length);\n var index = match.index + match[1].length;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = dayjs(ref);\n var startMoment = refMoment;\n var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n if(lowerText == 'amanhã'){\n\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n\n } else if(lowerText == 'ontem') {\n\n startMoment = startMoment.add(-1, 'day');\n }\n else if(lowerText == 'noite') {\n\n result.start.imply('hour', 0);\n if (refMoment.hour() > 6) {\n startMoment = startMoment.add(-1, 'day');\n }\n\n } else if (lowerText.match(\"esta\")) {\n\n var secondMatch = match[3].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"manhã\") {\n\n result.start.imply('hour', 6);\n\n } else if (secondMatch == \"noite\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n } else if (lowerText.match(/de|à/)) {\n\n var firstMatch = match[4].toLowerCase();\n if (firstMatch === 'ontem') {\n\n startMoment = startMoment.add(-1, 'day');\n\n } else if (firstMatch === 'amanhã') {\n\n startMoment = startMoment.add(1, 'day');\n\n }\n\n var secondMatch = match[6].toLowerCase();\n if (secondMatch == \"tarde\") {\n\n result.start.imply('hour', 18);\n\n } else if (secondMatch == \"manhã\") {\n\n result.start.imply('hour', 9);\n\n } else if (secondMatch == \"noite\") {\n\n // Normally means this coming midnight\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n\n }\n\n } else if (lowerText.match(\"agora\")) {\n\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags['PTCasualDateParser'] = true;\n return result;\n }\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|em|em*até)\\s*([0-9]+|mei[oa]|uma?)\\s*(minutos?|horas?|dias?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function PTDeadlineFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var index = match.index + match[1].length;\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[3]);\n if (isNaN(num)) {\n if (match[3].match(/(meio|meia)/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = dayjs(ref);\n if (match[4].match(/dia/)) {\n date = date.add(num, 'd');\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n\n if (match[4].match(/hora/)) {\n\n date = date.add(num, 'hour');\n\n } else if (match[4].match(/minuto/)) {\n\n date = date.add(num, 'minute');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['PTDeadlineFormatParser'] = true;\n return result;\n };\n}\n","var parser = require('../parser');\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/PT');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(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*)?' +\n '([0-9]{1,2})(?:º|ª|°)?' +\n '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|ao?|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n '(Jan(?:eiro|\\\\.)?|Fev(?:ereiro|\\\\.)?|Mar(?:ço|\\\\.)?|Abr(?:il|\\\\.)?|Mai(?:o|\\\\.)?|Jun(?:ho|\\\\.)?|Jul(?:ho|\\\\.)?|Ago(?:sto|\\\\.)?|Set(?:embro|\\\\.)?|Out(?:ubro|\\\\.)?|Nov(?:embro|\\\\.)?|Dez(?:embro|\\\\.)?)' +\n '(?:\\\\s*(?:de?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n '(?=\\\\W|$)', 'i'\n );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function PTMonthNameLittleEndianParser(){\n parser.Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n var result = new ParsedResult({\n text: match[0].substr(match[1].length, match[0].length - match[1].length),\n index: match.index + match[1].length,\n ref: ref,\n });\n\n var month = match[MONTH_NAME_GROUP];\n month = util.MONTH_OFFSET[month.toLowerCase()];\n\n var day = match[DATE_GROUP];\n day = parseInt(day);\n\n var year = null;\n if (match[YEAR_GROUP]) {\n year = match[YEAR_GROUP];\n year = parseInt(year);\n\n if(match[YEAR_BE_GROUP]){\n if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n // antes de Cristo\n year = -year;\n }\n } else if (year < 100){\n\n year = year + 2000;\n }\n }\n\n if(year){\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n } else {\n year = parser.findYearClosestToRef(ref, day, month);\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.imply('year', year);\n }\n\n // Weekday component\n if (match[WEEKDAY_GROUP]) {\n var weekday = match[WEEKDAY_GROUP];\n weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n result.start.assign('weekday', weekday);\n }\n\n // Text can be 'range' value. Such as '12 - 13 January 2012'\n if (match[DATE_TO_GROUP]) {\n result.end = result.start.clone();\n result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n }\n\n result.tags['PTMonthNameLittleEndianParser'] = true;\n return result;\n };\n}\n","/*\n Date format with slash \"/\" (also \"-\" and \".\") between numbers\n - Martes 3/11/2015\n - 3/11/2015\n - 3/11\n*/\nconst dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:' +\n '((?: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))' +\n '\\\\s*\\\\,?\\\\s*' +\n ')?' +\n '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n '(?:' +\n '[\\\\/\\\\.\\\\-]' +\n '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n ')?' +\n '(\\\\W|$)', 'i');\n\nvar 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,\n 'quinta': 4, 'quinta-feira': 4, 'qui': 4, 'sexta': 5, 'sexta-feira': 5, 'sex': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function PTSlashDateFormatParser(argument) {\n Parser.apply(this, arguments);\n\n this.pattern = function () { return PATTERN; };\n this.extract = function(text, ref, match, opt){\n\n if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n // Long skip, if there is some overlapping like:\n // XX[/YY/ZZ]\n // [XX/YY/]ZZ\n match.index += match[0].length\n return;\n }\n\n var index = match.index + match[OPENNING_GROUP].length;\n var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n var result = new ParsedResult({\n text: text,\n index: index,\n ref: ref,\n });\n\n if(text.match(/^\\d\\.\\d$/)) return;\n if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n // MM/dd -> OK\n // MM.dd -> NG\n if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n var date = null;\n var year = match[YEAR_GROUP] || dayjs(ref).year() + '';\n var month = match[MONTH_GROUP];\n var day = match[DAY_GROUP];\n\n month = parseInt(month);\n day = parseInt(day);\n year = parseInt(year);\n\n if(month < 1 || month > 12) {\n if(month > 12) {\n // dd/mm/yyyy date format if day looks like a month, and month\n // looks like a day.\n if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n // unambiguous\n var tday = month;\n month = day;\n day = tday;\n }\n else {\n // both month and day are <= 12\n return null;\n }\n }\n }\n if(day < 1 || day > 31) return null;\n\n if(year < 100){\n if(year > 50){\n year = year + 1900;\n }else{\n year = year + 2000;\n }\n }\n\n result.start.assign('day', day);\n result.start.assign('month', month);\n result.start.assign('year', year);\n\n //Day of week\n if(match[WEEKDAY_GROUP]) {\n result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n }\n\n result.tags['PTSlashDateFormatParser'] = true;\n return result;\n };\n};","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)há\\s*([0-9]+|mei[oa]|uma?)\\s*(minutos?|horas?|semanas?|dias?|mes(es)?|anos?)(?=(?:\\W|$))/i;\n\nexports.Parser = function PTTimeAgoFormatParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n }\n\n this.extract = function(text, ref, match, opt){\n\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n var text = match[0];\n text = match[0].substr(match[1].length, match[0].length - match[1].length);\n index = match.index + match[1].length;\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var num = parseInt(match[2]);\n if (isNaN(num)) {\n if (match[2].match(/mei/)) {\n num = 0.5;\n } else {\n num = 1;\n }\n }\n\n var date = dayjs(ref);\n\n if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n if (match[3].match(/hora/)) {\n\n date = date.add(-num, 'hour');\n\n } else if (match[3].match(/minuto/)) {\n\n date = date.add(-num, 'minute');\n }\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.tags['PTTimeAgoFormatParser'] = true;\n return result;\n }\n\n if (match[3].match(/semana/)) {\n date = date.add(-num, 'week');\n\n result.start.imply('day', date.date());\n result.start.imply('month', date.month() + 1);\n result.start.imply('year', date.year());\n result.start.imply('weekday', date.day());\n return result;\n }\n\n if (match[3].match(/dia/)) {\n date = date.add(-num, 'd');\n }\n\n if (match[3].match(/mes/)) {\n date = date.add(-num, 'month');\n }\n\n if (match[3].match(/ano/)) {\n\n date = date.add(-num, 'year');\n }\n\n result.start.assign('day', date.date());\n result.start.assign('month', date.month() + 1);\n result.start.assign('year', date.year());\n return result;\n\n };\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN = new RegExp(\"(^|\\\\s|T)\" +\n \"(?:(?:ao?|às?|das|da|do)\\\\s*)?\" +\n \"(\\\\d{1,4}|meio-dia|meia-noite|meio dia|meia noite)\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\:|\\\\:)(\\\\d{2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:o)?|\\\\?)\\\\s*\" +\n \"(\\\\d{1,4})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \"(?:\" +\n \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n \")?\" +\n \")?\" +\n \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP = 2;\nvar MINUTE_GROUP = 3;\nvar SECOND_GROUP = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function PTTimeExpressionParser(){\n Parser.apply(this, arguments);\n\n this.pattern = function() { return FIRST_REG_PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n var refMoment = dayjs(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index + match[1].length;\n result.text = match[0].substring(match[1].length);\n result.tags['PTTimeExpressionParser'] = true;\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month()+1);\n result.start.imply('year', refMoment.year());\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.start.assign('second', second);\n }\n\n // ----- Hours\n if (match[HOUR_GROUP].toLowerCase().match(/meio\\-di/)){\n meridiem = 1;\n hour = 12;\n } else if (match[HOUR_GROUP].toLowerCase() == \"meia-noite\") {\n meridiem = 0;\n hour = 0;\n } else {\n hour = parseInt(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if(match[MINUTE_GROUP] != null){\n minute = parseInt(match[MINUTE_GROUP]);\n } else if(hour > 100) {\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if(match[AM_PM_HOUR_GROUP] != null) {\n if(hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if(ampm == \"a\"){\n meridiem = 0;\n if(hour == 12) hour = 0;\n }\n\n if(ampm == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n }\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) {\n return null;\n }\n return result;\n }\n\n\n\n // Pattern \"YY.YY -XXXX\" is more like timezone offset\n if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n return result;\n }\n\n if(result.end == null){\n result.end = new ParsedComponents(null, result.start.date());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if(match[SECOND_GROUP] != null){\n var second = parseInt(match[SECOND_GROUP]);\n if(second >= 60) return null;\n\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[2]);\n\n // ----- Minute\n if (match[MINUTE_GROUP]!= null) {\n\n minute = parseInt(match[MINUTE_GROUP]);\n if(minute >= 60) return result;\n\n } else if (hour > 100) {\n\n minute = hour%100;\n hour = parseInt(hour/100);\n }\n\n if(minute >= 60) {\n return null;\n }\n\n if(hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP] != null){\n\n if (hour > 12) return null;\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n meridiem = 0;\n if(hour == 12) {\n hour = 0;\n if (!result.end.isCertain('day')) {\n result.end.imply('day', result.end.get('day') + 1);\n }\n }\n }\n\n if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n meridiem = 1;\n if(hour != 12) hour += 12;\n }\n\n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n\n result.start.imply('meridiem', 0);\n\n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n\n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12);\n }\n }\n }\n\n } else if(hour >= 12) {\n meridiem = 1;\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n\n return result;\n }\n}\n","var Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar 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,\n 'quinta': 4, 'quinta-feira': 4, 'qui': 4, 'sexta': 5, 'sexta-feira': 5, 'sex': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n '(?:(este|esta|passado|pr[oó]ximo)\\\\s*)?' +\n '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n '(?:\\\\s*(este|esta|passado|pr[óo]ximo)\\\\s*semana)?' +\n '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function PTWeekdayParser() {\n Parser.apply(this, arguments);\n\n this.pattern = function() { return PATTERN; }\n\n this.extract = function(text, ref, match, opt){\n var index = match.index + match[1].length;\n var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n var offset = DAYS_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var modifier = null;\n var prefix = match[PREFIX_GROUP];\n var postfix = match[POSTFIX_GROUP];\n if (prefix || postfix) {\n var norm = prefix || postfix;\n norm = norm.toLowerCase();\n\n if(norm == 'passado') {\n modifier = 'this';\n }\n else if(norm == 'próximo' || norm == 'proximo') {\n modifier = 'next';\n }\n else if(norm== 'este') {\n modifier = 'this';\n }\n }\n\n updateParsedComponent(result, ref, offset, modifier);\n result.tags['PTWeekdayParser'] = true;\n return result;\n }\n}\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n '(而家|立(?:刻|即)|即刻)|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s|,|,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?', 'i');\n\nvar NOW_GROUP = 1;\nvar DAY_GROUP_1 = 2;\nvar TIME_GROUP_1 = 3;\nvar TIME_GROUP_2 = 4;\nvar DAY_GROUP_3 = 5;\nvar TIME_GROUP_3 = 6;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n text = match[0];\n var index = match.index;\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref,\n });\n\n var refMoment = dayjs(ref);\n var startMoment = refMoment;\n\n if (match[NOW_GROUP]) {\n result.start.imply('hour', refMoment.hour());\n result.start.imply('minute', refMoment.minute());\n result.start.imply('second', refMoment.second());\n result.start.imply('millisecond', refMoment.millisecond());\n } else if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n var time1 = match[TIME_GROUP_1];\n\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n startMoment = startMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n startMoment = startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment = startMoment.add(-3, 'day');\n } else if ( day1 == \"後\"){\n startMoment = startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment = startMoment.add(3, 'day');\n }\n\n if (time1 == '早' || time1 == '朝') {\n result.start.imply('hour', 6);\n } else if (time1 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n }\n\n } else if (match[TIME_GROUP_2]) {\n var timeString2 = match[TIME_GROUP_2];\n var time2 = timeString2[0];\n if (time2 == '早' || time2 == '朝' || time2 == '上') {\n result.start.imply('hour', 6);\n } else if (time2 == '下' || time2 == '晏') {\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n } else if (time2 == '中') {\n result.start.imply('hour', 12);\n result.start.imply('meridiem', 1);\n } else if (time2 == '夜' || time2 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (time2 == '凌') {\n result.start.imply('hour', 0);\n }\n\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n\n if (day3 == '明' || day3 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment = startMoment.add(1, 'day');\n }\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n startMoment = startMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n startMoment = startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment = startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment = startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment = startMoment.add(3, 'day');\n }\n\n\n var timeString3 = match[TIME_GROUP_3];\n if (timeString3) {\n var time3 = timeString3[0];\n if (time3 == '早' || time3 == '朝' || time3 == '上') {\n result.start.imply('hour', 6);\n } else if (time3 == '下' || time3 == '晏') {\n result.start.imply('hour', 15);\n result.start.imply('meridiem', 1);\n } else if (time3 == '中') {\n result.start.imply('hour', 12);\n result.start.imply('meridiem', 1);\n } else if (time3 == '夜' || time3 == '晚') {\n result.start.imply('hour', 22);\n result.start.imply('meridiem', 1);\n } else if (time3 == '凌') {\n result.start.imply('hour', 0);\n }\n }\n }\n\n result.start.assign('day', startMoment.date())\n result.start.assign('month', startMoment.month() + 1)\n result.start.assign('year', startMoment.year())\n result.tags.ZHHantCasualDateParser = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(\\\\d{2,4}|[' + Object.keys(util.NUMBER).join('') + ']{2,4})?' +\n '(?:\\\\s*)' +\n '(?:年)?' +\n '(?:[\\\\s|,|,]*)' +\n '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})' +\n '(?:\\\\s*)' +\n '(?:月)' +\n '(?:\\\\s*)' +\n '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})?' +\n '(?:\\\\s*)' +\n '(?:日|號)?'\n);\n\nvar YEAR_GROUP = 1;\nvar MONTH_GROUP = 2;\nvar DAY_GROUP = 3;\n\nexports.Parser = function ZHHantDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var startMoment = dayjs(ref);\n var result = new ParsedResult({\n text: match[0],\n index: match.index,\n ref: ref,\n });\n\n //Month\n var month = parseInt(match[MONTH_GROUP]);\n if (isNaN(month)) month = util.zhStringToNumber(match[MONTH_GROUP]);\n result.start.assign('month', month);\n\n //Day\n if (match[DAY_GROUP]) {\n var day = parseInt(match[DAY_GROUP]);\n if (isNaN(day)) day = util.zhStringToNumber(match[DAY_GROUP]);\n result.start.assign('day', day);\n } else {\n result.start.imply('day', startMoment.date());\n }\n\n //Year\n if (match[YEAR_GROUP]) {\n var year = parseInt(match[YEAR_GROUP]);\n if (isNaN(year)) year = util.zhStringToYear(match[YEAR_GROUP]);\n result.start.assign('year', year);\n } else {\n result.start.imply('year', startMoment.year());\n }\n\n result.tags.ZHHantDateParser = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+|半|幾)(?:\\\\s*)' +\n '(?:個)?' +\n '(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)' +\n '(?:(?:之|過)?後|(?:之)?內)', 'i'\n);\n\nvar NUMBER_GROUP = 1;\nvar UNIT_GROUP = 2;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var index = match.index;\n text = match[0];\n\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var number = parseInt(match[NUMBER_GROUP]);\n if (isNaN(number)){\n number = util.zhStringToNumber(match[NUMBER_GROUP]);\n }\n\n if (isNaN(number)){\n var string = match[NUMBER_GROUP];\n if (string === '幾'){\n number = 3;\n }else if(string === '半'){\n number = 0.5;\n }else{\n\n //just in case\n return null;\n }\n }\n\n var date = dayjs(ref);\n var unit = match[UNIT_GROUP];\n var unitAbbr = unit[0];\n\n if (unitAbbr.match(/[日天星禮月年]/)){\n if(unitAbbr == '日' || unitAbbr == '天'){\n date = date.add(number, 'd');\n }else if(unitAbbr == '星' || unitAbbr == '禮'){\n date = date.add(number * 7, 'd');\n }else if(unitAbbr == '月'){\n date = date.add(number, 'month');\n }else if(unitAbbr == '年'){\n date = date.add(number, 'year');\n }\n\n result.start.assign('year', date.year());\n result.start.assign('month', date.month() + 1);\n result.start.assign('day', date.date());\n return result;\n }\n\n if(unitAbbr == '秒'){\n date = date.add(number, 'second');\n }else if(unitAbbr == '分'){\n date = date.add(number, 'minute');\n }else if(unitAbbr == '小' || unitAbbr == '鐘'){\n date = date.add(number, 'hour');\n }\n\n result.start.imply('year', date.year());\n result.start.imply('month', date.month() + 1);\n result.start.imply('day', date.date());\n result.start.assign('hour', date.hour());\n result.start.assign('minute', date.minute());\n result.start.assign('second', date.second());\n result.tags.ZHHantDeadlineFormatParser = true;\n return result;\n };\n};\n","const dayjs = require('dayjs');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar patternString1 = '(?:由|從|自)?' +\n '(?:' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s,,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n ')?' +\n '(?:[\\\\s,,]*)' +\n '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n '(?:\\\\s*)' +\n '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n '(?:\\\\s*)' +\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar patternString2 = '(?:\\\\s*(?:到|至|\\\\-|\\\\–|\\\\~|\\\\〜)\\\\s*)' +\n '(?:' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n '(?:[\\\\s,,]*)' +\n '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n ')?' +\n '(?:[\\\\s,,]*)' +\n '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n '(?:\\\\s*)' +\n '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n '(?:\\\\s*)' +\n '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar FIRST_REG_PATTERN = new RegExp(patternString1, 'i');\nvar SECOND_REG_PATTERN = new RegExp(patternString2, 'i');\n\nvar DAY_GROUP_1 = 1;\nvar ZH_AM_PM_HOUR_GROUP_1 = 2;\nvar ZH_AM_PM_HOUR_GROUP_2 = 3;\nvar DAY_GROUP_3 = 4;\nvar ZH_AM_PM_HOUR_GROUP_3 = 5;\nvar HOUR_GROUP = 6;\nvar MINUTE_GROUP = 7;\nvar SECOND_GROUP = 8;\nvar AM_PM_HOUR_GROUP = 9;\n\nexports.Parser = function ZHHantTimeExpressionParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return FIRST_REG_PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n\n // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n if (match.index > 0 && text[match.index - 1].match(/\\w/)) return null;\n var refMoment = dayjs(ref);\n var result = new ParsedResult();\n result.ref = ref;\n result.index = match.index;\n result.text = match[0];\n result.tags.ZHTimeExpressionParser = true;\n\n var startMoment = refMoment.clone();\n\n // ----- Day\n if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n startMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n startMoment.add(3, 'day');\n }\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n if (day3 == '明' || day3 == '聽') {\n startMoment.add(1, 'day');\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n startMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n startMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n startMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n startMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n startMoment.add(3, 'day');\n }\n result.start.assign('day', startMoment.date());\n result.start.assign('month', startMoment.month() + 1);\n result.start.assign('year', startMoment.year());\n } else {\n result.start.imply('day', startMoment.date());\n result.start.imply('month', startMoment.month() + 1);\n result.start.imply('year', startMoment.year());\n }\n\n var hour = 0;\n var minute = 0;\n var meridiem = -1;\n\n // ----- Second\n if (match[SECOND_GROUP]) {\n var second = parseInt(match[SECOND_GROUP]);\n if (isNaN(second)) {\n second = util.zhStringToNumber(match[SECOND_GROUP]);\n }\n if (second >= 60) return null;\n result.start.assign('second', second);\n }\n\n hour = parseInt(match[HOUR_GROUP]);\n if (isNaN(hour)) {\n hour = util.zhStringToNumber(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if (match[MINUTE_GROUP]) {\n if (match[MINUTE_GROUP] == '半') {\n minute = 30;\n } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n minute = 0;\n } else {\n minute = parseInt(match[MINUTE_GROUP]);\n if (isNaN(minute)) {\n minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n }\n }\n } else if (hour > 100) {\n minute = hour % 100;\n hour = parseInt(hour / 100);\n }\n\n if (minute >= 60) {\n return null;\n }\n\n if (hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP]) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm == \"a\") {\n meridiem = 0;\n if (hour == 12) hour = 0;\n }\n\n if (ampm == \"p\") {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n var zhAMPM1 = zhAMPMString1[0];\n if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM1 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n var zhAMPM2 = zhAMPMString2[0];\n if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n var zhAMPM3 = zhAMPMString3[0];\n if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n }\n\n result.start.assign('hour', hour);\n result.start.assign('minute', minute);\n\n if (meridiem >= 0) {\n result.start.assign('meridiem', meridiem);\n } else {\n if (hour < 12) {\n result.start.imply('meridiem', 0);\n } else {\n result.start.imply('meridiem', 1);\n }\n }\n\n // ==============================================================\n // Extracting the 'to' chunk\n // ==============================================================\n\n match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n // Not accept number only result\n if (result.text.match(/^\\d+$/)) {\n return null;\n }\n return result;\n }\n\n var endMoment = startMoment.clone();\n result.end = new ParsedComponents(null, null);\n\n // ----- Day\n if (match[DAY_GROUP_1]) {\n var day1 = match[DAY_GROUP_1];\n if (day1 == '明' || day1 == '聽') {\n // Check not \"Tomorrow\" on late night\n if(refMoment.hour() > 1) {\n endMoment.add(1, 'day');\n }\n } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n endMoment.add(-1, 'day');\n } else if (day1 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day1 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day1 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day1 == \"大後\"){\n endMoment.add(3, 'day');\n }\n result.end.assign('day', endMoment.date());\n result.end.assign('month', endMoment.month() + 1);\n result.end.assign('year', endMoment.year());\n } else if (match[DAY_GROUP_3]) {\n var day3 = match[DAY_GROUP_3];\n if (day3 == '明' || day3 == '聽') {\n endMoment.add(1, 'day');\n } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n endMoment.add(-1, 'day');\n } else if (day3 == \"前\"){\n endMoment.add(-2, 'day');\n } else if (day3 == \"大前\"){\n endMoment.add(-3, 'day');\n } else if (day3 == \"後\"){\n endMoment.add(2, 'day');\n } else if (day3 == \"大後\"){\n endMoment.add(3, 'day');\n }\n result.end.assign('day', endMoment.date());\n result.end.assign('month', endMoment.month() + 1);\n result.end.assign('year', endMoment.year());\n } else {\n result.end.imply('day', endMoment.date());\n result.end.imply('month', endMoment.month() + 1);\n result.end.imply('year', endMoment.year());\n }\n\n hour = 0;\n minute = 0;\n meridiem = -1;\n\n // ----- Second\n if (match[SECOND_GROUP]) {\n var second = parseInt(match[SECOND_GROUP]);\n if (isNaN(second)) {\n second = util.zhStringToNumber(match[SECOND_GROUP]);\n }\n\n if (second >= 60) return null;\n result.end.assign('second', second);\n }\n\n hour = parseInt(match[HOUR_GROUP]);\n if (isNaN(hour)) {\n hour = util.zhStringToNumber(match[HOUR_GROUP]);\n }\n\n // ----- Minutes\n if (match[MINUTE_GROUP]) {\n if (match[MINUTE_GROUP] == '半') {\n minute = 30;\n } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n minute = 0;\n } else {\n minute = parseInt(match[MINUTE_GROUP]);\n if (isNaN(minute)) {\n minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n }\n }\n } else if (hour > 100) {\n minute = hour % 100;\n hour = parseInt(hour / 100);\n }\n\n if (minute >= 60) {\n return null;\n }\n\n if (hour > 24) {\n return null;\n }\n if (hour >= 12) {\n meridiem = 1;\n }\n\n // ----- AM & PM\n if (match[AM_PM_HOUR_GROUP]) {\n if (hour > 12) return null;\n var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n if (ampm == \"a\") {\n meridiem = 0;\n if (hour == 12) hour = 0;\n }\n\n if (ampm == \"p\") {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n\n if (!result.start.isCertain('meridiem')) {\n if (meridiem == 0) {\n\n result.start.imply('meridiem', 0);\n\n if (result.start.get('hour') == 12) {\n result.start.assign('hour', 0);\n }\n\n } else {\n\n result.start.imply('meridiem', 1);\n\n if (result.start.get('hour') != 12) {\n result.start.assign('hour', result.start.get('hour') + 12);\n }\n }\n }\n\n } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n var zhAMPM1 = zhAMPMString1[0];\n if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM1 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n var zhAMPM2 = zhAMPMString2[0];\n if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n var zhAMPM3 = zhAMPMString3[0];\n if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n meridiem = 0;\n if (hour == 12) hour = 0;\n } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n meridiem = 1;\n if (hour != 12) hour += 12;\n }\n }\n\n result.text = result.text + match[0];\n result.end.assign('hour', hour);\n result.end.assign('minute', minute);\n if (meridiem >= 0) {\n result.end.assign('meridiem', meridiem);\n } else {\n var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n if (startAtPM && result.start.get('hour') > hour) {\n // 10pm - 1 (am)\n result.end.imply('meridiem', 0);\n\n } else if (hour > 12) {\n result.end.imply('meridiem', 1);\n }\n }\n\n if (result.end.date().getTime() < result.start.date().getTime()) {\n result.end.imply('day', result.end.get('day') + 1)\n }\n\n return result;\n };\n};\n","var Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n '(上|今|下|這|呢)?' +\n '(?:個)?' +\n '(?:星期|禮拜)' +\n '(' + Object.keys(util.WEEKDAY_OFFSET).join('|') + ')'\n);\n\nvar PREFIX_GROUP = 1;\nvar WEEKDAY_GROUP = 2;\n\nexports.Parser = function ZHHantWeekdayParser() {\n\n Parser.apply(this, arguments);\n\n this.pattern = function() {\n return PATTERN;\n };\n\n this.extract = function(text, ref, match, opt) {\n var index = match.index;\n text = match[0];\n var result = new ParsedResult({\n index: index,\n text: text,\n ref: ref\n });\n\n var dayOfWeek = match[WEEKDAY_GROUP];\n var offset = util.WEEKDAY_OFFSET[dayOfWeek];\n if(offset === undefined) return null;\n\n var modifier = null;\n var prefix = match[PREFIX_GROUP];\n\n if(prefix == '上') {\n modifier = 'last';\n } else if(prefix == '下') {\n modifier = 'next';\n } else if(prefix == '今' || prefix == '這' || prefix == '呢') {\n modifier = 'this';\n }\n\n updateParsedComponent(result, ref, offset, modifier);\n result.tags['ZHHantWeekdayParser'] = true;\n return result;\n };\n};\n","/*\n\n*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\nvar DEFAULT_TIMEZONE_ABBR_MAP = {\n \"ACDT\":630,\"ACST\":570,\"ADT\":-180,\"AEDT\":660,\"AEST\":600,\"AFT\":270,\"AKDT\":-480,\"AKST\":-540,\"ALMT\":360,\"AMST\":-180,\"AMT\":-240,\"ANAST\":720,\"ANAT\":720,\"AQTT\":300,\"ART\":-180,\"AST\":-240,\"AWDT\":540,\"AWST\":480,\"AZOST\":0,\"AZOT\":-60,\"AZST\":300,\"AZT\":240,\"BNT\":480,\"BOT\":-240,\"BRST\":-120,\"BRT\":-180,\"BST\":60,\"BTT\":360,\"CAST\":480,\"CAT\":120,\"CCT\":390,\"CDT\":-300,\"CEST\":120,\"CET\":60,\"CHADT\":825,\"CHAST\":765,\"CKT\":-600,\"CLST\":-180,\"CLT\":-240,\"COT\":-300,\"CST\":-360,\"CVT\":-60,\"CXT\":420,\"ChST\":600,\"DAVT\":420,\"EASST\":-300,\"EAST\":-360,\"EAT\":180,\"ECT\":-300,\"EDT\":-240,\"EEST\":180,\"EET\":120,\"EGST\":0,\"EGT\":-60,\"EST\":-300,\"ET\":-300,\"FJST\":780,\"FJT\":720,\"FKST\":-180,\"FKT\":-240,\"FNT\":-120,\"GALT\":-360,\"GAMT\":-540,\"GET\":240,\"GFT\":-180,\"GILT\":720,\"GMT\":0,\"GST\":240,\"GYT\":-240,\"HAA\":-180,\"HAC\":-300,\"HADT\":-540,\"HAE\":-240,\"HAP\":-420,\"HAR\":-360,\"HAST\":-600,\"HAT\":-90,\"HAY\":-480,\"HKT\":480,\"HLV\":-210,\"HNA\":-240,\"HNC\":-360,\"HNE\":-300,\"HNP\":-480,\"HNR\":-420,\"HNT\":-150,\"HNY\":-540,\"HOVT\":420,\"ICT\":420,\"IDT\":180,\"IOT\":360,\"IRDT\":270,\"IRKST\":540,\"IRKT\":540,\"IRST\":210,\"IST\":330,\"JST\":540,\"KGT\":360,\"KRAST\":480,\"KRAT\":480,\"KST\":540,\"KUYT\":240,\"LHDT\":660,\"LHST\":630,\"LINT\":840,\"MAGST\":720,\"MAGT\":720,\"MART\":-510,\"MAWT\":300,\"MDT\":-360,\"MESZ\":120,\"MEZ\":60,\"MHT\":720,\"MMT\":390,\"MSD\":240,\"MSK\":240,\"MST\":-420,\"MUT\":240,\"MVT\":300,\"MYT\":480,\"NCT\":660,\"NDT\":-90,\"NFT\":690,\"NOVST\":420,\"NOVT\":360,\"NPT\":345,\"NST\":-150,\"NUT\":-660,\"NZDT\":780,\"NZST\":720,\"OMSST\":420,\"OMST\":420,\"PDT\":-420,\"PET\":-300,\"PETST\":720,\"PETT\":720,\"PGT\":600,\"PHOT\":780,\"PHT\":480,\"PKT\":300,\"PMDT\":-120,\"PMST\":-180,\"PONT\":660,\"PST\":-480,\"PT\":-480,\"PWT\":540,\"PYST\":-180,\"PYT\":-240,\"RET\":240,\"SAMT\":240,\"SAST\":120,\"SBT\":660,\"SCT\":240,\"SGT\":480,\"SRT\":-180,\"SST\":-660,\"TAHT\":-600,\"TFT\":300,\"TJT\":300,\"TKT\":780,\"TLT\":540,\"TMT\":300,\"TVT\":720,\"ULAT\":480,\"UTC\":0,\"UYST\":-120,\"UYT\":-180,\"UZT\":300,\"VET\":-210,\"VLAST\":660,\"VLAT\":660,\"VUT\":660,\"WAST\":120,\"WAT\":60,\"WEST\":60,\"WESZ\":60,\"WET\":0,\"WEZ\":0,\"WFT\":720,\"WGST\":-120,\"WGT\":-180,\"WIB\":420,\"WIT\":540,\"WITA\":480,\"WST\":780,\"WT\":0,\"YAKST\":600,\"YAKT\":600,\"YAPT\":600,\"YEKST\":360,\"YEKT\":360\n};\n\nexports.Refiner = function ExtractTimezoneAbbrRefiner(config) {\n\tRefiner.call(this, arguments);\n\n\tthis.refine = function(text, results, opt) {\n\n\t var timezones = new Object(DEFAULT_TIMEZONE_ABBR_MAP);\n\t if (opt.timezones) {\n\t for (var name in opt.timezones) {\n timezones[name] = opt.timezones[name];\n }\n }\n\n\t\tresults.forEach(function(result) {\n\n if (!result.tags['ENTimeExpressionParser'] &&\n !result.tags['ZHTimeExpressionParser'] &&\n !result.tags['FRTimeExpressionParser'] &&\n !result.tags['DETimeExpressionParser']) {\n return;\n }\n\n var match = TIMEZONE_NAME_PATTERN.exec(text.substring(result.index + result.text.length));\n if (match) {\n var timezoneAbbr = match[1].toUpperCase();\n if (timezones[timezoneAbbr] === undefined) {\n return;\n }\n\n var timezoneOffset = timezones[timezoneAbbr];\n if (!result.start.isCertain('timezoneOffset')) {\n result.start.assign('timezoneOffset', timezoneOffset);\n }\n\n if (result.end != null && !result.end.isCertain('timezoneOffset')) {\n result.end.assign('timezoneOffset', timezoneOffset);\n }\n\n result.text += match[0];\n result.tags['ExtractTimezoneAbbrRefiner'] = true;\n }\n\t\t});\n\n return results;\n\t}\n};","/*\n \n*/\nvar Refiner = require('./refiner').Refiner;\n\n\nvar TIMEZONE_OFFSET_PATTERN = new RegExp(\"^\\\\s*(GMT|UTC)?(\\\\+|\\\\-)(\\\\d{1,2}):?(\\\\d{2})\", 'i');\nvar TIMEZONE_OFFSET_SIGN_GROUP = 2;\nvar TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 3;\nvar TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 4;\n\nexports.Refiner = function ExtractTimezoneOffsetRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n results.forEach(function(result) {\n\n if (result.start.isCertain('timezoneOffset')) {\n return;\n }\n\n var match = TIMEZONE_OFFSET_PATTERN.exec(text.substring(result.index + result.text.length));\n if (!match) {\n return;\n }\n\n var hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);\n var minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP]);\n var timezoneOffset = hourOffset * 60 + minuteOffset;\n if (match[TIMEZONE_OFFSET_SIGN_GROUP] === '-') {\n timezoneOffset = -timezoneOffset;\n }\n\n if (result.end != null) {\n result.end.assign('timezoneOffset', timezoneOffset);\n }\n\n result.start.assign('timezoneOffset', timezoneOffset);\n result.text += match[0];\n result.tags['ExtractTimezoneOffsetRefiner'] = true;\n });\n\n return results;\n }\n}\n","/*\n Enforce 'forwardDate' option to on the results. When there are missing component,\n e.g. \"March 12-13 (without year)\" or \"Thursday\", the refiner will try to adjust the result\n into the future instead of the past.\n*/\nvar dayjs = require('dayjs');\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function ForwardDateRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n if (!opt['forwardDate']) {\n return results;\n }\n\n results.forEach(function(result) {\n\n var refMoment = dayjs(result.ref);\n\n if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())\n ) {\n // Adjust year into the future\n for (var i=0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) {\n result.start.imply('year', result.start.get('year') + 1);\n\n if (result.end && !result.end.isCertain('year')) {\n result.end.imply('year', result.end.get('year') + 1);\n }\n }\n\n result.tags['ForwardDateRefiner'] = true;\n }\n\n if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) {\n // Adjust date to the coming week\n if (refMoment.day() > result.start.get('weekday')) {\n refMoment = refMoment.day(result.start.get('weekday') + 7);\n } else {\n refMoment = refMoment.day(result.start.get('weekday'));\n }\n\n result.start.imply('day', refMoment.date());\n result.start.imply('month', refMoment.month() + 1);\n result.start.imply('year', refMoment.year());\n result.tags['ForwardDateRefiner'] = true;\n }\n });\n\n return results;\n }\n};\n","/*\n \n*/\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function OverlapRemovalRefiner() {\n\tRefiner.call(this);\n\t\n\n\tthis.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n \n var filteredResults = [];\n var prevResult = results[0];\n \n for (var i=1; i<results.length; i++){\n \n var result = results[i];\n \n // If overlap, compare the length and discard the shorter one\n if (result.index < prevResult.index + prevResult.text.length) {\n\n if (result.text.length > prevResult.text.length){\n prevResult = result;\n }\n \n } else {\n filteredResults.push(prevResult);\n prevResult = result;\n }\n }\n \n // The last one\n if (prevResult != null) {\n filteredResults.push(prevResult);\n }\n\n return filteredResults;\n }\n}","/*\n \n*/\nvar Filter = require('./refiner').Filter;\n\nexports.Refiner = function UnlikelyFormatFilter() {\n Filter.call(this);\n \n\n this.isValid = function(text, result, opt) { \n\n if (result.text.replace(' ','').match(/^\\d*(\\.\\d*)?$/)) {\n return false;\n }\n\n return true; \n }\n}","/*\n \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function DEMergeDateRangeRefiner() {\n ENMergeDateRangeRefiner.call(this);\n\n this.pattern = function () {\n return /^\\s*(bis(?:\\s*(?:am|zum))?|\\-)\\s*$/i\n };\n};\n","/*\n \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\nvar isDateOnly = require('../en/ENMergeDateTimeRefiner').isDateOnly;\nvar isTimeOnly = require('../en/ENMergeDateTimeRefiner').isTimeOnly;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|um|am|,|-)?\\\\s*$\");\n\nfunction isAbleToMerge(text, prevResult, curResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n return textBetween.match(PATTERN);\n}\n\nfunction mergeResult(text, dateResult, timeResult){\n\n var beginDate = dateResult.start;\n var beginTime = timeResult.start; \n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n\n if (dateResult.end != null || timeResult.end != null) {\n \n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\n \n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n // Ex. 9pm - 1am\n if (endDateTime.isCertain('day')) {\n endDateTime.assign('day', endDateTime.get('day') + 1);\n } else {\n endDateTime.imply('day', endDateTime.get('day') + 1);\n }\n }\n\n dateResult.end = endDateTime;\n }\n\n dateResult.start = beginDateTime; \n\n var startIndex = Math.min(dateResult.index, timeResult.index);\n var endIndex = Math.max(\n dateResult.index + dateResult.text.length, \n timeResult.index + timeResult.text.length);\n \n dateResult.index = startIndex;\n dateResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in timeResult.tags) {\n dateResult.tags[tag] = true;\n }\n dateResult.tags['DEMergeDateAndTimeRefiner'] = true;\n return dateResult;\n}\n\nexports.Refiner = function DEMergeDateTimeRefiner() {\n Refiner.call(this);\n\n\n this.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n \n if (isDateOnly(prevResult) && isTimeOnly(currResult) \n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n \n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, currResult, prevResult);\n currResult = null;\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}","/*\n \n*/\nvar Refiner = require('../refiner').Refiner;\n\nexports.Refiner = function ENMergeDateRangeRefiner() {\n Refiner.call(this);\n\n this.pattern = function () { return /^\\s*(to|\\-)\\s*$/i };\n\n this.refine = function(text, results, opt) {\n\n if (results.length < 2) return results;\n \n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n \n for (var i=1; i<results.length; i++){\n \n currResult = results[i];\n prevResult = results[i-1];\n \n if (!prevResult.end && !currResult.end \n && this.isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = this.mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n \n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n\n return mergedResult;\n };\n\n this.isAbleToMerge = function(text, result1, result2) {\n var begin = result1.index + result1.text.length;\n var end = result2.index;\n var textBetween = text.substring(begin,end);\n\n return textBetween.match(this.pattern());\n };\n\n this.mergeResult = function(text, fromResult, toResult) {\n\n if (!fromResult.isOnlyWeekday() && !toResult.isOnlyWeekday()) {\n \n var timeKeys = {'hour': true, 'minute': true, 'second': true};\n\n for (var key in toResult.start.knownValues) {\n if (!fromResult.start.isCertain(key)) {\n fromResult.start.assign(key, toResult.start.get(key));\n }\n }\n\n for (var key in fromResult.start.knownValues) {\n if (!toResult.start.isCertain(key)) {\n toResult.start.assign(key, fromResult.start.get(key));\n }\n }\n }\n\n if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {\n \n var fromMoment = fromResult.start.dayjs();\n var toMoment = toResult.start.dayjs();\n\n if (fromResult.isOnlyWeekday() && fromMoment.add(-7, 'days').isBefore(toMoment)) {\n fromMoment = fromMoment.add(-7, 'days');\n fromResult.start.imply('day', fromMoment.date());\n fromResult.start.imply('month', fromMoment.month() + 1);\n fromResult.start.imply('year', fromMoment.year());\n } else if (toResult.isOnlyWeekday() && toMoment.add(7, 'days').isAfter(fromMoment)) {\n toMoment = toMoment.add(7, 'days');\n toResult.start.imply('day', toMoment.date());\n toResult.start.imply('month', toMoment.month() + 1);\n toResult.start.imply('year', toMoment.year());\n } else {\n var tmp = toResult;\n toResult = fromResult;\n fromResult = tmp;\n }\n }\n \n fromResult.end = toResult.start;\n\n \n\n for (var tag in toResult.tags) {\n fromResult.tags[tag] = true;\n }\n\n \n var startIndex = Math.min(fromResult.index, toResult.index);\n var endIndex = Math.max(\n fromResult.index + fromResult.text.length, \n toResult.index + toResult.text.length);\n \n fromResult.index = startIndex;\n fromResult.text = text.substring(startIndex, endIndex);\n fromResult.tags[this.constructor.name] = true;\n return fromResult;\n }\n};\n\n","/*\n \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|at|after|before|on|of|,|-)?\\\\s*$\");\n\nvar isDateOnly = exports.isDateOnly = function(result) {\n return !result.start.isCertain('hour');\n}\n \nvar isTimeOnly = exports.isTimeOnly = function(result) {\n return !result.start.isCertain('month') && !result.start.isCertain('weekday');\n}\n\nvar isAbleToMerge = exports.isAbleToMerge = function(text, prevResult, curResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n return textBetween.match(PATTERN);\n}\n\nvar mergeDateTimeComponent = exports.mergeDateTimeComponent = function(dateComponent, timeComponent) {\n var dateTimeComponent = dateComponent.clone();\n\n if (timeComponent.isCertain('hour')) {\n dateTimeComponent.assign('hour', timeComponent.get('hour'));\n dateTimeComponent.assign('minute', timeComponent.get('minute'));\n\n if (timeComponent.isCertain('second')) {\n dateTimeComponent.assign('second', timeComponent.get('second'));\n\n if (timeComponent.isCertain('millisecond')) {\n dateTimeComponent.assign('millisecond', timeComponent.get('millisecond'));\n } else {\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n } else {\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n \n } else {\n dateTimeComponent.imply('hour', timeComponent.get('hour'));\n dateTimeComponent.imply('minute', timeComponent.get('minute'));\n dateTimeComponent.imply('second', timeComponent.get('second'));\n dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n }\n\n if (timeComponent.isCertain('meridiem')) {\n dateTimeComponent.assign('meridiem', timeComponent.get('meridiem'));\n } else if (\n timeComponent.get('meridiem') !== undefined &&\n dateTimeComponent.get('meridiem') === undefined\n ) {\n dateTimeComponent.imply('meridiem', timeComponent.get('meridiem'));\n }\n\n if (dateTimeComponent.get('meridiem') == 1 && dateTimeComponent.get('hour') < 12) {\n if (timeComponent.isCertain('hour')) {\n dateTimeComponent.assign('hour', dateTimeComponent.get('hour') + 12);\n } else {\n dateTimeComponent.imply('hour', dateTimeComponent.get('hour') + 12);\n }\n }\n\n return dateTimeComponent;\n}\n\n\nfunction mergeResult(text, dateResult, timeResult){\n\n var beginDate = dateResult.start;\n var beginTime = timeResult.start;\n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n \n if (dateResult.end != null || timeResult.end != null) {\n \n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\n \n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n // Ex. 9pm - 1am\n if (endDateTime.isCertain('day')) {\n endDateTime.assign('day', endDateTime.get('day') + 1);\n } else {\n endDateTime.imply('day', endDateTime.get('day') + 1);\n }\n }\n\n dateResult.end = endDateTime;\n }\n\n dateResult.start = beginDateTime; \n\n var startIndex = Math.min(dateResult.index, timeResult.index);\n var endIndex = Math.max(\n dateResult.index + dateResult.text.length, \n timeResult.index + timeResult.text.length);\n \n dateResult.index = startIndex;\n dateResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in timeResult.tags) {\n dateResult.tags[tag] = true;\n }\n dateResult.tags['ENMergeDateAndTimeRefiner'] = true;\n return dateResult;\n}\n\nexports.Refiner = function ENMergeDateTimeRefiner() {\n Refiner.call(this);\n\n\n this.refine = function(text, results, opt) { \n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n \n if (isDateOnly(prevResult) && isTimeOnly(currResult) \n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, prevResult, currResult);\n currResult = results[i + 1];\n i += 1;\n \n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n \n prevResult = mergeResult(text, currResult, prevResult);\n currResult = results[i + 1];\n i += 1;\n }\n \n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}","/*\n\n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\n\nvar PATTERN = new RegExp(\"^\\\\s*(at|after|before|on|,|-|\\\\(|\\\\))?\\\\s*$\");\n\nfunction isMoreSpecific(prevResult, currResult) {\n var moreSpecific = false;\n\n if (prevResult.start.isCertain('year')) {\n if (!currResult.start.isCertain('year')) {\n moreSpecific = true;\n } else {\n if (prevResult.start.isCertain('month')) {\n if (!currResult.start.isCertain('month')) {\n moreSpecific = true;\n } else {\n if (prevResult.start.isCertain('day') && !currResult.start.isCertain('day')) {\n moreSpecific = true;\n }\n }\n }\n }\n }\n\n return moreSpecific;\n}\n\n\nfunction isAbleToMerge(text, prevResult, currResult) {\n var textBetween = text.substring(prevResult.index + prevResult.text.length, currResult.index);\n\n // Only accepts merge if one of them comes from casual relative date\n var includesRelativeResult = (prevResult.tags['ENRelativeDateFormatParser'] || currResult.tags['ENRelativeDateFormatParser']);\n\n // We assume they refer to the same date if all date fields are implied\n var referToSameDate = !prevResult.start.isCertain('day') && !prevResult.start.isCertain('month') && !prevResult.start.isCertain('year');\n\n // If both years are certain, that determines if they refer to the same date\n // but with one more specific than the other\n if (prevResult.start.isCertain('year') && currResult.start.isCertain('year'))\n referToSameDate = (prevResult.start.get('year') === currResult.start.get('year'));\n\n // We now test with the next level (month) if they refer to the same date\n if (prevResult.start.isCertain('month') && currResult.start.isCertain('month'))\n referToSameDate = (prevResult.start.get('month') === currResult.start.get('month')) && referToSameDate;\n\n return includesRelativeResult && textBetween.match(PATTERN) && referToSameDate;\n}\n\nfunction mergeResult(text, specificResult, nonSpecificResult){\n\n var specificDate = specificResult.start;\n var nonSpecificDate = nonSpecificResult.start;\n\n var startIndex = Math.min(specificResult.index, nonSpecificResult.index);\n var endIndex = Math.max(\n specificResult.index + specificResult.text.length,\n nonSpecificResult.index + nonSpecificResult.text.length);\n\n specificResult.index = startIndex;\n specificResult.text = text.substring(startIndex, endIndex);\n\n for (var tag in nonSpecificResult.tags) {\n specificResult.tags[tag] = true;\n }\n specificResult.tags['ENPrioritizeSpecificDateRefiner'] = true;\n return specificResult;\n}\n\nexports.Refiner = function ENPrioritizeSpecificDateRefiner() {\n Refiner.call(this);\n\n this.refine = function(text, results, opt) {\n\n if (results.length < 2) return results;\n\n var mergedResult = [];\n var currResult = null;\n var prevResult = null;\n\n for (var i = 1; i < results.length; i++) {\n\n currResult = results[i];\n prevResult = results[i-1];\n\n if (isMoreSpecific(prevResult, currResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n\n prevResult = mergeResult(text, prevResult, currResult);\n currResult = null;\n i += 1;\n\n } else if (isMoreSpecific(currResult, prevResult)\n && isAbleToMerge(text, prevResult, currResult)) {\n\n prevResult = mergeResult(text, currResult, prevResult);\n currResult = null;\n i += 1;\n }\n\n mergedResult.push(prevResult);\n }\n\n if (currResult != null) {\n mergedResult.push(currResult);\n }\n\n return mergedResult;\n }\n}\n","/*\r\n \r\n*/\r\nvar Refiner = require('../refiner').Refiner;\r\n\r\nexports.Refiner = function FRMergeDateRangeRefiner() {\r\n Refiner.call(this);\r\n\r\n this.pattern = function () { return /^\\s*(à|a|\\-)\\s*$/i };\r\n\r\n this.refine = function(text, results, opt) {\r\n\r\n if (results.length < 2) return results;\r\n \r\n var mergedResult = [];\r\n var currResult = null;\r\n var prevResult = null;\r\n \r\n for (var i=1; i<results.length; i++){\r\n \r\n currResult = results[i];\r\n prevResult = results[i-1];\r\n \r\n if (!prevResult.end && !currResult.end \r\n && this.isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = this.mergeResult(text, prevResult, currResult);\r\n currResult = null;\r\n i += 1;\r\n }\r\n \r\n mergedResult.push(prevResult);\r\n }\r\n \r\n if (currResult != null) {\r\n mergedResult.push(currResult);\r\n }\r\n\r\n\r\n return mergedResult;\r\n };\r\n\r\n this.isAbleToMerge = function(text, result1, result2) {\r\n var begin = result1.index + result1.text.length;\r\n var end = result2.index;\r\n var textBetween = text.substring(begin,end);\r\n\r\n return textBetween.match(this.pattern());\r\n };\r\n\r\n this.isWeekdayResult = function (result) {\r\n return result.start.isCertain('weekday') && !result.start.isCertain('day');\r\n };\r\n\r\n this.mergeResult = function(text, fromResult, toResult) {\r\n\r\n if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\r\n\r\n for (var key in toResult.start.knownValues) {\r\n if (!fromResult.start.isCertain(key)) {\r\n fromResult.start.assign(key, toResult.start.get(key));\r\n }\r\n }\r\n\r\n for (var key in fromResult.start.knownValues) {\r\n if (!toResult.start.isCertain(key)) {\r\n toResult.start.assign(key, fromResult.start.get(key));\r\n }\r\n }\r\n }\r\n\r\n if (fromResult.start.date().getTime() > toResult.start.date()) {\r\n var tmp = toResult;\r\n toResult = fromResult;\r\n fromResult = tmp;\r\n }\r\n \r\n fromResult.end = toResult.start;\r\n\r\n \r\n\r\n for (var tag in toResult.tags) {\r\n fromResult.tags[tag] = true;\r\n }\r\n\r\n \r\n var startIndex = Math.min(fromResult.index, toResult.index);\r\n var endIndex = Math.max(\r\n fromResult.index + fromResult.text.length, \r\n toResult.index + toResult.text.length);\r\n \r\n fromResult.index = startIndex;\r\n fromResult.text = text.substring(startIndex, endIndex);\r\n fromResult.tags[this.constructor.name] = true;\r\n return fromResult;\r\n }\r\n};\r\n\r\n","/*\r\n \r\n*/\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\nvar Refiner = require('../refiner').Refiner;\r\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\r\n\r\nvar PATTERN = new RegExp(\"^\\\\s*(T|à|a|vers|de|,|-)?\\\\s*$\");\r\n\r\nfunction isDateOnly(result) {\r\n return !result.start.isCertain('hour') || result.tags['FRCasualDateParser'];\r\n}\r\n \r\nfunction isTimeOnly(result) {\r\n return !result.start.isCertain('month') && !result.start.isCertain('weekday');\r\n}\r\n\r\n\r\nfunction isAbleToMerge(text, prevResult, curResult) {\r\n var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\r\n return textBetween.match(PATTERN);\r\n}\r\n\r\nfunction mergeResult(text, dateResult, timeResult){\r\n\r\n var beginDate = dateResult.start;\r\n var beginTime = timeResult.start;\r\n var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\r\n\r\n if (dateResult.end != null || timeResult.end != null) {\r\n \r\n var endDate = dateResult.end == null ? dateResult.start : dateResult.end; \r\n var endTime = timeResult.end == null ? timeResult.start : timeResult.end;\r\n var endDateTime = mergeDateTimeComponent(endDate, endTime);\r\n \r\n if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\r\n // Ex. 9pm - 1am\r\n if (endDateTime.isCertain('day')) {\r\n endDateTime.assign('day', endDateTime.get('day') + 1);\r\n } else {\r\n endDateTime.imply('day', endDateTime.get('day') + 1);\r\n }\r\n }\r\n\r\n dateResult.end = endDateTime;\r\n }\r\n\r\n dateResult.start = beginDateTime; \r\n\r\n var startIndex = Math.min(dateResult.index, timeResult.index);\r\n var endIndex = Math.max(\r\n dateResult.index + dateResult.text.length, \r\n timeResult.index + timeResult.text.length);\r\n \r\n dateResult.index = startIndex;\r\n dateResult.text = text.substring(startIndex, endIndex);\r\n\r\n for (var tag in timeResult.tags) {\r\n dateResult.tags[tag] = true;\r\n }\r\n dateResult.tags['FRMergeDateAndTimeRefiner'] = true;\r\n return dateResult;\r\n}\r\n\r\nexports.Refiner = function FRMergeDateTimeRefiner() {\r\n Refiner.call(this);\r\n\r\n\r\n this.refine = function(text, results, opt) { \r\n\r\n if (results.length < 2) return results;\r\n\r\n var mergedResult = [];\r\n var currResult = null;\r\n var prevResult = null;\r\n\r\n for (var i = 1; i < results.length; i++) {\r\n\r\n currResult = results[i];\r\n prevResult = results[i-1];\r\n \r\n if (isDateOnly(prevResult) && isTimeOnly(currResult) \r\n && isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = mergeResult(text, prevResult, currResult);\r\n currResult = null;\r\n i += 1;\r\n \r\n } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\r\n && isAbleToMerge(text, prevResult, currResult)) {\r\n \r\n prevResult = mergeResult(text, currResult, prevResult);\r\n currResult = null;\r\n i += 1;\r\n }\r\n \r\n mergedResult.push(prevResult);\r\n }\r\n\r\n if (currResult != null) {\r\n mergedResult.push(currResult);\r\n }\r\n\r\n return mergedResult;\r\n }\r\n}","/*\n \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function JPMergeDateRangeRefiner() {\n ENMergeDateRangeRefiner.call(this);\n\n this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\n\n","\nexports.Refiner = function Refiner() { \n\n this.refine = function(text, results, opt) { return results; };\n}\n\nexports.Filter = function Filter() { \n \n exports.Refiner.call(this);\n\n this.isValid = function(text, result, opt) { return true; }\n this.refine = function(text, results, opt) { \n\n var filteredResult = [];\n for (var i=0; i < results.length; i++) {\n\n var result = results[i];\n if (this.isValid(text, result, opt)) {\n filteredResult.push(result);\n }\n }\n\n return filteredResult;\n }\n}\n\n\n// Common refiners\nexports.OverlapRemovalRefiner = require('./OverlapRemovalRefiner').Refiner;\nexports.ExtractTimezoneOffsetRefiner = require('./ExtractTimezoneOffsetRefiner').Refiner;\nexports.ExtractTimezoneAbbrRefiner = require('./ExtractTimezoneAbbrRefiner').Refiner;\nexports.ForwardDateRefiner = require('./ForwardDateRefiner').Refiner;\nexports.UnlikelyFormatFilter = require('./UnlikelyFormatFilter').Refiner;\n\n// en refiners\nexports.ENMergeDateTimeRefiner = require('./en/ENMergeDateTimeRefiner').Refiner;\nexports.ENMergeDateRangeRefiner = require('./en/ENMergeDateRangeRefiner').Refiner;\nexports.ENPrioritizeSpecificDateRefiner = require('./en/ENPrioritizeSpecificDateRefiner').Refiner;\n\n// ja refiners\nexports.JPMergeDateRangeRefiner = require('./ja/JPMergeDateRangeRefiner').Refiner;\n\n// fr refiners\nexports.FRMergeDateRangeRefiner = require('./fr/FRMergeDateRangeRefiner').Refiner;\nexports.FRMergeDateTimeRefiner = require('./fr/FRMergeDateTimeRefiner').Refiner;\n\n// de refiners\nexports.DEMergeDateRangeRefiner = require('./de/DEMergeDateRangeRefiner').Refiner;\nexports.DEMergeDateTimeRefiner = require('./de/DEMergeDateTimeRefiner').Refiner;\n","const dayjs = require('dayjs');\n\nfunction ParsedResult(result){\n result = result || {};\n\n this.ref = result.ref;\n this.index = result.index;\n this.text = result.text;\n this.tags = result.tags || {};\n\n this.start = new ParsedComponents(result.start, result.ref)\n if(result.end){\n this.end = new ParsedComponents(result.end, result.ref)\n }\n}\n\nParsedResult.prototype.clone = function() {\n var result = new ParsedResult(this);\n result.tags = JSON.parse(JSON.stringify(this.tags));\n result.start = this.start.clone();\n if (this.end) {\n result.end = this.end.clone();\n }\n\n return result\n}\n\nParsedResult.prototype.date = function() {\n return this.start.date();\n}\n\nParsedResult.prototype.hasPossibleDates = function() {\n return this.start.isPossibleDate() && (!this.end || this.end.isPossibleDate());\n}\n\nParsedResult.prototype.isOnlyWeekday = function() {\n return this.start.isOnlyWeekdayComponent();\n}\n\nParsedResult.prototype.isOnlyDayMonth = function() {\n return this.start.isOnlyDayMonthComponent();\n}\n\nfunction ParsedComponents (components, ref){\n\n this.knownValues = {};\n this.impliedValues = {};\n\n if (components) {\n for (key in components) {\n this.knownValues[key] = components[key];\n }\n }\n\n if (ref) {\n ref = dayjs(ref);\n this.imply('day', ref.date())\n this.imply('month', ref.month() + 1)\n this.imply('year', ref.year())\n }\n \n\n this.imply('hour', 12);\n this.imply('minute', 0);\n this.imply('second', 0);\n this.imply('millisecond', 0);\n}\n\nParsedComponents.prototype.clone = function () {\n var component = new ParsedComponents();\n component.knownValues = JSON.parse(JSON.stringify(this.knownValues));\n component.impliedValues = JSON.parse(JSON.stringify(this.impliedValues));\n return component;\n};\n\nParsedComponents.prototype.get = function(component, value) {\n if (component in this.knownValues) return this.knownValues[component];\n if (component in this.impliedValues) return this.impliedValues[component];\n};\n\nParsedComponents.prototype.assign = function(component, value) {\n this.knownValues[component] = value;\n delete this.impliedValues[component];\n};\n\nParsedComponents.prototype.imply = function(component, value) {\n if (component in this.knownValues) return;\n this.impliedValues[component] = value;\n};\n\nParsedComponents.prototype.isCertain = function(component) {\n return component in this.knownValues;\n};\n\nParsedComponents.prototype.isOnlyWeekdayComponent = function() {\n return this.isCertain('weekday') && !this.isCertain('day') && !this.isCertain('month');\n};\n\nParsedComponents.prototype.isOnlyDayMonthComponent = function() {\n return this.isCertain('day') && this.isCertain('month') && !this.isCertain('year');\n};\n\nParsedComponents.prototype.isPossibleDate = function() {\n var dateMoment = this.dayjs();\n if (this.isCertain('timezoneOffset')) {\n const adjustTimezoneOffset = this.get('timezoneOffset') - dateMoment.utcOffset();\n dateMoment = dateMoment.add(adjustTimezoneOffset, 'minutes');\n }\n\n if (dateMoment.get('year') != this.get('year')) return false;\n if (dateMoment.get('month') != this.get('month')-1) return false;\n if (dateMoment.get('date') != this.get('day')) return false;\n if (dateMoment.get('hour') != this.get('hour')) return false;\n if (dateMoment.get('minute') != this.get('minute')) return false;\n\n return true;\n};\n\nParsedComponents.prototype.date = function() {\n var result = this.dayjs();\n return result.toDate();\n};\n\n\nParsedComponents.prototype.dayjs = function() {\n var result = dayjs();\n\n result = result.year(this.get('year'));\n result = result.month(this.get('month') - 1);\n result = result.date(this.get('day'));\n result = result.hour(this.get('hour'));\n result = result.minute(this.get('minute'));\n result = result.second(this.get('second'));\n result = result.millisecond(this.get('millisecond'));\n\n // Javascript Date Object return minus timezone offset\n var currentTimezoneOffset = result.utcOffset();\n var targetTimezoneOffset = this.get('timezoneOffset') !== undefined ? \n this.get('timezoneOffset') : currentTimezoneOffset;\n\n var adjustTimezoneOffset = targetTimezoneOffset - currentTimezoneOffset;\n result = result.add(-adjustTimezoneOffset, 'minute');\n\n return result;\n};\n\nParsedComponents.prototype.moment = function() {\n // Keep for compatibility\n return this.dayjs();\n};\n\n\n\nexports.ParsedComponents = ParsedComponents;\nexports.ParsedResult = ParsedResult;\n","exports.WEEKDAY_OFFSET = { \n 'sonntag': 0, \n 'so': 0, \n 'montag': 1, \n 'mo': 1,\n 'dienstag': 2, \n 'di':2, \n 'mittwoch': 3, \n 'mi': 3, \n 'donnerstag': 4, \n 'do': 4, \n 'freitag': 5, \n 'fr': 5,\n 'samstag': 6, \n 'sa': 6\n};\n \nexports.MONTH_OFFSET = { \n 'januar': 1,\n 'jan': 1,\n 'jan.': 1,\n 'februar': 2,\n 'feb': 2,\n 'feb.': 2,\n 'märz': 3,\n 'maerz': 3,\n 'mär': 3,\n 'mär.': 3,\n 'mrz': 3,\n 'mrz.': 3,\n 'april': 4,\n 'apr': 4,\n 'apr.': 4,\n 'mai': 5,\n 'juni': 6,\n 'jun': 6,\n 'jun.': 6,\n 'juli': 7,\n 'jul': 7,\n 'jul.': 7,\n 'august': 8,\n 'aug': 8,\n 'aug.': 8,\n 'september': 9,\n 'sep': 9,\n 'sep.': 9,\n 'sept': 9,\n 'sept.': 9,\n 'oktober': 10,\n 'okt': 10,\n 'okt.': 10,\n 'november': 11,\n 'nov': 11,\n 'nov.': 11,\n 'dezember': 12,\n 'dez': 12,\n 'dez.': 12\n};\n\nexports.INTEGER_WORDS_PATTERN = '(?:eins|zwei|drei|vier|fünf|fuenf|sechs|sieben|acht|neun|zehn|elf|zwölf|zwoelf)';\nexports.INTEGER_WORDS = {\n 'eins' : 1,\n 'zwei' : 2,\n 'drei' : 3,\n 'vier' : 4,\n 'fünf' : 5,\n 'fuenf': 5,\n 'sechs' : 6,\n 'sieben' : 7,\n 'acht' : 8,\n 'neun' : 9,\n 'zehn' : 10,\n 'elf' : 11,\n 'zwölf' : 12,\n 'zwoelf' : 12\n};\n","exports.WEEKDAY_OFFSET = { \n 'sunday': 0, \n 'sun': 0, \n 'monday': 1, \n 'mon': 1,\n 'tuesday': 2, \n 'tue':2, \n 'wednesday': 3, \n 'wed': 3, \n 'thursday': 4, \n 'thur': 4, \n 'thu': 4,\n 'friday': 5, \n 'fri': 5,\n 'saturday': 6, \n 'sat': 6\n};\n \nexports.MONTH_OFFSET = { \n 'january': 1,\n 'jan': 1,\n 'jan.': 1,\n 'february': 2,\n 'feb': 2,\n 'feb.': 2,\n 'march': 3,\n 'mar': 3,\n 'mar.': 3,\n 'april': 4,\n 'apr': 4,\n 'apr.': 4,\n 'may': 5,\n 'june': 6,\n 'jun': 6,\n 'jun.': 6,\n 'july': 7,\n 'jul': 7,\n 'jul.': 7,\n 'august': 8,\n 'aug': 8,\n 'aug.': 8,\n 'september': 9,\n 'sep': 9,\n 'sep.': 9,\n 'sept': 9,\n 'sept.': 9,\n 'october': 10,\n 'oct': 10,\n 'oct.': 10,\n 'november': 11,\n 'nov': 11,\n 'nov.': 11,\n 'december': 12,\n 'dec': 12,\n 'dec.': 12\n};\n\nexports.MONTH_PATTERN = '(?:' \n + Object.keys(exports.MONTH_OFFSET).join('|').replace(/\\./g, '\\\\.')\n + ')';\n\nexports.INTEGER_WORDS = {\n 'one' : 1,\n 'two' : 2,\n 'three' : 3,\n 'four' : 4,\n 'five' : 5,\n 'six' : 6,\n 'seven' : 7,\n 'eight' : 8,\n 'nine' : 9,\n 'ten' : 10,\n 'eleven' : 11,\n 'twelve' : 12\n};\nexports.INTEGER_WORDS_PATTERN = '(?:' \n + Object.keys(exports.INTEGER_WORDS).join('|') \n +')';\n\nexports.ORDINAL_WORDS = {\n 'first' : 1,\n 'second': 2,\n 'third': 3,\n 'fourth': 4,\n 'fifth': 5,\n 'sixth': 6,\n 'seventh': 7,\n 'eighth': 8,\n 'ninth': 9,\n 'tenth': 10,\n 'eleventh': 11,\n 'twelfth': 12,\n 'thirteenth': 13,\n 'fourteenth': 14,\n 'fifteenth': 15,\n 'sixteenth': 16,\n 'seventeenth': 17,\n 'eighteenth': 18,\n 'nineteenth': 19,\n 'twentieth': 20,\n 'twenty first': 21,\n 'twenty second': 22,\n 'twenty third': 23,\n 'twenty fourth': 24,\n 'twenty fifth': 25,\n 'twenty sixth': 26,\n 'twenty seventh': 27,\n 'twenty eighth': 28,\n 'twenty ninth': 29,\n 'thirtieth': 30,\n 'thirty first': 31\n};\nexports.ORDINAL_WORDS_PATTERN = '(?:' \n + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') \n + ')';\n\nvar TIME_UNIT = \n '(' + exports.INTEGER_WORDS_PATTERN + '|[0-9]+|[0-9]+\\.[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n '(?:[0-9]+|an?)\\\\s*' +\n '(?:seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\n\nexports.TIME_UNIT_PATTERN = '(?:' + TIME_UNIT + ')+';\nexports.TIME_UNIT_STRICT_PATTERN = '(?:' + TIME_UNIT_STRICT + ')+';\n\nexports.extractDateTimeUnitFragments = function (timeunitText) {\n var fragments = {};\n var remainingText = timeunitText;\n var match = PATTERN_TIME_UNIT.exec(remainingText);\n while (match) {\n collectDateTimeFragment(match, fragments);\n remainingText = remainingText.substring(match[0].length);\n match = PATTERN_TIME_UNIT.exec(remainingText);\n }\n return fragments;\n};\n\nfunction collectDateTimeFragment(match, fragments) {\n var num = match[1].toLowerCase() ;\n if (exports.INTEGER_WORDS[num] !== undefined) {\n num = exports.INTEGER_WORDS[num];\n } else if(num === 'a' || num === 'an'){\n num = 1;\n } else if (num.match(/few/)) {\n num = 3;\n } else if (num.match(/half/)) {\n num = 0.5;\n } else {\n num = parseFloat(num);\n }\n\n if (match[2].match(/hour/i)) {\n fragments['hour'] = num;\n } else if (match[2].match(/min/i)) {\n fragments['minute'] = num;\n } else if (match[2].match(/sec/i)) {\n fragments['second'] = num;\n } else if (match[2].match(/week/i)) {\n fragments['week'] = num;\n } else if (match[2].match(/day/i)) {\n fragments['d'] = num;\n } else if (match[2].match(/month/i)) {\n fragments['month'] = num;\n } else if (match[2].match(/year/i)) {\n fragments['year'] = num;\n }\n\n return fragments;\n}","exports.WEEKDAY_OFFSET = {\n 'domingo': 0,\n 'dom': 0,\n 'lunes': 1,\n 'lun': 1,\n 'martes': 2,\n 'mar':2,\n 'miércoles': 3,\n 'miercoles': 3,\n 'mie': 3,\n 'jueves': 4,\n 'jue': 4,\n 'viernes': 5,\n 'vie': 5,\n 'sábado': 6,\n 'sabado': 6,\n 'sab': 6,}\n\nexports.MONTH_OFFSET = {\n 'enero': 1,\n 'ene': 1,\n 'ene.': 1,\n 'febrero': 2,\n 'feb': 2,\n 'feb.': 2,\n 'marzo': 3,\n 'mar': 3,\n 'mar.': 3,\n 'abril': 4,\n 'abr': 4,\n 'abr.': 4,\n 'mayo': 5,\n 'may': 5,\n 'may.': 5,\n 'junio': 6,\n 'jun': 6,\n 'jun.': 6,\n 'julio': 7,\n 'jul': 7,\n 'jul.': 7,\n 'agosto': 8,\n 'ago': 8,\n 'ago.': 8,\n 'septiembre': 9,\n 'sep': 9,\n 'sept': 9,\n 'sep.': 9,\n 'sept.': 9,\n 'octubre': 10,\n 'oct': 10,\n 'oct.': 10,\n 'noviembre': 11,\n 'nov': 11,\n 'nov.': 11,\n 'diciembre': 12,\n 'dic': 12,\n 'dic.': 12,\n}\n","exports.WEEKDAY_OFFSET = { \r\n 'dimanche': 0, \r\n 'dim': 0, \r\n 'lundi': 1, \r\n 'lun': 1,\r\n 'mardi': 2, \r\n 'mar':2, \r\n 'mercredi': 3, \r\n 'mer': 3, \r\n 'jeudi': 4, \r\n 'jeu': 4, \r\n 'vendredi': 5, \r\n 'ven': 5,\r\n 'samedi': 6, \r\n 'sam': 6\r\n};\r\n \r\nexports.MONTH_OFFSET = { \r\n 'janvier': 1,\r\n 'jan': 1,\r\n 'jan.': 1,\r\n 'février': 2,\r\n 'fév': 2,\r\n 'fév.': 2,\r\n 'fevrier': 2,\r\n 'fev': 2,\r\n 'fev.': 2,\r\n 'mars': 3,\r\n 'mar': 3,\r\n 'mar.': 3,\r\n 'avril': 4,\r\n 'avr': 4,\r\n 'avr.': 4,\r\n 'mai': 5,\r\n 'juin': 6,\r\n 'jun': 6,\r\n 'juillet': 7,\r\n 'jul': 7,\r\n 'jul.': 7,\r\n 'août': 8,\r\n 'aout': 8,\r\n 'septembre': 9,\r\n 'sep': 9,\r\n 'sep.': 9,\r\n 'sept': 9,\r\n 'sept.': 9,\r\n 'octobre': 10,\r\n 'oct': 10,\r\n 'oct.': 10,\r\n 'novembre': 11,\r\n 'nov': 11,\r\n 'nov.': 11,\r\n 'décembre': 12,\r\n 'decembre': 12,\r\n 'dec': 12,\r\n 'dec.': 12\r\n};\r\n\r\nexports.INTEGER_WORDS_PATTERN = '(?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize)';\r\nexports.INTEGER_WORDS = {\r\n 'un' : 1,\r\n 'deux' : 2,\r\n 'trois' : 3,\r\n 'quatre' : 4,\r\n 'cinq' : 5,\r\n 'six' : 6,\r\n 'sept' : 7,\r\n 'huit' : 8,\r\n 'neuf' : 9,\r\n 'dix' : 10,\r\n 'onze' : 11,\r\n 'douze' : 12,\r\n 'treize' : 13,\r\n};\r\n","\n\n/**\n * to-hankaku.js\n * convert to ascii code strings.\n *\n * @version 1.0.1\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\n \nexports.toHankaku = (function (String, fromCharCode) {\n \n function toHankaku (string) {\n return String(string).replace(/\\u2019/g, '\\u0027').replace(/\\u201D/g, '\\u0022').replace(/\\u3000/g, '\\u0020').replace(/\\uFFE5/g, '\\u00A5').replace(/[\\uFF01\\uFF03-\\uFF06\\uFF08\\uFF09\\uFF0C-\\uFF19\\uFF1C-\\uFF1F\\uFF21-\\uFF3B\\uFF3D\\uFF3F\\uFF41-\\uFF5B\\uFF5D\\uFF5E]/g, alphaNum);\n }\n \n function alphaNum (token) {\n return fromCharCode(token.charCodeAt(0) - 65248);\n }\n \n return toHankaku;\n})(String, String.fromCharCode);\n\n/**\n * to-zenkaku.js\n * convert to multi byte strings.\n *\n * @version 1.0.2\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\nexports.toZenkaku = (function (String, fromCharCode) {\n \n function toZenkaku (string) {\n return String(string).replace(/\\u0020/g, '\\u3000').replace(/\\u0022/g, '\\u201D').replace(/\\u0027/g, '\\u2019').replace(/\\u00A5/g, '\\uFFE5').replace(/[!#-&(),-9\\u003C-?A-[\\u005D_a-{}~]/g, alphaNum);\n }\n \n function alphaNum (token) {\n return fromCharCode(token.charCodeAt(0) + 65248);\n }\n \n return toZenkaku;\n})(String, String.fromCharCode);","exports.WEEKDAY_OFFSET = {\n 'domingo': 0,\n 'dom': 0,\n 'segunda': 1,\n 'segunda-feira': 1,\n 'seg': 1,\n 'terça': 2,\n 'terca': 2,\n 'terça-feira': 2,\n 'terca-feira': 2,\n 'ter':2,\n 'quarta': 3,\n 'quarta-feira': 3,\n 'qua': 3,\n 'quinta': 4,\n 'quinta-feira': 4,\n 'qui': 4,\n 'sexta': 5,\n 'sexta-feira': 5,\n 'sex': 5,\n 'sábado': 6,\n 'sabado': 6,\n 'sab': 6,}\n \n exports.MONTH_OFFSET = {\n 'janeiro': 1,\n 'jan': 1,\n 'jan.': 1,\n 'fevereiro': 2,\n 'fev': 2,\n 'fev.': 2,\n 'março': 3,\n 'mar': 3,\n 'mar.': 3,\n 'abril': 4,\n 'abr': 4,\n 'abr.': 4,\n 'maio': 5,\n 'mai': 5,\n 'mai.': 5,\n 'junho': 6,\n 'jun': 6,\n 'jun.': 6,\n 'julho': 7,\n 'jul': 7,\n 'jul.': 7,\n 'agosto': 8,\n 'ago': 8,\n 'ago.': 8,\n 'setembro': 9,\n 'set': 9,\n 'set.': 9,\n 'outubro': 10,\n 'out': 10,\n 'out.': 10,\n 'novembro': 11,\n 'nov': 11,\n 'nov.': 11,\n 'dezembro': 12,\n 'dez': 12,\n 'dez.': 12,\n }","var NUMBER ={\n '零':0,\n '一':1,\n '二':2,\n '兩':2,\n '三':3,\n '四':4,\n '五':5,\n '六':6,\n '七':7,\n '八':8,\n '九':9,\n '十':10,\n '廿':20,\n '卅':30,\n};\n\nvar WEEKDAY_OFFSET ={\n '天':0,\n '日':0,\n '一':1,\n '二':2,\n '三':3,\n '四':4,\n '五':5,\n '六':6,\n};\n\nexports.NUMBER = NUMBER;\nexports.WEEKDAY_OFFSET = WEEKDAY_OFFSET;\n\nexports.zhStringToNumber=function(text){\n var number = 0;\n for(var i=0; i<text.length ;i++){\n var char = text[i];\n if(char === '十'){\n number = number=== 0 ? NUMBER[char] : (number * NUMBER[char]);\n }else{\n number += NUMBER[char];\n }\n }\n return number;\n};\n\nexports.zhStringToYear=function(text){\n var string = '';\n for(var i=0; i<text.length ;i++){\n var char = text[i];\n string = string + NUMBER[char];\n }\n return parseInt(string);\n};\n"]}
|