APs and movable blocks in Equative Phrases!

This commit is contained in:
lingdocs 2022-05-24 13:20:04 -05:00
parent 5c9b7b7c3e
commit f5ae11c1ad
22 changed files with 1031 additions and 120 deletions

505
nouns-adjs/adverbs.js Normal file
View File

@ -0,0 +1,505 @@
module.exports = [
{ ts: 1527812449, e: `there` }, // هلته - hálta, álta
{ ts: 1527823758, e: `only, just` }, // ایکي - eekee
{ ts: 1527813043, e: `without delay, immediately` }, // بې له ټاله - be la Taala
{ ts: 1527823145, e: `outside, from without, on the outside; abroad (as in out of country)` }, // بېرون - beróon
{ ts: 1527811735, e: `artistically, skillfully` }, // هنرمندانه - hUnarmandaana
{ ts: 1527813516, e: `how` }, // څنګه - tsanga, tsunga
{ ts: 1578014249199, e: `therein` }, // پکښې - pukxe
{ ts: 1527821618, e: `stupidly, foolishly, stupid, foolish; stupid, foolish` }, // احمقانه - ahmaqaana
{ ts: 1579824262965, e: `together, in one place; at the same time` }, // یو ځای - yo dzaay
{ ts: 1527822788, e: `tonight, this evening` }, // بېګاته - begáata
{ ts: 1527812183, e: `aware of, thinking of` }, // ورپام - wărpaam
{ ts: 1527814711, e: `soon, very soon, shortly` }, // لنډ پر لنډه - lanD par lanDa
{ ts: 1527821930, e: `impromptu, without preparation` }, // بالبدیهه - bilbadeehá
{ ts: 1527814164, e: `this side, on this side` }, // دېخوا - dekhwaa
{ ts: 1527815160, e: `yesterday` }, // پرون - paroon
{ ts: 1623688539364, e: `nasal (speaking through the nose)` }, // ګانګوړ - gaangóR, gaangwÚR
{ ts: 1588780597931, e: `near, close to, almost` }, // نېږدې - neGdé
{ ts: 1527821127, e: `specifically, especially, in particular` }, // مشخصاً - mUshakhkhasan
{ ts: 1527811221, e: `above, overhead` }, // پورته - porta
{ ts: 1611401028364, e: `physically` }, // جسماً - jismán
{ ts: 1527815099, e: `late` }, // نا وخته - naa wakhta
{ ts: 1527823029, e: `evident, open, manifestly, frankly` }, // برالا - baraalaa
{ ts: 1527817154, e: `after (as in going after), in pursuit, behind (د چا پسې خبرې کول to talk bad about someone, gossip, or talk bad behind their back)` }, // پسې - pase
{ ts: 1527818325, e: `fee; useless person, idle, vagrant; barely, just, scarcely, only, merely` }, // اېله - elá
{ ts: 1610796256372, e: `forward` }, // مخ په وړاندې - mukh pu wRaande
{ ts: 1527819870, e: `unfaily, unjustly, falsely, undeservingly` }, // په ناحقه - pu naahaqa
{ ts: 1527815228, e: `slow; slowly` }, // رو - roo
{ ts: 1575236274891, e: `this way, here, over there` }, // دوري - dóoree
{ ts: 1527818064, e: `after him/her/it/them, behind` }, // ورپسې - warpase
{ ts: 1527820292, e: `behind` }, // شاته - shaata
{ ts: 1610443940798, e: `finally, end` }, // اخیر - akhéer
{ ts: 1527812428, e: `exactly, precisely, as is` }, // کټمټ - kaTmaT, kuTmuT
{ ts: 1527818594, e: `naturally, by nature, of course` }, // طبعاً - tab'án
{ ts: 1527822766, e: `suddenly, immediately, instantly, at once` }, // وار له واره - waar la waara
{ ts: 1527812448, e: `of course, certainly` }, // البته - albatta
{ ts: 1527812935, e: `face to face, across from, opposite; straight` }, // مخامخ - mukhaamukh
{ ts: 1527813711, e: `sudden, suddenly, unexpected, unexpectedly, unforeseen` }, // ناڅاپه - naatsaapa
{ ts: 1527823633, e: `lets suppose, supposing, supposedly` }, // بالفرض - bilfárz
{ ts: 1527818327, e: `pure, uncontaminated; plain, simple; merely, only, purely` }, // محض - mahz
{ ts: 1527814561, e: `duty bound, answering the call of duty` }, // وظیفتاً - wazeefatan
{ ts: 1527821294, e: `never, not at all` }, // هرګز - hărgíz
{ ts: 1527815428, e: `alone, only` }, // یوازې - yawaaze
{ ts: 1527817895, e: `maybe, perhaps, possibly, apparently` }, // ګوندې - goonde
{ ts: 1527818439, e: `last night, yesterday evening; this evening, dusk` }, // بېګا - begaa
{ ts: 1527811712, e: `near, close, basically, approximately; control, check` }, // کابو - kaaboo
{ ts: 1527812665, e: `any time` }, // هر کله - hăr kala
{ ts: 1527822392, e: `all over, in every corner` }, // ګوټ ګوټ - gooT gooT
{ ts: 1527818697, e: `forgotten` }, // فراموش - faraamosh, faraamoosh
{ ts: 1595233263437, e: `suddenly, unexpectedly, out of turn, embarrassed` }, // بې واره - bewáara
{ ts: 1527817342, e: `scrutiny, deliberation, intent; carefully, watchfully, intently (as in looking at somebody intently چا ته په ځير کتل)` }, // ځیر - dzeer
{ ts: 1527823024, e: `besides, except for, without (د دې نه بغير)` }, // بغیر - baghéyr
{ ts: 1566476668924, e: `practically, in practice` }, // عملاً - amalán
{ ts: 1527822699, e: `actually, in fact` }, // اساساً - asaasan
{ ts: 1595233763403, e: `attaining, achieving; precise, exact; height?` }, // رسا - rasáa, rusáa
{ ts: 1527823231, e: `evasively` }, // په جڼه جڼه - pu jaNa jaNa
{ ts: 1527812890, e: `usually` }, // معمولاً - mamoolan
{ ts: 1586363985796, e: `daily, each day` }, // روزانه - rozaaná
{ ts: 1527819008, e: `autocratic, despotic, absolute` }, // مطلق العنان - mUtlaq-Ul-'ináan
{ ts: 1527822660, e: `automatically, on ones own, on its own` }, // خود به خود - khoodbakhood
{ ts: 1527823364, e: `in spite of, despite, notwithstading` }, // باوجود - baawujood
{ ts: 1527820143, e: `after, later, afterwards` }, // پسته - pasta
{ ts: 1527821368, e: `unconditional` }, // بلاشرط - bilaashárt
{ ts: 1527814075, e: `pure, entirely, totally, completely` }, // سوچ - sooch
{ ts: 1527814911, e: `near, close to, almost` }, // نږدې - naGde
{ ts: 1527822215, e: `by foot, on foot, walking` }, // پېدل - pedál
{ ts: 1527813790, e: `because of this, for this reason` }, // په دې خاطر - pu de khaatur
{ ts: 1527822329, e: `in a detailed fashion, thoroughly` }, // مفصلاً - mUfasalan
{ ts: 1527818655, e: `right up to, even; exactly, directly` }, // عن - an
{ ts: 1527815358, e: `all; gathered, collected; gross (as opposed to net)` }, // ټول - Tol
{ ts: 1527819777, e: `monthly, by the month, per month` }, // ماهواري - maahawaaree
{ ts: 1527818774, e: `without a doubt, undoubtedly, certain` }, // بې شبهه - be shÚbha
{ ts: 1527821224, e: `only, just, uniquely, thats all, the end` }, // فقط - faqát
{ ts: 1527817302, e: `together, in one place` }, // یوځای - yodzaay
{ ts: 1527820499, e: `for a time, for temporary use, for rent` }, // عاریتاً - aariyatan
{ ts: 1527815959, e: `in an instant, in a flash, at once` }, // دم درحال - dam dărhaal
{ ts: 1527821253, e: `near, close (نژدې)` }, // نزدې - nizde, nazde
{ ts: 1527815997, e: `unfortunately` }, // بدبختانه - badbakhtaana
{ ts: 1584688791272, e: `on purpose, intentionally (قصداً)` }, // په لوی لاس - pu looy laas
{ ts: 1527814166, e: `side by side` }, // خوا په خوا - khwaa pu khwaa
{ ts: 1527818306, e: `daily, everyday` }, // هرورځنی - hărwradzanéy
{ ts: 1527815198, e: `formerly, before` }, // پخوا - pukhwaa
{ ts: 1527817953, e: `consciously, (doing something) while being informed` }, // اګاهانه - agaahaana
{ ts: 1586453865821, e: `at the same time` }, // هم مهاله - hum mahaala
{ ts: 1527818003, e: `obligatory, necessary; definitely, surely` }, // ضرور - zaróor
{ ts: 1527821734, e: `especially` }, // خاصتاً - khaassatán
{ ts: 1527813653, e: `in this way, like this` }, // دغسې - daghase
{ ts: 1527813773, e: `for example` }, // مثلاً - maslan
{ ts: 1527815963, e: `now, at this moment` }, // دم دستي - dam dastee
{ ts: 1527821877, e: `verbal, oral; verbally, orally` }, // شفاهي - shafaahee
{ ts: 1527819031, e: `by chance, coincidentally, accidentally` }, // تصادفاً - tasaadUfan
{ ts: 1527813109, e: `really, truly, real, true` }, // واقعي - waaqee
{ ts: 1578015603537, e: `above` }, // له پاسه - la paasa
{ ts: 1527823385, e: `cowardly` }, // بزدلانه - bUzdilaana
{ ts: 1586265891338, e: `until now, up until now, yet` }, // تر اوسه - turoosa
{ ts: 1527812743, e: `when, sometimes` }, // کله - kala
{ ts: 1527811637, e: `most, the majority, predominating` }, // زیاتره - zyaatara
{ ts: 1527811328, e: `sincerely, truthfully, faithfully` }, // صادقانه - saadiqaana
{ ts: 1576439306974, e: `honourably` }, // ابرومندانه - abroomandaana
{ ts: 1527822114, e: `barely, scarcely, just, hardly ever; just, so much; in vain, for naught, for no reason` }, // هیله بیله - heela beela
{ ts: 1527818329, e: `extremity, end, maximum, utmost; only, the thing is, at least` }, // منتها - mUntaháa
{ ts: 1527816311, e: `approximately, about` }, // تقریباً - taqreeban
{ ts: 1527820706, e: `extremely, ultimately` }, // نهایتاً - nihaayatan
{ ts: 1527818709, e: `in particular, especially` }, // خصوصاً - khUsoosan
{ ts: 1527822388, e: `immediately, instantly, right away` }, // ټک په ټک - Tak pu Tak
{ ts: 1584515639723, e: `at least` }, // اقلاً - aqalan
{ ts: 1578006215294, e: `beginner, new, inexperienced; a little bit` }, // نوکی - nawakéy
{ ts: 1527813279, e: `in front of, forward, ahead of` }, // مخته - mukhta
{ ts: 1527818411, e: `logically` }, // منتقاً - mantiqan
{ ts: 1527814269, e: `unfortunately, regretfully` }, // متاسفانه - mUtaasafaana
{ ts: 1527819967, e: `definitely, for sure, whether someone wants or not, willy-nilly (this last use more in Urdu)` }, // خامخا - khaamakhaa
{ ts: 1527815457, e: `all over, throughout` }, // سراسري - săraasaree
{ ts: 1527820539, e: `honourably, with dignity` }, // شرافتمندانه - sharaafatmandaana
{ ts: 1576103092146, e: `involuntarily, unintentionally` }, // غیر اختیاري - gheyr ikhtiyaaree
{ ts: 1527815347, e: `last year` }, // تېرکال - terkaal
{ ts: 1527811405, e: `officially` }, // رسماً - rasman
{ ts: 1527816897, e: `last year` }, // پروسږکال - prosaGkaal
{ ts: 1527818069, e: `in front of him/her/it/them` }, // وروړاندې - wărwRaande
{ ts: 1527812987, e: `the day after tomorrow` }, // پس صبا - passabaa
{ ts: 1527814452, e: `at the side of something, yonder, over there` }, // ایسته - eesta
{ ts: 1527819269, e: `individually, separately, apart` }, // ځانله - dzaanla
{ ts: 1527815243, e: `tomorrow, morning` }, // صبا - sabaa
{ ts: 1527811604, e: `intentionally, purposefully` }, // په قصد - pu qasd
{ ts: 1527813200, e: `just so much, exactly this much, only` }, // همدومره - hamdoomra
{ ts: 1527813586, e: `as` }, // په توګه - pu toga
{ ts: 1527823589, e: `poorly, miserably, thinly, sparsely` }, // ناداره - naadaará
{ ts: 1568927284353, e: `again and again, again, over and over (څو ځلې)` }, // په کراتو - pu karaato ??
{ ts: 1527812322, e: `just, just because; in vain, for no reason, to no avail` }, // هاسې - haase
{ ts: 1527822679, e: `successfully` }, // کامیابانه - kaamyaabaana
{ ts: 1566477540941, e: `totally, wholly, all together` }, // جمعاً - jam'an
{ ts: 1527815719, e: `in this way, in the same way, in just this way` }, // همدارنګه - hamdaaranga
{ ts: 1585821362480, e: `most, the majority, mostly` }, // اکثره - aksara
{ ts: 1527815385, e: `until the end, until the finish` }, // تر پایه - tur paaya
{ ts: 1527815193, e: `together, combined` }, // په ګډه - pu guDa
{ ts: 1527814109, e: `first, at first` }, // اول - awwal
{ ts: 1527811233, e: `openly, frankly` }, // ډاګه - Daaga
{ ts: 1585835393077, e: `last night` }, // برایي - baraayée
{ ts: 1527823027, e: `at least` }, // کم از کم - kam az kam
{ ts: 1527816912, e: `outside, outside of, beyond` }, // دباندي - dubaandee
{ ts: 1527816580, e: `direct, straight` }, // مستقیم - mUstaqeem
{ ts: 1527822780, e: `forward, towards` }, // ورمخته - wărmukhta
{ ts: 1527815242, e: `tomorrow, morning` }, // سبا - sabaa
{ ts: 1527815070, e: `all alone, alone` }, // یک تنها - yaktanhaa
{ ts: 1527819758, e: `totally, fully, completely` }, // کاملاً - kaamilan
{ ts: 1527817002, e: `along with, alongside of` }, // ترڅنګ - turtsang
{ ts: 1527818671, e: `once, ever, anytime, sometimes, now and then` }, // ګاهې - gaahe
{ ts: 1527822214, e: `by foot, on foot, walking; pedestrian, infantry` }, // پیاده - piyaada
{ ts: 1527813690, e: `above, on top` }, // بر - bar
{ ts: 1527814710, e: `soon, very soon, shortly` }, // نژدې پر نژدې - najzde par najzde
{ ts: 1527821743, e: `at first` }, // ابتداً - ibtidán
{ ts: 1527817155, e: `continuous, back to back, uninterrupted, constant, unceasing` }, // پرله پسې - parlapase
{ ts: 1527818323, e: `barely, just, scarcely, only, merely` }, // ایله - eelá
{ ts: 1527822464, e: `in imitation, in manner of copying` }, // تقلیداً - taqleedan
{ ts: 1527813650, e: `like, as, similar to; spot, stain` }, // لکه - lăka
{ ts: 1527811618, e: `as` }, // منحیث - minheys
{ ts: 1527822465, e: `with trouble, with difficulty, strained` }, // تقلیفاً - taqleefan
{ ts: 1527817294, e: `up, above` }, // پاس - paas
{ ts: 1527819016, e: `directly` }, // مستقیماً - mUstaqeeman
{ ts: 1527817351, e: `around, surrounding, encompassing` }, // ګرد چاپېره - gardchaapera
{ ts: 1527814605, e: `far, distant` }, // لرې - lure
{ ts: 1527819679, e: `special (fig. really, well, actually, totally)` }, // خاص - khaas
{ ts: 1527820827, e: `one time, once` }, // یوځل - yawdzal
{ ts: 1527821764, e: `wild, savage, barbaric` }, // وحشیانه - wahshiyaana
{ ts: 1527821332, e: `respectfully` }, // دست بسته - dastbastá
{ ts: 1527820017, e: `suddenly, at once, unexpectedly, by chance` }, // یوناڅاپه - yawnaatsáapa
{ ts: 1527818326, e: `merely, only` }, // صرفاً - sarfan
{ ts: 1527812371, e: `never` }, // هیڅ کله - heetskala
{ ts: 1527822803, e: `far, distantly, a bit further, to the side, back, away, direction` }, // هیسته - héesta
{ ts: 1610800613765, e: `as if, like, seemingly; or else, otherwise` }, // ګڼې - gaNe
{ ts: 1527819007, e: `absolute, fully, unconditional, absolutely` }, // مطلق - mUtláq
{ ts: 1527818714, e: `gradually` }, // په تدریجي ډول - pu tadreejee Dawul
{ ts: 1527817350, e: `around, surrounding, encompassing` }, // چاپېره - chaapera
{ ts: 1610800612067, e: `as if, like, seemingly; or else, otherwise` }, // ګنې - gane
{ ts: 1527816043, e: `still, even so` }, // بیا هم - byaa hum, byaa ham
{ ts: 1527818040, e: `fortunately` }, // د ښه مرغه - du xu murgha
{ ts: 1527814904, e: `empty, hollow; just` }, // تش - tush, tash
{ ts: 1527820490, e: `half-and-half, rented on a metayage basis` }, // نیمکاره - neemkaara
{ ts: 1527813874, e: `crooked, winding, twisted` }, // تاوراتاو - taawraataaw
{ ts: 1579389575376, e: `in name, by name only` }, // په نامه - pu naama
{ ts: 1527820440, e: `all the more, still more` }, // لاپسې - laapasé
{ ts: 1527818174, e: `how, like` }, // څرنګه - tsuranga
{ ts: 1527813915, e: `before, in front of` }, // مخکې - mukhke
{ ts: 1527818596, e: `naturally, by ones nature` }, // طبیعتاً - tabiy'atan
{ ts: 1527819271, e: `relatively` }, // نسبتاً - nisbatan
{ ts: 1527819335, e: `on an empty stomach, not having eaten` }, // نهار نهور - niháar nUhóor
{ ts: 1527811270, e: `from a distance, from afar, distantly` }, // له ورا - lawraa
{ ts: 1527815317, e: `immediately, instantly` }, // سمدستي - sumdustee
{ ts: 1527816034, e: `behind` }, // تر شا - tur shaa
{ ts: 1610454983695, e: `at this place, at that place, here` }, // دغلته - daghalta
{ ts: 1527811243, e: `even, even up to, as far as, right up to, precisely` }, // ان - an
{ ts: 1527818049, e: `foolishly, ignorantly, carelessly (often religious, ignoring eternal consequences)` }, // غافلانه - ghaafilaana
{ ts: 1595517249765, e: `quickly` }, // په جلتۍ - pu jaltúy
{ ts: 1622875116871, e: `just like that/this (abrev of هم دغسې)` }, // همدغسې - humdaghase
{ ts: 1527815135, e: `now` }, // اوس - oos
{ ts: 1527815433, e: `one each` }, // یو یو - yo yo
{ ts: 1577390288042, e: `colloqiual/dialectical contraction of the adverb پرې (thereupon, thereon)` }, // پې - pe
{ ts: 1527811986, e: `similarly` }, // همداراز - humdaaraaz
{ ts: 1566476674338, e: `theoretically, in theory` }, // نظراً - nazarán
{ ts: 1527820087, e: `time and again, occasionally ???` }, // وخت ناوخت - wakhtnaawakht
{ ts: 1527814163, e: `that side, across` }, // اخوا - akhwaa
{ ts: 1527822165, e: `straight, level, right away, direct, frank` }, // سیده - seeda
{ ts: 1527814912, e: `near, close to` }, // رانږدې - raanaGde
{ ts: 1593176318060, e: `openly, direct` }, // ډانګ پېیلی - Daang pe`yúley
{ ts: 1527819455, e: `because of this` }, // د دې له کبله - du de la kabala
{ ts: 1578330078760, e: `badly, bad` }, // بدبد - badbad, budbud
{ ts: 1527815962, e: `in the middle of the night` }, // شومه دم - shooma dam
{ ts: 1527816658, e: `immediately, at once, right away` }, // دم په دستي - dampudastee
{ ts: 1527819321, e: `down, below; slope` }, // کښته - kxúta
{ ts: 1527812559, e: `very, lots, many` }, // ډېر - Der
{ ts: 1527812683, e: `also, too, as well, even more` }, // هم - hum, ham, hUm
{ ts: 1527812413, e: `after oneself` }, // راپسې - raapase
{ ts: 1527823390, e: `deliberately, intentionally, on purpose` }, // عمداً - amadan
{ ts: 1527815532, e: `undoubtably, absolutely, without doubt, of course` }, // بې شک - beshak
{ ts: 1588781449015, e: `around, surrounding, encompassing` }, // چار چاپېره - chaarchaapera
{ ts: 1527814278, e: `on purpose, intentionally` }, // قصداً - qasdan
{ ts: 1527811781, e: `in the same degree, insofar as, in the same measure` }, // هماغومره - humaaghaoomra
{ ts: 1645130994575, e: `apparently, visibly, ostensibly, by appearance, outwardly` }, // ظاهراً - zaahiran
{ ts: 1527820016, e: `until` }, // ترهغه - turhaghú
{ ts: 1527813259, e: `finally, at last (Arabic)` }, // بالاخره - bilaakhira
{ ts: 1527818438, e: `with dignity, respectfully` }, // با عزت - baa izzat
{ ts: 1527813122, e: `inside, within, interior` }, // دننه - dununa
{ ts: 1527815318, e: `immediately, urgently, instantly` }, // سملاستي - sumlaastee
{ ts: 1527819294, e: `in the morning` }, // سهر وختي - sahar wakhtee
{ ts: 1527811327, e: `sincere; sincerely, in a heartfelt manner` }, // صمیمانه - sameemaana
{ ts: 1577390207734, e: `thereupon, thereon, په plus something previously mentioned` }, // پرې - pre
{ ts: 1527818716, e: `gradually` }, // تدریجاً - tadreejan
{ ts: 1527822285, e: `all, the whole, total` }, // کل - kUl
{ ts: 1527822183, e: `according to Sharia law` }, // شرعاً - sharan
{ ts: 1527818276, e: `at the time of, during (د ... پر مهال)` }, // پرمهال - purmahaal
{ ts: 1527814270, e: `unfortunately, regretfully` }, // له بده مرغه - la buda margha, la buda murgha
{ ts: 1527820764, e: `wise, sensible, intelligent, prudent` }, // عاقلانه - aaqilaana
{ ts: 1527814453, e: `over here, this side` }, // را ایسته - raaeesta
{ ts: 1527815261, e: `around, all around, approximately` }, // شاوخوا - shaawkhwaa, shaa-U-khwaa
{ ts: 1527818186, e: `after you (sing and plural)` }, // درپسې - dărpase
{ ts: 1527820198, e: `completely, totally, absolutely` }, // مطلقاً - mUtlaqán
{ ts: 1584689085630, e: `indirectly` }, // نامستقیماً - naamUstaqeeman
{ ts: 1527814881, e: `urgently, sudden` }, // فوري - foree, fauree
{ ts: 1527819385, e: `especially, in particular` }, // بالخصوص - bilkhUsóos
{ ts: 1527814146, e: `slowly, gently, quietly, softly` }, // سوکه سوکه - sawka sawka
{ ts: 1527813591, e: `friendly, in a friendly manner` }, // دوستانه - dostaana
{ ts: 1576104020648, e: `involuntarily, unintentionally` }, // غیر ارادي - gheyr iraadee
{ ts: 1527816767, e: `obvious, openly, boldly, immodestly` }, // رډ رډ - raDraD
{ ts: 1527812520, e: `again` }, // بیا - byaa
{ ts: 1527812496, e: `completely, totally` }, // بېخي - bekhee
{ ts: 1527817710, e: `that side, across` }, // ها خوا - haakhwaa
{ ts: 1527814067, e: `this very` }, // همدا - hamdaa
{ ts: 1527817230, e: `by force` }, // په زور - pu zor
{ ts: 1571626944932, e: `always, forever` }, // همېش - hamésh
{ ts: 1614083674358, e: `hurridly, urgently` }, // عاجلانه - aajilaana
{ ts: 1527813595, e: `such, as much, so much, much, as much as, until` }, // چندان - chandaan
{ ts: 1527811222, e: `like, similar to, in this style, manner` }, // په څېر - pu tser
{ ts: 1527813692, e: `for the sake of, because of, out of deference to` }, // په خاطر - pu khaatir
{ ts: 1623688507454, e: `nasal (speaking through the nose)` }, // ګنګوړ - gangóR, gangwÚR
{ ts: 1527820344, e: `voluntarily` }, // په داوطلب ډول - pu daawtaláb Dawul
{ ts: 1527811360, e: `at the same time, simultaneous` }, // هم مهاله - hammahaala
{ ts: 1527812498, e: `yes (from Farsi)` }, // بلې - băle
{ ts: 1586262008294, e: `never, not at all` }, // پېټ - peT
{ ts: 1527818646, e: `double, twofold` }, // یو په دوه - yawpudwá
{ ts: 1527812762, e: `empty, only, just` }, // خالي - khaalee
{ ts: 1600075984510, e: `especially, specifically` }, // په تېره بیا - pu tera byaa
{ ts: 1527818642, e: `double, twin, duplicate, twofold, duplex, both at once` }, // غبرګ - ghbarg
{ ts: 1573149071525, e: `up and down, all over, encompassing the whole geographic range (of a country/land)` }, // لروبر - larobar
{ ts: 1527814268, e: `unfortunately, regretfully` }, // درېغی - dreghey
{ ts: 1527823634, e: `if it so happens that..., possibly` }, // احیاناً - ahiyaanan
{ ts: 1579462935759, e: `more, other, still, yet, various, remaining` }, // نور - nor, noor
{ ts: 1527813588, e: `for instance, for example` }, // د ساري په توګه - du saaree pu toga
{ ts: 1527813038, e: `at once, suddenly, all of a sudden` }, // دواره - duwaara
{ ts: 1527815418, e: `slow` }, // ورو - wroo
{ ts: 1527815215, e: `since (له ... راپدېخوا)` }, // راپدېخوا - raapudekhwaa
{ ts: 1527815260, e: `around, approximately` }, // شاوخوا - shaawkhwaa
{ ts: 1527817261, e: `without reason, for no reason` }, // وچ په وچه - wuchpuwucha
{ ts: 1527814708, e: `close, near, soon, almost` }, // نژدې - nijzde, najzde
{ ts: 1527813686, e: `opposite, on the contrary` }, // برعکس - baraks, barakis
{ ts: 1527819388, e: `inside, in` }, // وردننه - wardunúna
{ ts: 1617989716527, e: `out of place, improperly, incorrectly, irrelevant, incorrect` }, // بېځایه - bedzáaya
{ ts: 1527819899, e: `gradually` }, // د استدراج په توګه - du istidraaj pu toga
{ ts: 1527821015, e: `especially, in particular` }, // خاصکر - khaaskar
{ ts: 1527818185, e: `wherever` }, // هرچرته - hărcharta
{ ts: 1568927364452, e: `automatic, automatically` }, // اتومات - atomáat
{ ts: 1527815533, e: `undoubtably, absolutely, without doubt, of course` }, // بې شکه - beshaka
{ ts: 1527816301, e: `free, wandering, loose, open, not serious; with nonsense, foolishly` }, // یله - yala
{ ts: 1610796249240, e: `forward` }, // مخ پر وړاندې - mukh pur wRaande
{ ts: 1588073608418, e: `suddenly, immediately, at once, currently` }, // دفعتاً - daf'atan
{ ts: 1527822216, e: `by foot, on foot, walking` }, // پیاده پا - piyaada paa
{ ts: 1527823047, e: `suddenly, unexpectedly, all of a sudden` }, // اچانک - achaanak
{ ts: 1527813881, e: `by name, called, so-called` }, // په نامه - pu naama
{ ts: 1527817130, e: `alongside, beside` }, // ترخوا - turkhwaa
{ ts: 1595515640766, e: `more or less (suitable), sooner or later, approximate, changing` }, // تېر و بېر - ter-U-ber
{ ts: 1527822042, e: `above, overhead` }, // راپورته - raaporta
{ ts: 1527818051, e: `eternally, forever, constantly, for eternity` }, // تر ابده - tur abada
{ ts: 1585821444042, e: `accidentally, by chance; unanimously, by consensus` }, // اتفاقاً - itifaaqan
{ ts: 1527818054, e: `merely, only, just (محض)` }, // مازې - máaze
{ ts: 1585489925980, e: `yet, still, hitherto` }, // هنوز - hanóoz
{ ts: 1621018588552, e: `by nature, naturally` }, // ذاتاً - zaatan
{ ts: 1527815195, e: `by force` }, // په زوره - pu zora
{ ts: 1527818717, e: `probably, perhaps, possibly, maybe` }, // شاید - shaayad
{ ts: 1645041265197, e: `publicly` }, // علناً - alanan
{ ts: 1527823077, e: `vainly, in vain` }, // بېهوده - behoodá
{ ts: 1527823222, e: `without rhyme or reason, for no reason at all` }, // سلابلا - salaabaláa
{ ts: 1575239139152, e: `again` }, // باره - baara
{ ts: 1527818524, e: `probably, in all probability, most likely` }, // غالباً - ghaalibán
{ ts: 1527812952, e: `slave-like, slavish, servant-like, servile` }, // غلامانه - ghUlaamaana
{ ts: 1527811234, e: `openly, frankly` }, // په ډاګه - pu Daaga
{ ts: 1527817157, e: `just like that, in just that manner` }, // همداسې - hamdaase
{ ts: 1527814437, e: `shared, together` }, // په شریکه - pu shareeka
{ ts: 1527812780, e: `down, beneath` }, // ښکته - xkuta
{ ts: 1586340494373, e: `at least, minimum (from Farsi)` }, // حد اقل - had-i-aqul
{ ts: 1578080952673, e: `outside, outside of, beyond` }, // دباندې - dubaande
{ ts: 1622374915074, e: `probably, likely, presumptively, having preference/advantage` }, // اغلب - aghláb
{ ts: 1527813323, e: `fortunately, luckily` }, // خوشبختانه - khoshbakhtaana
{ ts: 1527819156, e: `cruel, cruelly, evil` }, // ظالمانه - zaalimaana
{ ts: 1527818313, e: `bi-weekly, every two weeks, fortnightly pay` }, // پنځلس ورځنی - pindzúlaswradzanéy
{ ts: 1527812670, e: `just, basically` }, // هسې - hase
{ ts: 1527818324, e: `barely, just, scarcely, only, merely` }, // په مټې - pumúTe
{ ts: 1527820205, e: `sometimes` }, // کله ناکله - kalanaakala
{ ts: 1527812278, e: `exactly that` }, // هماغه - hamaagha
{ ts: 1527813688, e: `lower, below, down` }, // کوز - kooz
{ ts: 1527821666, e: `magisterial, authoritative` }, // آمرانه - aamuraana
{ ts: 1527817845, e: `exactly, precisely, as is` }, // کټ مټ - kaTmaT, kuTmuT
{ ts: 1527822351, e: `more or less suitable, approximate, changing, alternating, sooner or later` }, // تېر و بېر - ter-U-ber
{ ts: 1527813618, e: `by nature, naturally` }, // طبعاً - taban
{ ts: 1527821531, e: `always, forever, constantly` }, // تل - tul
{ ts: 1527817255, e: `far, distant` }, // لیرې - leere
{ ts: 1527812472, e: `again and again, often` }, // بار بار - baar baar
{ ts: 1527811459, e: `gradually, in turns` }, // وار په وار - waar pu waar
{ ts: 1527814590, e: `alongside, along with this` }, // تر څنګ - tur tsang
{ ts: 1610796828062, e: `pride, arrogance, haughtiness; arrogantly, proudly` }, // ناغ - naagh
{ ts: 1527817080, e: `totally, absolutely, entirely, wholly; thats right, yep` }, // بالکل - bilkUl
{ ts: 1622369722256, e: `directly` }, // نېغ په نېغه - negh pu negha
{ ts: 1527813928, e: `right here, in this very place` }, // همدلته - hamdalta
{ ts: 1527812293, e: `with you` }, // درسره - dărsara
{ ts: 1527819160, e: `absolutely, decisively, categorically` }, // قطعاً - qattan
{ ts: 1527814690, e: `this year, current year` }, // سږکال - suGkaal
{ ts: 1527814145, e: `slowly, gently, quietly, softly` }, // سوکه - sawka
{ ts: 1527812983, e: `after, later, afterwards, susequently` }, // پس - pas
{ ts: 1574354759066, e: `slowly, gently, quietly, softly` }, // سوکه - sooka
{ ts: 1527821252, e: `always, constantly, eternally` }, // همېشه - hamesha
{ ts: 1591984859456, e: `perhaps, really?` }, // ګڼې - gaNé
{ ts: 1527819835, e: `all at once, straight away, right away; quite, completely` }, // یواریځ - yawaaréedz
{ ts: 1527812671, e: `definitely` }, // حتماً - hatman
{ ts: 1574354762646, e: `slowly, gently, quietly, softly` }, // سوکه سوکه - sooka sooka
{ ts: 1527822241, e: `sudden, suddenly, unexpected, unexpectedly, unforeseen (ناڅاپه)` }, // ناببره - naabUbúra
{ ts: 1527814256, e: `full, complete, total, totally, entire` }, // پوره - poora
{ ts: 1527811269, e: `from afar, clearly, apparent` }, // له ورایه - lawraaya, la weraya
{ ts: 1527822218, e: `by foot, on foot, walking` }, // پیاده روي - piyaada rawee
{ ts: 1527822286, e: `totally, entirely` }, // کلاً - kUllan
{ ts: 1527815291, e: `only, just` }, // صرف - sirf
{ ts: 1527812419, e: `fully, quite` }, // هډو - haDo
{ ts: 1527818118, e: `everywhere, every place` }, // هرځای - hărdzaay
{ ts: 1527811773, e: `very much, exceedingly` }, // زښت - zuxt
{ ts: 1527815454, e: `quickly, fast` }, // زر - zur
{ ts: 1577408435617, e: `unwillingly, grudingly` }, // په نه زړه - pu nu zRu
{ ts: 1527814568, e: `willingly, voluntarily` }, // په خوښه - pu khwaxa
{ ts: 1527819158, e: `exactly, precisely` }, // دقیقاً - daqeeqan
{ ts: 1527819818, e: `last, final; lately, at last, in recently` }, // آخر - aakhir, aakhur
{ ts: 1527818408, e: `last year` }, // پروسه کال - parosa kaal
{ ts: 1527823722, e: `right away, immediately, at once, urgently` }, // فوراً - forán, faurán
{ ts: 1527819029, e: `by chance, coincidental, coincidentally, accidental, accidentally` }, // تصادفي - tasaadUfee
{ ts: 1527815188, e: `besides, without` }, // پرته - prata
{ ts: 1527812721, e: `quickly, fast` }, // ژر - jzur
{ ts: 1527811873, e: `seperately, apart, scattered, strew about` }, // تار په تار - taarputaar
{ ts: 1527815416, e: `ahead, forward, before, earlier` }, // وړاندې - wRaande
{ ts: 1527822222, e: `above` }, // د پاسه - du paasa
{ ts: 1527819243, e: `immediately, right away, quickly` }, // سمدلاسه - samdalaasa
{ ts: 1527819393, e: `over/across to you/there` }, // درپورې - darpore
{ ts: 1527815136, e: `presently` }, // اوسمهال - oosmahaal
{ ts: 1584549648579, e: `suddenly, at once, all of a sudden` }, // ناګهانه - naagahaana
{ ts: 1527814324, e: `probably, possibly` }, // ښایي - xaayee
{ ts: 1527812138, e: `as fast as possible, as quickly as possible, immediately` }, // ژر تر ژره - jzurturjzura
{ ts: 1527816581, e: `indirect` }, // غیر مستقیم - gheyr-i-mUstaqeem
{ ts: 1527811508, e: `completely, totally` }, // په بشپړه توګه - pu bushpuRa toga
{ ts: 1527815514, e: `especially, particularly` }, // مخصوصاً - makhsoosan
{ ts: 1527815069, e: `on one's own, single handed` }, // تکې تنها - tuketanhaa
{ ts: 1527812321, e: `such, like this, like that, like` }, // داسې - daase
{ ts: 1527823533, e: `there, in that place, thence` }, // هغلته - haghalta
{ ts: 1620041996603, e: `air, to do with air/aviation; by air (adv. ie. هوایي راغلې - you came by flying)` }, // هوائي - hawaa`ee
{ ts: 1527817156, e: `continuous, back to back, uninterrupted, constant, unceasing` }, // پرلپسې - parlapase
{ ts: 1527820289, e: `truly, really, actually` }, // واقعاً - waaqi'an, waaqiyan
{ ts: 1588786919406, e: `as fast as possible, as quickly as possible, immediately` }, // زر تر زره - zur tur zura
{ ts: 1575642923868, e: `even, in fact` }, // حتیٰ - hattaa
{ ts: 1527813261, e: `at that time (used in correspondence with کله), in that case, then` }, // هله - hala
{ ts: 1593173287113, e: `summary, synopsis; brief, short; in short, in summary` }, // مجمل - mUjmál
{ ts: 1527815224, e: `right, true, truly` }, // رښتیا - rixtiyaa
{ ts: 1594909066356, e: `around, in the area` }, // خوا و شا - khwaa-U-shaa
{ ts: 1527819344, e: `after` }, // پسه - pása
{ ts: 1527817032, e: `that much, so much, so much as` }, // دغومره - daghaoomra
{ ts: 1527822217, e: `by foot, on foot, walking` }, // پیاده پای - piyaada paay
{ ts: 1527818507, e: `noble, well-known, nobly, with dignity and honour` }, // شریفانه - shareefaana
{ ts: 1527819500, e: `against (د ... پر ضد)` }, // پرضد - purzid
{ ts: 1593683680743, e: `in general, in broad areas, usually, normally` }, // عموماً - Umóoman
{ ts: 1527811333, e: `sincere, frank, open` }, // خلاملا - khalaamalaa
{ ts: 1527821125, e: `logically` }, // په منطقي ډول - pu mantiqee Dawul
{ ts: 1527812137, e: `eternal, everlasting, forever` }, // تل تر تله - tulturtula
{ ts: 1527812375, e: `back (as in return)` }, // واپس - waapus
{ ts: 1527821736, e: `temporarily` }, // په موقت ډول - pu mUwaqqat Dawul
{ ts: 1527816129, e: `scattered, speed, thrown about` }, // خواره واره - khwaarawaara
{ ts: 1527812572, e: `like … (in comparison)` }, // د ... په شان - du … pu shaan
{ ts: 1527811423, e: `below, beneath` }, // لاندې - laande
{ ts: 1527820416, e: `commanding, authoritative` }, // حاکمانه - haakimaana
{ ts: 1527812866, e: `at least` }, // لږترلږه - luG tur luGa
{ ts: 1527822631, e: `side, beside` }, // څېرمه - tsérma
{ ts: 1527818039, e: `unfortunately` }, // د بده مرغه - du buda murgha
{ ts: 1527816088, e: `always, at all times` }, // همیشه - hameysha
{ ts: 1527815951, e: `constantly, every instant` }, // دم پدم - dampudam
{ ts: 1527819360, e: `towards (د چا خوا ته)` }, // خواته - khwaata
{ ts: 1527817550, e: `conservatively, conservative` }, // محافظه کارانه - mUhaafizakaaraana
{ ts: 1527823349, e: `certainly, surely, definitely` }, // یقیناً - yaqeenan
{ ts: 1527815124, e: `these days` }, // نن سبا - nun sabaa
{ ts: 1527818245, e: `extremely, bound, limit; extreme, excessive` }, // نهایت - nihaayat
{ ts: 1527820609, e: `good, well, firmly (انګليسي ښه ټايټه زده دا - hes learnt English really well)` }, // ټایټ - TaayT
{ ts: 1527816045, e: `itself, himself, herself, etc.` }, // په خپله - pukhpula
{ ts: 1527813061, e: `quickly, without delay` }, // بې درنګه - bediranga
{ ts: 1527818056, e: `now, presently, currently, right now, for now, at once, immediately` }, // فی الحال - filháal
{ ts: 1527818654, e: `eye, source, well-spring, essence; exact, precisely, exactly` }, // عین - ayn
{ ts: 1527818669, e: `childishly` }, // ماشومانه - maashoomaana
{ ts: 1527822765, e: `suddenly, immediately, instantly, at once` }, // له واره - la waara
{ ts: 1527814913, e: `near, close to` }, // ورنږدې - warnaGde
{ ts: 1527816312, e: `about, estimated` }, // تخمیناً - takhmeenan
{ ts: 1578191355725, e: `obvious, evident; bold, impertinent, rude; complex, confused; completely, quite` }, // رټ - raT, ruT
{ ts: 1527820456, e: `on me, on us (باندې with 1st person directive pronoun)` }, // راباندې - raabaande
{ ts: 1527812457, e: `actually` }, // اصلاً - aslan
{ ts: 1527813034, e: `without delay, quickly` }, // بې ځنډه - be dzunDa
{ ts: 1617989743649, e: `out of place, improperly, incorrectly, irrelevant, incorrect` }, // بې ځایه - be dzáaya
{ ts: 1527811244, e: `even, even up to, as far as, right up to, precisely` }, // آن - aan
{ ts: 1527816949, e: `as much as` }, // هومره - hoomra
{ ts: 1527821995, e: `finally, end` }, // اخر - akhúr, akhír
{ ts: 1527817078, e: `sure, certainly, totally, surely, aware` }, // خود - khood, khwud
{ ts: 1527823176, e: `surely, naturally, independently` }, // آخود - aakhwad
{ ts: 1586626956539, e: `all, everything, everyone` }, // درست - drust, drast
{ ts: 1527818644, e: `existing, current; currently, on the present` }, // برحال - barháal
{ ts: 1527815340, e: `repeating, repitition, repeated; again` }, // تکرار - tăkraar
{ ts: 1527811636, e: `most, the majority, mostly` }, // اکثر - aksar
{ ts: 1620904454896, e: `sincerely, sincere` }, // مخلصانه - mUkhlisaana
{ ts: 1581189430959, e: `ahead, in front; earlier, first, before` }, // پېش - pesh
{ ts: 1527818710, e: `fortunately, luckily, thankfully` }, // خوشبختانه - khooshbakhtaana
{ ts: 1527819419, e: `still` }, // لاهم - laahum
{ ts: 1527811657, e: `air, to do with air/aviation; by air (adv. ie. هوایي راغلې - you came by flying)` }, // هوایي - hawaayee
{ ts: 1527822405, e: `every moment, constantly` }, // دم په دم - dámpudam
{ ts: 1527818249, e: `as if, as though, like, as if it was, it seems, perhaps` }, // ګویا - goyaa, gooyaa
{ ts: 1610797421074, e: `unconscious, subconscious, un-aware, slow-witted` }, // لاشعوري - laashU'ooree
{ ts: 1527822198, e: `continually, perpetually, permanently, always` }, // مدام - mUdáam
{ ts: 1527819210, e: `late` }, // ناوخته - naawakhta
{ ts: 1527812558, e: `here` }, // دلته - dălta
{ ts: 1650297924157, e: `humble, humbly` }, // عاجزانه - aajizaana
{ ts: 1527813772, e: `for example` }, // د بېلګې په توګه - du belge pu toga
{ ts: 1527815029, e: `alone, lone, solitary, only; desolate` }, // تنها - tanhaa
{ ts: 1527820921, e: `separate, separately` }, // علیحده - aleyhida, alaeyda
{ ts: 1527817376, e: `from you` }, // درڅخه - dărtsukha
{ ts: 1527822852, e: `this way and that way, here and there` }, // دېخوا هاخوا - dekhwaa haakhwaa
{ ts: 1527820103, e: `required (as of a payment or penalty), at once, immediately, forthwith` }, // یوموټ - yawmóoT
{ ts: 1527820737, e: `in this/that way, like this/that` }, // هغسې - haghase
{ ts: 1527823338, e: `that much, so much (هغومره)` }, // هاغومره - haaghoomra
{ ts: 1527814318, e: `in front, forward, before` }, // مخکښې - mukhkxe
{ ts: 1584689070748, e: `indirect` }, // نامستقیم - naamUstaqeem
{ ts: 1527821752, e: `except for, excepting, with the exception of` }, // ماسوا - maasiwáa
{ ts: 1527812477, e: `after` }, // بعد - bad
{ ts: 1591382269266, e: `near, close, basically, approximately; control, check` }, // قابو - qaaboo
{ ts: 1527818586, e: `without exception` }, // بلا استثنیٰ - bilaaistisnaa
{ ts: 1527820750, e: `at random, haphazardly` }, // چوټ انداز - choT andaaz, chooT andaaz ??
{ ts: 1527812504, e: `back (as in go back, give back etc.)` }, // بېرته - berta
{ ts: 1571526377164, e: `with a family, having a family` }, // کډن - kaDún
{ ts: 1527819764, e: `monthly, every month` }, // ماهانه - maahaaná
{ ts: 1527822366, e: `willy-nilly` }, // حق ناحق - haqnaaháq
{ ts: 1527819438, e: `far, distant, removed` }, // لېرې - lere
{ ts: 1527819392, e: `moreover, besides, in addition to, apart from, over, above, more than, on top of` }, // برسېره - barséra
{ ts: 1527822184, e: `morally, ethically` }, // اخلاقاً - akhlaaqan
{ ts: 1527813260, e: `finally, totally, completely, all together, in full` }, // تماماً - tamaaman
{ ts: 1588758935200, e: `that way, direction, over there` }, // وراخوا - wăraakhwaa
{ ts: 1527822230, e: `regular, regularly; repaired, restored` }, // باقاعده - baaqaa'ida
{ ts: 1527821919, e: `immediately, right away, instantly` }, // دستي - dustée
{ ts: 1527813778, e: `barefoot` }, // په چپه پښه - pu chapa pxa
{ ts: 1527820805, e: `right there, in the same place, in the very same place` }, // هماغلته - hamáaghalta
{ ts: 1572991416788, e: `definately, for sure, I'll bet, certainly` }, // هرو مرو - haroo maroo
{ ts: 1527819298, e: `early, soon` }, // وختي - wakhtee
{ ts: 1527813064, e: `just, only` }, // ذره - zára
{ ts: 1527819293, e: `immediately, right away, quickly` }, // سملاسي - samlaasee
{ ts: 1527816310, e: `round about, around` }, // چاپېر - chaaper
{ ts: 1527815123, e: `today, these days` }, // نن - nun
{ ts: 1593173323555, e: `in summary, briefly` }, // په مجمله توګه - pu mUjmala toga
{ ts: 1527815410, e: `why` }, // ولې - wăle
{ ts: 1527821715, e: `accordingly, appropriately, in parallel` }, // په موازي ډول - pu mUwaazee Dawul
{ ts: 1527814073, e: `therein` }, // پکې - puke
{ ts: 1527819612, e: `ones own (misspelling of په خپل - cf. پخپله)` }, // پخپل - pukhpul
{ ts: 1527821074, e: `independently` }, // مستقلانه - mUstaqilaana
{ ts: 1527818081, e: `still, even so, yet` }, // بیاهم - byaahum
{ ts: 1527818237, e: `(doing something) himself, herself, myself, ourself etc., used to indicate actions that the subject does himself` }, // پخپله - pukhpula
{ ts: 1527813053, e: `slow, quiet; slowly, quietly` }, // آهسته - aahista
{ ts: 1527811453, e: `until, as much, so that, in order that` }, // ترڅو - turtso
{ ts: 1527816656, e: `now, presently, currently, right now, for now` }, // فعلاً - fi'lan
{ ts: 1577999518050, e: `there, over there, thither` }, // هورې - hooré
{ ts: 1527815225, e: `right, true, truly` }, // رشتیا - rishtiyaa
{ ts: 1527815456, e: `really, lots, tons, maximum, more; much, more, many, excess, most` }, // زیات - zyaat
{ ts: 1584518205499, e: `repeatedly` }, // تکراراً - takraaran
{ ts: 1527812415, e: `immediately, at once, instantly` }, // سم دلاسه - samdulaasa
{ ts: 1527823339, e: `that much, so much` }, // هغومره - haghoomra
{ ts: 1527821616, e: `victimly, pitiful` }, // مظلومانه - mazloomaana
{ ts: 1584691547040, e: `politely, with courtesy, nicely` }, // مودبانه - mUaddabaana
{ ts: 1527812324, e: `in vain, to no avail` }, // هاسې په هاسې - haase pu haase
{ ts: 1527815420, e: `later, after, behind` }, // وروسته - wroosta
{ ts: 1527818595, e: `by nature, naturally` }, // قدرتاً - qUdratan
{ ts: 1527823755, e: `again, once more` }, // دوباره - doobáara
{ ts: 1527816771, e: `short-term` }, // لنډ مهال - lanDmahaal
{ ts: 1588758395153, e: `just like that (abrev. of هم هغسې)` }, // همغسې - humaghase
{ ts: 1527811620, e: `as` }, // په حیث - pu heys
];

View File

@ -1,4 +1,5 @@
module.exports = [ module.exports = [
{ ts: 1527812828, e: "house" }, // kor
{ ts: 1527812432, e: `sky, heaven` }, // آسمان - aasmaan { ts: 1527812432, e: `sky, heaven` }, // آسمان - aasmaan
{ ts: 1527812431, e: `mango` }, // آم - aam { ts: 1527812431, e: `mango` }, // آم - aam
{ ts: 1527812434, e: `sound, voice` }, // آواز - aawaaz { ts: 1527812434, e: `sound, voice` }, // آواز - aawaaz

View File

@ -1,6 +1,6 @@
{ {
"name": "@lingdocs/pashto-inflector", "name": "@lingdocs/pashto-inflector",
"version": "2.5.7", "version": "2.5.8",
"author": "lingdocs.com", "author": "lingdocs.com",
"description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations", "description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations",
"homepage": "https://verbs.lingdocs.com", "homepage": "https://verbs.lingdocs.com",
@ -23,6 +23,8 @@
"registry": "https://npm.lingdocs.com" "registry": "https://npm.lingdocs.com"
}, },
"dependencies": { "dependencies": {
"@formkit/auto-animate": "^1.0.0-beta.1",
"assert-never": "^1.2.1",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"jsurl2": "^2.1.0", "jsurl2": "^2.1.0",
"lz-string": "^1.4.4", "lz-string": "^1.4.4",
@ -78,7 +80,16 @@
"react-app/jest" "react-app/jest"
], ],
"rules": { "rules": {
"no-warning-comments": [1, {"terms": ["fixme", "xxx"], "location": "anywhere"}] "no-warning-comments": [
1,
{
"terms": [
"fixme",
"xxx"
],
"location": "anywhere"
}
]
} }
}, },
"browserslist": { "browserslist": {

View File

@ -68,6 +68,11 @@ pre {
background: var(--closer); background: var(--closer);
} }
.block-card {
background: var(--theme-shade);
border-color: var(--farther);
}
.list-group { .list-group {
background: var(--closer); background: var(--closer);
} }

View File

@ -23,7 +23,7 @@ import {
Modal Modal
} from "react-bootstrap"; } from "react-bootstrap";
import * as T from "./types"; import * as T from "./types";
import { isAdjectiveEntry, isLocativeAdverbEntry, isNounEntry } from "./lib/type-predicates"; import { isAdjectiveEntry, isAdverbEntry, isLocativeAdverbEntry, isNounEntry } from "./lib/type-predicates";
import defualtTextOptions from "./lib/default-text-options"; import defualtTextOptions from "./lib/default-text-options";
import PhraseBuilder from "./components/vp-explorer/VPExplorer"; import PhraseBuilder from "./components/vp-explorer/VPExplorer";
import useStickyState from "./lib/useStickyState"; import useStickyState from "./lib/useStickyState";
@ -38,11 +38,13 @@ const verbTypes: VerbType[] = [
const nouns = nounsAdjs.filter(isNounEntry); const nouns = nounsAdjs.filter(isNounEntry);
const adjectives = nounsAdjs.filter(isAdjectiveEntry); const adjectives = nounsAdjs.filter(isAdjectiveEntry);
const locativeAdverbs = nounsAdjs.filter(isLocativeAdverbEntry); const locativeAdverbs = nounsAdjs.filter(isLocativeAdverbEntry);
const adverbs = nounsAdjs.filter(isAdverbEntry);
const entryFeeder: T.EntryFeeder = { const entryFeeder: T.EntryFeeder = {
locativeAdverbs, locativeAdverbs,
nouns, nouns,
adjectives, adjectives,
verbs, verbs,
adverbs,
}; };
const transitivities: T.Transitivity[] = [ const transitivities: T.Transitivity[] = [

View File

@ -0,0 +1,94 @@
import { useState, useEffect } from "react";
import * as T from "../../types";
import SandwichPicker from "../np-picker/SandwichPicker";
import AdverbPicker from "./AdverbPicker";
type APType = "adverb" | "sandwich";
const types: APType[] = ["adverb", "sandwich"];
function APPicker(props: {
phraseIsComplete: boolean,
onChange: (comp: T.APSelection | undefined) => void,
AP: T.APSelection | undefined,
opts: T.TextOptions,
cantClear?: boolean,
heading?: JSX.Element | string,
entryFeeder: T.EntryFeeder,
onRemove: () => void,
}) {
const [type, setType] = useState<APType | undefined>(props.AP
? props.AP.type
: undefined);
useEffect(() => {
setType(props.AP
? props.AP.type
: undefined);
}, [props.AP]);
function handleClear() {
setType(undefined);
props.onChange(undefined);
}
function handleCompTypeChange(ctp: APType) {
props.onChange(undefined);
setType(ctp);
}
function handleSandwichExit() {
setType(undefined);
props.onChange(undefined);
}
const clearButton = (type && !props.cantClear)
? <button className="btn btn-sm btn-light mb-2" onClick={handleClear}>X</button>
: (!props.cantClear)
? <div>
<div className="clickable" onClick={props.onRemove}><i className="fas fa-trash" /></div>
</div>
: <div></div>;
return <>
<div className="d-flex flex-row justify-content-between">
<div></div>
<div>
{typeof props.heading === "string"
? <div className="h5 text-center">{props.heading}</div>
: props.heading}
</div>
<div>
{clearButton}
</div>
</div>
{!type && <div className="text-center">
<div className="h6 mr-3">
Choose AP
</div>
{types.map((apt) => <div key={apt} className="mb-2">
<button
key={apt}
type="button"
className="mr-2 btn btn-sm btn-outline-secondary"
onClick={() => handleCompTypeChange(apt)}
>
{apt}
</button>
</div>)}
</div>}
<div style={{ minWidth: "9rem" }}>
{type === "adverb" ?
<AdverbPicker
entryFeeder={props.entryFeeder.adverbs}
adjective={props.AP?.type === "adverb" ? props.AP : undefined}
opts={props.opts}
onChange={props.onChange}
/>
: type === "sandwich" ?
<SandwichPicker
onChange={props.onChange}
opts={props.opts}
sandwich={props.AP?.type === "sandwich" ? props.AP : undefined}
entryFeeder={props.entryFeeder}
phraseIsComplete={props.phraseIsComplete}
onExit={handleSandwichExit}
/>
: null}
</div>
</>;
}
export default APPicker;

View File

@ -0,0 +1,37 @@
import * as T from "../../types";
import EntrySelect from "../EntrySelect";
function AdverbPicker(props: {
entryFeeder: T.EntryFeederSingleType<T.AdverbEntry>,
adjective: T.AdverbSelection | undefined,
onChange: (p: T.AdverbSelection | undefined) => void,
opts: T.TextOptions,
}) {
function onEntrySelect(entry: T.AdverbEntry | undefined) {
if (!entry) {
return props.onChange(undefined);
}
props.onChange(makeAdverbSelection(entry));
}
return <div style={{ maxWidth: "225px", minWidth: "125px" }}>
<h6>Adverb</h6>
<div>
<EntrySelect
value={props.adjective?.entry}
entryFeeder={props.entryFeeder}
onChange={onEntrySelect}
name="Adverb"
opts={props.opts}
/>
</div>
</div>;
}
export default AdverbPicker;
function makeAdverbSelection(entry: T.AdverbEntry): T.AdverbSelection {
return {
type: "adverb",
entry: entry,
};
}

View File

@ -3,6 +3,7 @@ import { completeEPSelection, renderEP } from "../../lib/phrase-building/render-
import { compileEP } from "../../lib/phrase-building/compile"; import { compileEP } from "../../lib/phrase-building/compile";
import Examples from "../Examples"; import Examples from "../Examples";
import ButtonSelect from "../ButtonSelect"; import ButtonSelect from "../ButtonSelect";
import { getRenderedSubjectSelection, getSubjectSelection } from "../../lib/phrase-building/blocks-utils";
function EPDisplay({ eps, opts, setOmitSubject }: { function EPDisplay({ eps, opts, setOmitSubject }: {
eps: T.EPSelectionState, eps: T.EPSelectionState,
@ -10,19 +11,21 @@ function EPDisplay({ eps, opts, setOmitSubject }: {
setOmitSubject: (value: "true" | "false") => void, setOmitSubject: (value: "true" | "false") => void,
}) { }) {
const EP = completeEPSelection(eps); const EP = completeEPSelection(eps);
const subject = getSubjectSelection(eps.blocks);
if (!EP) { if (!EP) {
return <div className="lead text-center my-4"> return <div className="lead text-center my-4">
{(!eps.subject && !eps.predicate[eps.predicate.type]) {(!subject && !eps.predicate[eps.predicate.type])
? "Select Subject and Predicate" ? "Select Subject and Predicate"
: (eps.subject && !eps.predicate[eps.predicate.type]) : (subject && !eps.predicate[eps.predicate.type])
? "Select Predicate" ? "Select Predicate"
: (!eps.subject && eps.predicate[eps.predicate.type]) : (!subject && eps.predicate[eps.predicate.type])
? "Select Subject" ? "Select Subject"
: ""} : ""}
</div> </div>
} }
const rendered = renderEP(EP); const rendered = renderEP(EP);
const result = compileEP(rendered); const result = compileEP(rendered);
const renderedSubject = getRenderedSubjectSelection(rendered.blocks).selection;
return <div className="text-center pt-3"> return <div className="text-center pt-3">
<div className="mb-2"> <div className="mb-2">
<ButtonSelect <ButtonSelect
@ -47,7 +50,7 @@ function EPDisplay({ eps, opts, setOmitSubject }: {
{result.e.map((e, i) => <div key={i}>{e}</div>)} {result.e.map((e, i) => <div key={i}>{e}</div>)}
</div>} </div>}
{EP.predicate.selection.type === "participle" && <div style={{ maxWidth: "6 00px", margin: "0 auto" }} className="alert alert-warning mt-3 pt-4"> {EP.predicate.selection.type === "participle" && <div style={{ maxWidth: "6 00px", margin: "0 auto" }} className="alert alert-warning mt-3 pt-4">
<p> NOTE: This means that the subject {rendered.subject.e ? `(${rendered.subject.e})` : ""} is <strong>the action/idea</strong> of <p> NOTE: This means that the subject {renderedSubject.e ? `(${renderedSubject.e})` : ""} is <strong>the action/idea</strong> of
{` `} {` `}
"{rendered.predicate.e ? rendered.predicate.e : "the particple"}".</p> "{rendered.predicate.e ? rendered.predicate.e : "the particple"}".</p>
<p>It <strong>does not</strong> mean that the subject is doing the action, which is what the transaltion sounds like in English.</p> <p>It <strong>does not</strong> mean that the subject is doing the action, which is what the transaltion sounds like in English.</p>

View File

@ -8,10 +8,14 @@ import EqCompPicker from "./eq-comp-picker/EqCompPicker";
import { roleIcon } from "../vp-explorer/VPExplorerExplanationModal"; import { roleIcon } from "../vp-explorer/VPExplorerExplanationModal";
import EqChartsDisplay from "./EqChartsDisplay"; import EqChartsDisplay from "./EqChartsDisplay";
import epsReducer from "./eps-reducer"; import epsReducer from "./eps-reducer";
import { useState } from "react"; import { useEffect, useRef, useState } from "react";
import { completeEPSelection } from "../../lib/phrase-building/render-ep"; import { completeEPSelection } from "../../lib/phrase-building/render-ep";
import { makeEPSBlocks, getSubjectSelection } from "../../lib/phrase-building/blocks-utils";
import APPicker from "../ap-picker/APPicker";
import autoAnimate from "@formkit/auto-animate";
const blankEps: T.EPSelectionState = { const blankEps: T.EPSelectionState = {
subject: undefined, blocks: makeEPSBlocks(),
predicate: { predicate: {
type: "Complement", type: "Complement",
NP: undefined, NP: undefined,
@ -31,9 +35,14 @@ function EPExplorer(props: {
entryFeeder: T.EntryFeeder, entryFeeder: T.EntryFeeder,
}) { }) {
const [mode, setMode] = useStickyState<"charts" | "phrases">("charts", "EPExplorerMode"); const [mode, setMode] = useStickyState<"charts" | "phrases">("charts", "EPExplorerMode");
const [eps, adjustEps] = useStickyReducer(epsReducer, blankEps, "EPState2", flashMessage); const [eps, adjustEps] = useStickyReducer(epsReducer, blankEps, "EPState4", flashMessage);
const [alert, setAlert] = useState<string | undefined>(undefined); const [alert, setAlert] = useState<string | undefined>(undefined);
const king = eps.subject?.type === "pronoun" const parent = useRef<HTMLDivElement>(null);
useEffect(() => {
parent.current && autoAnimate(parent.current);
}, [parent])
const subject = getSubjectSelection(eps.blocks).selection;
const king = subject?.type === "pronoun"
? "subject" ? "subject"
: eps.predicate.type === "Complement" : eps.predicate.type === "Complement"
? "subject" ? "subject"
@ -56,21 +65,48 @@ function EPExplorer(props: {
handleChange={setMode} handleChange={setMode}
/> />
</div> </div>
<div className="d-flex flex-row justify-content-around flex-wrap" style={{ marginLeft: "-0.5rem", marginRight: "-0.5rem" }}> <div className="clickable h5" onClick={() => adjustEps({ type: "insert new AP" })}>+ AP</div>
<div ref={parent} className="d-flex flex-row justify-content-around flex-wrap" style={{ marginLeft: "-0.5rem", marginRight: "-0.5rem" }}>
{mode === "phrases" && <> {mode === "phrases" && <>
<div className="my-2"> {eps.blocks.map(({ block, key }, i) => (
<NPPicker <div className="my-2 card block-card p-1 mx-1" key={key}>
<div className="d-flex flex-row justify-content-between mb-1" style={{ height: "1rem" }}>
{i > 0 ? <div
className="small clickable ml-1"
onClick={() => adjustEps({ type: "shift block", payload: { index: i, direction: "back" }})}
>
<i className="fas fa-chevron-left" />
</div> : <div/>}
{i < eps.blocks.length - 1 ? <div
className="small clickable mr-1"
onClick={() => adjustEps({ type: "shift block", payload: { index: i, direction: "forward" }})}
>
<i className="fas fa-chevron-right" />
</div> : <div/>}
</div>
{block && block.type === "subjectSelection"
? <NPPicker
phraseIsComplete={phraseIsComplete} phraseIsComplete={phraseIsComplete}
heading={<div className="h5 text-center">Subject {king === "subject" ? roleIcon.king : ""}</div>} heading={<div className="h5 text-center">Subject {king === "subject" ? roleIcon.king : ""}</div>}
entryFeeder={props.entryFeeder} entryFeeder={props.entryFeeder}
np={eps.subject} np={block.selection}
counterPart={undefined} counterPart={undefined}
role="subject" role="subject"
onChange={payload => adjustEps({ type: "set subject", payload })} onChange={payload => adjustEps({ type: "set subject", payload })}
opts={props.opts} opts={props.opts}
/> />
: <APPicker
phraseIsComplete={phraseIsComplete}
heading="AP"
entryFeeder={props.entryFeeder}
AP={block}
opts={props.opts}
onChange={AP => adjustEps({ type: "set AP", payload: { index: i, AP } })}
onRemove={() => adjustEps({ type: "remove AP", payload: i })}
/>}
</div> </div>
<div className="my-2"> ))}
<div className="my-2 card block-card p-1">
<div className="h5 text-center">Predicate {king === "predicate" ? roleIcon.king : ""}</div> <div className="h5 text-center">Predicate {king === "predicate" ? roleIcon.king : ""}</div>
<div className="mb-2 text-center"> <div className="mb-2 text-center">
<ButtonSelect <ButtonSelect

View File

@ -5,6 +5,8 @@ import {
} from "../../lib/misc-helpers"; } from "../../lib/misc-helpers";
import { isUnisexNounEntry } from "../../lib/type-predicates"; import { isUnisexNounEntry } from "../../lib/type-predicates";
import { checkForMiniPronounsError } from "../../lib/phrase-building/compile"; import { checkForMiniPronounsError } from "../../lib/phrase-building/compile";
import { adjustSubjectSelection, getSubjectSelection, makeAPBlock } from "../../lib/phrase-building/blocks-utils";
import { assertNever } from "assert-never";
type EpsReducerAction = { type EpsReducerAction = {
type: "set predicate type", type: "set predicate type",
@ -24,6 +26,23 @@ type EpsReducerAction = {
} | { } | {
type: "set equative", type: "set equative",
payload: T.EquativeSelection, payload: T.EquativeSelection,
} | {
type: "insert new AP",
} | {
type: "set AP",
payload: {
index: number,
AP: T.APSelection | undefined,
},
} | {
type: "remove AP",
payload: number,
} | {
type: "shift block",
payload: {
index: number,
direction: "back" | "forward",
},
}; };
export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAction, sendAlert?: (msg: string) => void): T.EPSelectionState { export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAction, sendAlert?: (msg: string) => void): T.EPSelectionState {
@ -41,7 +60,7 @@ export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAc
if (!subject) { if (!subject) {
return { return {
...eps, ...eps,
subject, blocks: adjustSubjectSelection(eps.blocks, subject),
}; };
} }
if (subject.type === "pronoun" && eps.predicate.type === "NP" && eps.predicate.NP?.type === "noun" && isUnisexNounEntry(eps.predicate.NP.entry)) { if (subject.type === "pronoun" && eps.predicate.type === "NP" && eps.predicate.NP?.type === "noun" && isUnisexNounEntry(eps.predicate.NP.entry)) {
@ -57,7 +76,7 @@ export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAc
} }
return { return {
...eps, ...eps,
subject, blocks: adjustSubjectSelection(eps.blocks, subject),
predicate: { predicate: {
...eps.predicate, ...eps.predicate,
NP: adjusted, NP: adjusted,
@ -66,7 +85,7 @@ export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAc
} }
const n: T.EPSelectionState = { const n: T.EPSelectionState = {
...eps, ...eps,
subject, blocks: adjustSubjectSelection(eps.blocks, subject),
}; };
return subject ? ensureMiniPronounsOk(eps, n, sendAlert) : n; return subject ? ensureMiniPronounsOk(eps, n, sendAlert) : n;
} }
@ -81,16 +100,17 @@ export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAc
}, },
}; };
} }
if (eps.subject?.type === "pronoun" && selection.type === "noun" && isUnisexNounEntry(selection.entry)) { const subject = getSubjectSelection(eps.blocks).selection;
if (subject?.type === "pronoun" && selection.type === "noun" && isUnisexNounEntry(selection.entry)) {
const { gender, number } = selection; const { gender, number } = selection;
const pronoun = eps.subject.person; const pronoun = subject.person;
const newPronoun = movePersonNumber(movePersonGender(pronoun, gender), number); const newPronoun = movePersonNumber(movePersonGender(pronoun, gender), number);
return { return {
...eps, ...eps,
subject: { blocks: adjustSubjectSelection(eps.blocks, {
...eps.subject, ...subject,
person: newPronoun, person: newPronoun,
}, }),
predicate: { predicate: {
...eps.predicate, ...eps.predicate,
NP: selection, NP: selection,
@ -122,12 +142,59 @@ export default function epsReducer(eps: T.EPSelectionState, action: EpsReducerAc
}; };
return ensureMiniPronounsOk(eps, n, sendAlert); return ensureMiniPronounsOk(eps, n, sendAlert);
} }
// if (action.type === "set equative") { if (action.type === "set equative") {
return { return {
...eps, ...eps,
equative: action.payload, equative: action.payload,
} }
}
if (action.type === "insert new AP") {
return {
...eps,
blocks: [makeAPBlock(), ...eps.blocks],
};
// const index = action.payload;
// const newAP = undefined;
// return {
// ...eps,
// blocks: [...eps.blocks].splice(index, 0, newAP),
// };
}
if (action.type === "set AP") {
const blocks = [...eps.blocks];
const { index, AP } = action.payload;
blocks[index].block = AP;
return {
...eps,
blocks,
};
}
if (action.type === "remove AP") {
const blocks = [...eps.blocks];
blocks.splice(action.payload, 1);
return {
...eps,
blocks,
};
}
if (action.type === "shift block") {
const { index, direction } = action.payload;
const newIndex = index + (direction === "forward" ? 1 : -1);
const blocks = [...eps.blocks];
if (newIndex >= blocks.length || newIndex < 0) {
return eps;
// var k = newIndex - blocks.length + 1;
// while (k--) {
// blocks.push(undefined);
// } // }
}
blocks.splice(newIndex, 0, blocks.splice(index, 1)[0]);
return {
...eps,
blocks,
};
}
assertNever(action);
} }
function ensureMiniPronounsOk(old: T.EPSelectionState, eps: T.EPSelectionState, sendAlert?: (msg: string) => void): T.EPSelectionState { function ensureMiniPronounsOk(old: T.EPSelectionState, eps: T.EPSelectionState, sendAlert?: (msg: string) => void): T.EPSelectionState {

View File

@ -30,6 +30,10 @@ function EqCompPicker(props: {
props.onChange(undefined); props.onChange(undefined);
setCompType(ctp); setCompType(ctp);
} }
function handleSandwichExit() {
setCompType(undefined);
props.onChange(undefined);
}
const clearButton = (compType && !props.cantClear) const clearButton = (compType && !props.cantClear)
? <button className="btn btn-sm btn-light mb-2" onClick={handleClear}>X</button> ? <button className="btn btn-sm btn-light mb-2" onClick={handleClear}>X</button>
: <div></div>; : <div></div>;
@ -82,6 +86,7 @@ function EqCompPicker(props: {
opts={props.opts} opts={props.opts}
sandwich={props.comp?.type === "sandwich" ? props.comp : undefined} sandwich={props.comp?.type === "sandwich" ? props.comp : undefined}
entryFeeder={props.entryFeeder} entryFeeder={props.entryFeeder}
onExit={handleSandwichExit}
// TODO: get phraseIsComplete working here // TODO: get phraseIsComplete working here
phraseIsComplete={props.phraseIsComplete} phraseIsComplete={props.phraseIsComplete}
/> />

View File

@ -28,14 +28,19 @@ function AdjectivePicker(props: {
setAddingSandwich(false); setAddingSandwich(false);
} }
} }
function handleSandwichExit() {
setAddingSandwich(false);
props.onChange(undefined);
}
return <div style={{ maxWidth: "225px", minWidth: "125px" }}> return <div style={{ maxWidth: "225px", minWidth: "125px" }}>
{(props.adjective?.sandwich || addingSandwich) && <SandwichPicker {(props.adjective?.sandwich || addingSandwich) && <SandwichPicker
onChange={handleSandwichChange} onChange={handleSandwichChange}
opts={props.opts} opts={props.opts}
sandwich={props.adjective?.sandwich} sandwich={props.adjective?.sandwich}
entryFeeder={props.entryFeeder} entryFeeder={props.entryFeeder}
// TODO: get phraseIsComplete working here onExit={handleSandwichExit}
phraseIsComplete={props.phraseIsComplete} // TODO: not allowing shrinking any possesisives on sandwiches for now - need to work with the blocks and their special behaviour
phraseIsComplete={false}
/>} />}
<div className="d-flex flex-row justify-content-between align-items-baseline"> <div className="d-flex flex-row justify-content-between align-items-baseline">
{!props.noTitle && <div> {!props.noTitle && <div>

View File

@ -10,6 +10,7 @@ function SandwichPicker(props: {
sandwich: T.SandwichSelection<T.Sandwich> | undefined; sandwich: T.SandwichSelection<T.Sandwich> | undefined;
entryFeeder: T.EntryFeeder, entryFeeder: T.EntryFeeder,
phraseIsComplete: boolean, phraseIsComplete: boolean,
onExit: () => void,
}) { }) {
const [sandwichBase, setSandwichBase] = useState<T.Sandwich | undefined>(undefined); const [sandwichBase, setSandwichBase] = useState<T.Sandwich | undefined>(undefined);
function handleNounChange(n: T.NPSelection | undefined) { function handleNounChange(n: T.NPSelection | undefined) {
@ -36,11 +37,14 @@ function SandwichPicker(props: {
...s, ...s,
}); });
} }
function handleExit() {
props.onExit();
}
return <div> return <div>
<div className="d-flex flex-row justify-content-between"> <div className="d-flex flex-row justify-content-between">
<div></div> <div></div>
<div className="text-center">🥪 Sandwich</div> <div className="text-center">🥪 Sandwich</div>
<div className="clickable" onClick={() => props.onChange(undefined)}> <div className="clickable" onClick={handleExit}>
<i className="fas fa-trash" /> <i className="fas fa-trash" />
</div> </div>
</div> </div>
@ -54,9 +58,7 @@ function SandwichPicker(props: {
role="object" role="object"
cantClear={true} cantClear={true}
entryFeeder={props.entryFeeder} entryFeeder={props.entryFeeder}
// TODO: the shrinking of possesives in sandwiches gets messed up with compilinig 😩 phraseIsComplete={props.phraseIsComplete}
// disabling it for now
phraseIsComplete={false}
/> />
</div>} </div>}
<SandwichSelect <SandwichSelect

View File

@ -0,0 +1,65 @@
import * as T from "../../types";
export function getSubjectSelection(blocks: T.EPSBlockComplete[]): T.SubjectSelectionComplete;
export function getSubjectSelection(blocks: T.EPSBlock[]): T.SubjectSelection;
export function getSubjectSelection(blocks: T.EPSBlock[] | T.EPSBlockComplete[]): T.SubjectSelection | T.SubjectSelectionComplete {
const b = blocks.find(f => f.block?.type === "subjectSelection");
if (!b || !b.block || b.block.type !== "subjectSelection") {
throw new Error("subjectSelection not found in blocks");
}
return b.block;
}
export function getRenderedSubjectSelection(blocks: (T.Rendered<T.SubjectSelectionComplete> | T.Rendered<T.APSelection>)[]): T.Rendered<T.SubjectSelectionComplete> {
const b = blocks.find(f => f.type === "subjectSelection");
if (!b || b.type !== "subjectSelection") {
throw new Error("subjectSelection not found in blocks");
}
return b;
}
export function makeEPSBlocks(): T.EPSBlock[] {
return [
{
key: Math.random(),
block: {
type: "subjectSelection",
selection: undefined,
},
}
];
}
export function makeAPBlock(): T.EPSBlock {
return {
key: Math.random(),
block: undefined,
};
}
export function makeSubjectSelection(selection: T.NPSelection | undefined): T.SubjectSelection {
return {
type: "subjectSelection",
selection,
};
}
export function EPSBlocksAreComplete(blocks: T.EPSBlock[]): blocks is T.EPSBlockComplete[] {
if (blocks.some(block => block.block === undefined)) {
return false;
}
const subject = getSubjectSelection(blocks);
return !!subject.selection;
}
export function adjustSubjectSelection(blocks: T.EPSBlock[], subject: T.SubjectSelectionComplete | T.NPSelection): T.EPSBlockComplete[];
export function adjustSubjectSelection(blocks: T.EPSBlock[], subject: T.SubjectSelection | undefined): T.EPSBlock[];
export function adjustSubjectSelection(blocks: T.EPSBlock[], subject: T.SubjectSelection | T.SubjectSelectionComplete | T.NPSelection | undefined): T.EPSBlock[] | T.EPSBlockComplete[] {
const nb = [...blocks];
const i = nb.findIndex(b => b.block && b.block.type === "subjectSelection");
if (i === -1) {
throw new Error("couldn't find subjectSelection to modify");
}
nb[i].block = subject?.type === "subjectSelection" ? subject : makeSubjectSelection(subject);
return nb;
}

View File

@ -25,6 +25,7 @@ import { pronouns } from "../grammar-units";
import { completeEPSelection, renderEP } from "./render-ep"; import { completeEPSelection, renderEP } from "./render-ep";
import { completeVPSelection } from "./vp-tools"; import { completeVPSelection } from "./vp-tools";
import { renderVP } from "./render-vp"; import { renderVP } from "./render-vp";
import { getRenderedSubjectSelection } from "./blocks-utils";
const blank: T.PsString = { const blank: T.PsString = {
p: "______", p: "______",
@ -62,6 +63,7 @@ type CompilePsInput = {
}, },
VP: T.VPRendered, VP: T.VPRendered,
} }
function compilePs({ NPs, kids, verb: { head, rest }, VP }: CompilePsInput): T.SingleOrLengthOpts<T.PsString[]> { function compilePs({ NPs, kids, verb: { head, rest }, VP }: CompilePsInput): T.SingleOrLengthOpts<T.PsString[]> {
if ("long" in rest) { if ("long" in rest) {
return { return {
@ -277,7 +279,19 @@ export function compileEP(EP: T.EPRendered, combineLengths?: boolean, blankOut?:
export function getEPSegmentsAndKids(EP: T.EPRendered, blankOut?: BlankoutOptions): { kids: Segment[], NPs: Segment[] } { export function getEPSegmentsAndKids(EP: T.EPRendered, blankOut?: BlankoutOptions): { kids: Segment[], NPs: Segment[] } {
const possToShrink = findPossesivesToShrinkInEP(EP); const possToShrink = findPossesivesToShrinkInEP(EP);
const subject = makeSegment(getPashtoFromRendered(EP.subject, false)); const blocks = EP.blocks.reduce((accum, block) => {
if (block.type === "subjectSelection") {
if (EP.omitSubject) return accum;
return [
...accum,
makeSegment(getPashtoFromRendered(block.selection, false)),
];
}
return [
...accum,
makeSegment(getPashtoFromRendered(block, false)),
];
}, [] as Segment[]);
const predicate = makeSegment(getPashtoFromRendered(EP.predicate, false)); const predicate = makeSegment(getPashtoFromRendered(EP.predicate, false));
return { return {
kids: blankOut?.kidsSection ? [kidsBlank] : orderKidsSection([ kids: blankOut?.kidsSection ? [kidsBlank] : orderKidsSection([
@ -288,7 +302,7 @@ export function getEPSegmentsAndKids(EP: T.EPRendered, blankOut?: BlankoutOption
...possToShrink.map(a => shrinkNP(a.np)), ...possToShrink.map(a => shrinkNP(a.np)),
]), ]),
NPs: [ NPs: [
...EP.omitSubject ? [] : [subject], ...blocks,
predicate predicate
], ],
}; };
@ -319,18 +333,30 @@ function compileEPPs({ NPs, kids, equative, negative }: {
} }
function compileEPEnglish(EP: T.EPRendered): string[] | undefined { function compileEPEnglish(EP: T.EPRendered): string[] | undefined {
function insertEWords(e: string, { subject, predicate }: { subject: string, predicate: string }): string { function insertEWords(e: string, { subject, predicate, APs }: { subject: string, predicate: string, APs: string }): string {
return e.replace("$SUBJ", subject).replace("$PRED", predicate || ""); return e.replace("$SUBJ", subject).replace("$PRED", predicate || "") + APs;
} }
const engSubj = getEnglishFromRendered(EP.subject); const engSubj = getRenderedSubjectSelection(EP.blocks).selection.e;
const engPred = getEnglishFromRendered(EP.predicate); const engPred = getEnglishFromRendered(EP.predicate);
const engAPs = getEnglishAPs(EP.blocks);
// require all English parts for making the English phrase // require all English parts for making the English phrase
return (EP.englishBase && engSubj && engPred) const b = (EP.englishBase && engSubj && engPred)
? EP.englishBase.map(e => insertEWords(e, { ? EP.englishBase.map(e => insertEWords(e, {
subject: engSubj, subject: engSubj,
predicate: engPred, predicate: engPred,
APs: engAPs,
})) }))
: undefined; : undefined;
return b;
}
function getEnglishAPs(blocks: (T.Rendered<T.SubjectSelectionComplete> | T.Rendered<T.APSelection>)[]) {
const APs = blocks.filter(x => x.type !== "subjectSelection") as T.Rendered<T.APSelection>[];
return APs.reduce((accum, curr) => {
const e = getEnglishFromRendered(curr);
if (!e) return accum;
return `${accum} ${e}`;
}, "");
} }
@ -497,7 +523,24 @@ type FoundNP = {
}; };
export function findPossesivesToShrinkInEP(EP: T.EPRendered): FoundNP[] { export function findPossesivesToShrinkInEP(EP: T.EPRendered): FoundNP[] {
const inSubject: FoundNP[] = findPossesivesInNP(EP.subject).map(np => ({ np, from: "subject" })); const inBlocks: FoundNP[] = EP.blocks.reduce((accum, block): FoundNP[] => {
if (block.type === "subjectSelection") {
if (EP.omitSubject) return accum;
const found: FoundNP[] = findPossesivesInNP(block.selection).map(np => ({ np, from: "subject" }));
return [
...accum,
...found,
];
}
if (block.type === "sandwich") {
const found: FoundNP[] = findPossesivesInNP(block.inside).map(np => ({ np, from: "AP" }));
return [
...accum,
...found,
];
}
return accum;
}, [] as FoundNP[]);
const inPredicate: FoundNP[] = ((EP.predicate.type === "loc. adv.") const inPredicate: FoundNP[] = ((EP.predicate.type === "loc. adv.")
? [] ? []
: (EP.predicate.type === "adjective") : (EP.predicate.type === "adjective")
@ -507,9 +550,9 @@ export function findPossesivesToShrinkInEP(EP: T.EPRendered): FoundNP[] {
EP.predicate as T.NPSelection EP.predicate as T.NPSelection
)).map(np => ({ np, from: "predicate" })); )).map(np => ({ np, from: "predicate" }));
return [ return [
...inSubject, ...inBlocks,
...inPredicate, ...inPredicate,
].filter(found => !(found.from === "subject" && EP.omitSubject)); ];
} }
// export function findPossesiveToShrinkInVP(VP: T.VPRendered): T.Rendered<T.NPSelection>[] { // export function findPossesiveToShrinkInVP(VP: T.VPRendered): T.Rendered<T.NPSelection>[] {

View File

@ -5,7 +5,7 @@ import {
import * as T from "../../types"; import * as T from "../../types";
import { concatPsString } from "../p-text-helpers"; import { concatPsString } from "../p-text-helpers";
function getBaseAndAdjectives(np: T.Rendered<T.NPSelection | T.EqCompSelection>): T.PsString[] { function getBaseAndAdjectives(np: T.Rendered<T.NPSelection | T.EqCompSelection | T.APSelection>): T.PsString[] {
if (np.type === "sandwich") { if (np.type === "sandwich") {
return getSandwichPsBaseAndAdjectives(np); return getSandwichPsBaseAndAdjectives(np);
} }
@ -73,26 +73,26 @@ function trimOffShrunkenPossesive(p: T.Rendered<T.NPSelection>): T.Rendered<T.NP
} }
} }
export function getPashtoFromRendered(np: T.Rendered<T.NPSelection> | T.Rendered<T.EqCompSelection>, subjectsPerson: false | T.Person): T.PsString[] { export function getPashtoFromRendered(b: T.Rendered<T.NPSelection> | T.Rendered<T.EqCompSelection> | T.Rendered<T.APSelection>, subjectsPerson: false | T.Person): T.PsString[] {
const base = getBaseAndAdjectives(np); const base = getBaseAndAdjectives(b);
if (np.type === "loc. adv.") { if (b.type === "loc. adv." || b.type === "adverb") {
return base; return base;
} }
if (np.type === "adjective") { if (b.type === "adjective") {
if (!np.sandwich) { if (!b.sandwich) {
return base return base
} }
const sandwichPs = getPashtoFromRendered(np.sandwich, false); const sandwichPs = getPashtoFromRendered(b.sandwich, false);
return base.flatMap(p => ( return base.flatMap(p => (
sandwichPs.flatMap(s => ( sandwichPs.flatMap(s => (
concatPsString(s, " ", p) concatPsString(s, " ", p)
)) ))
)); ));
} }
const trimmed = np.type === "sandwich" ? { const trimmed = b.type === "sandwich" ? {
...np, ...b,
inside: trimOffShrunkenPossesive(np.inside), inside: trimOffShrunkenPossesive(b.inside),
} : trimOffShrunkenPossesive(np); } : trimOffShrunkenPossesive(b);
if (trimmed.type === "sandwich") { if (trimmed.type === "sandwich") {
return trimmed.inside.possesor return trimmed.inside.possesor
? addPossesor(trimmed.inside.possesor.np, base, subjectsPerson) ? addPossesor(trimmed.inside.possesor.np, base, subjectsPerson)
@ -190,12 +190,12 @@ function pronounPossEng(p: T.Person): string {
return "their"; return "their";
} }
export function getEnglishFromRendered(r: T.Rendered<T.NPSelection | T.EqCompSelection>): string | undefined { export function getEnglishFromRendered(r: T.Rendered<T.NPSelection | T.EqCompSelection | T.APSelection>): string | undefined {
if (r.type === "sandwich") { if (r.type === "sandwich") {
return getEnglishFromRenderedSandwich(r); return getEnglishFromRenderedSandwich(r);
} }
if (!r.e) return undefined; if (!r.e) return undefined;
if (r.type === "loc. adv.") { if (r.type === "loc. adv." || r.type === "adverb") {
return r.e; return r.e;
} }
if (r.type === "adjective") { if (r.type === "adjective") {

View File

@ -11,24 +11,28 @@ import { psStringFromEntry } from "../p-text-helpers";
import { isLocativeAdverbEntry } from "../type-predicates"; import { isLocativeAdverbEntry } from "../type-predicates";
import { renderAdjectiveSelection } from "./render-adj"; import { renderAdjectiveSelection } from "./render-adj";
import { renderSandwich } from "./render-sandwich"; import { renderSandwich } from "./render-sandwich";
import { EPSBlocksAreComplete, getSubjectSelection } from "./blocks-utils";
export function renderEP(EP: T.EPSelectionComplete): T.EPRendered { export function renderEP(EP: T.EPSelectionComplete): T.EPRendered {
const king = (EP.subject.type === "pronoun") const subject = getSubjectSelection(EP.blocks).selection;
const king = (subject.type === "pronoun")
? "subject" ? "subject"
: EP.predicate.type === "NP" : EP.predicate.type === "NP"
? "predicate" ? "predicate"
: "subject"; : "subject";
// TODO: less repetative logic // TODO: less repetative logic
const kingPerson = king === "subject" const kingPerson = king === "subject"
? getPersonFromNP(EP.subject) ? getPersonFromNP(subject)
: EP.predicate.type === "NP" : EP.predicate.type === "NP"
? getPersonFromNP(EP.predicate.selection) ? getPersonFromNP(EP.predicate.selection)
: getPersonFromNP(EP.subject); : getPersonFromNP(subject);
const kingIsParticiple = EP[king].type === "participle"; const kingIsParticiple = king === "subject"
? (subject.type === "participle")
: (EP.predicate.type === "NP" && EP.predicate.selection.type === "participle");
return { return {
type: "EPRendered", type: "EPRendered",
king: EP.predicate.type === "Complement" ? "subject" : "predicate", king: EP.predicate.type === "Complement" ? "subject" : "predicate",
subject: renderNPSelection(EP.subject, false, false, "subject", king === "subject" ? "king" : "none"), blocks: renderEPSBlocks(EP.blocks, king),
predicate: EP.predicate.type === "NP" predicate: EP.predicate.type === "NP"
? renderNPSelection(EP.predicate.selection, false, true, "subject", "king") ? renderNPSelection(EP.predicate.selection, false, true, "subject", "king")
: renderEqCompSelection(EP.predicate.selection, kingPerson), : renderEqCompSelection(EP.predicate.selection, kingPerson),
@ -54,6 +58,21 @@ export function getEquativeForm(tense: T.EquativeTense): { hasBa: boolean, form:
} }
} }
function renderEPSBlocks(blocks: T.EPSBlockComplete[], king: "subject" | "predicate"): (T.Rendered<T.SubjectSelectionComplete> | T.Rendered<T.APSelection>)[] {
return blocks.map(({ block }): (T.Rendered<T.SubjectSelectionComplete> | T.Rendered<T.APSelection>) => {
if (block.type === "adverb") {
return renderAdverbSelection(block);
}
if (block.type === "sandwich") {
return renderSandwich(block);
}
return {
type: "subjectSelection",
selection: renderNPSelection(block.selection, false, false, "subject", king === "subject" ? "king" : "none")
};
});
}
function renderEquative(es: T.EquativeSelection, person: T.Person): T.EquativeRendered { function renderEquative(es: T.EquativeSelection, person: T.Person): T.EquativeRendered {
const { form, hasBa } = getEquativeForm(es.tense) const { form, hasBa } = getEquativeForm(es.tense)
const ps = getPersonFromVerbForm(form, person); const ps = getPersonFromVerbForm(form, person);
@ -65,6 +84,20 @@ function renderEquative(es: T.EquativeSelection, person: T.Person): T.EquativeRe
}; };
} }
function renderAdverbSelection(a: T.AdverbSelection): T.Rendered<T.AdverbSelection> {
const e = getEnglishWord(a.entry);
if (!e || typeof e !== "string") {
console.log(e);
throw new Error("error getting english for compliment");
}
return {
type: "adverb",
entry: a.entry,
ps: [psStringFromEntry(a.entry)],
e,
};
}
function renderEqCompSelection(s: T.EqCompSelection, person: T.Person): T.Rendered<T.EqCompSelection> { function renderEqCompSelection(s: T.EqCompSelection, person: T.Person): T.Rendered<T.EqCompSelection> {
if (s.type === "sandwich") { if (s.type === "sandwich") {
return renderSandwich(s); return renderSandwich(s);
@ -160,7 +193,7 @@ function getEnglishConj(p: T.Person, e: string | T.EnglishBlock): string {
export function completeEPSelection(eps: T.EPSelectionState): T.EPSelectionComplete | undefined { export function completeEPSelection(eps: T.EPSelectionState): T.EPSelectionComplete | undefined {
if (!eps.subject) { if (!EPSBlocksAreComplete(eps.blocks)) {
return undefined; return undefined;
} }
if (eps.predicate.type === "Complement") { if (eps.predicate.type === "Complement") {
@ -168,7 +201,7 @@ export function completeEPSelection(eps: T.EPSelectionState): T.EPSelectionCompl
if (!selection) return undefined; if (!selection) return undefined;
return { return {
...eps, ...eps,
subject: eps.subject, blocks: eps.blocks,
predicate: { predicate: {
type: "Complement", type: "Complement",
selection, selection,
@ -180,7 +213,7 @@ export function completeEPSelection(eps: T.EPSelectionState): T.EPSelectionCompl
if (!selection) return undefined; if (!selection) return undefined;
return { return {
...eps, ...eps,
subject: eps.subject, blocks: eps.blocks,
predicate: { predicate: {
type: "NP", type: "NP",
selection, selection,

View File

@ -216,48 +216,6 @@ export function switchSubjObj(vps: T.VPSelectionState | T.VPSelectionComplete):
}; };
} }
// export function insertSubjectSelection(vps: T.VPSelectionState, s: T.SubjectSelection): T.VPSelectionState {
// const index = vps.blocks.findIndex(f => f.type === "subjectSelection");
// if (index === -1) {
// throw new Error("couldn't find subjectSelection to insert over");
// }
// const blocks = [...vps.blocks];
// blocks[index] = s;
// return {
// ...vps,
// blocks,
// };
// }
// export function insertObjecttSelection(vps: T.VPSelectionState, o: T.ObjectSelection): T.VPSelectionState {
// const index = vps.blocks.findIndex(f => f.type === "objectSelection");
// if (index === -1) {
// throw new Error("couldn't find objectSelection to insert over");
// }
// const blocks = [...vps.blocks];
// blocks[index] = o;
// return {
// ...vps,
// blocks,
// };
// }
// export function getSubjectSelection(vps: T.VPSelectionState): T.SubjectSelection {
// const subject = vps.blocks.find(f => f.type === "subjectSelection");
// if (subject?.type !== "subjectSelection") {
// throw new Error("couldn't find subjectSelection");
// }
// return subject;
// }
// export function getObjectSelection(vps: T.VPSelectionState): T.ObjectSelection {
// const object = vps.blocks.find(f => f.type === "objectSelection");
// if (object?.type !== "objectSelection") {
// throw new Error("couldn't find objectSelection");
// }
// return object;
// }
export function completeVPSelection(vps: T.VPSelectionState): T.VPSelectionComplete | undefined { export function completeVPSelection(vps: T.VPSelectionState): T.VPSelectionComplete | undefined {
if (vps.subject === undefined) { if (vps.subject === undefined) {
return undefined; return undefined;

View File

@ -92,6 +92,12 @@ export const sandwiches: T.Sandwich[] = [
after: { p: "غوندې", f: "ghwunde" }, after: { p: "غوندې", f: "ghwunde" },
e: "like", e: "like",
}, },
{
type: "sandwich",
before: { p: "د", f: "du" },
after: { p: "په حیث", f: "pu heys" },
e: "as",
},
]; ];
export default sandwiches; export default sandwiches;

File diff suppressed because one or more lines are too long

View File

@ -541,7 +541,7 @@ export type ObjectSelection = {
}; };
export type SubjectSelectionComplete = { export type SubjectSelectionComplete = {
type: "subjectSelectionComplete", type: "subjectSelection",
selection: NPSelection, selection: NPSelection,
}; };
@ -676,10 +676,17 @@ export type RenderedPossesorSelection = {
shrunken: boolean, shrunken: boolean,
}; };
export type Rendered<T extends NPSelection | EqCompSelection | AdjectiveSelection | SandwichSelection<Sandwich>> = T extends SandwichSelection<Sandwich> export type Rendered<T extends NPSelection | EqCompSelection | AdjectiveSelection | SandwichSelection<Sandwich> | APSelection | SubjectSelectionComplete> = T extends SandwichSelection<Sandwich>
? Omit<SandwichSelection<Sandwich>, "inside"> & { ? Omit<SandwichSelection<Sandwich>, "inside"> & {
inside: Rendered<NPSelection>, inside: Rendered<NPSelection>,
} }
: T extends AdverbSelection
? {
type: "adverb",
entry: AdverbEntry,
ps: PsString[],
e?: string,
}
: T extends AdjectiveSelection : T extends AdjectiveSelection
? { ? {
type: "adjective", type: "adjective",
@ -690,6 +697,11 @@ export type Rendered<T extends NPSelection | EqCompSelection | AdjectiveSelectio
inflected: boolean, inflected: boolean,
person: Person, person: Person,
} }
: T extends SubjectSelectionComplete
? {
type: "subjectSelection",
selection: Rendered<NPSelection>,
}
: ReplaceKey< : ReplaceKey<
Omit<T, "changeGender" | "changeNumber" | "changeDistance" | "adjectives" | "possesor">, Omit<T, "changeGender" | "changeNumber" | "changeDistance" | "adjectives" | "possesor">,
"e", "e",
@ -710,7 +722,7 @@ export type Rendered<T extends NPSelection | EqCompSelection | AdjectiveSelectio
// TODO: recursive changing this down into the possesor etc. // TODO: recursive changing this down into the possesor etc.
export type EPSelectionState = { export type EPSelectionState = {
subject: NPSelection | undefined, blocks: EPSBlock[],
predicate: { predicate: {
type: "NP" | "Complement", type: "NP" | "Complement",
NP: NPSelection | undefined, NP: NPSelection | undefined,
@ -720,8 +732,17 @@ export type EPSelectionState = {
omitSubject: boolean, omitSubject: boolean,
}; };
export type EPSelectionComplete = Omit<EPSelectionState, "subject" | "predicate"> & { export type EPSBlock = {
subject: NPSelection, key: number,
block: SubjectSelection | APSelection | undefined,
};
export type EPSBlockComplete = {
key: number,
block: SubjectSelectionComplete | APSelection,
};
export type EPSelectionComplete = Omit<EPSelectionState, "predicate" | "blocks"> & {
blocks: EPSBlockComplete[],
predicate: { predicate: {
type: "NP", type: "NP",
selection: NPSelection, selection: NPSelection,
@ -760,7 +781,7 @@ export type EquativeRendered = EquativeSelection & {
export type EPRendered = { export type EPRendered = {
type: "EPRendered", type: "EPRendered",
king: "subject" | "predicate", king: "subject" | "predicate",
subject: Rendered<NPSelection>, blocks: (Rendered<SubjectSelectionComplete> | Rendered<APSelection>)[],
predicate: Rendered<NPSelection> | Rendered<EqCompSelection>, predicate: Rendered<NPSelection> | Rendered<EqCompSelection>,
equative: EquativeRendered, equative: EquativeRendered,
englishBase?: string[], englishBase?: string[],
@ -772,11 +793,13 @@ export type EntryFeeder = {
verbs: EntryLookupPortal<VerbEntry>, verbs: EntryLookupPortal<VerbEntry>,
adjectives: EntryLookupPortal<AdjectiveEntry>, adjectives: EntryLookupPortal<AdjectiveEntry>,
locativeAdverbs: EntryLookupPortal<LocativeAdverbEntry>, locativeAdverbs: EntryLookupPortal<LocativeAdverbEntry>,
adverbs: EntryLookupPortal<AdverbEntry>,
} | { } | {
nouns: NounEntry[], nouns: NounEntry[],
verbs: VerbEntry[], verbs: VerbEntry[],
adjectives: AdjectiveEntry[], adjectives: AdjectiveEntry[],
locativeAdverbs: LocativeAdverbEntry[], locativeAdverbs: LocativeAdverbEntry[],
adverbs: AdverbEntry[],
} }
export type EntryFeederSingleType<X extends VerbEntry | DictionaryEntry> = X[] | EntryLookupPortal<X>; export type EntryFeederSingleType<X extends VerbEntry | DictionaryEntry> = X[] | EntryLookupPortal<X>;

View File

@ -1336,6 +1336,11 @@
minimatch "^3.0.4" minimatch "^3.0.4"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@formkit/auto-animate@^1.0.0-beta.1":
version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/@formkit/auto-animate/-/auto-animate-1.0.0-beta.1.tgz#aec5fd2ea5e499ceb7eb117c7fd1217a7f100748"
integrity sha512-I3OWOBaPZKSJL4bsooXI8kC3q7bcgibD2oML0P/Lir6MnbvUe/0/7EH8br024juvM/Ulm9C9xGx9CJUQYrOWSA==
"@fortawesome/fontawesome-free@^5.15.2": "@fortawesome/fontawesome-free@^5.15.2":
version "5.15.4" version "5.15.4"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5"
@ -2757,6 +2762,11 @@ asn1.js@^5.2.0:
minimalistic-assert "^1.0.0" minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0" safer-buffer "^2.1.0"
assert-never@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==
assert@^1.1.1: assert@^1.1.1:
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"