From 42212cb8655fa1377571230e5f39367a5fe87c2d Mon Sep 17 00:00:00 2001 From: dualfroz Date: Fri, 2 Oct 2026 16:52:45 +0200 Subject: [PATCH] Parse 'fortnight' as a duration of two weeks --- data/lexicon/dates/durations.js | 2 ++ .../src/api/parse/one/01-tokenize/01-shift.js | 14 ++++++++++++-- plugins/dates/tests/to-iso.test.js | 2 ++ src/2-two/preTagger/model/lexicon/_data.js | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/data/lexicon/dates/durations.js b/data/lexicon/dates/durations.js index c8b7d0c..1bd16f3 100644 --- a/data/lexicon/dates/durations.js +++ b/data/lexicon/dates/durations.js @@ -22,6 +22,8 @@ export default [ 'weekend', 'week', 'weeks', + 'fortnight', + 'fortnights', 'wk', 'wks', 'year', diff --git a/plugins/dates/src/api/parse/one/01-tokenize/01-shift.js b/plugins/dates/src/api/parse/one/01-tokenize/01-shift.js index 0aa8488..50026a7 100644 --- a/plugins/dates/src/api/parse/one/01-tokenize/01-shift.js +++ b/plugins/dates/src/api/parse/one/01-tokenize/01-shift.js @@ -18,6 +18,11 @@ const aliases = { weekend: 'week', //for now... } +// units made of other units +const multiples = { + fortnight: [2, 'week'], +} + // half of a unit, in smaller whole units const halfUnits = { year: [6, 'month'], @@ -53,9 +58,14 @@ const parseShift = function (doc) { // '5 weeks' shift.match('#Cardinal #Duration').forEach((ts) => { - const num = ts.match('#Cardinal').numbers().get()[0] + let num = ts.match('#Cardinal').numbers().get()[0] if (num && typeof num === 'number') { - const unit = parseUnit(ts) + let unit = parseUnit(ts) + // '1 fortnight' is 2 weeks + if (Object.hasOwn(multiples, unit)) { + num *= multiples[unit][0] + unit = multiples[unit][1] + } if (knownUnits[unit] === true) { result[unit] = isNegative ? num * -1 : num } diff --git a/plugins/dates/tests/to-iso.test.js b/plugins/dates/tests/to-iso.test.js index 6d5ca51..1a50fa7 100644 --- a/plugins/dates/tests/to-iso.test.js +++ b/plugins/dates/tests/to-iso.test.js @@ -156,6 +156,8 @@ test('date-parse :', function (t) { ['in 1 year', '2020-02-02T00:00:00.000Z'], ['3 days ago', '2019-01-30T00:00:00.000Z'], ['2 weeks ago', '2019-01-19T00:00:00.000Z'], + ['in a fortnight', '2019-02-16T00:00:00.000Z'], + ['1 fortnight ago', '2019-01-19T00:00:00.000Z'], ['1 month ago', '2019-01-02T00:00:00.000Z'], ['1 year ago', '2018-02-02T00:00:00.000Z'], ['at 4pm', '2019-02-02T16:00:00.000Z'], diff --git a/src/2-two/preTagger/model/lexicon/_data.js b/src/2-two/preTagger/model/lexicon/_data.js index 8755393..c37d075 100644 --- a/src/2-two/preTagger/model/lexicon/_data.js +++ b/src/2-two/preTagger/model/lexicon/_data.js @@ -51,7 +51,7 @@ export default { "WeekDay": "true¦fri2mon2s1t0wednesd3;hurs1ues1;aturd1und1;!d0;ay0;!s", "Month": "true¦dec0february,july,nov0octo1sept0;em0;ber", "Date": "true¦ago,on4som4t1week0yesterd5; end,ends;mr1o0;d2morrow;!w;ed0;ay", - "Duration": "true¦centurAd8h7m5q4se3w1y0;ear8r8;eek0k7;!end,s;ason,c5;tr,uarter;i0onth3;llisecond2nute2;our1r1;ay0ecade0;!s;ies,y", + "Duration": "true¦centurAd8fortnight9h7m5q4se3w1y0;ear8r8;eek0k7;!end,s;ason,c5;tr,uarter;i0onth3;llisecond2nute2;our1r1;ay0ecade0;!s;ies,y", "FemaleName": "true¦!1:#$%&()*+-./<=>?@[]^_`~:an,el,na,in,en,ri,ie,is,le,da,et,ma,ya,ra,on,la,sa,ia,er,ne,yn,ey;0:J7;1:JB;2:IJ;3:IK;4:J1;5:IO;6:JS;7:JO;8:HB;9:JK;A:H4;B:I2;C:IT;D:JH;E:IX;F:BA;G:I4;aGTbFLcDRdD0eBMfB4gADh9Ti9Gj8Dk7Cl5Wm48n3Lo3Hp33qu32r29s15t0Eu0Cv02wVxiTyOzH;aLeI&eb,oHsof3;e3Sf3@,>;h2iKlI%,`H;ab,ep;.,<;.,h2iH>;%b;aKeJ&g,olB7uIvH;/8?DP;i0%;-0s(3;$,gmur,n,r&,s8W;aoHme0nyi;mei,y#;aM(dDZhiDGiH;d$e9lJnH;if48niHo0;e,f47;a,h$mi0lH<;a,ow;ka0nB;aNeKiHu[5;ck84kIl8o-AviH;#F(J4;ky,to)BK;.,l<,rHs0;a,nH?ica;a,ice;-H_sH9;nILrH;i1y;g9rHs6xue;su5te;aYeUhRiNoLrIuHy2;i,@;acJ3iHudy;c3%,sH;hFta;nHr0F;iF=;aJff#y,nHs6;a,gtiH;ng;!nFS>;aIeHo;!ka;a,iH;a,t6;at6it6;a0Ecar-tt,e0AhWiSkye,_za0oQ),tNuIyH;bil,lvi1;ha,<=h,niAsIzH;#3N/8*,y;#Hi7;!a,e,nH;aCe;aIeH;f#4l5Dph#6E;cI5r5;b3fiAAm0LnHphi1;d2],ja,=;^2lJm?1nIobh#,tH;a,i;dy;l&,v3;aMeIirHo0)sti,y5;a,lDM;ba,e0i5lJrH;iHr6Jyl;!d#,fa;],lDZ;hd,iMki2nJrIu0w0yH;@,<,%;i,-9?,r?,`;aI.,],nH?;a,?;!=;k6mH;!aa;lJrItayesh,vH;.,&j;e0ife;(1i0<;#vi,bLd5Ohar,iBkKlJmInd2rHs6v#%C;aCi0;#t6i2;lDO<,ome;ee0&eh,u2;&1)0;a05eZhXiUoHuthDM;bScRghQl8LnPsJwIxH;#B3*,y;#,e0;aIeH*,lD;#n7ll1,soun;d7rH;a,eE;h8Gild1t4;a,cUgQiKjor4l7Un4s6tJwa,yH;!aHb/h,ja9lou;m,nBL;a,ha,&1;!aJb$,eIja,lD%,sHtza;!a,ol,[;!l1D;!h,mInH;!a,e,n1;!awit,i;arJeI*,oHr48ue)8;!t;!ry;/46i3B;$4Xi7Cy;dH?,ue5;akr#Ay;ak,(,iHlory;a,ka,nB;a,re,s4te;.Hg4;!l3E;alDd4$Hge,+?,?0;ei9&1`;$,-;a0Ne0CiXoQuLyH;d3@,nH;!a,dIe2OnHs~;!a,e2N;a,s~;#n,cJ$0P+1lI%,pHz;e,iA;a,u,wa;iHy;a0Se,ja,l2NnB;+,l1UrItt1LuHv$4;$5+1;aKeIi7%,rH;aADi7;lHn1tA;ei;!&1;aTbb9HdSepa,lNnKsJvIzH;!a,b/h,/8z4;!];a,/8;!a,dH;a,sHy;ay,~,i,y;a,iJja,lH;iHy;aA8e;!aH;!nF;],=;!nH;!a,_;aP.,e0iNjY@,nMoKsJtHx93y5;iHt4;c3t3;edi,lCO;@,nH>;a,*,o2;a,or1;a,gh,@H;!ni;!h,nH;a,d2e,n5V;cOd?9DiNkes6mija,%,rMtJurIvHxmi,y5;^n1&3;a,e5A*,`;as6iIoH;n=,=;fa,s6;a,+A9;a,@;~,*,y;a04eZhXiO-a,oNrJyH;lH>;a,ee,*;+tHy6I;a,(,iIyH;!%;!e,n5F;nul,),urt_y;aO^N-y,mJrHzzy;a,stH;(,&;!b^lIm^nH;aq;eHi,y;e,y;a,stE;!%,>;aHei2?gordzol;dij1w5;$7UiKjsi,lJnIrH;a,i,);d2%,za;~,i,lBLs4y;>,s6;biAc~,d]tou,ede,iSlQmPn=ku<),rNss6NtKviAyH;!e,lH;a,eH;e,igh;!a6HeIhHi4TlD)0y;ar8H^8H*,-ErBAy;!l`8O)0;a,(,iHl5Xoli0`;!<,nFs[;a5il1;eigh,i,lH;e,*;a,tl6O;a0AeZiWoOuH;#MdLlHst88;es,iH;a8NeHs[;!n9tH;!a,te;e5Mith,y;a,iA;!#Nc$DdM$Gh#7V-Lni,sIva0yH;a,ce;eH*;fHlDph7Y;a,&1;(,n1;i7y;!a,e,n45;lHng;!i#,lH;!i#;#N-0nKrJsH;ica,sH;!e,ica;i,);!a,$Gif^,nH;a,/8iHy;!e,f^;a,eJiInH;a,eIiH;e,n1;!t8;cM.,mi,nIque4Ysm&Fv*2y9zH;m&7;a7eIiH;ce,e,n1s;!lHs[,t0F;e,-;&Ik6HlDqu$H;&1`;.,ta;.,lRmPnOo0rNsIvaHwo0zaro;!a0lu,%;aJiI@Hob$;!nde;do2;b$Hdo2;!a,e,l3B;ati,(1i0<;di2es,g)d,ji;a9$BogH;(1;a,e9iHo0se;a0%;aSeOiJoHus[,=c&th;.,ll4rt(se,snH;a,i=;lIh,za0;cr&,d0Revi,i0Pk0Ol07mXnid,rUsOtNuMvHwa;aK$IiH;!e,ta;&F`;!a;!ng$4V;g(i1nice;h$,i(9ta;mLp^#KtH;eIhHr$5;^;l31r7;za;a,e>lB;iH<,_4L`;cHka,n;a,ka;aPeNiKmH;aHe21*,y;!li9nuH;$G;lHn1;e7iHy;a,e,ja;lH>ld;.,y;!nue5;aWeUiNlM<,no2oKsJvH;a,iH;%,>;a,*;iHuiH;se;a,(,*,y;a0c3.,e,f,nMsJzaH;!b/HveA;e,h;aHe,ka;!beH;th;!a,or;#or,nH;!a,i;!&1%;ate1Rta;-Es6;vi;eIiH%,wi0;e,th;l,n;aYeMh3iLj(eKoH;lores,m&ique,n3FrHtt4;a,eE+,@,othHthy;ea,y;ba;#09%C?9=;#QbPde,eOiMlJm/r3nHsiree;a,iH;ce,se;a,iI@,orHphi9;es,+;a,@h;dHrdH;re;!dee,%;!b2Fo>C>C;a,d2nH;!a,e;hl3i0@l,mNnLphn1rIvi1WyH;-,%;a,by,cI],lH;a,(1;~,*;a,/8iH;!ca,$1Aka,z;arH];+;a0Re0Nh04i02lUoJ)stI`H;di,th3;al,i0;lPnMrIurH;tn1D;aJd2OiHn2O)9;!nH;a,e,n1;!l4;cepci?,n4sH;t#Hu$o;ce,za;eH-E;(,t8;aJeoIotH;ilde;!pat2;ir7rJudH;/8iH;a,_;a,e,iH;ce,sZ;a2^2ndH;i,y;aReNloe,rH;+JyH;stH;al;sy,tH;a1S(,iHy;#1e,n1;deJlseIrH;!i7yl;a,y;li9;nMrH;+KlImH;ai9;a,eHot8;n1t8;![;d2$GtH;al,$G;cIlH;es8i47;$3ilH;e,],y;itlYlXmilWndVrMsKtHy5;aIeIhH)0;^1I-ErDy;)0;a38sH;a37*;a,iOlLmeJolIrH;*,ol;!e,&1`;lHn;!a,@;a,eI*,otHy;a,ta;_,y;%,s[;ace,ice;a,e,l1;+Al4;&,`;a0Ke02iZlXoUrH;#di7eRiJoIyH;#0nn;nwDoke;#3HdgMgiLtH;_y,tH;!aInH;~,i,y;ny;d,t8;/H;!t7;#0e,nH;.,%;bbi7g@rIlo07nH;iAn4;ka;#cHythe;a,he;#ca,lja0nHs;a2Ub2Od25g21i1Sj5l18m0Zn0Boi,r06sWtVuPvOwa,yIzH;>,u0;aKes6gJlIn,seH;!l;&;un;!nH;a,%;a,i2K;drLguJrIsteH;ja;$3;stH;&1;a,~,i,y;aahua,he0;hIi=,ja,miAsil,trH;id;aMlI>qHt?;at;eIi7yH;!n;e,iHy;gh;!nH;ti;iJ-Io6piA;ta;(,n1t8;aH$G;!n1J;a01dje5eZgViTjRnKohito,toH=;&/8nH;$5];te;!aKeIiHmJ;e,ka;!mHtt7;ar4;!b$IliHmU;[;!l1;a,$iH;ca;ka,sHta;a,[;$H*;a,iH;a,ca,n1qH;ue;!tH;a,te;!bImHstasiM=;ar3;$;aLb^K$iJiHy;e,l3%H;!ta;a,ja;!ly;hGiIl3nB;.;a,>;-;aWba,ePiMlKthJyH;a,c3sH;a,?,[;ea;iHys?;e,s?;a,cIn1sHza;a,e,ha,?,[;e,],ja;c3+6jaKk[K%,sJxH;aH];!nd2;],[H;nd2;>;];i0nIyH;ah,%;a,+,%Coud;@;c6.,-EmNnLsH;haClH;&HyY;g,n;!h;a,o,slH;~;ee;(;at6g4nIusH;ti0;es;*;aWdiT$MrH;eJiH;#M(H;a,e,_;#0;%;!aLeKiIyH;nn;a,n1;a,e;!_;!iH;de;e,lDsH;?;`;!lH;i9`;_;aKbIiHrL;!e,gaK;~,i7y;!e;gaH;il;dKliyJ>dhIs6;ha;=;ah;a,=", "Honorific": "true¦director1field marsh2lieutenant1rear0sergeant major,vice0; admir1; gener0;al", "Adj|Gerund": "true¦:!1:#$%&()*+-./<=>?@[:er,ts,ra,uo,ir,ar,it,xe,la,ps,ed,re,lf,ht,us,im,ob;0:3B;1:32;2:3F;3:3J;gni4;b3Ic3Ed2Og2Gh2Ak24l1Rm1Kn1Cogt&,p1Ar0Ws0MtSuRvLwoKxIy9z4;ama,e#f,i4n5;g<2-5n4;r,sefil;g(tXniCs2;aKcIeHfiGhgil0iFlEnDpmet,roCs6t4ub(B;es4if,uc;ffo,pu;a7#6i5u4;ah+,gs3rt;wt,+;!etQ%;l,r4;tn1;fm1pp?;ess3ioppas3uad;em,?L;c+,vK;lpu,rd;kcoryks,pm1v(;a4i=n1;r2F+;cixotFdCg*@,iBlumi$,nAoZr7t5v*4;om,pac;i4sav0;lib0rri;alih+,e5g,o4$urf;givAprocA;le8.a+;evuj#,@ulli;l@uh,ruf7;@*6om4;mo4;cca;ni;a#cCiAo8s5u4;fn1ma;)%bme,#4@;p4$3;!/;lc,p4;mi,po;-tiv#,morp4rpr?,urb;!m1;/,ni;aFe9i6[,ri$,u4;d2l-,ssaKt4;am,run;.4t;a,n4;i,oc;d7gga$,tta6wo4;=,p4;me,r16;=;li0Cna4;em;c,d,/2lg,o4;r,s;eews,ols,p4;alr0Z(g;aeAe6gi#,i4nuW07;ac,ehwr0M;e4=;lg,$;aeFbCeuLfBgg[,iAk%.,l5pp(c,t4w).,zzZ;%Gsub,tesnu;)>2e7i5or4;!tn1;fluf,hc,r4w;>;pm1t,uFws;av#p,ms,[;fab,i6;a2m4&5;),e4um;rt;h,ppa,vP;a6c5(4ovorp;$;al,ohs;#bdn&5os,t>ae4;rb;rg;c6s4toos;ad,#fHin4ur;otLup;a,e#cs,(2%rXt4&t;ef,i4;web;a8gal,n6r4;e4?;me;a4el-4ulp;hc;g2m5r4;!&c2;ad;aRdQeN(rMlKn7o5%w4;#;be4lpF;rof;aBe9i7o.#r1&4;f,rr5t4;sa;?;b4lb;!lleF;f4m,p;fo;m6p5$t4;&;+;/,m1;oc;eiy,of4;nu;evo;ce5e4;.;rp;ub;el,f,rg0;/;*2n4