From 8d841a6c2460d49089f7513f53b9cc3b17a927c1 Mon Sep 17 00:00:00 2001 From: lingdocs <71590811+lingdocs@users.noreply.github.com> Date: Fri, 8 Apr 2022 15:04:16 +0500 Subject: [PATCH] wohoo new VPExplorer moved into the grammar engine! --- .gitignore | 1 + get-verbs.js | 71 ---- get-words.js | 113 +++++ nouns-adjs/a-fem.js | 102 +++++ nouns-adjs/aa-fem.js | 36 ++ nouns-adjs/aanu-unisex.js | 46 +++ nouns-adjs/basic-fem.js | 18 + nouns-adjs/basic-masc.js | 102 +++++ nouns-adjs/basic-unisex.js | 128 ++++++ nouns-adjs/e-fem.js | 25 ++ nouns-adjs/ee-fem.js | 34 ++ nouns-adjs/exception-people-fem.js | 13 + nouns-adjs/exception-people-masc.js | 37 ++ nouns-adjs/ey-masc.js | 133 ++++++ nouns-adjs/ey-stressed-unisex.js | 50 +++ nouns-adjs/ey-unstressed-unisex.js | 64 +++ nouns-adjs/non-inflecting.js | 5 + nouns-adjs/nouns-unisex.js | 79 ++++ nouns-adjs/o-fem.js | 3 + nouns-adjs/short-irreg-unisex.js | 19 + nouns-adjs/u-masc.js | 23 ++ nouns-adjs/uy-fem.js | 33 ++ nouns-adjs/y-masc.js | 14 + package.json | 11 +- src/App.css | 5 + src/App.tsx | 20 +- src/components/EntrySelect.tsx | 90 ++++ src/components/np-picker/NPNounPicker.tsx | 163 ++++++++ .../np-picker/NPParticiplePicker.tsx | 50 +++ src/components/np-picker/NPPicker.tsx | 113 +++++ src/components/np-picker/NPPronounPicker.tsx | 147 +++++++ src/components/np-picker/picker-tools.tsx | 115 ++++++ src/components/verb-info/VerbTypeInfo.tsx | 4 +- .../vp-explorer/AbbreviationFormSelector.tsx | 101 +++++ src/components/vp-explorer/ChartDisplay.tsx | 27 ++ src/components/vp-explorer/TensePicker.tsx | 178 ++++++++ src/components/vp-explorer/VPDisplay.tsx | 71 ++++ src/components/vp-explorer/VPExplorer.tsx | 214 ++++++++++ src/components/vp-explorer/VerbPicker.tsx | 154 +++++++ src/components/vp-explorer/verb-selection.ts | 106 +++++ src/lib/accent-and-ps-utils.test.ts | 12 + src/lib/accent-and-ps-utils.ts | 30 ++ src/lib/accent-helpers.test.ts | 2 +- src/lib/accent-helpers.ts | 2 +- src/lib/diacritics.ts | 2 +- src/lib/misc-helpers.ts | 2 + src/lib/np-tools.ts | 91 +++++ src/lib/p-text-helpers.test.ts | 8 +- src/lib/p-text-helpers.ts | 65 ++- src/lib/pashto-inflector.ts | 13 +- src/lib/phrase-building/compile-vp.ts | 386 ++++++++++++++++++ .../phrase-building/english-vp-rendering.ts | 237 +++++++++++ src/lib/phrase-building/index.ts | 7 + src/lib/phrase-building/render-vp.ts | 344 ++++++++++++++++ src/lib/phrase-building/vp-tools.ts | 156 +++++++ src/lib/protobuf.test.ts | 4 +- src/lib/translate-phonetics.test.ts | 2 + src/lib/type-predicates.ts | 155 +++++++ src/lib/useStickyState.ts | 47 +++ src/lib/verb-conjugation.ts | 6 +- src/lib/verb-info.ts | 10 +- src/library.ts | 38 +- src/nouns-adjs.ts | 13 + src/types.ts | 164 ++++++++ yarn.lock | 163 +++++++- 65 files changed, 4525 insertions(+), 152 deletions(-) delete mode 100644 get-verbs.js create mode 100644 get-words.js create mode 100644 nouns-adjs/a-fem.js create mode 100644 nouns-adjs/aa-fem.js create mode 100644 nouns-adjs/aanu-unisex.js create mode 100644 nouns-adjs/basic-fem.js create mode 100644 nouns-adjs/basic-masc.js create mode 100644 nouns-adjs/basic-unisex.js create mode 100644 nouns-adjs/e-fem.js create mode 100644 nouns-adjs/ee-fem.js create mode 100644 nouns-adjs/exception-people-fem.js create mode 100644 nouns-adjs/exception-people-masc.js create mode 100644 nouns-adjs/ey-masc.js create mode 100644 nouns-adjs/ey-stressed-unisex.js create mode 100644 nouns-adjs/ey-unstressed-unisex.js create mode 100644 nouns-adjs/non-inflecting.js create mode 100644 nouns-adjs/nouns-unisex.js create mode 100644 nouns-adjs/o-fem.js create mode 100644 nouns-adjs/short-irreg-unisex.js create mode 100644 nouns-adjs/u-masc.js create mode 100644 nouns-adjs/uy-fem.js create mode 100644 nouns-adjs/y-masc.js create mode 100644 src/components/EntrySelect.tsx create mode 100644 src/components/np-picker/NPNounPicker.tsx create mode 100644 src/components/np-picker/NPParticiplePicker.tsx create mode 100644 src/components/np-picker/NPPicker.tsx create mode 100644 src/components/np-picker/NPPronounPicker.tsx create mode 100644 src/components/np-picker/picker-tools.tsx create mode 100644 src/components/vp-explorer/AbbreviationFormSelector.tsx create mode 100644 src/components/vp-explorer/ChartDisplay.tsx create mode 100644 src/components/vp-explorer/TensePicker.tsx create mode 100644 src/components/vp-explorer/VPDisplay.tsx create mode 100644 src/components/vp-explorer/VPExplorer.tsx create mode 100644 src/components/vp-explorer/VerbPicker.tsx create mode 100644 src/components/vp-explorer/verb-selection.ts create mode 100644 src/lib/accent-and-ps-utils.test.ts create mode 100644 src/lib/accent-and-ps-utils.ts create mode 100644 src/lib/np-tools.ts create mode 100644 src/lib/phrase-building/compile-vp.ts create mode 100644 src/lib/phrase-building/english-vp-rendering.ts create mode 100644 src/lib/phrase-building/index.ts create mode 100644 src/lib/phrase-building/render-vp.ts create mode 100644 src/lib/phrase-building/vp-tools.ts create mode 100644 src/lib/type-predicates.ts create mode 100644 src/lib/useStickyState.ts create mode 100644 src/nouns-adjs.ts diff --git a/.gitignore b/.gitignore index 6d3425d..fa30a96 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ yarn-debug.log* yarn-error.log* /src/verbs.ts +/src/noun-adjs.ts diff --git a/get-verbs.js b/get-verbs.js deleted file mode 100644 index 992ae09..0000000 --- a/get-verbs.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2021 lingdocs.com - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ -const fs = require("fs"); -const fetch = require("node-fetch"); -const path = require("path"); -const collectionPath = path.join(".", "verbs"); -const verbTsFiles = fs.readdirSync(collectionPath); -const protoModels = require("./src/lib/dictionary-models.js"); -const Pbf = require("pbf"); - -const allTsS = [...new Set(verbTsFiles.reduce((arr, fileName) => { - const TsS = require("./verbs/"+fileName); - return [...arr, ...TsS]; -}, []))]; - -fetch(process.env.LINGDOCS_DICTIONARY_URL).then(res => res.arrayBuffer()).then(buffer => { - const pbf = new Pbf(buffer); - const dictionary = protoModels.Dictionary.read(pbf); - const entries = dictionary.entries; - const allVerbs = getFromTsS(entries); - const content = ` -/** - * Copyright (c) 2021 lingdocs.com - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -import { DictionaryEntry } from "./types"; - -const verbs: { - entry: DictionaryEntry, - complement?: DictionaryEntry, -}[] = ${JSON.stringify(allVerbs)}; -export default verbs;`; - fs.writeFileSync("./src/verbs.ts", content); - console.log("fetched verbs from dictionary"); -}); - -function getFromTsS(entries) { - const missingEc = []; - const toReturn = allTsS.map(ts => { - const entry = entries.find(x => ts === x.ts); - if (!entry.ec) { - missingEc.push(entry.ts); - } - if (!entry) { - console.log("couldn't find ts", ts); - return undefined; - } - if (entry.c && entry.c.includes("comp.")) { - const complement = entries.find(x => entry.l === x.ts); - return { - entry, - complement, - }; - } - return { entry }; - }).filter(x => x); - if (missingEc.length !== 0) { - console.log("missingEc", missingEc); - } - return toReturn; - -} diff --git a/get-words.js b/get-words.js new file mode 100644 index 0000000..1a5e33b --- /dev/null +++ b/get-words.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ +const fs = require("fs"); +const fetch = require("node-fetch"); +const path = require("path"); +const verbCollectionPath = path.join(".", "verbs"); +const nounAdjCollectionPath = path.join(".", "nouns-adjs"); +const verbTsFiles = fs.readdirSync(verbCollectionPath); +const nounAdjTsFiles = fs.readdirSync(nounAdjCollectionPath); +const protoModels = require("./src/lib/dictionary-models.js"); +const Pbf = require("pbf"); + +const allVerbTsS = [...new Set(verbTsFiles.reduce((arr, fileName) => { + const TsS = require("./verbs/"+fileName); + return [...arr, ...TsS]; +}, []))]; + +const allNounAdjTsS = [...new Set(nounAdjTsFiles.reduce((arr, fileName) => { + const TsS = require("./nouns-adjs/"+fileName).map(x => x.ts); + return [...arr, ...TsS]; +}, []))]; + +fetch(process.env.LINGDOCS_DICTIONARY_URL).then(res => res.arrayBuffer()).then(buffer => { + const pbf = new Pbf(buffer); + const dictionary = protoModels.Dictionary.read(pbf); + const entries = dictionary.entries; + const allVerbs = getVerbsFromTsS(entries, allVerbTsS); + const verbsContent = ` +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import { DictionaryEntry, VerbEntry } from "./types"; + +const verbs: { + entry: DictionaryEntry, + complement?: DictionaryEntry, +}[] = ${JSON.stringify(allVerbs)}; +export default verbs as VerbEntry[];`; + fs.writeFileSync("./src/verbs.ts", verbsContent); + const allNounsAdjs = getNounsAdjsFromTsS(entries, allNounAdjTsS); + const nounsAdjsContent = ` +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import { DictionaryEntry } from "./types"; + +const nounsAdjs: DictionaryEntry[] = ${JSON.stringify(allNounsAdjs)}; +export default nounsAdjs;`; + fs.writeFileSync("./src/nouns-adjs.ts", nounsAdjsContent); + console.log("fetched words from dictionary"); +}); + +function getNounsAdjsFromTsS(entries, tss) { + const missingEc = []; + const toReturn = tss.map(ts => { + const entry = entries.find(x => ts === x.ts); + if (!entry) { + console.log("couldn't find ts", ts); + return undefined; + } + if (ts.ec) { + missingEc.push(ts); + } + return entry; + }).filter(x => x); + if (missingEc.length !== 0) { + console.log("missingEc", missingEc); + } + return toReturn; + +} + +function getVerbsFromTsS(entries, tss) { + const missingEc = []; + const toReturn = tss.map(ts => { + const entry = entries.find(x => ts === x.ts); + if (!entry.ec) { + missingEc.push(entry.ts); + } + if (!entry) { + console.log("couldn't find ts", ts); + return undefined; + } + if (entry.c && entry.c.includes("comp.")) { + const complement = entries.find(x => entry.l === x.ts); + return { + entry, + complement, + }; + } + return { entry }; + }).filter(x => x); + if (missingEc.length !== 0) { + console.log("missingEc", missingEc); + } + return toReturn; + +} diff --git a/nouns-adjs/a-fem.js b/nouns-adjs/a-fem.js new file mode 100644 index 0000000..201649a --- /dev/null +++ b/nouns-adjs/a-fem.js @@ -0,0 +1,102 @@ +module.exports = [ + { ts: 1527812797, e: "woman" }, // xudza + { ts: 1527816466, e: `peace` }, // صلح - sUlha + { ts: 1527816589, e: `plan` }, // طرح - tarha + { ts: 1589023873660, e: `victory, conquest` }, // فتح - fathá + { ts: 1527813791, e: `permission` }, // اجازه - ijaaza +{ ts: 1614083533098, e: `agenda` }, // اجنډه - ajanDa +{ ts: 1527811425, e: "door" }, // darwaaza +{ ts: 1527816215, e: `administration, management, directorate` }, // اداره - idaara +{ ts: 1527812687, e: `continuation` }, // ادامه - idaama +{ ts: 1527811661, e: `base, army post, (air) port` }, // اډه - aDa +{ ts: 1527814310, e: `evaluation, appraisal, assessment` }, // ارزونه - arzawuna +{ ts: 1527821380, e: `saw (the tool)` }, // اره - ara +{ ts: 1527822277, e: `mare, female horse; fever` }, // اسپه - aspa +{ ts: 1527814922, e: `addition, add-on, augmentation` }, // اضافه - izaafa +{ ts: 1527822458, e: `expression` }, // افاده - ifaada +{ ts: 1527813303, e: `myth, legend, fairy tale` }, // افسانه - afsaana +{ ts: 1527822494, e: `cheek` }, // انانګه - anaangá +{ ts: 1527817225, e: `measure, dimension, extent, scale` }, // اندازه - andaaza +{ ts: 1527813759, e: `worry, concern, fear` }, // اندېښنه - andexna +{ ts: 1527815787, e: `shoulder` }, // اوږه - ooGá +{ ts: 1527813787, e: `tear (from eye)` }, // اوښکه - ooxka +{ ts: 1527819927, e: `liver` }, // اینه - éena +{ ts: 1527816261, e: `wallet` }, // بټوه - baTwa +{ ts: 1527812001, e: `poriton, part, share` }, // برخه - barkha +{ ts: 1578009902092, e: `veil, burka` }, // برقه - bUrqá +{ ts: 1527816994, e: `program` }, // برنامه - barnaama +{ ts: 1579294091093, e: `balcony, veranda, porch` }, // برنډه - baranDá +{ ts: 1527823617, e: `crime, offense, sin, guilt, fault` }, // بزه - bazá +{ ts: 1527823619, e: `moth` }, // بزه - bUzá +{ ts: 1527823620, e: `patch (in a garment)` }, // بزه - bza +{ ts: 1591026261598, e: `she-goat` }, // بزه - buza +{ ts: 1574188090133, e: `contribution, donation, gift, charity` }, // بسپنه - baspuna +{ ts: 1527816590, e: `sufficiency, to have enough or get by` }, // بسنه - basuna +{ ts: 1593852212828, e: `fear, fright` }, // بېره - béra +{ ts: 1527815862, e: `speed, rush, hurry, urgency` }, // بېړه - beRa +{ ts: 1527815156, e: `leaf` }, // پاڼه - paaNa +{ ts: 1527813481, e: `project` }, // پروژه - projza +{ ts: 1527818409, e: `process` }, // پروسه - purosa +{ ts: 1527815192, e: `decision` }, // پرېکړه - prékRa +{ ts: 1527822412, e: `nose` }, // پزه - páza +{ ts: 1527816124, e: `foot` }, // پښه - pxa +{ ts: 1527815155, e: `pretext, excuse` }, // پلمه - palma +{ ts: 1566469328688, e: `fan` }, // پنکه - panka +{ ts: 1527815184, e: `question` }, // پوښتنه - poxtuna +{ ts: 1527822437, e: `shelf, niche` }, // تاخچه - taakhchá +{ ts: 1527814974, e: `fever` }, // تبه - tuba +{ ts: 1527815332, e: `expectation` }, // تمه - tama +{ ts: 1527815716, e: `stone, rock` }, // تیږه - teeGa +{ ts: 1582390417084, e: `escape, flight, running away` }, // تېښته - téxta +{ ts: 1527822268, e: `carriage, buggy` }, // ټانګه - Taangá +{ ts: 1527812014, e: `society, association, gathering, assembly, congregation` }, // ټولنه - Toluna +{ ts: 1527816696, e: `sentence; whole, total, sum` }, // جمله - jUmla +{ ts: 1527820504, e: `land, earth, ground` }, // ځمکه - dzmuka +{ ts: 1527815497, e: `face, picture` }, // څېره - tsera +{ ts: 1527811993, e: `attack, assault` }, // حمله - hamla +{ ts: 1527812720, e: `language` }, // ژبه - jzúba, jzíba +{ ts: 1527812052, e: `brick, cinder-block` }, // خښته - khuxta +{ ts: 1527813475, e: `minute` }, // دقیقه - daqeeqa +{ ts: 1527812542, e: `break, rest` }, // دمه - dama +{ ts: 1527812085, e: `obligation, duty, responsibility; job, work, position` }, // دنده - danda +{ ts: 1527822847, e: `jaw` }, // ژامه - jzaamá +{ ts: 1527815278, e: `night` }, // شپه - shpa +{ ts: 1527813145, e: `tribe` }, // قبیله - qabeela +{ ts: 1566653299904, e: `camara` }, // کمره - kamara +{ ts: 1527812825, e: `street` }, // کوڅه - kootsa +{ ts: 1527812756, e: `banana` }, // کېله - kela +{ ts: 1527812859, e: `game, match` }, // لوبه - lóba +{ ts: 1527819087, e: `defeat` }, // ماته - maata +{ ts: 1588076706989, e: `distance, span` }, // مسافه - masaafá +{ ts: 1527818358, e: `apple` }, // مڼه - maNá +{ ts: 1527812901, e: `stomach` }, // مېده - meda +{ ts: 1527813387, e: `gluing, joining, wrangle, quarrel, fighting, skirmish, battle` }, // نښته - nuxúta +{ ts: 1527815110, e: `sign, mark, indication` }, // نښه - náxa, núxa +{ ts: 1527813391, e: `date (as in time)` }, // نېټه - neTa +{ ts: 1527811429, e: `graveyard, cemetery` }, // هدیره - hadeera +{ ts: 1527814323, e: `gift, present, donation, contribution` }, // هدیه - hadiya +{ ts: 1527812655, e: `week` }, // هفته - hafta +{ ts: 1527812681, e: `agreement` }, // هوکړه - hókRa +{ ts: 1578343468611, e: `tendon, sinew; hamstring` }, // واڼه - wáaNa +{ ts: 1527822717, e: `snow` }, // واوره - wáawra +{ ts: 1527811207, e: `eyebrow` }, // وروځه - wróodza +{ ts: 1527816375, e: `niece; brother's daughter` }, // ورېره - wrera +{ ts: 1527822259, e: `breeze, light wind` }, // وږمه - waGmá +{ ts: 1527814719, e: `weapons, firearms, artillery` }, // وسله - wasla +{ ts: 1527823717, e: `cloth, fabric, material, clothing, garment` }, // کپړه - kapRá +{ ts: 1527816257, e: `notebook, little book` }, // کتابچه - kitaabcha +{ ts: 1527820050, e: `bag, purse` }, // کڅوړه - katsóRa +{ ts: 1527813252, e: `line, trace` }, // کرښه - kurxa +{ ts: 1527823590, e: `sphere, globe` }, // کره - kará +{ ts: 1527823591, e: `shovel, scraper, scoop` }, // کره - kára +{ ts: 1527815884, e: `criticism` }, // کره کتنه - karakatuna +{ ts: 1527823035, e: `whip` }, // کروړه - karoRá +{ ts: 1527816870, e: `farmland` }, // کرونده - karwanda +{ ts: 1527817371, e: `lament, mourning aloud, wail, cry (also out of hapiness)` }, // کریږه - kreeGa +{ ts: 1598119732734, e: `bitter melon` }, // کرېله - karelá +{ ts: 1527820606, e: `cave, cavern` }, // سمڅه - smútsa +{ ts: 1527815249, e: `song, poem, verse` }, // سندره - sandura +{ ts: 1591034128816, e: `mistake, error, blunder, fault` }, // سهوه - sáhwa +{ ts: 1527814370, e: `nostril` }, // سوږمه - soGma +{ ts: 1527817498, e: `famine, starvation, serious hunger/lack of food, drought, crop failure` }, // سوکړه - sookRá +]; \ No newline at end of file diff --git a/nouns-adjs/aa-fem.js b/nouns-adjs/aa-fem.js new file mode 100644 index 0000000..9b70761 --- /dev/null +++ b/nouns-adjs/aa-fem.js @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527813115, e: "claim" }, // ادعا - idaa + { ts: 1527818119, e: "stick, walking staff, walking stick, crutch" }, // امسا - amsaa + { ts: 1527815043, e: "punishment, retribution" }, // جزا - jazaa + { ts: 1527819022, e: "well, water-hole" }, // څا - tsaa + { ts: 1527814225, e: "mistake, error, blunder" }, // خطا - khataa + { ts: 1610797589510, e: "cavity, emptiness, vacuum, empty space, space (as in planets etc.)" }, // خلا - khaláa + { ts: 1527812582, e: "prayer" }, // دعا - dUaa + { ts: 1527813415, e: "medicine, medication" }, // دوا - dawaa + { ts: 1527812272, e: "light, glory" }, // رڼا - raNaa + { ts: 1527823245, e: "dream, vision" }, // رویا - rooyáa + { ts: 1586596579414, e: "council (an institution)" }, // شورا - shooraa + { ts: 1527815984, e: "beauty" }, // ښکلا - xkulaa + { ts: 1527817670, e: "theft, robbery, stealing" }, // غلا - ghlaa + { ts: 1527814362, e: "cow" }, // غوا - ghwaa + { ts: 1585487002625, e: "castle, fort, fortress" }, // قلا - qaláa + { ts: 1527812048, e: "meaning, sense, spirit" }, // مانا - maanaa + { ts: 1527815483, e: "back (body part)" }, // ملا - mlaa + { ts: 1527812230, e: "friendship" }, // ملګرتیا - malgurtiyaa + { ts: 1527812910, e: "hospitality; invitation, event, party, banquet, reception" }, // مېلمستیا - melmastiyaa + { ts: 1617781446945, e: "sickness, illness" }, // ناجوړتیا - naajoRtiyaa, naajoRtyaa + { ts: 1527815120, e: "grandmother" }, // نیا - niyaa + { ts: 1527811740, e: "incompleteness, default, shortcoming" }, // نیمګړتیا - neemguRtiyaa + { ts: 1527821040, e: "plague, cholera" }, // وبا - wabáa + { ts: 1527823534, e: "ability, capacity, capability, power, volumeá" }, // وړتیا - waRtiyáa + { ts: 1610443988250, e: "division, distribution" }, // وېشلتیا - weshiltyaa, weshiltiyaa + { ts: 1527816806, e: "speech, statement" }, // وینا - waynaa +]; \ No newline at end of file diff --git a/nouns-adjs/aanu-unisex.js b/nouns-adjs/aanu-unisex.js new file mode 100644 index 0000000..90b4c77 --- /dev/null +++ b/nouns-adjs/aanu-unisex.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527815197, e: "Pashtun" }, // پښتون + { ts: 1527813148, e: "lying" }, // پروت + { ts: 1574867531681, e: "mature, ripe, cooked" }, // پوخ + { ts: 1576952412644, e: "soft" }, // پوست + { ts: 1527815366, e: "bitter" }, // تریخ + { ts: 1527818789, e: "sour" }, // تریو + // { ts: 1527815333, e: "'tandoor'" }, // تنور + { ts: 1527817664, e: "hot" }, // تود + // { ts: 1577408901204, e: "knee" }, // ځنګون + { ts: 1527816071, e: "spread" }, // خپور + { ts: 1574865652928, e: "sweet" }, // خوږ + { ts: 1527813499, e: "heavy" }, // دروند + { ts: 1527813943, e: "returned, come back" }, // راستون + { ts: 1576596860977, e: "clear, bright" }, // روڼ + { ts: 1527811971, e: "blind" }, // ړوند + { ts: 1527815451, e: "old" }, // زوړ + // { ts: 1527815845, e: "life" }, // ژوندون + { ts: 1527815300, e: "rider, mounted" }, // سپور + { ts: 1527819505, e: "being (in a place after returning, coming back etc.)" }, // ستون + { ts: 1600080053835, e: "riding, mounted" }, // سور + { ts: 1527813068, e: "cold" }, // سوړ + { ts: 1575924767041, e: "shepherd" }, // شپون + // { ts: 1610448014063, e: "large flat basket" }, // شکور + { ts: 1527813172, e: "bent" }, // کوږ + { ts: 1527811973, e: "deaf" }, // کوڼ + // { ts: 1527823497, e: "intestines" }, // لړمون + // { ts: 1527813809, e: "namaz" }, // لمونځ + { ts: 1527817123, e: "wet" }, // لومد + { ts: 1527817117, e: "wet" }, // لوند + { ts: 1576889120767, e: "wet" }, // لوند + { ts: 1527812927, e: "full, satisfied" }, // موړ + { ts: 1527812908, e: "guest" }, // مېلمه + { ts: 1579463171333, e: "cleansed" }, // نوږ + { ts: 1576113803291, e: "small" }, // ووړ + { ts: 1527819244, e: "host" }, // کوربه + { ts: 1527812908, e: "guest" }, // مېلمه +]; \ No newline at end of file diff --git a/nouns-adjs/basic-fem.js b/nouns-adjs/basic-fem.js new file mode 100644 index 0000000..969521f --- /dev/null +++ b/nouns-adjs/basic-fem.js @@ -0,0 +1,18 @@ +module.exports = [ + { ts: 1527814150, e: `road, way, path` }, // لار - laar + { ts: 1527815417, e: `day` }, // ورځ - wradz + { ts: 1527812922, e: `month` }, // میاشت - miyaasht + { ts: 1527823306, e: `elbow` }, // څنګل - tsangúl + { ts: 1527813824, e: `bosom, breast; wrestling` }, // غېږ - gheG + { ts: 1527820524, e: `pelt, skin, hide, leather` }, // څرمن - tsarmún + { ts: 1527814147, e: `blanket, coving, quilt` }, // بړستن - bRastun +{ ts: 1527818707, e: `wedge; gusset (in a shirt)` }, // ترخځ - turkhúdz +{ ts: 1527822792, e: `narrow mattress used as a bed or a couch, reversible rug` }, // توشک - toshák +{ ts: 1527813294, e: `comb` }, // ږمنځ - Gmundz +{ ts: 1527811580, e: `needle, injection; pillar, mast` }, // ستن - stun +{ ts: 1527815779, e: `swearing, name-calling, verbal abuse, bad language` }, // کنځل - kundzul +{ ts: 1527817456, e: `skirt, portion of clothing hanging down from the waist; foot, base (eg. of a mountain)` }, // لمن - lamun +{ ts: 1527822725, e: `span` }, // لوېشت - lwesht +{ ts: 1527811609, e: `claw, paw` }, // منګل - mangul +{ ts: 1527821684, e: `cloud` }, // ورېځ - wurédz +] \ No newline at end of file diff --git a/nouns-adjs/basic-masc.js b/nouns-adjs/basic-masc.js new file mode 100644 index 0000000..79b756f --- /dev/null +++ b/nouns-adjs/basic-masc.js @@ -0,0 +1,102 @@ +module.exports = [ + { ts: 1527812432, e: `sky, heaven` }, // آسمان - aasmaan + { ts: 1527812431, e: `mango` }, // آم - aam + { ts: 1527812434, e: `sound, voice` }, // آواز - aawaaz + { ts: 1527816724, e: `room, chamber` }, // اتاق - Utaaq + { ts: 1527811859, e: `union, alliance` }, // اتحاد - itihaad + { ts: 1527822033, e: `joining, connection, contiguity, junction` }, // اتصال - ittisáal + { ts: 1527811858, e: `unity, alliance, agreement, understanding, consent; coincidence` }, // اتفاق - itifaaq + { ts: 1527813560, e: `accusation, charge, indictment` }, // اتهام - itihaam + { ts: 1527812105, e: `respect, honor, esteem, deference` }, // احترام - ihtiraam + { ts: 1527819653, e: `possibility, probability, likelihood` }, // احتمال - ihtimaal + { ts: 1527812689, e: `need, requirement` }, // احتیاج - ihtiyaaj + { ts: 1527812690, e: `caution` }, // احتیاط - ihtiyaat + { ts: 1527813782, e: `feeling, sensation, emotion` }, // احساس - ahsaas + { ts: 1527817303, e: `objection, protest` }, // اعتراض - itiraaz + { ts: 1527813418, e: `influence, effect, affect, action` }, // اغېز - aghez + { ts: 1527816625, e: `disaster` }, // افت - afat + { ts: 1527813558, e: `accusation, charge, blame` }, // الزام - ilzaam + { ts: 1527815388, e: `hope, expectation` }, // امید - Umeed + { ts: 1527812453, e: `picture, painting, image` }, // انځور - andzoor + { ts: 1527813827, e: `fire, flame` }, // اور - or + { ts: 1527814787, e: `rain` }, // باران - baaraan + { ts: 1527817293, e: `roof` }, // بام - baam + { ts: 1527814849, e: `eggplant` }, // بانجن - baanjan + { ts: 1527814106, e: `crisis` }, // بحران - bUhraan + { ts: 1527814885, e: `fortune, luck, fate` }, // بخت - bakht + { ts: 1527811281, e: `garden` }, // بڼ - baN + { ts: 1624039195280, e: `scholarship` }, // بورس - boors + { ts: 1527816877, e: `flag` }, // بیرغ - beyragh + { ts: 1527820423, e: `passport` }, // پاسپورټ - paasporT + { ts: 1527813224, e: `bridge` }, // پل - pUl + { ts: 1527813480, e: `plan` }, // پلان - plaan + { ts: 1527815199, e: `central-asian/middle-eastern rice dish, pilaf` }, // پلاو - pulaaw + { ts: 1527815185, e: `loan, debt` }, // پور - por + { ts: 1527815176, e: `onion` }, // پیاز - piyaaz + { ts: 1527815171, e: `start` }, // پیل - peyl + { ts: 1527816610, e: `crown, crest` }, // تاج - taaj + { ts: 1527822373, e: `vine; mouthful` }, // تاک - taak + { ts: 1527815326, e: `confirmation` }, // تایید - taayeed + { ts: 1527815357, e: `seed` }, // تخم - tUkhum + { ts: 1527821586, e: `pity, sympathy` }, // ترحم - tarahhÚm + { ts: 1527811389, e: `picture` }, // تصویر - tasweer + { ts: 1527814679, e: `guarantee, insurance, security` }, // تضمین - tazmeen + { ts: 1527814258, e: `speech, lecture` }, // تقریر - taqreer + { ts: 1527821670, e: `cheating, deception, fraud, forgery` }, // تقلب - taqalÚb + { ts: 1527811602, e: `attempt, aspiration, intention, effort` }, // تکل - takál + { ts: 1527813398, e: `movement, motion, going` }, // تګ - tug, tag + { ts: 1527822126, e: `anniversary` }, // تلین - tleen + { ts: 1527811308, e: `contact, touch` }, // تماس - tamaas + { ts: 1527817900, e: `body, flesh` }, // تن - tan + { ts: 1527821061, e: `contrast, opposition, contradiction` }, // تناقض - tanaaqÚz + { ts: 1527822387, e: `rope, cord; a measurement of ground or distances` }, // تناو - tanáaw + { ts: 1527818995, e: `lightning` }, // تندر - tandúr + { ts: 1527815362, e: `ball; (cannon) ball` }, // توپ - top + { ts: 1527816820, e: `spit` }, // توک - took + { ts: 1527816520, e: `family, clan, tribe, people` }, // ټبر - Tabar + { ts: 1527811348, e: `wound` }, // ټپ - Tap + { ts: 1527819566, e: `piece, part; cloth, fabric` }, // ټکر - TUkúr + { ts: 1527812213, e: `mosque` }, // جمات - jUmaat + { ts: 1527811705, e: `structure` }, // جوړښت - joRuxt + { ts: 1527814058, e: `answer, reply` }, // ځواب - dzawaab + { ts: 1527816887, e: `life, existence, energy, force` }, // ځواک - dzwaak + { ts: 1527814649, e: `market square, crossroads, paved area in front of entrance` }, // چوک - chok + { ts: 1527815065, e: `hammer` }, // څټک - tsaTak, tsTuk + { ts: 1527814589, e: `side` }, // څنګ - tsang + { ts: 1527816228, e: `boundary, limit, extent` }, // حد - had + { ts: 1527813749, e: `government, reign, rule` }, // حکومت - hUkoomat + { ts: 1527814125, e: `solution` }, // حل - hal + { ts: 1527818703, e: `shirt` }, // خت - khut + { ts: 1527813804, e: `sleep, dream` }, // خوب - khob + { ts: 1527812815, e: `safety, security` }, // خوندیتوب - khwundeetob + { ts: 1527813763, e: `religion, faith` }, // دین - deen + { ts: 1527811517, e: `journey, travel` }, // سفر - safar + { ts: 1527815389, e: `age, life` }, // عمر - Úmur + { ts: 1527816746, e: `tooth` }, // غاښ - ghaax + { ts: 1527812631, e: `ear` }, // غوږ - ghwuG, ghwaG + { ts: 1527812265, e: `decree, order` }, // فرمان - farmaan + { ts: 1527817205, e: `film, movie` }, // فلم - film + { ts: 1527812727, e: `year` }, // کال - kaal + { ts: 1527812817, e: `book` }, // کتاب - kitaab + { ts: 1527812611, e: `step, move` }, // ګام - gaam + { ts: 1527812641, e: `rose, flower` }, // ګل - gUl + { ts: 1527812650, e: `threat, danger, challeng` }, // ګواښ - gwaax + { ts: 1527813521, e: `mourning, grief, grieving, deep sorrow` }, // ماتم - maatam + { ts: 1527812176, e: `evening` }, // ماښام - maaxaam + { ts: 1527813601, e: `death` }, // مرګ - marg + { ts: 1527817691, e: `future` }, // مستقبل - mUstaqbil + { ts: 1527811866, e: `damage, defect, loss` }, // نقصان - nUqsaan + { ts: 1527815122, e: `name` }, // نوم - noom + { ts: 1527812661, e: `boy, young lad` }, // هلک - halík, halúk + { ts: 1566476070874, e: `street, road` }, // واټ - waaT + { ts: 1527816036, e: `authority, power` }, // واک - waak + { ts: 1527815400, e: `time` }, // وخت - wakht + { ts: 1527818582, e: `building, prosperity, habitable state` }, // ودانښت - wadaanuxt + { ts: 1527811441, e: `door, gate, entrance` }, // ور - war + { ts: 1527815406, e: `homeland, home country` }, // وطن - watán + { ts: 1573149648251, e: `fellow country-man` }, // وطن وال - watanwaal + { ts: 1586428847646, e: `national (person), a citizen or person of that land` }, // وطنوال - watanwáal + { ts: 1527822208, e: `bat, coward, pipsqueak, hesitant person` }, // وطواط - watwáat + { ts: 1527819571, e: `apprehension, anxiety, suspicion; imagination, whims, some problem made up in someone’s head` }, // وهم - wáhum, wahm + { ts: 1527816332, e: `pride, glory` }, // ویاړ - wyaaR +]; \ No newline at end of file diff --git a/nouns-adjs/basic-unisex.js b/nouns-adjs/basic-unisex.js new file mode 100644 index 0000000..f3aea9b --- /dev/null +++ b/nouns-adjs/basic-unisex.js @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527815408, e: "asleep" }, // ویده - weedú + { ts: 1527812796, e: "good" }, // ښه - xu + { ts: 1527821744, e: "cook, chef" }, // آشپز - aashpáz + { ts: 1527812461, e: "hero, brave" }, // اتل - atul + { ts: 1527821649, e: "impressive, effective, influencing" }, // اثرناک - asarnáak + { ts: 1527818704, e: "wide, spacious, extensive" }, // ارت - arát + { ts: 1578340121962, e: "free, independant" }, // ازاد - azáad + { ts: 1527819418, e: "independant, autonomous" }, // خپلواک - khpulwaak + { ts: 1527817146, e: "resident; settled" }, // استوګن - astogan + { ts: 1527813713, e: "hopeful, pregnant" }, // امیدوار - Umeedwaar + { ts: 1527819451, e: "Englishman, English (adjective)" }, // انګرېز - angréz + { ts: 1527820346, e: "on-line" }, // انلاین - anlaayn + { ts: 1527813667, e: "important" }, // اهم - aham + { ts: 1598724912198, e: "dry" }, // اوچ - ooch + { ts: 1527815138, e: "insurgent" }, // اورپک - orpak + { ts: 1586452587974, e: "free, available" }, // اوزګار - oozgáar + { ts: 1527816489, e: "faithful, believer" }, // ایماندار - eemaandaar + { ts: 1527820433, e: "valiant" }, // باتور - baatóor + { ts: 1527813425, e: "stingy" }, // بخیل - bakheel + { ts: 1527812511, e: "bad" }, // بد - bud, bad + { ts: 1527812518, e: "equal, even, set up" }, // برابر - buraabur + { ts: 1527811861, e: "naked" }, // بربنډ - barbunD + { ts: 1527811511, e: "full, complete" }, // بشپړ - bushpuR + { ts: 1527812515, e: "other, next" }, // بل - bul + { ts: 1527815725, e: "knowledgeable, accustomed" }, // بلد - balad + { ts: 1577301753727, e: "closed" }, // بند - band + { ts: 1527812490, e: "useless" }, // بې کار - be kaar + { ts: 1527812031, e: "separate, different" }, // بېل - bel + { ts: 1527815144, e: "clean, pure" }, // پاک - paak + { ts: 1527815201, e: "hidden" }, // پټ - puT + { ts: 1527815179, e: "wide" }, // پلن - plun + { ts: 1527819059, e: "thick, fat" }, // پنډ - punD + { ts: 1611767359178, e: "compassionate" }, // ترسناک - tarsnáak + { ts: 1527813270, e: "sour" }, // تروش - troosh + { ts: 1527813817, e: "narrow, cramped" }, // تنګ - tang + { ts: 1527816354, e: "ready" }, // تیار - tayaar + { ts: 1527817056, e: "sharp, fast" }, // تېز - tez + { ts: 1527814076, e: "societal, social" }, // ټولنیز - Toluneez + { ts: 1527819864, e: "low" }, // ټیټ - TeeT + { ts: 1527811894, e: "firm, tough, rigid" }, // ټینګ - Teeng + { ts: 1527812943, e: "constant, stable, proven" }, // ثابت - saabit + { ts: 1527813085, e: "heavy, difficult" }, // ثقیل - saqeel + { ts: 1527820479, e: "ignorant" }, // جاهل - jaahíl + { ts: 1588160800930, e: "surgeon" }, // جراح - jarráah + { ts: 1527812707, e: "high, tall" }, // جګ - jig, jug + { ts: 1527816944, e: "clear, evident" }, // جوت - jawat + { ts: 1527822996, e: "alongside, adjoining" }, // جوخت - jokht + { ts: 1527812711, e: "well, healthy" }, // جوړ - joR + { ts: 1527816323, e: "shining, sparkling" }, // ځلاند - dzalaand + { ts: 1527812291, e: "young, youthful" }, // ځوان - dzwaan + { ts: 1527820112, e: "hanging" }, // ځوړند - dzwáRund + { ts: 1527819672, e: "crafty" }, // چالاک - chaaláak + { ts: 1527811230, e: "quick, fast" }, // چټک - chaTak + { ts: 1527812524, e: "started, in motion" }, // چلان - chalaan + { ts: 1527815370, e: "clear, apparent" }, // څرګند - tsărgund + { ts: 1576366107077, e: "straight, upright" }, // څک - tsak + { ts: 1527812113, e: "present, on hand, ready" }, // حاضر - haazir, haazur + { ts: 1527820699, e: "pregnant, carrying" }, // حامل - haamíl + { ts: 1527819824, e: "greedy" }, // حریص - harées + { ts: 1527812669, e: "sensitive" }, // حساس - hasaas + { ts: 1527812057, e: "raw, unripe" }, // خام - khaam + { ts: 1527811523, e: "traitor, treacherous" }, // خاین - khaayin + { ts: 1527814219, e: "relative, one's own" }, // خپل - khpul + { ts: 1527812795, e: "relative" }, // خپلوان - khpulwaan + { ts: 1527812808, e: "poor, miserable" }, // خوار - khwaar + { ts: 1527814880, e: "tall" }, // دنګ - dung + { ts: 1527812537, e: "assured" }, // ډاډمن - DaaDmun + { ts: 1527812583, e: "full" }, // ډک - Duk + { ts: 1527822674, e: "gaunt" }, // ډنګر - Dungár, Dangár + { ts: 1527817256, e: "sunk" }, // ډوب - Doob + { ts: 1527814277, e: "healthy" }, // روغ - rogh + { ts: 1609780006604, e: "fruitful" }, // زرخېز - zarkhéz + { ts: 1527817116, e: "green, flourishing" }, // زرغون - zarghoon + { ts: 1527814026, e: "golden" }, // زرین - zareen + { ts: 1567594312839, e: "brave" }, // زړه ور - zuRawár + { ts: 1527815848, e: "committed" }, // ژمن - jzman + { ts: 1527813498, e: "light" }, // سپک - spuk + { ts: 1578329248464, e: "white" }, // سپین - speen + { ts: 1527811860, e: "great" }, // ستر - stur + { ts: 1527820178, e: "problematic" }, // ستونزمن - stoonzmán + { ts: 1527815246, e: "difficult" }, // سخت - sakht + { ts: 1527817262, e: "barren" }, // شنډ - shanD + { ts: 1527813426, e: "stingy" }, // شوم - shoom + { ts: 1527812625, e: "big" }, // غټ - ghuT, ghaT + { ts: 1527811846, e: "successful" }, // کامیاب - kaamyaab + { ts: 1527823678, e: "lazy" }, // کاهل - kaahíl + { ts: 1527814896, e: "proud, arrogant" }, // کبرجن - kaburjun + { ts: 1527813117, e: "firm, solid" }, // کلک - klak, kluk + { ts: 1578769492475, e: "few, little" }, // کم - kam + // { ts: 1527814253, e: "mixed up" }, // ګډ وډ // TODO: FIX INFLECTION MACHINE FOR DOUBLES! + { ts: 1578769409512, e: "weak" }, // کمزور - kamzór + { ts: 1527812639, e: "dear, difficult" }, // ګران - graan + { ts: 1527816786, e: "all" }, // ګرد - gurd + { ts: 1527814811, e: "warm, hot" }, // ګرم - garm, garum + { ts: 1527817662, e: "guilty" }, // ګرم - gram + { ts: 1527812308, e: "thick, lots" }, // ګڼ - gaN + { ts: 1527813848, e: "desiring, eager" }, // لېوال - lewaal + { ts: 1527816011, e: "broken" }, // مات - maat + { ts: 1527812881, e: "child" }, // ماشوم - maashoom + { ts: 1527817007, e: "known" }, // مالوم - maaloom + { ts: 1527814321, e: "positive" }, // مثبت - mUsbat + { ts: 1527811264, e: "condemned" }, // محکوم - mahkoom + { ts: 1527814802, e: "foul" }, // مردار - mUrdáar + { ts: 1527821812, e: "arrogant" }, // مغرور - maghróor + { ts: 1527820222, e: "lying down" }, // ملاست - mlaast + { ts: 1527814344, e: "important" }, // مهم - mUhím + { ts: 1527816033, e: "uncommon" }, // نادر - naadir + { ts: 1527815106, e: "sitting, seated" }, // ناست - naast + { ts: 1527815127, e: "nurse" }, // نرس - nurs + { ts: 1527821673, e: "moist, damp, wet" }, // نمجن - namjún + { ts: 1527815130, e: "dry, land, ground" }, // وچ - wuch, wUch + { ts: 1527817486, e: "ruined, destroyed; destructive, bad, naughty" }, // وران - wraan + { ts: 1527814373, e: "lost" }, // ورک - wruk + { ts: 1527822838, e: "decayed, spoiled, rotten" }, // وروست - wrost + { ts: 1609949334478, e: "roasted" }, // وریت - wreet + { ts: 1527811544, e: "standing" }, // ولاړ - waláaR, wuláaR + { ts: 1527815498, e: "aforementioned" }, // یاد - yaad + { ts: 1527815434, e: "cold" }, // یخ - yakh, yukh + ]; \ No newline at end of file diff --git a/nouns-adjs/e-fem.js b/nouns-adjs/e-fem.js new file mode 100644 index 0000000..9c8b9e3 --- /dev/null +++ b/nouns-adjs/e-fem.js @@ -0,0 +1,25 @@ +module.exports = [ + { ts: 1568926976497, e: `x-ray` }, // اکسرې - iksre + { ts: 1602179757779, e: `alphabet` }, // الف بې - alif be + { ts: 1527813840, e: `ashes` }, // ایرې - eere + { ts: 1527816692, e: `glasses, spectacles` }, // اینکې - aynake + { ts: 1527819286, e: `stairs, steps, staircase` }, // پاشتقې - paashtáqe + { ts: 1527816299, e: `money (plural of پېسې)` }, // پیسې - peyse + { ts: 1527814529, e: `buttermilk` }, // تروې - turwe + { ts: 1527816369, e: `widow, woman` }, // تورسرې - torsăre + { ts: 1577408787088, e: `sprey (as in a medicinal spray)` }, // سپرې - spre + { ts: 1527822255, e: `break of dawn, first light of day, sunrise` }, // سپېدې - spedé + { ts: 1626765107329, e: `chickenpox, chicken pox` }, // شرې - sharé + { ts: 1527815008, e: `milk` }, // شودې - shoode + { ts: 1527822131, e: `raw rice, unprocessed rice` }, // شولې - shole + { ts: 1527815009, e: `milk (plural of شيده)` }, // شیدې - sheede + { ts: 1527823571, e: `spit, saliva` }, // ښیالمې - xyaalmé + { ts: 1527816530, e: `sister in law` }, // ښینې - xeene + { ts: 1527823567, e: `spit, saliva, slobber, slime` }, // لاړې - laaRe + { ts: 1527822275, e: `dishes, pots, pans` }, // لوښې - looxe + { ts: 1617443138210, e: `urine, pee, piss` }, // مچیازې - michyaaze, muchyaaze + { ts: 1527814420, e: `yogurt` }, // مستې - maste + { ts: 1577999538077, e: `a sound/cry used to drive sheep on` }, // هرې - hire + { ts: 1586551382412, e: `rice` }, // وریژې - wreejze + { ts: 1527820261, e: `plow, plowing, plough, ploughing` }, // یوې - yuwe +]; \ No newline at end of file diff --git a/nouns-adjs/ee-fem.js b/nouns-adjs/ee-fem.js new file mode 100644 index 0000000..aba95f0 --- /dev/null +++ b/nouns-adjs/ee-fem.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527820771, e: "population, number of settlers; prosperity, well-being; organization of public services and amenities; construction" }, // آباداني - aabaadaanee + { ts: 1527813939, e: "freedom, independence" }, // آزادي - aazaadee + { ts: 1527818402, e: "championship; courage" }, // اتلولي - atalwalée + { ts: 1527814060, e: "ease" }, // اساني - asaanee + { ts: 1527821293, e: "preparation, readiness, planning" }, // امادګي - amaadagee + { ts: 1527819502, e: "kingship, kingdom, rule, throne, authority" }, // باچهي - baachahee + { ts: 1527820035, e: "dominion, holding sway over someone" }, // باداري - baadaaree + { ts: 1527817732, e: "misfortune, difficulty" }, // بدبختي - badbakhtee + { ts: 1588786872582, e: "shame, disrepute, dishonour" }, // بدنامي - badnaamee + { ts: 1573682378816, e: "sickness, illness" }, // بیماري - beemaaree + { ts: 1527816817, e: "cleanliness, hygiene" }, // پاکوالي - paakwaalee + { ts: 1586204619186, e: "righteousness, abstinence, self-control" }, // پرهېزګاري - parhezgaaree + { ts: 1584444376984, e: "patriarchy" }, // پلارواکي - plaarwaakee + { ts: 1527818744, e: "carpentry" }, // ترکاڼي - tarkaaNee + { ts: 1527815337, e: "consolation, comfort, satisfaction" }, // تسلي - tasallee + { ts: 1527819521, e: "happiness (خوشحالي)" }, // خوشالي - khoshaalee + { ts: 1527818037, e: "good fortune, good luck, hapiness" }, // خوشبختي - khooshbakhtee + { ts: 1527815914, e: "optimism" }, // خوشبیني - khooshbeenee + { ts: 1527811877, e: "friendship" }, // دوستي - dostee + { ts: 1527818019, e: "shopkeeping, retail store selling" }, // دوکانداري - dookaandaaree + { ts: 1527822080, e: "democracy" }, // دېموکراسي - demokraasee + { ts: 1527813462, e: "key" }, // کیلي - keelee + { ts: 1527814492, e: "cattle farming" }, // ګاوداري - gaawdaaree + { ts: 1610013679820, e: "brotherhood" }, // ورورولي - wrorwalée +]; \ No newline at end of file diff --git a/nouns-adjs/exception-people-fem.js b/nouns-adjs/exception-people-fem.js new file mode 100644 index 0000000..e4f5c50 --- /dev/null +++ b/nouns-adjs/exception-people-fem.js @@ -0,0 +1,13 @@ +module.exports = [ + { ts: 1527821971, e: `second wife of own husband` }, // بن - bun + { ts: 1527816397, e: `aunt` }, // ترور - tror + { ts: 1578704593901, e: `aunt (paternal uncle's wife)` }, // تندار - tandaar + { ts: 1527812785, e: `sister` }, // خور - khor + { ts: 1527812861, e: `daughter` }, // لور - loor + { ts: 1527812928, e: `mother, mom` }, // مور - mor + { ts: 1527812912, e: `lady, woman, wife` }, // مېرمن - mermán + { ts: 1527816476, e: `stepsister, half sister` }, // مېرېنۍ خور - merenuy khor + { ts: 1527823521, e: `daughter-in-law` }, // نږور - nGor + { ts: 1527816350, e: `brothers wife, sister-in-law` }, // ورندار - wrundaar + { ts: 1527816485, e: `wife of husbands brother, wife of brother-in-law` }, // یور - yor +]; \ No newline at end of file diff --git a/nouns-adjs/exception-people-masc.js b/nouns-adjs/exception-people-masc.js new file mode 100644 index 0000000..c7da43d --- /dev/null +++ b/nouns-adjs/exception-people-masc.js @@ -0,0 +1,37 @@ +module.exports = [ + { ts: 1527821817, e: `uncle (paternal)` }, // اکا - akáa + { ts: 1527816411, e: `father, grandfather (vocative or in child's speech)` }, // بابا - baabaa + { ts: 1527819439, e: `king, ruler, president, padishah` }, // باچا - baacháa + { ts: 1527823298, e: `sparrow-hawk, eagle` }, // باښه - baaxá + { ts: 1527817718, e: `slave, servant, a human, person (as in a slave of God)` }, // بنده - bandá + { ts: 1527815031, e: `prisoner, captive` }, // بندي - bandee + { ts: 1527815142, e: `king` }, // پاچا - paachaa + { ts: 1527817280, e: `leper` }, // جذامي - jUzaamee + { ts: 1527814236, e: `pot smoker, pothead, someone addicted to marijuana, pot, hash` }, // چرسي - charsee + { ts: 1578618561154, e: `Haji, someone who has gone on the Hajj` }, // حاجي - haajee + { ts: 1527821193, e: `supporter, protector, defender, patron, saviour` }, // حامي - haamee + { ts: 1591711877815, e: `washerman, someone who does the laundry` }, // دوبي - dobée + { ts: 1527820139, e: `rabab player, rubab player` }, // ربابي - rabaabee + { ts: 1619278755267, e: `troubling, pestering` }, // ربړنه - rabaRúna + { ts: 1577066022588, e: `cupbearer, butler, bartender, alchohol maker` }, // ساقي - saaqée + { ts: 1527822817, e: `soldier, warrior, guard` }, // سپاهي - sipaahee + { ts: 1527812975, e: `barber, hairdresser` }, // سلماني - salmaanee + { ts: 1527819414, e: `prince` }, // شاهزاده - shaahzaadá + { ts: 1527818084, e: `drinker, drunkard, alcoholic, wine-bibber` }, // شرابي - sharaabee + { ts: 1527821950, e: `prince` }, // شهزاده - shahzaadá + { ts: 1588158828142, e: `hunter` }, // ښکاري - xkaaree + { ts: 1527815206, e: `judge, religious authority/judge` }, // قاضي - qaazee + { ts: 1527818500, e: `contractor, supplier` }, // قراردادي - qaraardaadee + { ts: 1527816446, e: `paternal uncle, term of address for elderly man` }, // کاکا - kaakaa + { ts: 1595232159907, e: `begger, panhandler` }, // ګدا - gadáa + { ts: 1527816512, e: `elder brother, general form of familiar and respectful address` }, // لالا - laalaa + { ts: 1527812878, e: `uncle (maternal), respectful form of address` }, // ماما - maamaa + { ts: 1610556640847, e: `census` }, // مردمشماري - mărdamshUmaaree + { ts: 1527815484, e: `mullah, priest` }, // ملا - mUllaa + { ts: 1527821714, e: `parallel, matching, appropriate, identical` }, // موازي - mUwaazée + { ts: 1527816514, e: `shoemaker, shoe repairman, cobbler` }, // موچي - mochee + { ts: 1527823093, e: `prophet` }, // نبي - nabee + { ts: 1579041957559, e: `call, appeal, shout, summoning` }, // ندا - nadáa + { ts: 1527816253, e: `grandson` }, // نواسه - nawaasa + { ts: 1527819971, e: `governor` }, // والي - waalée +]; \ No newline at end of file diff --git a/nouns-adjs/ey-masc.js b/nouns-adjs/ey-masc.js new file mode 100644 index 0000000..6fef7eb --- /dev/null +++ b/nouns-adjs/ey-masc.js @@ -0,0 +1,133 @@ +module.exports = [ +{ ts: 1527818948, e: `sneezing, sneeze` }, // اټسکی - aTúskey +{ ts: 1573681135691, e: `tribal constable, tribal offical with police powers` }, // اربکی - arbakéy +{ ts: 1573659054031, e: `width, spaciousness` }, // ارتوالی - artwaaley, aratwaaley +{ ts: 1527811890, e: `thorn, prickle` }, // ازغی - azghey +{ ts: 1527817036, e: `representative, envoy, ambassador, commissioner` }, // استازی - astaazey +{ ts: 1527816982, e: `residence, dwelling; hostel, dormitory` }, // استوګنځی - astogundzey +{ ts: 1527818489, e: `yawn, sigh, deep breath, shivering` }, // اسوېلی - asweley +{ ts: 1527822497, e: `cheek` }, // اننګی - anangey +{ ts: 1527821967, e: `beaver, seal` }, // اوبسپی - obspéy +{ ts: 1527822190, e: `stove, oven, furnace, hearth, floor of a fireplace` }, // اور غالی - orgháaley +{ ts: 1527821545, e: `volcano` }, // اورشیندی - orsheendéy +{ ts: 1527819192, e: `train` }, // اورګاډی - orgáaDey +{ ts: 1527815585, e: `summer` }, // اوړی - oRey +{ ts: 1623044357441, e: `tuft, clump, shock of hair` }, // ببوتنکی - bubootúnkey +{ ts: 1527821668, e: `spark, speck, flicker` }, // بڅری - batsúrey +{ ts: 1527821239, e: `kidney` }, // بډوری - baDóorey +{ ts: 1527821099, e: `earring` }, // برغوږی - barghwáGey +{ ts: 1527822629, e: `lid, cover` }, // برغولی - barghóley +{ ts: 1527811903, e: `success, victory` }, // بری - barey +{ ts: 1594904072731, e: `bracelet` }, // بنګړی - bangRéy +{ ts: 1527817159, e: `plant` }, // بوټی - booTey +{ ts: 1527815055, e: `terrible` }, // بوږنوړی - boGnwaRey +{ ts: 1610618917483, e: `orphanage, nursery` }, // پالنځی - paalundzéy +{ ts: 1527814666, e: `final point, end point` }, // پای ټکی - paayTakey +{ ts: 1527816195, e: `small turban` }, // پټکی - paTkey +{ ts: 1527811611, e: `field, place where crops are sown` }, // پټی - paTey +{ ts: 1588762458105, e: `kitchen` }, // پخلنځی - pukhlandzéy +{ ts: 1527816059, e: `cooking, preparation of food; wisdom, maturity` }, // پخلی - pakhley +{ ts: 1527821241, e: `acorn` }, // پرګی - purgéy +{ ts: 1527813812, e: `veil, covering for women, cover` }, // پړونی - paRóoney +{ ts: 1527822385, e: `rope, cable, cord` }, // پړی - púRey +{ ts: 1527812980, e: `whispering, murmuring, rumor, gossip` }, // پس پسی - puspusey +{ ts: 1527814005, e: `spring, springtime (season)` }, // پسرلی - psarléy, pusărléy +{ ts: 1527821229, e: `kidney` }, // پښتورګی - paxtawurgey +{ ts: 1527817035, e: `mission, delegation` }, // پلاوی - plaawey +{ ts: 1527815187, e: `mat` }, // پوزی - pozey +{ ts: 1527816627, e: `fleece, pelt, skin, shell, rind, bark; ear lobe` }, // پوستکی - postukey +{ ts: 1527819332, e: `kidney` }, // پوښتورګی - pooxtawúrgey +{ ts: 1527819496, e: `understanding, comprehension` }, // پوهاوی - pohaawéy +{ ts: 1527815168, e: `load, weight, burden` }, // پېټی - peTéy +{ ts: 1527815927, e: `customer` }, // پېرونکی - peroonkey +{ ts: 1527815017, e: `cream` }, // پېروی - perúwey, peráwey +{ ts: 1527815325, e: `violence` }, // تاوتریخوالی - taawtreekhwaaley +{ ts: 1611397750325, e: `screwdriver, screw` }, // تاوی - taawéy +{ ts: 1622374978659, e: `hatchet` }, // تبرګی - tubúrgey +{ ts: 1527818705, e: `gusset (in a shirt)` }, // تخرګی - tkhurgéy +{ ts: 1527814392, e: `band, bandage` }, // تړونی - taRooney +{ ts: 1527822723, e: `side, groin, empty place, void` }, // تشی - túshey +{ ts: 1577585114379, e: `sole (of a shoe); yard, compound; palm` }, // تلی - táley +{ ts: 1527816630, e: `forehead, brow, slope` }, // تندی - tandey +{ ts: 1527821980, e: `bellyband (of a harness)` }, // تڼی - taNéy +{ ts: 1527819719, e: `spleen` }, // توری - tórey +{ ts: 1527819721, e: `letter, letter of the alphabet` }, // توری - tórey +{ ts: 1527819622, e: `rocket, missile` }, // توغندی - toghandéy +{ ts: 1527814705, e: `element, item, material; thing, material, kind, type` }, // توکی - tokey +{ ts: 1527819563, e: `piece, small piece; a length (of cloth); blanket` }, // ټکری - TUkréy +{ ts: 1577408381145, e: `shawl, head-covering` }, // ټکری - Tikréy +{ ts: 1527814667, e: `word; point; dot` }, // ټکی - Tákey +{ ts: 1527813617, e: `shawl, head covering` }, // ټیکری - Teekréy +{ ts: 1527819733, e: `young, youth, young lad` }, // ځلمی - dzalméy +{ ts: 1527815465, e: `official authority, official, authority` }, // چارواکی - chaarwaakey +{ ts: 1527822356, e: `worm, small insect` }, // چنجی - chinjéy +{ ts: 1527822808, e: `basin, bowl` }, // چنی - chanéy +{ ts: 1527822357, e: `worm, small insect` }, // چینجی - cheenjéy +{ ts: 1527819046, e: `drop` }, // څاڅکی - tsáatskey +{ ts: 1527817874, e: `quality, nature` }, // څرنګوالی - tsurangwaaley +{ ts: 1527814041, e: `spring (season)` }, // څړمنی - tsaRmuney +{ ts: 1573055311846, e: `warning, notice, alarm` }, // خبرداری - khabardaarey +{ ts: 1527820324, e: `melon` }, // خټکی - khaTakéy +{ ts: 1527819828, e: `weight; respect, honour` }, // درناوی - dranaawey +{ ts: 1588161660483, e: `crutch, walking-stick, cane` }, // ډانګوری - Daangooréy +{ ts: 1527819732, e: `young, youth, young lad` }, // زلمی - zalméy +{ ts: 1527813708, e: `good news, gospel` }, // زېری - zerey +{ ts: 1588758498458, e: `jaundice` }, // زېړی - zeRéy +{ ts: 1571626392709, e: `birthplace` }, // زېږنځی - zeGundzey +{ ts: 1527815698, e: `winter` }, // ژمی - jzúmey +{ ts: 1573686563723, e: `wineskin, bagpipe, skin for carrying liquid` }, // ژی - jzey +{ ts: 1527815239, e: `entertainment, fun, recreation` }, // ساتېری - saaterey +{ ts: 1527813725, e: `equal, equivalent, match, precedent` }, // ساری - sáarey +{ ts: 1527814021, e: `spring (season)` }, // سپرلی - sparléy +{ ts: 1527813509, e: `insult, disgrace, defamation, disrespect` }, // سپکاوی - spukaawéy +{ ts: 1527815298, e: `clarification, attestation` }, // سپیناوی - speenaawey +{ ts: 1578002674551, e: `eye-socket, eyelid; orbit` }, // سترغلی - sturghúley +{ ts: 1527811999, e: `star` }, // ستوری - storey +{ ts: 1527817001, e: `throat, larynx` }, // ستونی - stóoney +{ ts: 1527813511, e: `headache, trouble` }, // سرخوږی - sărkhwuGey +{ ts: 1527815251, e: `man` }, // سړی - saRéy +{ ts: 1527819850, e: `lung` }, // سږی - súGey +{ ts: 1527812302, e: `hole, slit, opening` }, // سوری - soorey +{ ts: 1527818221, e: `burning, zeal, fervour` }, // سوی - swey +{ ts: 1527812304, e: `shade, shadow` }, // سیوری - syórey, syóorey +{ ts: 1527815268, e: `thing` }, // شی - shey +{ ts: 1527822527, e: `ankle, ankle-bone` }, // ښتګری - xatgaréy +{ ts: 1527812793, e: `school` }, // ښوونځی - xowundzey +{ ts: 1527821064, e: `a quick, clever, agile, bright man; a swindler, a fraud` }, // ښویکی - xwayakéy +{ ts: 1527822650, e: `largeness, bigness` }, // غټوالی - ghaTwaaley +{ ts: 1527814569, e: `member` }, // غړی - ghuRey +{ ts: 1527817627, e: `arrow` }, // غشی - ghúshey +{ ts: 1527822913, e: `precious stone, precious stone in a signet ring` }, // غمی - ghaméy +{ ts: 1527816181, e: `vomit, nausea (Arabic)` }, // قی - qey +{ ts: 1527814715, e: `user` }, // کاروونکی - kaarawoonkey +{ ts: 1527823295, e: `stone, rock` }, // کاڼی - káaNey +{ ts: 1527818563, e: `muscle` }, // کبوړی - kabóoRey +{ ts: 1527822824, e: `booklet, notebook` }, // کتاب ګوټی - kitaabgóTey +{ ts: 1582388629980, e: `pupil (of an eye)` }, // کسی - kúsey +{ ts: 1594906790729, e: `boy` }, // ککی - kakéy +{ ts: 1527812836, e: `village` }, // کلی - kuley, kiley +{ ts: 1610616852625, e: `echo` }, // کنګرېزی - kangrezéy +{ ts: 1527819196, e: `car, train` }, // ګاډی - gaaDey +{ ts: 1579016593220, e: `beehive; wasps' nest` }, // ګنی - ganéy +{ ts: 1527819076, e: `doll, puppet` }, // ګوډاګی - gooDaagéy +{ ts: 1527822505, e: `cheek` }, // ګومبوری - goomboorey +{ ts: 1527819079, e: `puppet` }, // لاسپوڅی - laaspotséy +{ ts: 1573149568665, e: `access, availability` }, // لاسرسی - laasraséy +{ ts: 1527817464, e: `wood, timber` }, // لرګی - largey +{ ts: 1527822801, e: `sleeve` }, // لستوڼی - lastóNey +{ ts: 1527814401, e: `toy` }, // لوبونی - lobawuney +{ ts: 1527814519, e: `side, direction` }, // لوری - lorey +{ ts: 1527823103, e: `perspective, viewpoint` }, // لیدلوری - leedlorey +{ ts: 1527819920, e: `mosquito, midge` }, // ماشی - maashey +{ ts: 1527820224, e: `fly swatter` }, // مچوژی - muchwajzéy +{ ts: 1527817770, e: `dead body, corpse` }, // مړی - múRey +{ ts: 1527813189, e: `fall, autumn` }, // منی - máney +{ ts: 1527812421, e: `ant` }, // مېږی - meGey +{ ts: 1527819227, e: `lack` }, // نشتوالی - nashtwaaley +{ ts: 1527823577, e: `sapling, seedling, sprout, young tree` }, // نیالګی - niyaalgey +{ ts: 1527812073, e: `bone` }, // هډوکی - haDookey +{ ts: 1527812668, e: `welcome` }, // هرکلی - hărkáley +{ ts: 1588153218244, e: `height, elevation, tallness` }, // هسکوالی - haskwáaley +{ ts: 1585309922022, e: `flu, respiratory illness, influenza, cold` }, // والګی - waalgéy +{ ts: 1527821465, e: `shoulder` }, // ولی - wuléy +] \ No newline at end of file diff --git a/nouns-adjs/ey-stressed-unisex.js b/nouns-adjs/ey-stressed-unisex.js new file mode 100644 index 0000000..14ce0fd --- /dev/null +++ b/nouns-adjs/ey-stressed-unisex.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527822004, e: "last, final" }, // آخرینی - aakhireenéy + { ts: 1591872915426, e: "Afghan (person)" }, // افغانی - afghaanéy + { ts: 1612616237182, e: "Pakistani (person)"}, // پاکستانی - paakistaanéy + { ts: 1527813400, e: "current" }, // اوسنی - oosanéy + { ts: 1527815661, e: "first" }, // اولنی - awwalunéy + { ts: 1527812476, e: "child" }, // بچی - bachéy + { ts: 1527816646, e: "foreigner, outer" }, // بهرنی - baharanéy, bahranéy + { ts: 1527818769, e: "emergency" }, // بېړنی - beRanéy + { ts: 1592382613021, e: "old, ancient, former" }, // پخوانی - pakhwaanéy + { ts: 1527819532, e: "foreign, unrelated" }, // پردی - pradéy, prudéy + { ts: 1577381894391, e: "Englishman, Westerner" }, // پرنګی - parangéy + { ts: 1527820194, e: "so-and-so" }, // پلانکی - pulaankéy + { ts: 1527820130, e: "adherent" }, // پلوی - palawéy + { ts: 1582390092514, e: "upper, above" }, // پورتنی - portinéy + { ts: 1610617741649, e: "old, ancient" }, // ځنډنی - dzanDanéy, dzanDunéy + { ts: 1610793723568, e: "goat" }, // چېلی - cheléy + { ts: 1527819362, e: "calf (animal)" }, // خوسی - khooséy + { ts: 1590052667427, e: "witness" }, // درستی - drustéy, drastéy + { ts: 1527822854, e: "first, before" }, // ړومبی - Roombéy + { ts: 1527820213, e: "lion" }, // زمری - zmaréy + { ts: 1527813923, e: "living" }, // ژوندی - jzwundéy + { ts: 1527815299, e: "dog" }, // سپی - spéy + { ts: 1527820788, e: "city, urban" }, // ښارنی - xaaranéy + { ts: 1527812822, e: "little, small" }, // کوچنی - koochnéy + { ts: 1527823742, e: "nomadic" }, // کوچی - kochéy + { ts: 1527818765, e: "speedy, quick" }, // ګړندی - guRandéy + { ts: 1527819130, e: "cute" }, // ګلالی - gUlaaléy + { ts: 1576101261017, e: "mute (person)" }, // ګنګی - gangéy + { ts: 1582316583262, e: "lower, bottom" }, // لاندینی - laandeenéy + { ts: 1527816249, e: "grandchild" }, // لمسی - lmaséy + { ts: 1527813472, e: "first" }, // لومړنی - loomRanéy + { ts: 1527813132, e: "first" }, // لومړی - loomRéy + { ts: 1527819910, e: "slippery, smooth" }, // متلی - mutléy + { ts: 1527820414, e: "middle, central" }, // منځنی - mandzunéy + { ts: 1527811202, e: "monthly" }, // میاشتنی - miyaashtanéy + { ts: 1527819320, e: "thin" }, // نری - naréy + { ts: 1527816251, e: "grandchild" }, // نمسی - nmaséy + { ts: 1527821373, e: "deer" }, // هوسی - hoséy + { ts: 1527813636, e: "last" }, // وروستی - wroostéy + { ts: 1527815430, e: "only" }, // یوازنی - yawaazunéy +]; diff --git a/nouns-adjs/ey-unstressed-unisex.js b/nouns-adjs/ey-unstressed-unisex.js new file mode 100644 index 0000000..213c1b7 --- /dev/null +++ b/nouns-adjs/ey-unstressed-unisex.js @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1582853867682, e: "resident" }, // اوسېدونکی + { ts: 1527813469, e: "forgiving" }, // بخښونکی + { ts: 1527817829, e: "debtor" }, // پوروړی + { ts: 1527815205, e: "powerful" }, // پیاوړی + { ts: 1527815924, e: "customer" }, // پېرودونکی + { ts: 1527819604, e: "tense, stern" }, // ترینګلی + { ts: 1527813406, e: "bound, tied" }, // تړلی + { ts: 1527815381, e: "thirsty" }, // تږی + { ts: 1527817607, e: "disgraceful, shameful, dishonered" }, // تور مخی + { ts: 1527822859, e: "dishevelled, messy, curly (with hair etc.)" }, // څپولی + { ts: 1527811466, e: "researcher" }, // څېړونکی + { ts: 1527812377, e: "obedient, submissive" }, // حکم منونکی + { ts: 1527817299, e: "amazing, surprising" }, // حیرانوونکی + { ts: 1527813282, e: "seller" }, // خرڅوونکی + { ts: 1527812809, e: "malnourished" }, // خوار ځواکی + { ts: 1591871233587, e: "well-spoken" }, // خوږژبی + { ts: 1527814118, e: "painful, agonizing" }, // دردوونکی + { ts: 1527820657, e: "mediator, arbitrator" }, // درېیمګړی + { ts: 1527815713, e: "coming, future" }, // راتلونکی + { ts: 1527812142, e: "true, truthful" }, // رښتنی + { ts: 1527812161, e: "true, truthful" }, // رښتونی + { ts: 1527811507, e: "true, truthful" }, // رښتینی + { ts: 1527813758, e: "student" }, // زدکوونکی + { ts: 1577058349091, e: "interesting, pleasant" }, // زړه پوری + { ts: 1527817400, e: "merciful, compassionate" }, // زړه سواندی + { ts: 1527819587, e: "translator" }, // ژباړونکی + { ts: 1527814888, e: "savior, saviour, rescuer" }, // ژغورونکی + { ts: 1527818109, e: "pure, holy, magnificent" }, // سپېڅلی + { ts: 1527811338, e: "sincere hearted, trusting" }, // سپین زړی + { ts: 1527815306, e: "tired" }, // ستړی + { ts: 1527822745, e: "burned" }, // سټکوری + { ts: 1527817442, e: "heard-hearted" }, // سخت زړی + { ts: 1527816932, e: "soldier" }, // سرتېری + { ts: 1527820170, e: "singer" }, // سندرغاړی + { ts: 1527819964, e: "burning" }, // سوځېدونکی + { ts: 1527821951, e: "burned" }, // سوی + { ts: 1527812779, e: "beautiful" }, // ښکلی + { ts: 1527812806, e: "teacher" }, // ښوونکی + { ts: 1527811350, e: "quiet, silent" }, // غلی + { ts: 1527819637, e: "worker" }, // کارکوونکی + { ts: 1527818613, e: "weak" }, // کمزوری + { ts: 1595516629483, e: "deafening" }, // کڼوونکی + { ts: 1527820661, e: "mediator" }, // مېنځګړی + { ts: 1527814047, e: "aforesaid, above-mentioned" }, // نوموړی + { ts: 1527813822, e: "new" }, // نوی + { ts: 1586453720908, e: "encouraging" }, // هڅوونکی + { ts: 1588163180700, e: "stunning, amazing" }, // هېښوونکی + { ts: 1527823715, e: "small, little" }, // وړکوټی + { ts: 1527823714, e: "small, little" }, // وړکی + { ts: 1527815403, e: "little, small" }, // وړوکی + { ts: 1527813916, e: "lethal, deadly" }, // وژونکی + { ts: 1527815424, e: "hungry" }, // وږی + { ts: 1527823713, e: "small, little" }, // ووړکی + { ts: 1527816455, e: "separated, divided" }, // وېشلی +]; \ No newline at end of file diff --git a/nouns-adjs/non-inflecting.js b/nouns-adjs/non-inflecting.js new file mode 100644 index 0000000..435db84 --- /dev/null +++ b/nouns-adjs/non-inflecting.js @@ -0,0 +1,5 @@ +module.exports = [ + {"ts":1527812798,"i":5593,"p":"خفه","f":"khúfa","g":"khufa","e":"sad, upset, angry; choked, suffocated","c":"adj."}, + {"ts":1527812792,"i":5773,"p":"خوشاله","f":"khoshaala","g":"khoshaala","e":"happy, glad","c":"adj."}, + {"ts":1527812761,"i":8534,"p":"ښایسته","f":"xáaysta","g":"xaayusta","e":"beautiful","c":"adj."}, +]; \ No newline at end of file diff --git a/nouns-adjs/nouns-unisex.js b/nouns-adjs/nouns-unisex.js new file mode 100644 index 0000000..570f0f7 --- /dev/null +++ b/nouns-adjs/nouns-unisex.js @@ -0,0 +1,79 @@ +module.exports = [ + { ts: 1527821744, e: `cook, chef` }, // آشپز - aashpáz + { ts: 1527812156, e: `officer` }, // افسر - afsar + { ts: 1591872915426, e: `Afghan (person)` }, // افغانی - afghaanéy + { ts: 1527815137, e: `instigator, insurgent, terrorist` }, // اورپکی - orpakey + { ts: 1582853867682, e: `resident` }, // اوسېدونکی - osedóonkey + { ts: 1527812476, e: `child, offspring` }, // بچی - bachéy + { ts: 1623044005072, e: `insurrectionist, rebel` }, // بلواګر - balwaagar + { ts: 1612616237182, e: `Pakistani (person)` }, // پاکستانی - paakistaanéy + { ts: 1527817965, e: `keeper, one who brings up, raises (cattle etc.)` }, // پالونکی - paaloonkey + { ts: 1527815197, e: `Pashtun` }, // پښتون - puxtoon + { ts: 1527819228, e: `inspector, detective, person checking people at the doors etc.` }, // پلټونکی - pulaToonkey + { ts: 1527820130, e: `adherent, supporter; the outside or further ox in a team of oxes grinding or threshing` }, // پلوی - palawéy + { ts: 1527815924, e: `customer` }, // پېرودونکی - perodoonkey + { ts: 1527816431, e: `cousin (of paternal aunt)` }, // ترورزی - trorzéy + { ts: 1527820820, e: `follower` }, // تعقیبوونکی - ta'qeebawóonkey + { ts: 1586270915475, e: `mammal` }, // تي لرونکی - tee laroonkey + { ts: 1613563994424, e: `joker, jester, mocker` }, // ټوقمار - Toqmaar + { ts: 1610793723568, e: `ram, goat` }, // چېلی - cheléy + { ts: 1527811466, e: `researcher` }, // څېړونکی - tseRoonkey + { ts: 1527812795, e: `relative` }, // خپلوان - khpulwaan + { ts: 1527812802, e: `donkey` }, // خر - khur + { ts: 1527813282, e: `seller` }, // خرڅوونکی - khartsawóonkey + { ts: 1527819362, e: `calf (animal)` }, // خوسی - khooséy + { ts: 1527822535, e: `tailor` }, // خیاط - khayáat + { ts: 1590052667427, e: `witness` }, // درستی - drustéy, drastéy + { ts: 1622873938137, e: `crook, swindler, criminal` }, // درغلګر - darghalgar + { ts: 1527820656, e: `mediator, arbitrator` }, // دریمګړی - driyamgúRey + { ts: 1614081825855, e: `priest, monk/nun` }, // راهب - raahib + { ts: 1527813758, e: `student, learner, pupil` }, // زدکوونکی - zdakawóonkey + { ts: 1527819587, e: `translator` }, // ژباړونکی - jzbaaRoonkey + { ts: 1527815299, e: `dog` }, // سپی - spéy + { ts: 1610447830096, e: `calf; bull-calf` }, // سخی - skhey + { ts: 1527816932, e: `soldier` }, // سرتېری - sărtérey + { ts: 1527811519, e: `embassador, ambassador` }, // سفیر - safeer + { ts: 1622366208373, e: `secretary` }, // سکرتر - sakratár + { ts: 1527820170, e: `singer` }, // سندرغاړی - sandurgháaRey + { ts: 1566468540788, e: `rabbit` }, // سوی - sooy + { ts: 1527819801, e: `tourist, sightseer, visitor` }, // سیلانی - seylaanéy + { ts: 1575924767041, e: `shepherd` }, // شپون - shpoon + { ts: 1527815279, e: `shepherd` }, // شپونکی - shpoonkey + { ts: 1527819173, e: `analyst, examiner` }, // شنونکی - shanóonkey + { ts: 1527812806, e: `teacher` }, // ښووونکی - xowóonkey + { ts: 1527815436, e: `tyrant, oppressor, cruel person` }, // ظالم - zaalim + { ts: 1527818632, e: `twin` }, // غبرګونی - ghbargoney + { ts: 1527812624, e: `thief` }, // غل - ghul + { ts: 1613561408232, e: `guilty, at fault` }, // قصوروار - qUsoorwáar + { ts: 1527814715, e: `user` }, // کاروونکی - kaarawoonkey + { ts: 1527816256, e: `great-grandson` }, // کړوسی - kaRwaséy + { ts: 1594906790729, e: `child` }, // ککی - kakéy + { ts: 1527819244, e: `host, hostess; master of house` }, // کوربه - korba + { ts: 1527812174, e: `neighbour` }, // ګاونډی - gaawanDéy + { ts: 1579030083953, e: `sinner, sinful` }, // ګناه ګار - gUnaahgáar + { ts: 1527816249, e: `grandchild` }, // لمسی - lmaséy + { ts: 1527822661, e: `athlete, player; actor; mischevious, playful (of a child)` }, // لوبغاړی - lobgháaRey + { ts: 1589885143650, e: `fox` }, // لومبړ - loombáR + { ts: 1527812043, e: `writer, author` }, // لیکوال - leekwaal + { ts: 1527820680, e: `crazy, insane, mad person` }, // لېونی - lewanéy + { ts: 1527812881, e: `child, kid` }, // ماشوم - maashoom + { ts: 1527814445, e: `assigned, appointed, given orders or istructions (Arabic), authorized, sent on business; officer (as in government worker)` }, // مامور - maamóor + { ts: 1527818760, e: `civil activist` }, // مدني فاعل - madanee faa'al + { ts: 1527821523, e: `slave, servant` }, // مریی - mrayéy + { ts: 1527814159, e: `friend, companion` }, // ملګری - malgúrey + { ts: 1527820661, e: `mediator, go-between, arbitrator` }, // مېنځګړی - mendzgúRey + { ts: 1527823403, e: `fan, someone who loves or appreciates someone or something` }, // مینه وال - meenawáal + { ts: 1527815127, e: `nurse` }, // نرس - nurs + { ts: 1527816254, e: `grandson` }, // نوسی - nwaséy + { ts: 1527814806, e: `peer, someone of the same age` }, // همځولی - hamdzoléy ?? + { ts: 1527812684, e: `co-worker, fellow worker, collaborator, aid` }, // همکار - hamkaar + { ts: 1527811732, e: `artist, performer` }, // هنر مند - hUnarmand + { ts: 1527821373, e: `deer` }, // هوسی - hoséy + { ts: 1591027046896, e: `goat` }, // وز - wuz + { ts: 1611395180139, e: `fellow countryman, person from the same country` }, // وطندار - watandáar + { ts: 1527811296, e: `lawyer, proxy holder` }, // وکیل - wakeel + { ts: 1527813585, e: `person, human being, creature` }, // وګړی - wagúRey + { ts: 1527814672, e: `spokesperson, spokesman, newcaster` }, // ویاند - wayaand + { ts: 1586454081484, e: `orphan` }, // یتیم - yateem + { ts: 1527812461, e: "hero" }, // اتل - atal +]; \ No newline at end of file diff --git a/nouns-adjs/o-fem.js b/nouns-adjs/o-fem.js new file mode 100644 index 0000000..f631948 --- /dev/null +++ b/nouns-adjs/o-fem.js @@ -0,0 +1,3 @@ +module.exports = [ + { ts: 1527816016, e: "Pashto" }, // پښټو +] \ No newline at end of file diff --git a/nouns-adjs/short-irreg-unisex.js b/nouns-adjs/short-irreg-unisex.js new file mode 100644 index 0000000..84be176 --- /dev/null +++ b/nouns-adjs/short-irreg-unisex.js @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527816778, e: "long" }, // اوږد - ooGd, ooGud + { ts: 1527822706, e: "raw, unripe, immature" }, // اوم - oom + { ts: 1527812802, e: "donkey" }, // خر - khur + { ts: 1527813293, e: "red, hot" }, // سور - soor + { ts: 1527815265, e: "green, blue" }, // شین - sheen + { ts: 1527812624, e: "thief" }, // غل - ghul + { ts: 1527815087, e: "dead" }, // مړ - muR + { ts: 1527814151, e: "companion, friend" }, // مل - mal + { ts: 1527813580, e: "one" }, // یو - yo +]; \ No newline at end of file diff --git a/nouns-adjs/u-masc.js b/nouns-adjs/u-masc.js new file mode 100644 index 0000000..9e785ab --- /dev/null +++ b/nouns-adjs/u-masc.js @@ -0,0 +1,23 @@ +module.exports = [ + { ts: 1527819345, e: `sheep, ram` }, // پسه - psu + { ts: 1527822173, e: `bush, shrub` }, // جاړه - jaaRú + { ts: 1527813508, e: `heart` }, // زړه - zRu + { ts: 1588857967561, e: `bull` }, // غوایه - ghwaayú + { ts: 1527817108, e: `look, gaze, examination, inspection, spying` }, // کاته - kaatu + { ts: 1527817768, e: `raven, crow` }, // کارګه - kaargu + { ts: 1527819245, e: `master of house, head of family, married man` }, // کوربانه - korbaanú + { ts: 1527818516, e: `swimming, bathing` }, // لمبېده - lambedú + { ts: 1527813986, e: `sunset, west` }, // لمر پرېواته - lmarprewaatu + { ts: 1527813992, e: `sunset` }, // لمر لوېده - lmarlwedu + { ts: 1527813987, e: `sunrise, east` }, // لمرخاته - lmarkhaatu + { ts: 1527818255, e: `wolf, wild dog` }, // لېوه - lewú + { ts: 1527821522, e: `slave, servant` }, // مریه - mrayú + { ts: 1527812911, e: `husband, brave` }, // مېړه - meRu + { ts: 1527811626, e: `impracticability, impossibility, improbability` }, // نکېده - nukedu + { ts: 1527816410, e: `grandfather, grandpa` }, // نیکه - neekú + { ts: 1527822420, e: `rein, bridle (for horses); string for trousers, string used inside to hold up the partoog/shalwar` }, // واګه - waagu + { ts: 1527816357, e: `nephew, brother's son` }, // وراره - wraaru + { ts: 1527823225, e: `flock, herd, drove` }, // وله - wUlú + { ts: 1527814789, e: `hair` }, // وېښته - wextu + { ts: 1527815394, e: 'wedding' }, // واده - waadú +]; \ No newline at end of file diff --git a/nouns-adjs/uy-fem.js b/nouns-adjs/uy-fem.js new file mode 100644 index 0000000..03f0aa5 --- /dev/null +++ b/nouns-adjs/uy-fem.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +module.exports = [ + { ts: 1527818017, e: "store, shop" }, // اټۍ - aTuy + { ts: 1527812694, e: "girl" }, // انجنۍ - injUnuy + { ts: 1527815140, e: "week" }, // اونۍ - onuy, ownuy, owunuy + { ts: 1566476931206, e: "lamp, light" }, // بتۍ - batúy + { ts: 1527822192, e: "stove, oven, furnace" }, // بټۍ - baTúy + { ts: 1527820828, e: "daughter, girl" }, // بچۍ - bachúy + { ts: 1527822974, e: "cart, buggy, stroller" }, // بګۍ - bagúy + { ts: 1591805634565, e: "rib" }, // پوښتۍ - pooxtúy + { ts: 1586276322639, e: "hat, cap" }, // ټوپۍ - Topuy + { ts: 1527820058, e: "kneecap, patella" }, // ټوټکۍ - ToTakúy + { ts: 1527812564, e: "bread, food, meal" }, // ډوډۍ - DoDuy + { ts: 1527821555, e: "edge, verge, side" }, // ژۍ - jzuy + { ts: 1527814788, e: "moon" }, // سپوږمۍ - spoGmuy + { ts: 1527820120, e: "hill, hillrock, mound" }, // غونډۍ - ghwunDúy + { ts: 1527814203, e: "chair, seat, stool" }, // کرسۍ - kUrsuy + { ts: 1527812045, e: "window" }, // کړکۍ - kuRkúy + { ts: 1527816026, e: "ring, curl; handcuffs, link, chain; loom; department, section" }, // کړۍ - kaRuy + { ts: 1527813870, e: "boat, ship" }, // کشتۍ - kishtúy + { ts: 1527821895, e: "doll" }, // ګوډۍ - gooDúy + { ts: 1527814564, e: "pill tablet; bullet" }, // ګولۍ - golúy + { ts: 1527811763, e: "tail" }, // لکۍ - lakuy + { ts: 1527812659, e: "egg" }, // هګۍ - haguy + { ts: 1527821372, e: "gazelle, antelope" }, // هوسۍ - hosúy +]; \ No newline at end of file diff --git a/nouns-adjs/y-masc.js b/nouns-adjs/y-masc.js new file mode 100644 index 0000000..2cb4b7c --- /dev/null +++ b/nouns-adjs/y-masc.js @@ -0,0 +1,14 @@ +module.exports = [ + { ts: 1527815154, e: `end, finish, close, conclusion` }, // پای - paay +{ ts: 1527812594, e: `place, space` }, // ځای - dzaay +{ ts: 1527812525, e: `tea` }, // چای - chaay +{ ts: 1527812783, e: `God, Lord` }, // خدای - khUdaay +{ ts: 1527819514, e: `tier, row, foundation (masonry etc.)` }, // دای - daay +{ ts: 1610797797756, e: `hollow, depression` }, // سای - saay +{ ts: 1527822345, e: `caravansary, inn, large house` }, // سرای - saráay + + +{ ts: 1586598425514, e: `smell` }, // بوی - booy +{ ts: 1527814511, e: `character, nature, disposition, habit` }, // خوی - khooy +{ ts: 1566468540788, e: `rabbit` }, // سوی - sooy +] \ No newline at end of file diff --git a/package.json b/package.json index 3082364..a3c2ffb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lingdocs/pashto-inflector", - "version": "1.7.0", + "version": "1.8.0", "author": "lingdocs.com", "description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations", "homepage": "https://verbs.lingdocs.com", @@ -25,7 +25,8 @@ "dependencies": { "classnames": "^2.2.6", "pbf": "^3.2.1", - "rambda": "^6.7.0" + "rambda": "^6.7.0", + "react-select": "^5.2.2" }, "devDependencies": { "@fortawesome/fontawesome-free": "^5.15.2", @@ -64,10 +65,10 @@ "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "build-website": "node get-verbs.js && npm run build", - "build-library": "node get-verbs.js && rimraf dist && rimraf dist-cjs && tsc --project library-tsconfig.json && node library-post-build.js && rollup -c", + "build-website": "node get-words.js && npm run build", + "build-library": "node get-words.js && rimraf dist && rimraf dist-cjs && tsc --project library-tsconfig.json && node library-post-build.js && rollup -c", "test-ci": "npm run test -- --watchAll=false", - "get-verbs": "node get-verbs.js" + "get-words": "node get-words.js" }, "eslintConfig": { "extends": [ diff --git a/src/App.css b/src/App.css index 72801e4..d3f9d76 100644 --- a/src/App.css +++ b/src/App.css @@ -5,6 +5,11 @@ * LICENSE file in the root directory of this source tree. * */ + +* { + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} :root { --secondary: #00c1fc; diff --git a/src/App.tsx b/src/App.tsx index 08ad122..3646c66 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,8 +7,8 @@ */ import { useEffect, useState } from "react"; -import ConjugationViewer from "./components/ConjugationViewer"; import verbs from "./verbs"; +import nounsAdjs from "./nouns-adjs"; import Pashto from "./components/Pashto"; import Phonetics from "./components/Phonetics"; import { getVerbInfo } from "./lib/verb-info"; @@ -23,7 +23,9 @@ import { Modal } from "react-bootstrap"; import * as T from "./types"; +import { isNounEntry } from "./lib/type-predicates"; import defualtTextOptions from "./lib/default-text-options"; +import PhraseBuilder from "./components/vp-explorer/VPExplorer"; const textOptionsLocalStorageName = "textOptions2"; type VerbType = "simple" | "stative compound" | "dynamic compound"; const verbTypes: VerbType[] = [ @@ -31,6 +33,7 @@ const verbTypes: VerbType[] = [ "stative compound", "dynamic compound", ]; +const nouns = nounsAdjs.filter(isNounEntry); const transitivities: T.Transitivity[] = [ "transitive", @@ -192,7 +195,7 @@ function App() {

Each form is made from one simple formula which works for all verbs. 👨‍🔬

-

Choose a verb 👇, look at its roots and stems 🌳, see how all the forms are made and what they mean. 🤓

+

Choose a verb 👇, look at its roots and stems 🌳, see how all the forms are made. 🤓

@@ -288,11 +291,14 @@ function App() {
- {v?.verb.entry && } + {v?.verb.entry &&
+ +
} setShowingTextOptions(false)}> diff --git a/src/components/EntrySelect.tsx b/src/components/EntrySelect.tsx new file mode 100644 index 0000000..7909c66 --- /dev/null +++ b/src/components/EntrySelect.tsx @@ -0,0 +1,90 @@ +import * as T from "../types"; +import Select from "react-select"; +import AsyncSelect from "react-select/async"; +import { + makeSelectOption, + makeVerbSelectOption, + zIndexProps, +} from "./np-picker/picker-tools"; + +function EntrySelect(props: ({ + entries: E[] +} | { + searchF: (search: string) => E[], + getByTs: (ts: number) => E | undefined, +}) & { + value: E | undefined, + onChange: (value: E | undefined) => void, + name: string | undefined, + isVerbSelect?: boolean, + opts: T.TextOptions, +}) { + function makeOption(e: E | T.DictionaryEntry) { + if ("entry" in e) { + return (props.isVerbSelect ? makeVerbSelectOption : makeSelectOption)(e, props.opts); + } + return makeSelectOption(e, props.opts); + } + const value = props.value ? makeOption(props.value) : undefined; + if ("searchF" in props) { + const options = (searchString: string) => + new Promise<{ value: string, label: string | JSX.Element }[]>(resolve => { + resolve(props.searchF(searchString).map(makeOption)); + }); + const onChange = (v: { label: string | JSX.Element, value: string } | null) => { + if (!v) { + props.onChange(undefined); + return; + } + const s = props.getByTs(parseInt(v.value)); + if (!s) return; + props.onChange(s); + } + return
+ +
; + } + const options = props.entries + .sort((a, b) => { + if ("entry" in a) { + return a.entry.p.localeCompare("p" in b ? b.p : b.entry.p, "af-PS") + } + return a.p.localeCompare("p" in b ? b.p : b.entry.p, "af-PS"); + }) + .map(makeOption); + const onChange = (v: { label: string | JSX.Element, value: string } | null) => { + if (!v) { + props.onChange(undefined); + return; + } + const s = props.entries.find(e => ( + ("entry" in e) + ? e.entry.ts.toString() === v.value + : e.ts.toString() === v.value + )); + if (!s) return; + props.onChange(s); + } + return
+ o.value === verb.tense))} + onChange={onTenseSelect} + className="mb-2" + options={tOptions} + {...zIndexProps} + /> + {verb &&
+
+ +
+ {mode !== "charts" && } +
+ +
+
} +
+ ; +} + +export default TensePicker; \ No newline at end of file diff --git a/src/components/vp-explorer/VPDisplay.tsx b/src/components/vp-explorer/VPDisplay.tsx new file mode 100644 index 0000000..85d2954 --- /dev/null +++ b/src/components/vp-explorer/VPDisplay.tsx @@ -0,0 +1,71 @@ +import { useState } from "react"; +import { renderVP, compileVP } from "../../lib/phrase-building/index"; +import * as T from "../../types"; +import InlinePs from "../InlinePs"; +import AbbreviationFormSelector from "./AbbreviationFormSelector"; +import { isPastTense } from "../../lib/phrase-building/vp-tools"; + +function VPDisplay({ VP, opts }: { VP: T.VPSelection, opts: T.TextOptions }) { + const [form, setForm] = useState({ removeKing: false, shrinkServant: false }); + const [OSV, setOSV] = useState(false); + const result = compileVP(renderVP(VP), { ...form, OSV }); + return
+ {VP.verb.transitivity === "transitive" &&
+ setOSV(e.target.checked)} + /> + +
} + + {"long" in result.ps ? +
+ {/*
Long Verb:
*/} + + {/*
Short Verb:
*/} + + {result.ps.mini && <> + {/*
Mini Verb:
*/} + + } +
+ : + } + {result.e &&
+ {result.e.map((e, i) =>
{e}
)} +
} +
+} + +function whatsAdjustable(VP: T.VPSelection): "both" | "king" | "servant" { + // TODO: intransitive dynamic compounds? + return (VP.verb.isCompound === "dynamic" && VP.verb.transitivity === "transitive") + ? (isPastTense(VP.verb.tense) ? "servant" : "king") + : VP.verb.transitivity === "transitive" + ? "both" + : VP.verb.transitivity === "intransitive" + ? "king" + // grammTrans + : isPastTense(VP.verb.tense) + ? "servant" + : "king"; +} + +function VariationLayer({ vs, opts }: { vs: T.PsString[], opts: T.TextOptions }) { + return
+ {vs.map((r, i) =>
+ {r} +
)} +
; +} + +export default VPDisplay; \ No newline at end of file diff --git a/src/components/vp-explorer/VPExplorer.tsx b/src/components/vp-explorer/VPExplorer.tsx new file mode 100644 index 0000000..5555144 --- /dev/null +++ b/src/components/vp-explorer/VPExplorer.tsx @@ -0,0 +1,214 @@ +import NPPicker from "../np-picker/NPPicker"; +import VerbPicker from "./VerbPicker"; +import TensePicker from "./TensePicker"; +import VPDisplay from "./VPDisplay"; +import ButtonSelect from "../ButtonSelect"; +import { renderVP } from "../../lib/phrase-building/index"; +import { + isInvalidSubjObjCombo, +} from "../../lib/phrase-building/vp-tools"; +import * as T from "../../types"; +import ChartDisplay from "./ChartDisplay"; +import useStickyState from "../../lib/useStickyState"; +import { makeVerbSelection } from "./verb-selection"; +import { useEffect } from "react"; + +const kingEmoji = "👑"; +const servantEmoji = "🙇‍♂️"; + +// TODO: Drill Down text display options + +// TODO: SHOW KING AND SERVANT ONCE TENSE PICKED, EVEN IF NPs not selected +// TODO: Issue with dynamic compounds english making with plurals +// TODO: Issue with "the money were taken" +// TODO: Use the same component for PronounPicker and NPPronounPicker (sizing issue) +// get the practice pronoun picker page into a typesafe file +// A little button you can press on the tense select to show the formula and info about the tense +// in a popup +// TODO: option to show 3 modes Phrases - Charts - Quiz + +// TODO: error handling on error with rendering etc +export function VPExplorer(props: { + verb?: T.VerbEntry, + opts: T.TextOptions, +} & ({ + nouns: T.NounEntry[], + verbs: T.VerbEntry[], +} | { + nouns: (s: string) => T.NounEntry[], + verbs: (s: string) => T.VerbEntry[], + getNounByTs: (ts: number) => T.NounEntry | undefined, + getVerbByTs: (ts: number) => T.VerbEntry | undefined, +})) { + const [subject, setSubject] = useStickyState(undefined, "subjectNPSelection"); + const [mode, setMode] = useStickyState<"charts" | "phrases">("phrases", "verbExplorerMode"); + const passedVerb = props.verb; + const [verb, setVerb] = useStickyState( + passedVerb + ? (old) => makeVerbSelection(passedVerb, setSubject, old) + : undefined, + "verbExplorerVerb", + ); + useEffect(() => { + if (!passedVerb) { + setVerb(undefined); + } else { + setVerb(o => makeVerbSelection(passedVerb, setSubject, o)); + } + // eslint-disable-next-line + }, [passedVerb]); + function handleSubjectChange(subject: T.NPSelection | undefined, skipPronounConflictCheck?: boolean) { + if (!skipPronounConflictCheck && hasPronounConflict(subject, verb?.object)) { + alert("That combination of pronouns is not allowed"); + return; + } + setSubject(subject); + } + function handleObjectChange(object: T.NPSelection | undefined) { + if (!verb) return; + if ((verb.object === "none") || (typeof verb.object === "number")) return; + // check for pronoun conflict + if (hasPronounConflict(subject, object)) { + alert("That combination of pronouns is not allowed"); + return; + } + setVerb({ ...verb, object }); + } + function handleSubjObjSwap() { + if (verb?.isCompound === "dynamic") return; + const output = switchSubjObj({ subject, verb }); + setSubject(output.subject); + setVerb(output.verb); + } + const verbPhrase: T.VPSelection | undefined = verbPhraseComplete({ subject, verb }); + const VPRendered = verbPhrase && renderVP(verbPhrase); + return
+ handleSubjectChange(s, true)} + onChange={setVerb} + opts={props.opts} + /> +
+ +
+ {(verb && (typeof verb.object === "object") && (verb.isCompound !== "dynamic") && (mode !== "charts")) && +
+ +
} +
+ {mode !== "charts" && <> +
+
Subject {showRole(VPRendered, "subject")}
+ +
+ {verb && (verb.object !== "none") &&
+
Object {showRole(VPRendered, "object")}
+ {(typeof verb.object === "number") + ?
Unspoken 3rd Pers. Masc. Plur.
+ : } +
} + } +
+ +
+
+ {(verbPhrase && (mode === "phrases")) && + + } + {(verb && (mode === "charts")) && } +
+} + +export default VPExplorer; + +function hasPronounConflict(subject: T.NPSelection | undefined, object: undefined | T.VerbObject): boolean { + const subjPronoun = (subject && subject.type === "pronoun") ? subject : undefined; + const objPronoun = (object && typeof object === "object" && object.type === "pronoun") ? object : undefined; + if (!subjPronoun || !objPronoun) return false; + return isInvalidSubjObjCombo(subjPronoun.person, objPronoun.person); +} + +function verbPhraseComplete({ subject, verb }: { subject: T.NPSelection | undefined, verb: T.VerbSelection | undefined }): T.VPSelection | undefined { + if (!subject) return undefined; + if (!verb) return undefined; + if (verb.object === undefined) return undefined; + return { + type: "VPSelection", + subject, + object: verb.object, + verb, + }; +} + +function showRole(VP: T.VPRendered | undefined, member: "subject" | "object") { + return VP + ? + {(VP.king === member ? kingEmoji : VP.servant === member ? servantEmoji : "")} + + : ""; +} + +type SOClump = { subject: T.NPSelection | undefined, verb: T.VerbSelection | undefined }; +function switchSubjObj({ subject, verb }: SOClump): SOClump { + if (!subject|| !verb || !verb.object || !(typeof verb.object === "object")) { + return { subject, verb }; + } + return { + subject: verb.object, + verb: { + ...verb, + object: subject, + } + }; +} \ No newline at end of file diff --git a/src/components/vp-explorer/VerbPicker.tsx b/src/components/vp-explorer/VerbPicker.tsx new file mode 100644 index 0000000..7efe787 --- /dev/null +++ b/src/components/vp-explorer/VerbPicker.tsx @@ -0,0 +1,154 @@ +import * as T from "../../types"; +import ButtonSelect from "../ButtonSelect"; +import { RootsAndStems } from "../verb-info/VerbInfo"; +import { getVerbInfo } from "../../lib/verb-info"; +import Hider from "../Hider"; +import { makeVerbSelection } from "./verb-selection"; +import EntrySelect from "../EntrySelect"; +import useStickyState from "../../lib/useStickyState"; + + +// TODO: dark on past tense selecitons + +function VerbPicker(props: ({ + verbs: T.VerbEntry[], +} | { + verbs: (s: string) => T.VerbEntry[], + getVerbByTs: (ts: number) => T.VerbEntry | undefined; +}) & { + verb: T.VerbSelection | undefined, + subject: T.NPSelection | undefined, + onChange: (p: T.VerbSelection | undefined) => void, + changeSubject: (p: T.NPSelection | undefined) => void, + opts: T.TextOptions, + verbLocked: boolean, +}) { + const [showRootsAndStems, setShowRootsAndStems] = useStickyState(false, "showRootsAndStems"); + const infoRaw = props.verb ? getVerbInfo(props.verb.verb.entry, props.verb.verb.complement) : undefined; + const info = (!infoRaw || !props.verb) + ? undefined + : ("stative" in infoRaw) + ? infoRaw[props.verb.isCompound === "stative" ? "stative" : "dynamic"] + : ("transitive" in infoRaw) + ? infoRaw[props.verb.transitivity === "grammatically transitive" ? "grammaticallyTransitive" : "transitive"] + : infoRaw; + if (info && ("stative" in info || "transitive" in info)) { + return
ERROR: Verb version should be select first
; + } + // const [filters, useFilters] = useState({ + // stative: true, + // dynamic: true, + // transitive: true, + // intransitive: true, + // grammaticallyTransitive: true, + // }); + function onVerbSelect(v: T.VerbEntry | undefined) { + // TODO: what to do when clearing + if (!v) { + return props.onChange(v); + } + props.onChange(makeVerbSelection(v, props.changeSubject, props.verb)); + } + function onVoiceSelect(value: "active" | "passive") { + if (props.verb && props.verb.changeVoice) { + if (value === "passive" && (typeof props.verb.object === "object")) { + props.changeSubject(props.verb.object); + } + if (value === "active") { + props.changeSubject(undefined); + } + props.onChange(props.verb.changeVoice(value, value === "active" ? props.subject : undefined)); + } + } + function notInstransitive(t: "transitive" | "intransitive" | "grammatically transitive"): "transitive" | "grammatically transitive" { + return t === "intransitive" ? "transitive" : t; + } + function handleChangeTransitivity(t: "transitive" | "grammatically transitive") { + if (props.verb && props.verb.changeTransitivity) { + props.onChange(props.verb.changeTransitivity(t)); + } + } + function handleChangeStatDyn(c: "stative" | "dynamic") { + if (props.verb && props.verb.changeStatDyn) { + props.onChange(props.verb.changeStatDyn(c)); + } + } + return
+ {!props.verbLocked &&
+
Verb:
+ +
} + {info &&
+ setShowRootsAndStems(p => !p)} + hLevel={5} + > + + +
} +
+ {props.verb && props.verb.changeTransitivity &&
+ +
} + {props.verb && props.verb.changeVoice &&
+ +
} + {props.verb && props.verb.changeStatDyn &&
+ +
} +
+
; +} + + +export default VerbPicker; \ No newline at end of file diff --git a/src/components/vp-explorer/verb-selection.ts b/src/components/vp-explorer/verb-selection.ts new file mode 100644 index 0000000..f94a106 --- /dev/null +++ b/src/components/vp-explorer/verb-selection.ts @@ -0,0 +1,106 @@ +import { + makeNounSelection, +} from "../np-picker/picker-tools"; +import * as T from "../../types"; +import { getVerbInfo } from "../../lib/verb-info"; +import { isPerfectTense } from "../../lib/phrase-building/vp-tools"; + +export function makeVerbSelection(verb: T.VerbEntry, changeSubject: (s: T.NPSelection | undefined) => void, oldVerbSelection?: T.VerbSelection): T.VerbSelection { + const info = getVerbInfo(verb.entry, verb.complement); + function getTransObjFromOldVerbSelection() { + if ( + !oldVerbSelection || + oldVerbSelection.object === "none" || + typeof oldVerbSelection.object === "number" || + oldVerbSelection.isCompound === "dynamic" || + (oldVerbSelection.object?.type === "noun" && oldVerbSelection.object.dynamicComplement) + ) return undefined; + return oldVerbSelection.object; + } + const transitivity: T.Transitivity = "grammaticallyTransitive" in info + ? "transitive" + : info.transitivity; + const object = (transitivity === "grammatically transitive") + ? T.Person.ThirdPlurMale + : (info.type === "dynamic compound" && oldVerbSelection?.voice !== "passive") + ? makeNounSelection(info.objComplement.entry as T.NounEntry, true) + : (transitivity === "transitive" && oldVerbSelection?.voice !== "passive") + ? getTransObjFromOldVerbSelection() + : "none"; + if (oldVerbSelection?.voice === "passive" && info.type === "dynamic compound") { + changeSubject(makeNounSelection(info.objComplement.entry as T.NounEntry, true)); + } + const isCompound = ("stative" in info || info.type === "stative compound") + ? "stative" + : info.type === "dynamic compound" + ? "dynamic" + : false; + // TODO: here and below in the changeStatDyn function ... allow for entries with complement + const dynAuxVerb: T.VerbEntry | undefined = isCompound !== "dynamic" + ? undefined + : info.type === "dynamic compound" + ? { entry: info.auxVerb } as T.VerbEntry + : "dynamic" in info + ? { entry: info.dynamic.auxVerb } as T.VerbEntry + : undefined; + const tenseSelection = ((): { tenseCategory: "perfect", tense: T.PerfectTense } | { + tenseCategory: "basic" | "modal", + tense: T.VerbTense, + } => { + if (!oldVerbSelection) { + return { tense: "presentVerb", tenseCategory: "basic" }; + } + if (oldVerbSelection.tenseCategory === "modal") { + return { tenseCategory: "modal", tense: isPerfectTense(oldVerbSelection.tense) ? "presentVerb" : oldVerbSelection.tense }; + } + if (oldVerbSelection.tenseCategory === "basic") { + return { tenseCategory: "basic", tense: isPerfectTense(oldVerbSelection.tense) ? "presentVerb" : oldVerbSelection.tense }; + } + return { tenseCategory: "perfect", tense: isPerfectTense(oldVerbSelection.tense) ? oldVerbSelection.tense : "present perfect" }; + })(); + return { + type: "verb", + verb: verb, + dynAuxVerb, + ...tenseSelection, + object, + transitivity, + isCompound, + voice: transitivity === "transitive" + ? (oldVerbSelection?.voice || "active") + : "active", + negative: oldVerbSelection ? oldVerbSelection.negative : false, + ...("grammaticallyTransitive" in info) ? { + changeTransitivity: function(t) { + return { + ...this, + transitivity: t, + object: t === "grammatically transitive" ? T.Person.ThirdPlurMale : undefined, + }; + }, + } : {}, + ...("stative" in info) ? { + changeStatDyn: function(c) { + return { + ...this, + isCompound: c, + object: c === "dynamic" + ? makeNounSelection(info.dynamic.objComplement.entry as T.NounEntry, true) + : undefined, + dynAuxVerb: c === "dynamic" + ? { entry: info.dynamic.auxVerb } as T.VerbEntry + : undefined, + }; + } + } : {}, + ...(transitivity === "transitive") ? { + changeVoice: function(v, s) { + return { + ...this, + voice: v, + object: v === "active" ? s : "none", + }; + }, + } : {}, + }; +} diff --git a/src/lib/accent-and-ps-utils.test.ts b/src/lib/accent-and-ps-utils.test.ts new file mode 100644 index 0000000..589816a --- /dev/null +++ b/src/lib/accent-and-ps-utils.test.ts @@ -0,0 +1,12 @@ +import { removeFVarients, makePsString } from "./accent-and-ps-utils"; + +test(`removeFVarients`, () => { + expect(removeFVarients("ist'imaal, istimaal")).toBe("ist'imaal"); + expect(removeFVarients({ p: "معالوم", f: "ma'aalóom, maalóom" })) + .toEqual({ p: "معالوم", f: "ma'aalóom" }); + expect(removeFVarients("kor")).toBe("kor"); +}); + +test(`makePsString should work`, () => { + expect(makePsString("کور", "kor")).toEqual({ p: "کور", f: "kor" }); +}); diff --git a/src/lib/accent-and-ps-utils.ts b/src/lib/accent-and-ps-utils.ts new file mode 100644 index 0000000..7c01ad7 --- /dev/null +++ b/src/lib/accent-and-ps-utils.ts @@ -0,0 +1,30 @@ +import * as T from "../types"; + +/** + * Creates a Pashto string structure + * + * @param p - the Pashto text + * @param f - the phonetics text + */ +export function makePsString(p: string, f: string): T.PsString { + return { p, f }; +} + +export function removeFVarients(x: T.DictionaryEntry): T.DictionaryEntryNoFVars; +export function removeFVarients(x: T.PsString): T.PsStringNoFVars; +export function removeFVarients(x: string): T.FStringNoFVars; +export function removeFVarients(x: string | T.PsString | T.DictionaryEntry): T.FStringNoFVars | T.PsStringNoFVars | T.DictionaryEntryNoFVars { + if (typeof x === "string") { + return x.split(",")[0] as T.FStringNoFVars; + } + if ("ts" in x) { + return { + ...x, + f: removeFVarients(x.f), + } as unknown as T.DictionaryEntryNoFVars; + } + return { + ...x, + f: removeFVarients(x.f), + } as unknown as T.PsStringNoFVars; +} diff --git a/src/lib/accent-helpers.test.ts b/src/lib/accent-helpers.test.ts index 2f3eebe..aca96b0 100644 --- a/src/lib/accent-helpers.test.ts +++ b/src/lib/accent-helpers.test.ts @@ -6,7 +6,7 @@ * */ -import { makePsString } from "./p-text-helpers"; +import { makePsString } from "./accent-and-ps-utils"; import { accentOnFront, accentPastParticiple, diff --git a/src/lib/accent-helpers.ts b/src/lib/accent-helpers.ts index 29f067e..8a04e35 100644 --- a/src/lib/accent-helpers.ts +++ b/src/lib/accent-helpers.ts @@ -6,8 +6,8 @@ * */ -import { makePsString, removeFVarients } from "./p-text-helpers"; import * as T from "../types"; +import { makePsString, removeFVarients } from "./accent-and-ps-utils"; /** * Returns a Pashto string (or string with Length options) ensuring that diff --git a/src/lib/diacritics.ts b/src/lib/diacritics.ts index 001712a..42707b5 100644 --- a/src/lib/diacritics.ts +++ b/src/lib/diacritics.ts @@ -29,7 +29,7 @@ import { PhonemeStatus, } from "./diacritics-helpers"; -import { removeFVarients } from "./p-text-helpers"; +import { removeFVarients } from "./accent-and-ps-utils"; import { pipe } from "rambda"; /** diff --git a/src/lib/misc-helpers.ts b/src/lib/misc-helpers.ts index 86c1057..2c539cf 100644 --- a/src/lib/misc-helpers.ts +++ b/src/lib/misc-helpers.ts @@ -152,6 +152,7 @@ export function randomNumber(minInclusive: number, maxExclusive: number): number return Math.floor(Math.random() * (maxExclusive - minInclusive) + minInclusive); } +// TODO: deprecate this because we have it in np-tools? /** * Sees if a possiblePerson (for subject/object) is possible, given the other person * @@ -173,6 +174,7 @@ export function personIsAllowed(possiblePerson: T.Person, existingPerson?: T.Per return true; } +// TODO: deprecate this because we have it in np-tools? /** * Picks a random person while assuring that the other person is not in conflict * diff --git a/src/lib/np-tools.ts b/src/lib/np-tools.ts new file mode 100644 index 0000000..075226f --- /dev/null +++ b/src/lib/np-tools.ts @@ -0,0 +1,91 @@ +import * as T from "../types"; +import { parseEc } from "../lib/misc-helpers"; + +function getRandPers(): T.Person { + return Math.floor(Math.random() * 12); +} + +export function randomPerson(a?: { prev?: T.Person, counterPart?: T.VerbObject | T.NPSelection }) { + // no restrictions, just get any person + if (!a) { + return getRandPers(); + } + if (a.counterPart !== undefined && typeof a.counterPart === "object" && a.counterPart.type === "pronoun") { + // with counterpart pronoun + let newP = 0; + do { + newP = getRandPers(); + } while ( + isInvalidSubjObjCombo(a.counterPart.person, newP) + || + (newP === a.prev) + ); + return newP; + } + // without counterpart pronoun, just previous + let newP = 0; + do { + newP = getRandPers(); + } while (newP === a.prev); + return newP; +} + +export function isInvalidSubjObjCombo(subj: T.Person, obj: T.Person): boolean { + const firstPeople = [ + T.Person.FirstSingMale, + T.Person.FirstSingFemale, + T.Person.FirstPlurMale, + T.Person.FirstPlurFemale, + ]; + const secondPeople = [ + T.Person.SecondSingMale, + T.Person.SecondSingFemale, + T.Person.SecondPlurMale, + T.Person.SecondPlurFemale, + ]; + return ( + (firstPeople.includes(subj) && firstPeople.includes(obj)) + || + (secondPeople.includes(subj) && secondPeople.includes(obj)) + ); +} + +export function randomSubjObj(old?: { subj: T.Person, obj: T.Person }): { subj: T.Person, obj: T.Person } { + let subj = 0; + let obj = 0; + do { + subj = getRandPers(); + obj = getRandPers(); + } while ( + (old && ((old.subj === subj) || (old.obj === obj))) + || + isInvalidSubjObjCombo(subj, obj) + ); + return { subj, obj }; +} +export function getEnglishVerb(entry: T.DictionaryEntry): string { + if (!entry.ec) { + console.log("errored verb"); + console.log(entry); + throw new Error("no english information for verb"); + } + if (entry.ep) { + const ec = entry.ec.includes(",") ? parseEc(entry.ec)[0] : entry.ec; + return `to ${ec} ${entry.ep}`; + } + const ec = parseEc(entry.ec); + return `to ${ec[0]}`; +} + +export function getEnglishParticiple(entry: T.DictionaryEntry): string { + if (!entry.ec) { + console.log("errored participle"); + console.log(entry); + throw new Error("no english information for participle"); + } + const ec = parseEc(entry.ec); + const participle = ec[2]; + return (entry.ep) + ? `${participle} ${entry.ep}` + : participle; +} \ No newline at end of file diff --git a/src/lib/p-text-helpers.test.ts b/src/lib/p-text-helpers.test.ts index 0ffbff5..441ef15 100644 --- a/src/lib/p-text-helpers.test.ts +++ b/src/lib/p-text-helpers.test.ts @@ -5,10 +5,9 @@ * LICENSE file in the root directory of this source tree. * */ - +import { makePsString, removeFVarients } from "./accent-and-ps-utils"; import { concatPsString, - makePsString, removeEndingL, yulEndingInfinitive, mapVerbBlock, @@ -22,7 +21,6 @@ import { splitDoubleWord, endsInConsonant, addOEnding, - removeFVarients, endsInShwa, splitPsByVarients, endsWith, @@ -701,8 +699,8 @@ test(`splitDoubleWord should work`, () => { c: "adj.", i: 1, }, - ] - expect(splitDoubleWord(orig)).toEqual(out); + ]; + expect(splitDoubleWord(removeFVarients(orig))).toEqual(out); }); // test(`allThirdPersMascPlur should work`, () => { diff --git a/src/lib/p-text-helpers.ts b/src/lib/p-text-helpers.ts index b6ee5c5..51b5b5b 100644 --- a/src/lib/p-text-helpers.ts +++ b/src/lib/p-text-helpers.ts @@ -6,9 +6,6 @@ * */ -import { - inflectRegularYeyUnisex, -} from "./pashto-inflector"; import { baParticle } from "./grammar-units"; import { getVerbBlockPosFromPerson, @@ -21,6 +18,7 @@ import { } from "./accent-helpers"; import { phoneticsConsonants } from "./pashto-consonants"; import { simplifyPhonetics } from "./simplify-phonetics"; +import { makePsString, removeFVarients } from "./accent-and-ps-utils"; // export function concatPsStringWithVars(...items: Array): T.PsString[] { @@ -182,25 +180,6 @@ export function ensureBaAt(ps: T.FullForm, pos: number): T.FullForm< return baInserted; } -export function removeFVarients(x: T.DictionaryEntry): T.DictionaryEntryNoFVars; -export function removeFVarients(x: T.PsString): T.PsStringNoFVars; -export function removeFVarients(x: string): T.FStringNoFVars; -export function removeFVarients(x: string | T.PsString | T.DictionaryEntry): T.FStringNoFVars | T.PsStringNoFVars | T.DictionaryEntryNoFVars { - if (typeof x === "string") { - return x.split(",")[0] as T.FStringNoFVars; - } - if ("ts" in x) { - return { - ...x, - f: removeFVarients(x.f), - } as unknown as T.DictionaryEntryNoFVars; - } - return { - ...x, - f: removeFVarients(x.f), - } as unknown as T.PsStringNoFVars; -} - /** * Lets us know if all the forms of a verb block are the same * @@ -214,16 +193,6 @@ export function isAllOne (block: T.VerbBlock | T.ImperativeBlock): boolean { ), true) as unknown as boolean; } -/** - * Creates a Pashto string structure - * - * @param p - the Pashto text - * @param f - the phonetics text - */ -export function makePsString(p: string, f: string): T.PsString { - return { p, f }; -} - /** * Retuns a Pashto string with the ل - ul on the end removed * @@ -635,15 +604,7 @@ export function removeRetroflexR(ps: T.PsString): T.PsString { }; } -export function inflectYey(ps: T.SingleOrLengthOpts): T.SingleOrLengthOpts { - if ("long" in ps) { - return { - long: inflectYey(ps.long) as T.UnisexInflections, - short: inflectYey(ps.short) as T.UnisexInflections, - } - } - return inflectRegularYeyUnisex(ps.p, ps.f); -} + export function clamp(s: string, chars: number): string { return `${s.slice(0, 20)}${s.length > 20 ? "..." : ""}`; @@ -1010,4 +971,26 @@ export function endsWith( ((matchAccent ? f.slice(-fEnd.length) : removeAccents(f.slice(-fEnd.length))) === (matchAccent ? fEnd : removeAccents(fEnd))) : true) ); +} + +export function firstVariation(s: string): string { + return s.split(/[,|;]/)[0].trim(); +} + +export function psStringFromEntry(entry: T.PsString): T.PsString { + return { + p: entry.p, + f: removeFVarients(entry.f), + }; +} + +export function getLong(x: T.SingleOrLengthOpts): U { + if ("long" in x) { + return x.long; + } + return x; +} + +export function capitalizeFirstLetter(string: string) { + return string.charAt(0).toUpperCase() + string.slice(1); } \ No newline at end of file diff --git a/src/lib/pashto-inflector.ts b/src/lib/pashto-inflector.ts index 1775979..0c187b1 100644 --- a/src/lib/pashto-inflector.ts +++ b/src/lib/pashto-inflector.ts @@ -11,8 +11,6 @@ import { concatInflections, splitDoubleWord, ensureUnisexInflections, - makePsString, - removeFVarients, concatPsString, endsInConsonant, endsInAaOrOo, @@ -22,6 +20,7 @@ import { removeEndTick, endsWith, } from "./p-text-helpers"; +import { makePsString, removeFVarients } from "./accent-and-ps-utils"; import { accentFSylsOnNFromEnd, hasAccents, @@ -625,3 +624,13 @@ function makePlural(w: T.DictionaryEntryNoFVars): { plural: T.PluralInflections } return undefined; } + +export function inflectYey(ps: T.SingleOrLengthOpts): T.SingleOrLengthOpts { + if ("long" in ps) { + return { + long: inflectYey(ps.long) as T.UnisexInflections, + short: inflectYey(ps.short) as T.UnisexInflections, + } + } + return inflectRegularYeyUnisex(ps.p, ps.f); +} diff --git a/src/lib/phrase-building/compile-vp.ts b/src/lib/phrase-building/compile-vp.ts new file mode 100644 index 0000000..7b34e9c --- /dev/null +++ b/src/lib/phrase-building/compile-vp.ts @@ -0,0 +1,386 @@ +import * as T from "../../types"; +import { + concatPsString, +} from "../p-text-helpers"; +import { makePsString } from "../accent-and-ps-utils"; +import { + removeAccents, +} from "../accent-helpers"; +import { getVerbBlockPosFromPerson } from "../misc-helpers"; +import * as grammarUnits from "../grammar-units"; +import { + removeBa, + removeDuplicates, +} from "./vp-tools"; + +type Form = T.FormVersion & { OSV?: boolean }; +export function compileVP(VP: T.VPRendered, form: Form): { ps: T.SingleOrLengthOpts, e?: string [] }; +export function compileVP(VP: T.VPRendered, form: Form, combineLengths: true): { ps: T.PsString[], e?: string [] }; +export function compileVP(VP: T.VPRendered, form: Form, combineLengths?: true): { ps: T.SingleOrLengthOpts, e?: string [] } { + const verb = VP.verb.ps; + const { kids, NPs } = getSegmentsAndKids(VP, form); + const psResult = compilePs({ + NPs, + kids, + verb, + VP, + }); + return { + ps: combineLengths ? flattenLengths(psResult) : psResult, + // TODO: English doesn't quite work for dynamic compounds in passive voice + e: (VP.verb.voice === "passive" && VP.isCompound === "dynamic") ? undefined : compileEnglish(VP), + }; +} + +type CompilePsInput = { + NPs: Segment[][], + kids: Segment[], + verb: { + head: T.PsString | undefined, + rest: T.SingleOrLengthOpts, + }, + VP: T.VPRendered, +} +function compilePs({ NPs, kids, verb: { head, rest }, VP }: CompilePsInput): T.SingleOrLengthOpts { + if ("long" in rest) { + return { + long: compilePs({ NPs, verb: { head, rest: rest.long }, VP, kids }) as T.PsString[], + short: compilePs({ NPs, verb: { head, rest: rest.short }, VP, kids }) as T.PsString[], + ...rest.mini ? { + mini: compilePs({ NPs, verb: { head, rest: rest.mini }, VP, kids }) as T.PsString[], + } : {}, + }; + } + const verbWNegativeVersions = arrangeVerbWNegative(head, rest, VP.verb); + + // put together all the different possible permutations based on: + // a. potential different versions of where the nu goes + return removeDuplicates(verbWNegativeVersions.flatMap((verbSegments) => ( + // b. potential reordering of NPs + NPs.flatMap(NP => { + // for each permutation of the possible ordering of NPs and Verb + nu + // 1. put in kids in the kids section + const segments = putKidsInKidsSection([...NP, ...verbSegments], kids); + // 2. space out the words properly + const withProperSpaces = addSpacesBetweenSegments(segments); + // 3. throw it all together into a PsString for each permutation + return combineSegments(withProperSpaces); + }) + ))); +} + +function getSegmentsAndKids(VP: T.VPRendered, form: Form): { kids: Segment[], NPs: Segment[][] } { + const SO = { + subject: VP.subject.ps, + object: typeof VP.object === "object" ? VP.object.ps : undefined, + } + const removeKing = form.removeKing && !(VP.isCompound === "dynamic" && VP.isPast); + const shrinkServant = form.shrinkServant && !(VP.isCompound === "dynamic" && !VP.isPast); + + const toShrink = (() => { + if (!shrinkServant) return undefined; + if (!VP.servant) return undefined; + const servant = VP[VP.servant]; + if (typeof servant !== "object") return undefined; + return servant; + })(); + function getSegment(t: "subject" | "object"): Segment | undefined { + const word = (VP.servant === t) + ? (!shrinkServant ? SO[t] : undefined) + : (VP.king === t) + ? (!removeKing ? SO[t] : undefined) + : undefined; + if (!word) return undefined; + return makeSegment(word); + } + const subject = getSegment("subject"); + const object = getSegment("object"); + + return { + kids: [ + ...VP.verb.hasBa + ? [makeSegment(grammarUnits.baParticle, ["isBa", "isKid"])] : [], + ...toShrink + ? [shrinkNP(toShrink)] : [], + ], + NPs: [ + [ + ...subject ? [subject] : [], + ...object ? [object] : [], + ], + // TODO: make this an option to also include O S V order ?? + // also show O S V if both are showing + ...(subject && object && form.OSV) ? [[object, subject]] : [], + ], + }; +} + +function putKidsInKidsSection(segments: Segment[], kids: Segment[]): Segment[] { + const first = segments[0]; + const rest = segments.slice(1); + return [ + first, + // TODO: simplify to just isKidAfterHead ?? + ...(first.isVerbHead && rest[0] && rest[0].isVerbRest) + ? kids.map(k => k.adjust({ desc: ["isKidBetweenHeadAndRest"] })) + : kids, + ...rest, + ]; +} + +function arrangeVerbWNegative(head: T.PsString | undefined, restRaw: T.PsString[], V: T.VerbRendered): Segment[][] { + const hasLeapfrog = V.tenseCategory === "modal" || V.tenseCategory === "perfect"; + const rest = (() => { + if (hasLeapfrog) { + const [restF, restLast] = splitOffLeapfrogWord(restRaw); + return { + front: makeSegment(restF.map(removeBa), ["isVerbRest"]), + last: makeSegment(restLast.map(removeBa), ["isVerbRest"]), + }; + } + return makeSegment(restRaw.map(removeBa), ["isVerbRest"]); + })(); + const headSegment: Segment | undefined = !head + ? head + : makeSegment( + head, + (head.p === "و" || head.p === "وا") + ? ["isVerbHead", "isOoOrWaaHead"] + : ["isVerbHead"] + ); + if (!V.negative) { + if ("front" in rest) { + return [ + headSegment ? [headSegment, rest.front, rest.last] : [rest.front, rest.last], + ] + } + return [ + headSegment ? [headSegment, rest] : [rest], + ]; + } + const nu: T.PsString = { p: "نه", f: "nú" }; + if (!headSegment) { + if ("front" in rest) { + return [ + // pefect nu dey me leeduley and nu me dey leeduley + [ + mergeSegments( + makeSegment(nu, ["isNu"]), + rest.last.adjust({ ps: removeAccents }), + ), + rest.front.adjust({ ps: removeAccents }), + ], + [ + makeSegment(nu, ["isNu"]), + rest.last.adjust({ ps: removeAccents }), + rest.front.adjust({ ps: removeAccents }), + ], + [ + rest.front.adjust({ ps: removeAccents }), + makeSegment(nu, ["isNu"]), + rest.last.adjust({ ps: removeAccents }), + ], + ]; + } + return [[ + makeSegment(nu, ["isNu"]), + rest.adjust({ ps: removeAccents }), + ]]; + } + if ("front" in rest) { + return [ + [ + headSegment.adjust({ ps: removeAccents }), + rest.last.adjust({ + ps: r => concatPsString(nu, " ", removeAccents(r)), + desc: ["isNu"], + }), + rest.front.adjust({ + ps: r => removeAccents(r), + }), + ], + [ + headSegment.adjust({ ps: removeAccents }), + rest.front.adjust({ + ps: r => concatPsString(nu, " ", removeAccents(r)), + desc: ["isNu"], + }), + rest.last.adjust({ + ps: r => removeAccents(r), + }), + ], + ...(!headSegment.isOoOrWaaHead && !V.isCompound) ? [[ + mergeSegments(headSegment, rest.front, "no space").adjust({ + ps: r => concatPsString(nu, " ", removeAccents(r)), + desc: ["isNu"], + }), + rest.last.adjust({ + ps: r => removeAccents(r), + }), + ]] : [], + ]; + } + return [ + ...(V.voice !== "passive") ? [[ + ...headSegment ? [headSegment.adjust({ ps: removeAccents })] : [], + rest.adjust({ + ps: r => concatPsString(nu, " ", removeAccents(r)), + desc: ["isNu"], + }), + ]] : [], + // verbs that have a perfective prefix that is not و or وا can put the + // nu *before* the prefix as well // TODO: also وي prefixes? + ...((!headSegment.isOoOrWaaHead && !V.isCompound) || (V.voice === "passive")) ? [[ + makeSegment(nu, ["isNu"]), + headSegment.adjust({ ps: removeAccents }), + rest.adjust({ ps: removeAccents }), + ]] : [], + ]; +} + +function shrinkNP(np: T.Rendered): Segment { + const [row, col] = getVerbBlockPosFromPerson(np.person); + return makeSegment(grammarUnits.pronouns.mini[row][col], ["isKid", "isMiniPronoun"]); +} + +function mergeSegments(s1: Segment, s2: Segment, noSpace?: "no space"): Segment { + if (noSpace) { + return s2.adjust({ ps: (p) => concatPsString(s1.ps[0], p) }); + } + return s2.adjust({ ps: (p) => concatPsString(s1.ps[0], " ", p) }); +} + +function addSpacesBetweenSegments(segments: Segment[]): (Segment | " " | "" | T.PsString)[] { + const o: (Segment | " " | "" | T.PsString)[] = []; + for (let i = 0; i < segments.length; i++) { + const current = segments[i]; + const next = segments[i+1]; + o.push(current); + if (!next) break; + if ( + // stative compound part + !current.ps[0].p.endsWith(" ") + && + ( + (next.isKidBetweenHeadAndRest || next.isNu) + || + (next.isVerbRest && current.isKidBetweenHeadAndRest) + ) + ) { + o.push({ + f: " ", // TODO: make this "-" in the right places + p: ((current.isVerbHead && (next.isMiniPronoun || next.isNu)) + || (current.isOoOrWaaHead && (next.isBa || next.isNu))) ? "" : " ", // or if its waa head + }); + } else if (current.isVerbHead && next.isVerbRest) { + o.push(""); + } else { + o.push(" "); + } + } + return o; +} + +function compileEnglish(VP: T.VPRendered): string[] | undefined { + function insertEWords(e: string, { subject, object }: { subject: string, object?: string }): string { + return e.replace("$SUBJ", subject).replace("$OBJ", object || ""); + } + const engSubj = VP.subject.e || undefined; + const engObj = (typeof VP.object === "object" && VP.object.e) ? VP.object.e : undefined; + // require all English parts for making the English phrase + return (VP.englishBase && engSubj && (engObj || typeof VP.object !== "object")) + ? VP.englishBase.map(e => insertEWords(e, { + subject: engSubj, + object: engObj, + })) + : undefined; +} + +// SEGMENT TOOLS +// TODO: PULL OUT FOR SHARING ACROSS COMPILE EP ETC? + +type SegmentDescriptions = { + isVerbHead?: boolean, + isOoOrWaaHead?: boolean, + isVerbRest?: boolean, + isMiniPronoun?: boolean, + isKid?: boolean, + // TODO: Simplify to just isKidAfterHead? + isKidBetweenHeadAndRest?: boolean, + isNu?: boolean, + isBa?: boolean, +} + +type SDT = keyof SegmentDescriptions; +type Segment = { ps: T.PsString[] } & SegmentDescriptions & { + adjust: (o: { ps?: T.PsString | T.PsString[] | ((ps: T.PsString) => T.PsString), desc?: SDT[] }) => Segment, +}; + +function makeSegment( + ps: T.PsString | T.PsString[], + options?: (keyof SegmentDescriptions)[], +): Segment { + return { + ps: Array.isArray(ps) ? ps : [ps], + ...options && options.reduce((all, curr) => ({ + ...all, + [curr]: true, + }), {}), + adjust: function(o): Segment { + return { + ...this, + ...o.ps ? { + ps: Array.isArray(o.ps) + ? o.ps + : "p" in o.ps + ? [o.ps] + : this.ps.map(o.ps) + } : {}, + ...o.desc && o.desc.reduce((all, curr) => ({ + ...all, + [curr]: true, + }), {}), + }; + }, + }; +} + +function combineSegments(loe: (Segment | " " | "" | T.PsString)[]): T.PsString[] { + const first = loe[0]; + const rest = loe.slice(1); + if (!rest.length) { + if (typeof first === "string" || !("ps" in first)) { + throw new Error("can't end with a spacer"); + } + return first.ps; + } + return combineSegments(rest).flatMap(r => ( + (typeof first === "object" && "ps" in first) + ? first.ps.map(f => concatPsString(f, r)) + : [concatPsString(first, r)] + ) + ); +} + +function flattenLengths(r: T.SingleOrLengthOpts): T.PsString[] { + if ("long" in r) { + return Object.values(r).flat(); + } + return r; +} + +function splitOffLeapfrogWord(psVs: T.PsString[]): [T.PsString[], T.PsString[]] { + return psVs.reduce((tp, ps) => { + const pWords = ps.p.split(" "); + const fWords = ps.f.split(" "); + const beginning = makePsString( + pWords.slice(0, -1).join(" "), + fWords.slice(0, -1).join(" "), + ); + const end = makePsString( + pWords.slice(-1).join(" "), + fWords.slice(-1).join(" "), + ); + return [[...tp[0], beginning], [...tp[1], end]]; + }, [[], []] as [T.PsString[], T.PsString[]]); +} diff --git a/src/lib/phrase-building/english-vp-rendering.ts b/src/lib/phrase-building/english-vp-rendering.ts new file mode 100644 index 0000000..c4f69d3 --- /dev/null +++ b/src/lib/phrase-building/english-vp-rendering.ts @@ -0,0 +1,237 @@ +import * as T from "../../types"; +import { getVerbBlockPosFromPerson, parseEc } from "../misc-helpers"; +import * as grammarUnits from "../grammar-units"; + +function engHave(s: T.Person): string { + function isThirdPersonSing(p: T.Person): boolean { + return ( + p === T.Person.ThirdSingMale || + p === T.Person.ThirdSingFemale + ); + } + return isThirdPersonSing(s) ? "has" : "have"; +} + +export function renderEnglishVPBase({ subjectPerson, object, vs }: { + subjectPerson: T.Person, + object: T.NPSelection | T.ObjectNP, + vs: T.VerbSelection, +}): string[] { + const ec = parseEc(vs.verb.entry.ec || ""); + const ep = vs.verb.entry.ep; + function engEquative(tense: "past" | "present", s: T.Person): string { + const [row, col] = getVerbBlockPosFromPerson(s); + return grammarUnits.englishEquative[tense][row][col]; + } + function engPresC(s: T.Person, ec: T.EnglishVerbConjugationEc | [string, string]): string { + function isThirdPersonSing(p: T.Person): boolean { + return ( + p === T.Person.ThirdSingMale || + p === T.Person.ThirdSingFemale + ); + } + return isThirdPersonSing(s) ? ec[1] : ec[0]; + } + function isToBe(v: T.EnglishVerbConjugationEc): boolean { + return (v[2] === "being"); + } + const futureEngBuilder: T.EnglishBuilder = (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + ]); + // TODO: Pull these out to a seperate entity and import it + const basicBuilders: Record< + T.VerbTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + presentVerb: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${isToBe(ec) + ? `${engEquative("present", s)}${n ? " not" : ""}` + : `${n ? engPresC(s, ["don't", "doesn't"]) : ""} ${n ? ec[0] : engPresC(s, ec)}`}`, + `$SUBJ ${engEquative("present", s)}${n ? " not" : ""} ${ec[2]}`, + ]), + subjunctiveVerb: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ ${n ? " won't" : " will"} ${isToBe(ec) ? "be" : ec[0]}`, + `should $SUBJ ${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + ]), + imperfectiveFuture: futureEngBuilder, + perfectiveFuture: futureEngBuilder, + imperfectivePast: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + // - subj pastEquative (N && "not") ec.2 obj + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} ${ec[2]}`, + // - subj "would" (N && "not") ec.0 obj + `$SUBJ would${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + // - subj pastEquative (N && "not") going to" ec.0 obj + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} going to ${isToBe(ec) ? "be" : ec[0]}`, + ]), + perfectivePast: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ${isToBe(ec) + ? ` ${engEquative("past", s)}${n ? " not" : ""}` + : (n ? ` did not ${ec[0]}` : ` ${ec[3]}`) + }` + ]), + habitualPerfectivePast: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + `$SUBJ used to${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + ]), + habitualImperfectivePast: (s: T.Person, ec: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + `$SUBJ used to${n ? " not" : ""} ${isToBe(ec) ? "be" : ec[0]}`, + ]), + }; + const modalBuilders: Record< + T.VerbTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + presentVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ can${n ? "'t" : ""} ${isToBe(v) ? "be" : v[0]}`, + ]), + subjunctiveVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ can${n ? "'t" : ""} ${isToBe(v) ? "be" : v[0]}`, + ]), + imperfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + ]), + perfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + ]), + imperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("past", s)} ${n ? " not" : ""} able to ${isToBe(v) ? "be" : v[0]}`, + `$SUBJ could${n ? " not" : ""} ${v[0]}`, + ]), + perfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("past", s)} ${n ? " not" : ""} able to ${isToBe(v) ? "be" : v[0]}`, + `$SUBJ could${n ? " not" : ""} ${isToBe(v) ? "be" : v[0]}`, + ]), + habitualImperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ used to ${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + `$SUBJ would ${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + ]), + habitualPerfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ used to ${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + `$SUBJ would ${n ? " not" : ""} be able to ${isToBe(v) ? "be" : v[0]}`, + ]), + }; + const perfectBuilders: Record< + T.PerfectTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + "present perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engHave(s)}${n ? " not" : ""} ${v[4]}`, + ]), + "past perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ had${n ? " not" : ""} ${v[4]}`, + ]), + "habitual perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engHave(s)}${n ? " not" : ""} ${v[4]}`, + ]), + "subjunctive perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ will have${n ? " not" : ""} ${v[4]}`, + ]), + "future perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} have ${v[4]}`, + ]), + "wouldBe perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} have ${v[4]}`, + ]), + "pastSubjunctive perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} have ${v[4]}`, + `$SUBJ should${n ? " not" : ""} have ${v[4]}`, + ]), + } + const passiveBasicBuilders: Record< + T.VerbTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + presentVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("present", s)}${n ? " not" : ""} being ${v[4]}`, + `$SUBJ ${engEquative("present", s)}${n ? " not" : ""} ${v[4]}`, + ]), + subjunctiveVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ will${n ? " not" : ""} be ${v[4]}`, + ]), + imperfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be ${v[4]}`, + ]), + perfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be ${v[4]}`, + ]), + imperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} being ${v[4]}`, + `$SUBJ would${n ? " not" : ""} be ${v[4]}`, + ]), + perfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} ${v[4]}`, + ]), + habitualPerfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} be ${v[4]}`, + ]), + habitualImperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} be ${v[4]}`, + ]), + }; + const passivePerfectBuilders: Record< + T.PerfectTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + "present perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engHave(s)}${n ? " not" : ""} been ${v[4]}`, + ]), + "past perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ had${n ? " not" : ""} been ${v[4]}`, + ]), + "habitual perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engHave(s)}${n ? " not" : ""} been ${v[4]}`, + ]), + "subjunctive perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ will${n ? " not" : ""} have been ${v[4]}`, + ]), + "future perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} have been ${v[4]}`, + ]), + "wouldBe perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} have been ${v[4]}`, + ]), + "pastSubjunctive perfect": (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} have been ${v[4]}`, + ]), + } + const passiveModalBuilders: Record< + T.VerbTense, + (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => string[] + > = { + presentVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ can${n ? " not" : ""} be ${v[4]}`, + `$SUBJ ${engEquative("present", s)}${n ? " not" : ""} able to be ${v[4]}`, + ]), + subjunctiveVerb: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `that $SUBJ will${n ? " not" : ""} be able to be ${v[4]}`, + `that $SUBJ ${n ? " not" : ""} be able to be ${v[4]}`, + ]), + imperfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be able to be ${v[4]}`, + ]), + perfectiveFuture: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ will${n ? " not" : ""} be able to be ${v[4]}`, + ]), + imperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} be able to be ${v[4]}`, + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} being able to be ${v[4]}`, + ]), + perfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ ${engEquative("past", s)}${n ? " not" : ""} able to be ${v[4]}`, + ]), + habitualPerfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} be able to be ${v[4]}`, + ]), + habitualImperfectivePast: (s: T.Person, v: T.EnglishVerbConjugationEc, n: boolean) => ([ + `$SUBJ would${n ? " not" : ""} be able to be ${v[4]}`, + ]), + }; + const base = ( + (vs.tenseCategory === "perfect") + ? (vs.voice === "active" ? perfectBuilders : passivePerfectBuilders)[vs.tense] + : vs.tenseCategory === "basic" + ? (vs.voice === "active" ? basicBuilders : passiveBasicBuilders)[vs.tense] + : (vs.voice === "active" ? modalBuilders : passiveModalBuilders)[vs.tense])(subjectPerson, ec, vs.negative); + return base.map(b => `${b}${typeof object === "object" ? " $OBJ" : ""}${ep ? ` ${ep}` : ""}`); +} diff --git a/src/lib/phrase-building/index.ts b/src/lib/phrase-building/index.ts new file mode 100644 index 0000000..88b75b6 --- /dev/null +++ b/src/lib/phrase-building/index.ts @@ -0,0 +1,7 @@ +import { renderVP } from "./render-vp"; +import { compileVP } from "./compile-vp"; + +export { + renderVP, + compileVP, +}; \ No newline at end of file diff --git a/src/lib/phrase-building/render-vp.ts b/src/lib/phrase-building/render-vp.ts new file mode 100644 index 0000000..6142dc4 --- /dev/null +++ b/src/lib/phrase-building/render-vp.ts @@ -0,0 +1,344 @@ +import * as T from "../../types"; +import { parseEc } from "../../lib/misc-helpers"; +import { inflectWord } from "../pashto-inflector"; +import { getEnglishWord } from "../get-english-word"; +import * as grammarUnits from "../grammar-units"; +import { + getVerbBlockPosFromPerson, + getPersonNumber, +} from "../misc-helpers"; +import { conjugateVerb } from "../verb-conjugation"; +import { + concatPsString, + hasBaParticle, + psStringFromEntry, + getLong, +} from "../p-text-helpers"; +import { removeAccents } from "../accent-helpers"; +import { + getPersonFromNP, + removeBa, + isPastTense, + isPerfectTense, + getTenseVerbForm, +} from "./vp-tools"; +import { isPattern4Entry } from "../type-predicates"; +import { renderEnglishVPBase } from "./english-vp-rendering"; + +// TODO: ISSUE GETTING SPLIT HEAD NOT MATCHING WITH FUTURE VERBS + +export function renderVP(VP: T.VPSelection): T.VPRendered { + // Sentence Rules Logic + const isPast = isPastTense(VP.verb.tense); + const isTransitive = VP.object !== "none"; + const { king, servant } = getKingAndServant(isPast, isTransitive); + const kingPerson = getPersonFromNP(VP[king]); + // TODO: more elegant way of handling this type safety + if (kingPerson === undefined) { + throw new Error("king of sentance does not exist"); + } + const subjectPerson = getPersonFromNP(VP.subject); + const objectPerson = getPersonFromNP(VP.object); + // TODO: also don't inflect if it's a pattern one animate noun + const inflectSubject = isPast && isTransitive && !isMascSingAnimatePattern4(VP.subject); + const inflectObject = !isPast && isFirstOrSecondPersPronoun(VP.object); + // Render Elements + return { + type: "VPRendered", + king, + servant, + isPast, + isTransitive, + isCompound: VP.verb.isCompound, + subject: renderNPSelection(VP.subject, inflectSubject, false, "subject"), + object: renderNPSelection(VP.object, inflectObject, true, "object"), + verb: renderVerbSelection(VP.verb, kingPerson, objectPerson), + englishBase: renderEnglishVPBase({ + subjectPerson, + object: VP.verb.isCompound === "dynamic" ? "none" : VP.object, + vs: VP.verb, + }), + }; +} + +export function renderNPSelection(NP: T.NPSelection, inflected: boolean, inflectEnglish: boolean, role: "subject"): T.Rendered +export function renderNPSelection(NP: T.NPSelection | T.ObjectNP, inflected: boolean, inflectEnglish: boolean, role: "object"): T.Rendered | T.Person.ThirdPlurMale | "none"; +export function renderNPSelection(NP: T.NPSelection | T.ObjectNP, inflected: boolean, inflectEnglish: boolean, role: "subject" | "object"): T.Rendered | T.Person.ThirdPlurMale | "none" { + if (typeof NP !== "object") { + if (role !== "object") { + throw new Error("ObjectNP only allowed for objects"); + } + return NP; + } + if (NP.type === "noun") { + return renderNounSelection(NP, inflected); + } + if (NP.type === "pronoun") { + return renderPronounSelection(NP, inflected, inflectEnglish); + } + if (NP.type === "participle") { + return renderParticipleSelection(NP, inflected) + } + throw new Error("unknown NP type"); +}; + +function renderNounSelection(n: T.NounSelection, inflected: boolean): T.Rendered { + const english = getEnglishFromNoun(n.entry, n.number); + const pashto = ((): T.PsString[] => { + const infs = inflectWord(n.entry); + const ps = n.number === "singular" + ? getInf(infs, "inflections", n.gender, false, inflected) + : [ + ...getInf(infs, "plural", n.gender, true, inflected), + ...getInf(infs, "arabicPlural", n.gender, true, inflected), + ...getInf(infs, "inflections", n.gender, true, inflected), + ]; + return ps.length > 0 + ? ps + : [psStringFromEntry(n.entry)]; + })(); + return { + ...n, + person: getPersonNumber(n.gender, n.number), + inflected, + ps: pashto, + e: english, + }; +} + +function renderPronounSelection(p: T.PronounSelection, inflected: boolean, englishInflected: boolean): T.Rendered { + const [row, col] = getVerbBlockPosFromPerson(p.person); + return { + ...p, + inflected, + ps: grammarUnits.pronouns[p.distance][inflected ? "inflected" : "plain"][row][col], + e: grammarUnits.persons[p.person].label[englishInflected ? "object" : "subject"], + }; +} + +function renderParticipleSelection(p: T.ParticipleSelection, inflected: boolean): T.Rendered { + return { + ...p, + inflected, + person: T.Person.ThirdPlurMale, + // TODO: More robust inflection of inflecting pariticiples - get from the conjugation engine + ps: [psStringFromEntry(p.verb.entry)].map(ps => inflected ? concatPsString(ps, { p: "و", f: "o" }) : ps), + e: getEnglishParticiple(p.verb.entry), + }; +} + +function renderVerbSelection(vs: T.VerbSelection, person: T.Person, objectPerson: T.Person | undefined): T.VerbRendered { + const v = vs.dynAuxVerb || vs.verb; + const conjugations = conjugateVerb(v.entry, v.complement); + // TODO: error handle this? + const conj = "grammaticallyTransitive" in conjugations + // if there's an option for grammatically transitive or transitive + // will default to transitive + ? conjugations.transitive + : "stative" in conjugations + // TODO: option to manually select stative/dynamic + ? conjugations.stative + : conjugations; + return { + ...vs, + person, + ...getPsVerbConjugation(conj, vs, person, objectPerson), + } +} + +function getPsVerbConjugation(conj: T.VerbConjugation, vs: T.VerbSelection, person: T.Person, objectPerson: T.Person | undefined): { + ps: { + head: T.PsString | undefined, + rest: T.SingleOrLengthOpts, + }, + hasBa: boolean, +} { + const f = getTenseVerbForm(conj, vs.tense, vs.tenseCategory, vs.voice); + const block = getMatrixBlock(f, objectPerson, person); + const perfective = isPerfective(vs.tense); + const verbForm = getVerbFromBlock(block, person); + const hasBa = hasBaParticle(getLong(verbForm)[0]); + if (perfective) { + const past = isPastTense(vs.tense); + const splitInfo = conj.info[past ? "root" : "stem"].perfectiveSplit; + if (!splitInfo) return { ps: { head: undefined, rest: verbForm }, hasBa }; + // TODO: Either solve this in the inflector or here, it seems silly (or redundant) + // to have a length option in the perfective split stem?? + const [splitHead] = getLong(getMatrixBlock(splitInfo, objectPerson, person)); + const ps = getHeadAndRest(splitHead, verbForm); + return { + hasBa, + ps, + }; + } + return { hasBa, ps: { head: undefined, rest: verbForm }}; +} + +function getVerbFromBlock(block: T.SingleOrLengthOpts, person: T.Person): T.SingleOrLengthOpts { + function grabFromBlock(b: T.VerbBlock, [row, col]: [ row: number, col: number ]): T.PsString[] { + return b[row][col]; + } + const pos = getVerbBlockPosFromPerson(person); + if ("long" in block) { + return { + long: grabFromBlock(block.long, pos), + short: grabFromBlock(block.short, pos), + ...block.mini ? { + mini: grabFromBlock(block.mini, pos), + } : {}, + }; + } + return grabFromBlock(block, pos); +} + +function getHeadAndRest(head: T.PsString, rest: T.PsString[]): { head: T.PsString | undefined, rest: T.PsString[] }; +function getHeadAndRest(head: T.PsString, rest: T.SingleOrLengthOpts): { head: T.PsString | undefined, rest: T.SingleOrLengthOpts }; +function getHeadAndRest(head: T.PsString, rest: T.SingleOrLengthOpts): { head: T.PsString | undefined, rest: T.SingleOrLengthOpts } { + if ("long" in rest) { + return { + // whether or not to include the head (for irreg tlul) -- eww // TODO: make nicer? + head: removeBa(rest.long[0]).p.slice(0, head.p.length) === head.p + ? head : undefined, + rest: { + long: getHeadAndRest(head, rest.long).rest, + short: getHeadAndRest(head, rest.short).rest, + ...rest.mini ? { + mini: getHeadAndRest(head, rest.mini).rest, + } : {}, + }, + }; + } + let headMismatch = false; + const restM = rest.map((psRaw) => { + const ps = removeBa(psRaw); + const pMatches = removeAccents(ps.p.slice(0, head.p.length)) === head.p + const fMatches = removeAccents(ps.f.slice(0, head.f.length)) === removeAccents(head.f); + if (!(pMatches && fMatches)) { + headMismatch = true; + return psRaw; + // throw new Error(`split head does not match - ${JSON.stringify(ps)} ${JSON.stringify(head)}`); + } + return { + p: ps.p.slice(head.p.length), + f: ps.f.slice(head.f.length), + } + }); + return { + head: headMismatch ? undefined : head, + rest: restM, + } +} + +function getMatrixBlock(f: { + mascSing: T.SingleOrLengthOpts; + mascPlur: T.SingleOrLengthOpts; + femSing: T.SingleOrLengthOpts; + femPlur: T.SingleOrLengthOpts; +} | T.SingleOrLengthOpts, objectPerson: T.Person | undefined, kingPerson: T.Person): T.SingleOrLengthOpts { + if (!("mascSing" in f)) { + return f; + } + function personToLabel(p: T.Person): "mascSing" | "mascPlur" | "femSing" | "femPlur" { + if (p === T.Person.FirstSingMale || p === T.Person.SecondSingMale || p === T.Person.ThirdSingMale) { + return "mascSing"; + } + if (p === T.Person.FirstSingFemale || p === T.Person.SecondSingFemale || p === T.Person.ThirdSingFemale) { + return "femSing"; + } + if (p === T.Person.FirstPlurMale || p === T.Person.SecondPlurMale || p === T.Person.ThirdPlurMale) { + return "mascPlur"; + } + return "femPlur"; + } + // if there's an object the matrix will agree with that, otherwise with the kingPerson (subject for intransitive) + const person = (objectPerson === undefined) ? kingPerson : objectPerson; + return f[personToLabel(person)]; +} + +function getEnglishParticiple(entry: T.DictionaryEntry): string { + if (!entry.ec) { + console.log("errored participle"); + console.log(entry); + throw new Error("no english information for participle"); + } + const ec = parseEc(entry.ec); + const participle = ec[2]; + return (entry.ep) + ? `${participle} ${entry.ep}` + : participle; +} + +function getEnglishFromNoun(entry: T.DictionaryEntry, number: T.NounNumber): string { + const articles = { + singular: "(a/the)", + plural: "(the)", + }; + const article = articles[number]; + function addArticle(s: string) { + return `${article} ${s}`; + } + const e = getEnglishWord(entry); + if (!e) throw new Error(`unable to get english from subject ${entry.f} - ${entry.ts}`); + + if (typeof e === "string") return ` ${e}`; + if (number === "plural") return addArticle(e.plural); + if (!e.singular || e.singular === undefined) { + throw new Error(`unable to get english from subject ${entry.f} - ${entry.ts}`); + } + return addArticle(e.singular); +} + +function getInf(infs: T.InflectorOutput, t: "plural" | "arabicPlural" | "inflections", gender: T.Gender, plural: boolean, inflected: boolean): T.PsString[] { + // TODO: make this safe!! + // @ts-ignore + if (infs && t in infs && infs[t] !== undefined && gender in infs[t] && infs[t][gender] !== undefined) { + // @ts-ignore + const iset = infs[t][gender] as T.InflectionSet; + const inflectionNumber = (inflected ? 1 : 0) + ((t === "inflections" && plural) ? 1 : 0); + return iset[inflectionNumber]; + } + return []; +} + +function getKingAndServant(isPast: boolean, isTransitive: boolean): + { king: "subject", servant: "object" } | + { king: "object", servant: "subject" } | + { king: "subject", servant: undefined } { + if (!isTransitive) { + return { king: "subject", servant: undefined }; + } + return isPast ? { + king: "object", + servant: "subject", + } : { + king: "subject", + servant: "object", + }; +} + +function isFirstOrSecondPersPronoun(o: "none" | T.NPSelection | T.Person.ThirdPlurMale): boolean { + if (typeof o !== "object") return false; + if (o.type !== "pronoun") return false; + return [0,1,2,3,6,7,8,9].includes(o.person); +} + +function isPerfective(t: T.VerbTense | T.PerfectTense): boolean { + if (isPerfectTense(t)) return false; + if (t === "presentVerb" || t === "imperfectiveFuture" || t === "imperfectivePast" || t === "habitualImperfectivePast") { + return false; + } + if (t === "perfectiveFuture" || t === "subjunctiveVerb" || t === "perfectivePast" || t === "habitualPerfectivePast") { + return true; + } + throw new Error("tense not implemented yet"); +} + +function isMascSingAnimatePattern4(np: T.NPSelection): boolean { + if (np.type !== "noun") { + return false; + } + return isPattern4Entry(np.entry) + && np.entry.c.includes("anim.") + && (np.number === "singular") + && (np.gender === "masc"); +} diff --git a/src/lib/phrase-building/vp-tools.ts b/src/lib/phrase-building/vp-tools.ts new file mode 100644 index 0000000..c4305f3 --- /dev/null +++ b/src/lib/phrase-building/vp-tools.ts @@ -0,0 +1,156 @@ +import * as T from "../../types"; +import { + concatPsString, + psRemove, + psStringEquals, +} from "../../lib/p-text-helpers"; +import * as grammarUnits from "../../lib/grammar-units"; + +export function isInvalidSubjObjCombo(subj: T.Person, obj: T.Person): boolean { + const firstPeople = [ + T.Person.FirstSingMale, + T.Person.FirstSingFemale, + T.Person.FirstPlurMale, + T.Person.FirstPlurFemale, + ]; + const secondPeople = [ + T.Person.SecondSingMale, + T.Person.SecondSingFemale, + T.Person.SecondPlurMale, + T.Person.SecondPlurFemale, + ]; + return ( + (firstPeople.includes(subj) && firstPeople.includes(obj)) + || + (secondPeople.includes(subj) && secondPeople.includes(obj)) + ); +} + +export function getTenseVerbForm(conjR: T.VerbConjugation, tense: T.VerbTense | T.PerfectTense, tenseCategory: "basic" | "modal" | "perfect", voice: "active" | "passive"): T.VerbForm { + const conj = (voice === "passive" && conjR.passive) ? conjR.passive : conjR; + if (tenseCategory === "basic") { + if (tense === "presentVerb") { + return conj.imperfective.nonImperative; + } + if (tense === "subjunctiveVerb") { + return conj.perfective.nonImperative; + } + if (tense === "imperfectiveFuture") { + return conj.imperfective.future; + } + if (tense === "perfectiveFuture") { + return conj.perfective.future; + } + if (tense === "imperfectivePast") { + return conj.imperfective.past; + } + if (tense === "perfectivePast") { + return conj.perfective.past; + } + if (tense === "habitualImperfectivePast") { + return conj.imperfective.habitualPast; + } + if (tense === "habitualPerfectivePast") { + return conj.perfective.habitualPast; + } + } + if (tenseCategory === "modal") { + if (tense === "presentVerb") { + return conj.imperfective.modal.nonImperative; + } + if (tense === "subjunctiveVerb") { + return conj.perfective.modal.nonImperative; + } + if (tense === "imperfectiveFuture") { + return conj.imperfective.modal.future; + } + if (tense === "perfectiveFuture") { + return conj.perfective.modal.future; + } + if (tense === "imperfectivePast") { + return conj.imperfective.modal.past; + } + if (tense === "perfectivePast") { + return conj.perfective.modal.past; + } + if (tense === "habitualImperfectivePast") { + return conj.imperfective.modal.habitualPast; + } + if (tense === "habitualPerfectivePast") { + return conj.perfective.modal.habitualPast; + } + } + if (tense === "present perfect") { + return conj.perfect.present; + } + if (tense === "past perfect") { + return conj.perfect.past; + } + if (tense === "future perfect") { + return conj.perfect.future; + } + if (tense === "habitual perfect") { + return conj.perfect.habitual; + } + if (tense === "subjunctive perfect") { + return conj.perfect.subjunctive; + } + if (tense === "wouldBe perfect") { + return conj.perfect.affirmational; + } + if (tense === "pastSubjunctive perfect") { + return conj.perfect.pastSubjunctiveHypothetical; + } + throw new Error("unknown tense"); +} + +export function getPersonFromNP(np: T.NPSelection): T.Person; +export function getPersonFromNP(np: T.NPSelection | T.ObjectNP): T.Person | undefined; +export function getPersonFromNP(np: T.NPSelection | T.ObjectNP): T.Person | undefined { + if (np === "none") { + return undefined; + } + if (typeof np === "number") return np; + if (np.type === "participle") { + return T.Person.ThirdPlurMale; + } + if (np.type === "pronoun") { + return np.person; + } + return np.number === "plural" + ? (np.gender === "masc" ? T.Person.ThirdPlurMale : T.Person.ThirdPlurFemale) + : (np.gender === "masc" ? T.Person.ThirdSingMale : T.Person.ThirdSingFemale); +} + +export function removeBa(ps: T.PsString): T.PsString { + return psRemove(ps, concatPsString(grammarUnits.baParticle, " ")); +} + +export function isEquativeTense(t: T.VerbTense | T.EquativeTense | T.PerfectTense): t is T.EquativeTense { + return (t === "present" || t === "future" || t === "habitual" || t === "past" || t === "wouldBe" || t === "subjunctive" || t === "pastSubjunctive"); +} + +export function isPerfectTense(t: T.VerbTense | T.EquativeTense | T.PerfectTense): t is T.PerfectTense { + return ( + t === "present perfect" || + t === "habitual perfect" || + t === "future perfect" || + t === "past perfect" || + t === "wouldBe perfect" || + t === "subjunctive perfect" || + t === "pastSubjunctive perfect" + ); +} + +export function isPastTense(tense: T.VerbTense | T.PerfectTense): boolean { + if (isPerfectTense(tense)) return true; + return tense.toLowerCase().includes("past"); +} + +export function removeDuplicates(psv: T.PsString[]): T.PsString[] { + return psv.filter((ps, i, arr) => ( + i === arr.findIndex(t => ( + psStringEquals(t, ps) + )) + )); +} \ No newline at end of file diff --git a/src/lib/protobuf.test.ts b/src/lib/protobuf.test.ts index 5f6449a..e8f7d21 100644 --- a/src/lib/protobuf.test.ts +++ b/src/lib/protobuf.test.ts @@ -23,6 +23,6 @@ const sampleDictionary: T.Dictionary = { } test("should encode and decode", () => { - expect(readDictionaryInfo(writeDictionaryInfo(sampleDictionaryInfo))).toEqual(sampleDictionaryInfo); - expect(readDictionary(writeDictionary(sampleDictionary))).toEqual(sampleDictionary); + expect(readDictionaryInfo(writeDictionaryInfo(sampleDictionaryInfo) as Uint8Array)).toEqual(sampleDictionaryInfo); + expect(readDictionary(writeDictionary(sampleDictionary) as Uint8Array)).toEqual(sampleDictionary); }); \ No newline at end of file diff --git a/src/lib/translate-phonetics.test.ts b/src/lib/translate-phonetics.test.ts index 6ebaec3..e52b40c 100644 --- a/src/lib/translate-phonetics.test.ts +++ b/src/lib/translate-phonetics.test.ts @@ -73,6 +73,7 @@ translations.forEach((t) => { // check each dialect with given system dialects.forEach((dialect) => { test( + // @ts-ignore `${t.original} should be translated to ${t.ipa[dialect]} using ${system} with ${dialect} dialect`, () => { const translated = translatePhonetics(t.original, { @@ -81,6 +82,7 @@ translations.forEach((t) => { // @ts-ignore dialect, }); + // @ts-ignore expect(translated).toBe(t[system][dialect]); }, ); diff --git a/src/lib/type-predicates.ts b/src/lib/type-predicates.ts new file mode 100644 index 0000000..e01c60a --- /dev/null +++ b/src/lib/type-predicates.ts @@ -0,0 +1,155 @@ +import * as T from "../types"; +import { pashtoConsonants } from "./pashto-consonants"; +import { endsWith } from "../lib/p-text-helpers"; +import { countSyllables } from "../lib/accent-helpers"; + + +export function isNounEntry(e: T.Entry | T.DictionaryEntry): e is T.NounEntry { + if ("entry" in e) return false; + return !!(e.c && (e.c.includes("n. m.") || e.c.includes("n. f."))); +} + +export function isAdjectiveEntry(e: T.Entry): e is T.AdjectiveEntry { + if ("entry" in e) return false; + return !!e.c?.includes("adj.") && !isNounEntry(e); +} + +export function isAdverbEntry(e: T.Entry): e is T.AdverbEntry { + if ("entry" in e) return false; + return !!e.c?.includes("adv."); +} + +export function isLocativeAdverbEntry(e: T.Entry): e is T.LocativeAdverbEntry { + return isAdverbEntry(e) && e.c.includes("loc. adv."); +} + +export function isNounOrAdjEntry(e: T.Entry): e is (T.NounEntry | T.AdjectiveEntry) { + return isNounEntry(e) || isAdjectiveEntry(e); +} + +export function isVerbEntry(e: T.Entry | T.DictionaryEntry): e is T.VerbEntry { + return "entry" in e && !!e.entry.c?.startsWith("v."); +} + +export function isMascNounEntry(e: T.NounEntry | T.AdjectiveEntry): e is T.MascNounEntry { + return !!e.c && e.c.includes("n. m."); +} + +export function isFemNounEntry(e: T.NounEntry | T.AdjectiveEntry): e is T.FemNounEntry { + return !!e.c && e.c.includes("n. f."); +} + +export function isUnisexNounEntry(e: T.NounEntry | T.AdjectiveEntry): e is T.UnisexNounEntry { + return isNounEntry(e) && e.c.includes("unisex"); +} + +export function isAdjOrUnisexNounEntry(e: T.Entry): e is (T.AdjectiveEntry | T.UnisexNounEntry) { + return isAdjectiveEntry(e) || ( + isNounEntry(e) && isUnisexNounEntry(e) + ); +} + +/** + * shows if a noun/adjective has the basic (consonant / ه) inflection pattern + * + * @param e + * @returns + */ +export function isPattern1Entry(e: T): e is T.Pattern1Entry { + if (e.noInf) return false; + if (e.infap) return false; + if (isFemNounEntry(e)) { + return ( + endsWith([{ p: "ه", f: "a" }, { p: "ح", f: "a" }], e) || + (endsWith({ p: pashtoConsonants }, e) && !e.c.includes("anim.")) + ); + } + return ( + endsWith([{ p: pashtoConsonants }], e) || + endsWith([{ p: "ه", f: "u" }, { p: "ه", f: "h" }], e) || + endsWith([{ p: "ای", f: "aay" }, { p: "وی", f: "ooy" }], e) + ); +} + +/** + * shows if a noun/adjective has the unstressed ی inflection pattern + * + * @param e + * @returns T.T.T.T. + */ +export function isPattern2Entry(e: T): e is T.Pattern2Entry { + if (e.noInf) return false; + if (e.infap) return false; + if (isFemNounEntry(e)) { + return !e.c.includes("pl.") && endsWith({ p: "ې", f: "e" }, e, true); + } + // TODO: check if it's a single syllable word, in which case it would be pattern 1 + return endsWith({ p: "ی", f: "ey" }, e, true) && (countSyllables(e.f) > 1); +} + +/** + * shows if a noun/adjective has the stressed ی inflection pattern + * + * @param e + * @returns + */ +export function isPattern3Entry(e: T): e is T.Pattern3Entry { + if (e.noInf) return false; + if (e.infap) return false; + if (isFemNounEntry(e)) { + return endsWith({ p: "ۍ" }, e); + } + return (countSyllables(e.f) > 1) + ? endsWith({ p: "ی", f: "éy" }, e, true) + : endsWith({ p: "ی", f: "ey" }, e) +} + +/** + * shows if a noun/adjective has the "Pashtoon" inflection pattern + * + * @param e + * @returns + */ +export function isPattern4Entry(e: T): e is T.Pattern4Entry { + if (e.noInf) return false; + return ( + !!(e.infap && e.infaf && e.infbp && e.infbf) + && + (e.infap.slice(1).includes("ا") && e.infap.slice(-1) === "ه") + ); +} + +/** + * shows if a noun/adjective has the shorter squish inflection pattern + * + * @param e + * @returns + */ +export function isPattern5Entry(e: T): e is T.Pattern5Entry { + if (e.noInf) return false; + return ( + !!(e.infap && e.infaf && e.infbp && e.infbf) + && + (e.infaf.slice(-1) === "u") + && + !e.infap.slice(1).includes("ا") + ); +} + +export function isPattern6FemEntry(e: T.FemNounEntry): e is T.Pattern6FemEntry { + if (!isFemNounEntry(e)) return false; + if (e.c.includes("anim.")) return false; + return e.p.slice(-1) === "ي"; +} + +export function isPluralNounEntry(e: U): e is T.PluralNounEntry { + return e.c.includes("pl."); +} + +export function isSingularEntry(e: U): e is T.SingularEntry { + return !isPluralNounEntry(e); +} + +export function isArrayOneOrMore(a: U[]): a is T.ArrayOneOrMore { + return a.length > 0; +} diff --git a/src/lib/useStickyState.ts b/src/lib/useStickyState.ts new file mode 100644 index 0000000..ce824e3 --- /dev/null +++ b/src/lib/useStickyState.ts @@ -0,0 +1,47 @@ +import { useEffect, useState } from "react"; + +/** + * replacement from the React useState hook that will persist the state in local storage + * + * @param defaultValue The default value to use if there was nothing saved previously OR + * a function that will take the saved value and return a modified new value to start with + * @param key a key for saving the state in locolStorage + * @returns + */ +export default function useStickyState( + defaultValue: T | ((old: T | undefined) => T), + key: string +): [ + value: T, + setValue: React.Dispatch>, +] { + const [value, setValue] = useState(() => { + const v = window.localStorage.getItem(key); + // nothing saved + if (v === null) { + if (typeof defaultValue === "function") { + return defaultValue(undefined); + } + return defaultValue; + } + // something saved before + try { + const old = JSON.parse(v) as T; + if (typeof defaultValue === "function") { + return defaultValue(old); + } + return defaultValue; + } catch (e) { + console.error("error parsting saved state from stickState"); + return (typeof defaultValue === "function") + ? defaultValue(undefined) + : defaultValue; + } + }); + + useEffect(() => { + window.localStorage.setItem(key, JSON.stringify(value)); + }, [key, value]); + + return [value, setValue]; +} \ No newline at end of file diff --git a/src/lib/verb-conjugation.ts b/src/lib/verb-conjugation.ts index 08e2333..4bfeb4e 100644 --- a/src/lib/verb-conjugation.ts +++ b/src/lib/verb-conjugation.ts @@ -24,11 +24,13 @@ import { complementInflects, concatInflections, unisexInfToObjectMatrix, - inflectYey, allOnePersonInflection, psStringEquals, - makePsString, } from "./p-text-helpers"; +import { makePsString } from "./accent-and-ps-utils"; +import { + inflectYey, +} from "./pashto-inflector"; import { accentOnNFromEnd, } from "./accent-helpers"; diff --git a/src/lib/verb-info.ts b/src/lib/verb-info.ts index c144842..b89190e 100644 --- a/src/lib/verb-info.ts +++ b/src/lib/verb-info.ts @@ -8,12 +8,10 @@ import { concatPsString, - makePsString, psStringEquals, removeEndingL, yulEndingInfinitive, removeRetroflexR, - inflectYey, unisexInfToObjectMatrix, complementInflects, beginsWithDirectionalPronoun, @@ -21,9 +19,15 @@ import { removeStartingTick, ensureShortWurShwaShift, choosePersInf, - removeFVarients, isUnisexSet, } from "./p-text-helpers"; +import { + makePsString, + removeFVarients, +} from "./accent-and-ps-utils"; +import { + inflectYey, +} from "./pashto-inflector"; import { accentOnFront, accentOnNFromEnd, diff --git a/src/library.ts b/src/library.ts index bb568e4..d3e7108 100644 --- a/src/library.ts +++ b/src/library.ts @@ -6,7 +6,7 @@ * */ - import { +import { conjugateVerb, } from "./lib/verb-conjugation"; import { @@ -15,6 +15,7 @@ import { import { getVerbInfo, } from "./lib/verb-info"; +import { makeVerbSelection } from "./components/vp-explorer/verb-selection"; import ConjugationViewer from "./components/ConjugationViewer"; import InflectionsTable from "./components/InflectionsTable"; import Pashto from "./components/Pashto"; @@ -24,12 +25,18 @@ import ButtonSelect from "./components/ButtonSelect"; import VerbFormDisplay from "./components/VerbFormDisplay"; import VerbTable from "./components/VerbTable"; import Examples from "./components/Examples"; +import Hider from "./components/Hider"; +import EntrySelect from "./components/EntrySelect"; import VerbInfo, { RootsAndStems } from "./components/verb-info/VerbInfo"; +import VPExplorer from "./components/vp-explorer/VPExplorer"; +import useStickyState from "./lib/useStickyState"; +import { + makePsString, + removeFVarients, +} from "./lib/accent-and-ps-utils"; import { addToForm, concatPsString, - makePsString, - removeFVarients, isVerbBlock, isImperativeBlock, isPluralInflectionSet, @@ -39,6 +46,10 @@ import { endsWith, hasBaParticle, psRemove, + firstVariation, + psStringFromEntry, + getLong, + capitalizeFirstLetter, } from "./lib/p-text-helpers"; import { getEnglishWord, @@ -48,6 +59,11 @@ import { standardizePhonetics, } from "./lib/standardize-pashto"; import { phoneticsToDiacritics } from "./lib/phonetics-to-diacritics"; +import { + randomPerson, + isInvalidSubjObjCombo, + randomSubjObj, +} from "./lib/np-tools"; import { convertSpelling, revertSpelling, @@ -100,6 +116,7 @@ import defaultTextOptions from "./lib/default-text-options"; import * as grammarUnits from "./lib/grammar-units"; import genderColors from "./lib/gender-colors"; import * as Types from "./types"; +import * as typePredicates from "./lib/type-predicates"; export { // FUNCTIONS @@ -143,13 +160,23 @@ export { countSyllables, hasBaParticle, psRemove, + firstVariation, + capitalizeFirstLetter, + psStringFromEntry, + getLong, + makeVerbSelection, + useStickyState, + randomPerson, + isInvalidSubjObjCombo, + randomSubjObj, // protobuf helpers readDictionary, writeDictionary, readDictionaryInfo, writeDictionaryInfo, // COMPONENTS - ConjugationViewer, + VPExplorer, + ConjugationViewer, // TODO: Deprecated - remove Examples, VerbFormDisplay, VerbTable, @@ -160,7 +187,10 @@ export { Phonetics, InlinePs, ButtonSelect, + Hider, + EntrySelect, // OTHER + typePredicates, grammarUnits, pashtoConsonants, defaultTextOptions, diff --git a/src/nouns-adjs.ts b/src/nouns-adjs.ts new file mode 100644 index 0000000..6e95706 --- /dev/null +++ b/src/nouns-adjs.ts @@ -0,0 +1,13 @@ + +/** + * Copyright (c) 2021 lingdocs.com + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import { DictionaryEntry } from "./types"; + +const nounsAdjs: DictionaryEntry[] = [{"ts":1527812797,"i":8580,"p":"ښځه","f":"xúdza","g":"xudza","e":"woman, wife","c":"n. f.","ec":"woman","ep":"women"},{"ts":1527816466,"i":8710,"p":"صلح","f":"sUlha","g":"sUlha","e":"peace","c":"n. f."},{"ts":1527816589,"i":8783,"p":"طرح","f":"tarha","g":"tarha","e":"plan","c":"n. f."},{"ts":1589023873660,"i":9440,"p":"فتح","f":"fatha","g":"fatha","e":"victory, conquest","c":"n. f."},{"ts":1527813791,"i":190,"p":"اجازه","f":"ijaaza","g":"ijaaza","e":"permission","c":"n. f."},{"ts":1614083533098,"i":214,"p":"اجنډه","f":"ajanDa","g":"ajanDa","e":"agenda","c":"n. f."},{"ts":1527811425,"i":6094,"p":"دروازه","f":"darwaaza","g":"darwaaza","e":"door","c":"n. f."},{"ts":1527816215,"i":317,"p":"اداره","f":"idaara","g":"idaara","e":"administration, management, directorate","c":"n. f."},{"ts":1527812687,"i":320,"p":"ادامه","f":"idaama","g":"idaama","e":"continuation","c":"n. f."},{"ts":1527811661,"i":341,"p":"اډه","f":"aDa","g":"aDa","e":"base, army post, (air) port","c":"n. f."},{"ts":1527814310,"i":381,"p":"ارزونه","f":"arzawuna","g":"arzawuna","e":"evaluation, appraisal, assessment","c":"n. f."},{"ts":1527821380,"i":398,"p":"اره","f":"ara","g":"ara","e":"saw (the tool)","c":"n. f."},{"ts":1527822277,"i":479,"p":"اسپه","f":"aspa","g":"aspa","e":"mare, female horse; fever","c":"n. f."},{"ts":1527814922,"i":610,"p":"اضافه","f":"izaafa","g":"izaafa","e":"addition, add-on, augmentation","c":"n. f."},{"ts":1527822458,"i":673,"p":"افاده","f":"ifaada","g":"ifaada","e":"expression","c":"n. f."},{"ts":1527813303,"i":686,"p":"افسانه","f":"afsaana","g":"afsaana","e":"myth, legend, fairy tale","c":"n. f."},{"ts":1527822494,"i":871,"p":"انانګه","f":"anaangá","g":"anaanga","e":"cheek","c":"n. f."},{"ts":1527817225,"i":921,"p":"اندازه","f":"andaaza","g":"andaaza","e":"measure, dimension, extent, scale","c":"n. f."},{"ts":1527813759,"i":928,"p":"اندېښنه","f":"andexna","g":"andexna","e":"worry, concern, fear","c":"n. f."},{"ts":1527815787,"i":1080,"p":"اوږه","f":"ooGá","g":"ooga","e":"shoulder","c":"n. f."},{"ts":1527813787,"i":1095,"p":"اوښکه","f":"ooxka","g":"ooxka","e":"tear (from eye)","c":"n. f."},{"ts":1527819927,"i":1185,"p":"اینه","f":"éena","g":"eena","e":"liver","c":"n. f."},{"ts":1527816261,"i":1341,"p":"بټوه","f":"baTwa","g":"baTwa","e":"wallet","c":"n. f."},{"ts":1527812001,"i":1487,"p":"برخه","f":"barkha","g":"barkha","e":"poriton, part, share","c":"n. f."},{"ts":1578009902092,"i":1518,"p":"برقه","f":"bUrqá","g":"bUrka","e":"veil, burka","c":"n. f."},{"ts":1527816994,"i":1542,"p":"برنامه","f":"barnaama","g":"barnaama","e":"program","c":"n. f."},{"ts":1579294091093,"i":1545,"p":"برنډه","f":"baranDá","g":"baranDa","e":"balcony, veranda, porch","c":"n. f."},{"ts":1527823617,"i":1589,"p":"بزه","f":"bazá","g":"baza","e":"crime, offense, sin, guilt, fault","c":"n. f."},{"ts":1527823619,"i":1590,"p":"بزه","f":"bUzá","g":"bUza","e":"moth","c":"n. f."},{"ts":1527823620,"i":1591,"p":"بزه","f":"bza","g":"bza","e":"patch (in a garment)","c":"n. f.","ec":"patch","ep":"patches"},{"ts":1591026261598,"i":1592,"p":"بزه","f":"buza","g":"buza","e":"she-goat","c":"n. f."},{"ts":1574188090133,"i":1602,"p":"بسپنه","f":"baspuna","g":"baspuna","e":"contribution, donation, gift, charity","c":"n. f."},{"ts":1527816590,"i":1616,"p":"بسنه","f":"basuna","g":"basuna","e":"sufficiency, to have enough or get by","c":"n. f."},{"ts":1593852212828,"i":2017,"p":"بېره","f":"béra","g":"bera","e":"fear, fright","c":"n. f."},{"ts":1527815862,"i":2029,"p":"بېړه","f":"beRa","g":"beRa","e":"speed, rush, hurry, urgency","c":"n. f."},{"ts":1527815156,"i":2193,"p":"پاڼه","f":"paaNa","g":"paaNa","e":"leaf","c":"n. f.","ec":"leaf","ep":"leaves"},{"ts":1527813481,"i":2375,"p":"پروژه","f":"projza","g":"projza","e":"project","c":"n. f."},{"ts":1527818409,"i":2379,"p":"پروسه","f":"purosa","g":"purosa","e":"process","c":"n. f."},{"ts":1527815192,"i":2402,"p":"پرېکړه","f":"prékRa","g":"prekRa","e":"decision","c":"n. f."},{"ts":1527822412,"i":2438,"p":"پزه","f":"páza","g":"paza","e":"nose","c":"n. f."},{"ts":1527816124,"i":2502,"p":"پښه","f":"pxa","g":"pxa","e":"foot","c":"n. f.","ec":"foot","ep":"feet"},{"ts":1527815155,"i":2548,"p":"پلمه","f":"palma","g":"palma","e":"pretext, excuse","c":"n. f."},{"ts":1566469328688,"i":2631,"p":"پنکه","f":"panka","g":"panka","e":"fan","c":"n. f."},{"ts":1527815184,"i":2762,"p":"پوښتنه","f":"poxtuna","g":"poxtuna","e":"question","c":"n. f."},{"ts":1527822437,"i":2978,"p":"تاخچه","f":"taakhchá","g":"taakhcha","e":"shelf, niche","c":"n. f.","ec":"shelf","ep":"shelves"},{"ts":1527814974,"i":3085,"p":"تبه","f":"tuba","g":"tuba","e":"fever","c":"n. f."},{"ts":1527815332,"i":3689,"p":"تمه","f":"tama","g":"tama","e":"expectation","c":"n. f."},{"ts":1527815716,"i":3974,"p":"تیږه","f":"teeGa","g":"teega","e":"stone, rock","c":"n. f."},{"ts":1582390417084,"i":3977,"p":"تېښته","f":"téxta","g":"texta","e":"escape, flight, running away","c":"n. f."},{"ts":1527822268,"i":4018,"p":"ټانګه","f":"Taangá","g":"Taanga","e":"carriage, buggy","c":"n. f."},{"ts":1527812014,"i":4146,"p":"ټولنه","f":"Toluna","g":"Toluna","e":"society, association, gathering, assembly, congregation","c":"n. f."},{"ts":1527816696,"i":4427,"p":"جمله","f":"jUmla","g":"jUmla","e":"sentence; whole, total, sum","c":"n. f."},{"ts":1527820504,"i":4612,"p":"ځمکه","f":"dzmúka","g":"dzmuka","e":"land, earth, ground","c":"n. f."},{"ts":1527815497,"i":5184,"p":"څېره","f":"tsera","g":"tsera","e":"face, picture","c":"n. f."},{"ts":1527811993,"i":5335,"p":"حمله","f":"hamla","g":"hamla","e":"attack, assault","c":"n. f."},{"ts":1527812720,"i":7309,"p":"ژبه","f":"jzúba, jzíba","g":"jzuba,jziba","e":"language","c":"n. f."},{"ts":1527812052,"i":5598,"p":"خښته","f":"khuxta","g":"khuxta","e":"brick, cinder-block","c":"n. f."},{"ts":1527813475,"i":6191,"p":"دقیقه","f":"daqeeqa","g":"dakeeka","e":"minute","c":"n. f.","app":"دقائق","apf":"daqaa'iq"},{"ts":1527812542,"i":6257,"p":"دمه","f":"dama","g":"dama","e":"break, rest","c":"n. f."},{"ts":1527812085,"i":6260,"p":"دنده","f":"danda","g":"danda","e":"obligation, duty, responsibility; job, work, position","c":"n. f."},{"ts":1527822847,"i":7297,"p":"ژامه","f":"jzaamá","g":"jzaama","e":"jaw","c":"n. f."},{"ts":1527815278,"i":8216,"p":"شپه","f":"shpa","g":"shpa","e":"night","c":"n. f."},{"ts":1527813145,"i":9653,"p":"قبیله","f":"qabeela","g":"kabeela","e":"tribe","c":"n. f.","app":"قبایل","apf":"qabaayul"},{"ts":1566653299904,"i":10331,"p":"کمره","f":"kamara","g":"kamara","e":"camera","c":"n. f."},{"ts":1527812825,"i":10477,"p":"کوڅه","f":"kootsa","g":"kootsa","e":"street","c":"n. f."},{"ts":1527812756,"i":10657,"p":"کېله","f":"kela","g":"kela","e":"banana","c":"n. f."},{"ts":1527812859,"i":11432,"p":"لوبه","f":"lóba","g":"loba","e":"game, match","c":"n. f."},{"ts":1527819087,"i":11615,"p":"ماته","f":"maata","g":"maata","e":"defeat","c":"n. f."},{"ts":1588076706989,"i":12245,"p":"مسافه","f":"masaafá","g":"masaafa","e":"distance, span","c":"n. f."},{"ts":1527818358,"i":12823,"p":"مڼه","f":"maNá","g":"maNa","e":"apple","c":"n. f."},{"ts":1527812901,"i":13002,"p":"مېده","f":"meda","g":"meda","e":"stomach","c":"n. f."},{"ts":1527813387,"i":13408,"p":"نښته","f":"nuxúta","g":"nuxuta","e":"battle, skirmish, wrangle, quarrel, fighting, gluing, joining","c":"n. f."},{"ts":1527815110,"i":13414,"p":"نښه","f":"náxa, núxa","g":"naxa,nuxa","e":"sign, mark, indication","c":"n. f."},{"ts":1527813391,"i":13691,"p":"نېټه","f":"neTa","g":"neTa","e":"date (as in time)","c":"n. f."},{"ts":1527811429,"i":13810,"p":"هدیره","f":"hadeera","g":"hadeera","e":"graveyard, cemetery","c":"n. f."},{"ts":1527814323,"i":13811,"p":"هدیه","f":"hadiya","g":"hadiya","e":"gift, present, donation, contribution","c":"n. f."},{"ts":1527812655,"i":13872,"p":"هفته","f":"hafta","g":"hafta","e":"week","c":"n. f."},{"ts":1527812681,"i":14009,"p":"هوکړه","f":"hókRa","g":"hokRa","e":"agreement","c":"n. f."},{"ts":1578343468611,"i":14117,"p":"واڼه","f":"wáaNa","g":"waaNa","e":"tendon, sinew; hamstring","c":"n. f."},{"ts":1527822717,"i":14118,"p":"واوره","f":"wáawra","g":"waawra","e":"snow","c":"n. f."},{"ts":1527811207,"i":14221,"p":"وروځه","f":"wróodza","g":"wroodza","e":"eyebrow","c":"n. f."},{"ts":1527816375,"i":14248,"p":"ورېره","f":"wrera","g":"wrera","e":"niece; brother's daughter","c":"n. f."},{"ts":1527822259,"i":14299,"p":"وږمه","f":"waGmá","g":"wagma","e":"breeze, light wind","c":"n. f."},{"ts":1527814719,"i":14310,"p":"وسله","f":"wasla","g":"wasla","e":"weapon, firearm, artillery","c":"n. f."},{"ts":1527823717,"i":9958,"p":"کپړه","f":"kapRá","g":"kapRa","e":"cloth, fabric, material, clothing, garment","c":"n. f."},{"ts":1527816257,"i":9966,"p":"کتابچه","f":"kitaabcha","g":"kitaabcha","e":"notebook, little book","c":"n. f."},{"ts":1527820050,"i":10016,"p":"کڅوړه","f":"katsóRa","g":"katsoRa","e":"bag, purse","c":"n. f."},{"ts":1527813252,"i":10059,"p":"کرښه","f":"kurxa","g":"kurxa","e":"line, trace","c":"n. f."},{"ts":1527823590,"i":10089,"p":"کره","f":"kará","g":"kara","e":"sphere, globe","c":"n. f."},{"ts":1527823591,"i":10090,"p":"کره","f":"kára","g":"kara","e":"shovel, scraper, scoop","c":"n. f."},{"ts":1527815884,"i":10093,"p":"کره کتنه","f":"karakatuna","g":"karakatuna","e":"criticism","c":"n. f."},{"ts":1527823035,"i":10102,"p":"کروړه","f":"karoRá","g":"karoRa","e":"whip","c":"n. f."},{"ts":1527816870,"i":10104,"p":"کرونده","f":"karwanda","g":"karwanda","e":"farmland","c":"n. f."},{"ts":1527817371,"i":10110,"p":"کریږه","f":"kreeGa","g":"kreega","e":"lament, mourning aloud, wail, cry (also out of hapiness)","c":"n. f."},{"ts":1598119732734,"i":10112,"p":"کرېله","f":"karelá","g":"karela","e":"bitter melon","c":"n. f."},{"ts":1527820606,"i":7870,"p":"سمڅه","f":"smútsa","g":"smutsa","e":"cave, cavern","c":"n. f."},{"ts":1527815249,"i":7910,"p":"سندره","f":"sandura","g":"sandura","e":"song, poem, verse","c":"n. f."},{"ts":1591034128816,"i":7942,"p":"سهوه","f":"sáhwa","g":"sahwa","e":"mistake, error, blunder, fault","c":"n. f."},{"ts":1527814370,"i":8007,"p":"سوږمه","f":"soGma","g":"sogma","e":"nostril","c":"n. f."},{"ts":1527817498,"i":8023,"p":"سوکړه","f":"sookRá","g":"sookRa","e":"famine, starvation, serious hunger/lack of food, drought, crop failure","c":"n. f."},{"ts":1527813115,"i":332,"p":"ادعا","f":"idaa","g":"idaa","e":"claim","c":"n. f."},{"ts":1527818119,"i":839,"p":"امسا","f":"amsaa","g":"amsaa","e":"stick, walking staff, walking stick, crutch","c":"n. f."},{"ts":1527815043,"i":4345,"p":"جزا","f":"jazaa","g":"jazaa","e":"punishment, retribution","c":"n. f."},{"ts":1527819022,"i":5012,"p":"څا","f":"tsaa","g":"tsaa","e":"well, water-hole","c":"n. f."},{"ts":1527814225,"i":5606,"p":"خطا","f":"khataa","g":"khataa","e":"mistake, error, blunder","c":"n. f."},{"ts":1610797589510,"i":5627,"p":"خلا","f":"khaláa","g":"khalaa","e":"cavity, emptiness, vacuum, empty space, space (as in planets etc.)","c":"n. f."},{"ts":1527812582,"i":6164,"p":"دعا","f":"dUaa","g":"dUaa","e":"prayer","c":"n. f."},{"ts":1527813415,"i":6282,"p":"دوا","f":"dawaa","g":"dawaa","e":"medicine, medication","c":"n. f."},{"ts":1527812272,"i":6870,"p":"رڼا","f":"raNaa","g":"raNaa","e":"light, glory","c":"n. f."},{"ts":1527823245,"i":6958,"p":"رویا","f":"rooyáa","g":"rooyaa","e":"dream, vision","c":"n. f."},{"ts":1586596579414,"i":8473,"p":"شورا","f":"shooraa","g":"shooraa","e":"council (an institution)","c":"n. f."},{"ts":1527815984,"i":8600,"p":"ښکلا","f":"xkulaa","g":"xkulaa","e":"beauty","c":"n. f."},{"ts":1527817670,"i":9192,"p":"غلا","f":"ghlaa","g":"ghlaa","e":"theft, robbery, stealing","c":"n. f."},{"ts":1527814362,"i":9257,"p":"غوا","f":"ghwaa","g":"ghwaa","e":"cow","c":"n. f."},{"ts":1585487002625,"i":9742,"p":"قلا","f":"qaláa","g":"kalaa","e":"castle, fort, fortress","c":"n. f."},{"ts":1527812048,"i":11701,"p":"مانا","f":"maanaa","g":"maanaa","e":"meaning, sense, spirit","c":"n. f."},{"ts":1527815483,"i":12607,"p":"ملا","f":"mlaa","g":"mlaa","e":"back (body part)","c":"n. f."},{"ts":1527812230,"i":12665,"p":"ملګرتیا","f":"malgurtiyaa","g":"malgurtiyaa","e":"friendship","c":"n. f."},{"ts":1527812910,"i":13050,"p":"مېلمستیا","f":"melmastiyaa","g":"melmastiyaa","e":"hospitality; invitation, event, party, banquet, reception","c":"n. f."},{"ts":1617781446945,"i":13110,"p":"ناجوړتیا","f":"naajoRtiyaa, naajoRtyaa","g":"naajoRtiyaa,naajoRtyaa","e":"sickness, illness","c":"n. f."},{"ts":1527815120,"i":13673,"p":"نیا","f":"niyaa","g":"niyaa","e":"grandmother","c":"n. f."},{"ts":1527811740,"i":13736,"p":"نیمګړتیا","f":"neemguRtiyaa","g":"neemguRtiyaa","e":"incompleteness, default, shortcoming","c":"n. f."},{"ts":1527821040,"i":14122,"p":"وبا","f":"wabáa","g":"wabaa","e":"plague, cholera","c":"n. f."},{"ts":1527823534,"i":14261,"p":"وړتیا","f":"waRtiyáa","g":"waRtiyaa","e":"ability, capacity, capability, power, volumeá","c":"n. f."},{"ts":1610443988250,"i":14461,"p":"وېشلتیا","f":"weshiltyaa, weshiltiyaa","g":"weshiltyaa,weshiltiyaa","e":"division, distribution","c":"n. f."},{"ts":1527816806,"i":14477,"p":"وینا","f":"waynaa","g":"waynaa","e":"speech, statement","c":"n. f."},{"ts":1527815197,"i":2497,"p":"پښتون","f":"puxtoon","g":"puxtoon","e":"Pashtun","c":"n. m. anim. unisex / adj.","infap":"پښتانه","infaf":"puxtaanu","infbp":"پښتن","infbf":"puxtan"},{"ts":1527813148,"i":2371,"p":"پروت","f":"prot","g":"prot","e":"lying, lying down or on, located, situated","c":"adj. irreg.","infap":"پراته","infaf":"praatu","infbp":"پرت","infbf":"prat"},{"ts":1574867531681,"i":2723,"p":"پوخ","f":"pokh","g":"pokh","e":"mature, ripe, ready, cooked, able, skillful, experienced, tried, tested, true","c":"adj. irreg.","infap":"پاخه","infaf":"paakhu","infbp":"پخ","infbf":"pakh"},{"ts":1576952412644,"i":2750,"p":"پوست","f":"post","g":"post","e":"soft, tender, gentle, loosened","c":"adj. irreg.","infap":"پاسته","infaf":"paastu","infbp":"پست","infbf":"past"},{"ts":1527815366,"i":3356,"p":"تریخ","f":"treekh","g":"treekh","e":"bitter, hot, spicy (of food); terrible, miserable","c":"adj. irreg.","infap":"تراخه","infaf":"traakhu","infbp":"ترخ","infbf":"turkh"},{"ts":1527818789,"i":3365,"p":"تریو","f":"treew","g":"treew","e":"salty, savoury, sour, acid, bitter, grumpy","c":"adj. irreg.","infap":"تراوه","infaf":"traawu","infbp":"ترو","infbf":"truw"},{"ts":1527817664,"i":3805,"p":"تود","f":"tod","g":"tod","e":"warm, hot","c":"adj.","infap":"تاوده","infaf":"taawdu","infbp":"تود","infbf":"tawd"},{"ts":1527816071,"i":5459,"p":"خپور","f":"khpor","g":"khpor","e":"spread, dispersed, publicized, published","c":"adj.","infap":"خپاره","infaf":"khpaaru","infbp":"خپر","infbf":"khpar"},{"ts":1574865652928,"i":5781,"p":"خوږ","f":"khoG","g":"khog","e":"sweet, nice","c":"adj. irreg.","infap":"خواږه","infaf":"khwaaGu","infbp":"خوږ","infbf":"khwaG"},{"ts":1527813499,"i":6109,"p":"دروند","f":"droond","g":"droond","e":"heavy; respectable, reliable, serious","c":"adj.","infap":"درانه","infaf":"draanu","infbp":"درن","infbf":"dran"},{"ts":1527813943,"i":6627,"p":"راستون","f":"raastoon","g":"raastoon","e":"returned, come back","c":"adj.","infap":"راستانه","infaf":"raastaanu","infbp":"راستن","infbf":"raastan"},{"ts":1576596860977,"i":6952,"p":"روڼ","f":"rooN","g":"rooN","e":"shiny, bright, clear, enlightened, transparent","c":"adj. irreg.","infap":"راڼه","infaf":"raaNu","infbp":"رڼ","infbf":"raN"},{"ts":1527811971,"i":7012,"p":"ړوند","f":"Roond","g":"Roond","e":"blind","c":"adj.","infap":"ړانده","infaf":"Raandu","infbp":"ړند","infbf":"Rand"},{"ts":1527815451,"i":7225,"p":"زوړ","f":"zoR","g":"zoR","e":"old","c":"adj. irreg.","infap":"زاړه","infaf":"zaaRu","infbp":"زړ","infbf":"zaR"},{"ts":1527815300,"i":7502,"p":"سپور","f":"spor","g":"spor","e":"mounted, rider, riding","c":"adj.","infap":"سپاره","infaf":"spaaru","infbp":"سپر","infbf":"spar"},{"ts":1527819505,"i":7589,"p":"ستون","f":"stoon","g":"stoon","e":"returned, returning, being (in a place after returning, coming back etc.), delayed, late, lagging","c":"adj. irreg.","infap":"ستانه","infaf":"staanu","infbp":"ستن","infbf":"stan"},{"ts":1600080053835,"i":7983,"p":"سور","f":"sor","g":"sor","e":"riding, mounted (Pakistani)","c":"adj.","infap":"سواره","infaf":"swaaru","infbp":"سور","infbf":"swar"},{"ts":1527813068,"i":8001,"p":"سوړ","f":"soR","g":"soR","e":"cold, cool; patient; lazy; inactive; satisfied","c":"adj.","infap":"ساړه","infaf":"saaRu","infbp":"سړ","infbf":"saR"},{"ts":1575924767041,"i":8218,"p":"شپون","f":"shpoon","g":"shpoon","e":"shepherd","c":"n. m. anim. unisex","infap":"شپانه","infaf":"shpaanu","infbp":"شپن","infbf":"shpan"},{"ts":1527813172,"i":10542,"p":"کوږ","f":"koG","g":"kog","e":"crooked, bent","c":"adj.","infap":"کاږه","infaf":"kaaGu","infbp":"کږ","infbf":"kaG"},{"ts":1527811973,"i":10624,"p":"کوڼ","f":"kooN","g":"kooN","e":"deaf","c":"adj.","infap":"کاڼه","infaf":"kaaNu","infbp":"کڼ","infbf":"kaN"},{"ts":1527817123,"i":11513,"p":"لومد","f":"loomd","g":"loomd","e":"damp, wet, moist, humid","c":"adj.","infap":"لامده","infaf":"laamdu","infbp":"لمد","infbf":"lamd"},{"ts":1527817117,"i":11519,"p":"لوند","f":"loond","g":"loond","e":"wet, damp, moist, humid","c":"adj. irreg.","infap":"لانده","infaf":"laandu","infbp":"لند","infbf":"land"},{"ts":1576889120767,"i":11520,"p":"لوند","f":"loond","g":"loond","e":"wet, damp, moist, humid","c":"adj. irreg.","infap":"لامده","infaf":"laamdu","infbp":"لمد","infbf":"lamd"},{"ts":1527812927,"i":12911,"p":"موړ","f":"moR","g":"moR","e":"full, satisfied, sated","c":"adj. irreg.","infap":"ماړه","infaf":"maaRu","infbp":"مړ","infbf":"maR"},{"ts":1527812908,"i":13051,"p":"مېلمه","f":"melma","g":"melma","e":"guest","c":"n. m. irreg. unisex","infap":"مېلمانه","infaf":"melmaanu","infbp":"مېلمن","infbf":"melman"},{"ts":1579463171333,"i":13620,"p":"نوږ","f":"noG","g":"nog","e":"cleansed, cleaned, purified","c":"adj.","infap":"ناږه","infaf":"naaGu","infbp":"نږ","infbf":"naG"},{"ts":1576113803291,"i":14417,"p":"ووړ","f":"woR","g":"woR","e":"small, little","c":"adj. irreg.","infap":"واړه","infaf":"waaRu","infbp":"وړ","infbf":"waR"},{"ts":1527819244,"i":10495,"p":"کوربه","f":"korba","g":"korba","e":"host, hostess; master of house","c":"n. m. anim. unisex","infap":"کوربانه","infaf":"korbaanú","infbp":"کوربن","infbf":"korban"},{"ts":1527814150,"i":11087,"p":"لار","f":"laar","g":"laar","e":"road, way, path","c":"n. f."},{"ts":1527815417,"i":14191,"p":"ورځ","f":"wradz","g":"wradz","e":"day","c":"n. f."},{"ts":1527812922,"i":12982,"p":"میاشت","f":"miyaasht","g":"miyaasht","e":"month","c":"n. f."},{"ts":1527823306,"i":5142,"p":"څنګل","f":"tsangúl","g":"tsangul","e":"elbow","c":"n. f."},{"ts":1527813824,"i":9408,"p":"غېږ","f":"gheG","g":"gheg","e":"bosom, breast; wrestling","c":"n. f."},{"ts":1527820524,"i":5083,"p":"څرمن","f":"tsarmún","g":"tsarmun","e":"pelt, skin, hide, leather","c":"n. f."},{"ts":1527814147,"i":1571,"p":"بړستن","f":"bRastun","g":"bRastun","e":"blanket, coving, quilt","c":"n. f."},{"ts":1527818707,"i":3262,"p":"ترخځ","f":"turkhúdz","g":"turkhudz","e":"wedge; gusset (in a shirt)","c":"n. f."},{"ts":1527822792,"i":3845,"p":"توشک","f":"toshák","g":"toshak","e":"narrow mattress used as a bed or a couch, reversible rug","c":"n. f.","ec":"toshak"},{"ts":1527813294,"i":7365,"p":"ږمنځ","f":"Gmundz","g":"gmundz","e":"comb","c":"n. f."},{"ts":1527811580,"i":7575,"p":"ستن","f":"stun","g":"stun","e":"needle, injection; pillar, mast","c":"n. f."},{"ts":1527815779,"i":10366,"p":"کنځل","f":"kundzul","g":"kundzul","e":"swearing, name-calling, verbal abuse, bad language","c":"n. f."},{"ts":1527817456,"i":11372,"p":"لمن","f":"lamun","g":"lamun","e":"skirt, portion of clothing hanging down from the waist; foot, base (eg. of a mountain)","c":"n. f."},{"ts":1527822725,"i":11532,"p":"لوېشت","f":"lwesht","g":"lwesht","e":"span","c":"n. f."},{"ts":1527811609,"i":12806,"p":"منګل","f":"mangul","g":"mangul","e":"claw, paw","c":"n. f."},{"ts":1527821684,"i":14246,"p":"ورېځ","f":"wurédz","g":"wuredz","e":"cloud","c":"n. f."},{"ts":1527812432,"i":66,"p":"آسمان","f":"aasmaan","g":"aasmaan","e":"sky, heaven","c":"n. m."},{"ts":1527812431,"i":83,"p":"آم","f":"aam","g":"aam","e":"mango","c":"n. m."},{"ts":1527812434,"i":99,"p":"آواز","f":"aawaaz","g":"aawaaz","e":"sound, voice","c":"n. m."},{"ts":1527816724,"i":141,"p":"اتاق","f":"wutáaq, Utáaq","g":"wutaak,Utaak","e":"room, chamber","c":"n. m.","diacExcept":true},{"ts":1527811859,"i":143,"p":"اتحاد","f":"itihaad","g":"itihaad","e":"union, alliance","c":"n. m."},{"ts":1527822033,"i":146,"p":"اتصال","f":"ittisáal","g":"ittisaal","e":"joining, connection, contiguity, junction","c":"n. m."},{"ts":1527811858,"i":147,"p":"اتفاق","f":"itifaaq","g":"itifaak","e":"unity, alliance, agreement, understanding, consent; coincidence","c":"n. m."},{"ts":1527813560,"i":167,"p":"اتهام","f":"itihaam","g":"itihaam","e":"accusation, charge, indictment","c":"n. m.","app":"اتهامات","apf":"itihaamáat"},{"ts":1527812105,"i":235,"p":"احترام","f":"ihtiraam","g":"ihtiraam","e":"respect, honor, esteem, deference","c":"n. m."},{"ts":1527819653,"i":241,"p":"احتمال","f":"ihtimaal","g":"ihtimaal","e":"possibility, probability, likelihood","c":"n. m."},{"ts":1527812689,"i":243,"p":"احتیاج","f":"ihtiyaaj","g":"ihtiyaaj","e":"need, requirement","c":"n. m.","app":"احتیاجات","apf":"ihtiyaajáat"},{"ts":1527812690,"i":245,"p":"احتیاط","f":"ihtiyaat","g":"ihtiyaat","e":"caution","c":"n. m."},{"ts":1527813782,"i":247,"p":"احساس","f":"ahsaas","g":"ahsaas","e":"feeling, sensation, emotion","c":"n. m."},{"ts":1527817303,"i":633,"p":"اعتراض","f":"itiraaz","g":"itiraaz","e":"objection, protest","c":"n. m."},{"ts":1527813418,"i":670,"p":"اغېز","f":"aghez","g":"aghez","e":"influence, effect, affect, action","c":"n. m."},{"ts":1527816625,"i":675,"p":"افت","f":"afat","g":"afat","e":"disaster","c":"n. m."},{"ts":1527813558,"i":764,"p":"الزام","f":"ilzaam","g":"ilzaam","e":"accusation, charge, blame","c":"n. m."},{"ts":1527815388,"i":856,"p":"امید","f":"Umeed","g":"Umeed","e":"hope, expectation","c":"n. m."},{"ts":1527812453,"i":911,"p":"انځور","f":"andzoor","g":"andzoor","e":"picture, painting, image","c":"n. m."},{"ts":1527813827,"i":1037,"p":"اور","f":"or","g":"or","e":"fire, flame","c":"n. m."},{"ts":1527814787,"i":1240,"p":"باران","f":"baaraan","g":"baaraan","e":"rain","c":"n. m."},{"ts":1527817293,"i":1302,"p":"بام","f":"baam","g":"baam","e":"roof","c":"n. m."},{"ts":1527814849,"i":1306,"p":"بانجن","f":"baanjan","g":"baanjan","e":"eggplant","c":"n. m."},{"ts":1527814106,"i":1363,"p":"بحران","f":"bUhraan","g":"bUhraan","e":"crisis","c":"n. m."},{"ts":1527814885,"i":1365,"p":"بخت","f":"bakht","g":"bakht","e":"fortune, luck, fate","c":"n. m."},{"ts":1527811281,"i":1758,"p":"بڼ","f":"baN","g":"baN","e":"garden","c":"n. m."},{"ts":1624039195280,"i":1822,"p":"بورس","f":"boors","g":"boors","e":"scholarship","c":"n. m."},{"ts":1527816877,"i":2015,"p":"بیرغ","f":"beyragh","g":"beyragh","e":"flag","c":"n. m."},{"ts":1527820423,"i":2147,"p":"پاسپورټ","f":"paasporT","g":"paasporT","e":"passport","c":"n. m."},{"ts":1527813224,"i":2521,"p":"پل","f":"pUl","g":"pUl","e":"bridge","c":"n. m.","infap":"پله","infaf":"plu","infbp":"پل","infbf":"pl"},{"ts":1527813480,"i":2530,"p":"پلان","f":"plaan","g":"plaan","e":"plan","c":"n. m."},{"ts":1527815199,"i":2535,"p":"پلاو","f":"pulaaw","g":"pulaaw","e":"pulaaw (central-asian/middle-eastern rice dish), pilaf","c":"n. m."},{"ts":1527815185,"i":2727,"p":"پور","f":"por","g":"por","e":"loan, debt","c":"n. m."},{"ts":1527815176,"i":2806,"p":"پیاز","f":"piyaaz","g":"piyaaz","e":"onion","c":"n. m."},{"ts":1527815171,"i":2936,"p":"پیل","f":"peyl","g":"peyl","e":"start","c":"n. m."},{"ts":1527816610,"i":2974,"p":"تاج","f":"taaj","g":"taaj","e":"crown, crest","c":"n. m."},{"ts":1527822373,"i":3006,"p":"تاک","f":"taak","g":"taak","e":"vine; mouthful","c":"n. m."},{"ts":1527815326,"i":3051,"p":"تایید","f":"taayeed","g":"taayeed","e":"confirmation","c":"n. m."},{"ts":1527815357,"i":3169,"p":"تخم","f":"tUkhum","g":"tUkhum","e":"seed","c":"n. m."},{"ts":1527821586,"i":3260,"p":"ترحم","f":"tarahhÚm","g":"tarahhUm","e":"pity, sympathy","c":"n. m."},{"ts":1527811389,"i":3474,"p":"تصویر","f":"tasweer","g":"tasweer","e":"picture","c":"n. m.","app":"تصاویر","apf":"tasaaweer"},{"ts":1527814679,"i":3479,"p":"تضمین","f":"tazmeen","g":"tazmeen","e":"guarantee, insurance, security","c":"n. m."},{"ts":1527814258,"i":3566,"p":"تقریر","f":"taqreer","g":"takreer","e":"speech, lecture","c":"n. m."},{"ts":1527821670,"i":3574,"p":"تقلب","f":"taqalÚb","g":"takalUb","e":"cheating, deception, fraud, forgery","c":"n. m."},{"ts":1527811602,"i":3601,"p":"تکل","f":"takál","g":"takal","e":"attempt, aspiration, intention, effort","c":"n. m."},{"ts":1527813398,"i":3611,"p":"تګ","f":"tug, tag","g":"tug,tag","e":"movement, motion, going","c":"n. m."},{"ts":1527822126,"i":3651,"p":"تلین","f":"tleen","g":"tleen","e":"anniversary","c":"n. m."},{"ts":1527811308,"i":3655,"p":"تماس","f":"tamaas","g":"tamaas","e":"contact, touch","c":"n. m."},{"ts":1527817900,"i":3698,"p":"تن","f":"tan","g":"tan","e":"body, flesh","c":"n. m."},{"ts":1527821061,"i":3701,"p":"تناقض","f":"tanaaqÚz","g":"tanaakUz","e":"contrast, opposition, contradiction","c":"n. m."},{"ts":1527822387,"i":3702,"p":"تناو","f":"tanáaw","g":"tanaaw","e":"rope, cord; a measurement of ground or distances","c":"n. m."},{"ts":1527818995,"i":3713,"p":"تندر","f":"tandúr","g":"tandur","e":"lightning","c":"n. m."},{"ts":1527815362,"i":3791,"p":"توپ","f":"top","g":"top","e":"ball; (cannon) ball","c":"n. m."},{"ts":1527816820,"i":3872,"p":"توک","f":"took","g":"took","e":"spit","c":"n. m."},{"ts":1527816520,"i":4022,"p":"ټبر","f":"Tabar","g":"Tabar","e":"family, clan, tribe, people","c":"n. m."},{"ts":1527811348,"i":4023,"p":"ټپ","f":"Tap","g":"Tap","e":"wound","c":"n. m."},{"ts":1527819566,"i":4060,"p":"ټکر","f":"TUkúr","g":"TUkur","e":"piece, part; cloth, fabric","c":"n. m."},{"ts":1527812213,"i":4414,"p":"جمات","f":"jUmaat","g":"jUmaat","e":"mosque","c":"n. m."},{"ts":1527811705,"i":4522,"p":"جوړښت","f":"joRuxt","g":"joRuxt","e":"structure","c":"n. m."},{"ts":1527814058,"i":4636,"p":"ځواب","f":"dzawaab","g":"dzawaab","e":"answer, reply","c":"n. m."},{"ts":1527816887,"i":4637,"p":"ځواک","f":"dzwaak","g":"dzwaak","e":"life, existence, energy, force","c":"n. m."},{"ts":1527814649,"i":4952,"p":"چوک","f":"chok","g":"chok","e":"market square, crossroads, paved area in front of entrance","c":"n. m."},{"ts":1527815065,"i":5052,"p":"څټک","f":"tsaTak, tsTuk","g":"tsaTak,tsTuk","e":"hammer","c":"n. m."},{"ts":1527814589,"i":5141,"p":"څنګ","f":"tsang","g":"tsang","e":"side","c":"n. m."},{"ts":1527816228,"i":5237,"p":"حد","f":"had","g":"had","e":"boundary, limit, extent","c":"n. m.","app":"حدود","apf":"hUdood"},{"ts":1527813749,"i":5313,"p":"حکومت","f":"hUkoomat","g":"hUkoomat","e":"government, reign, rule","c":"n. m."},{"ts":1527814125,"i":5316,"p":"حل","f":"hal","g":"hal","e":"solution","c":"n. m."},{"ts":1527818703,"i":5460,"p":"خت","f":"khut","g":"khut","e":"shirt","c":"n. m."},{"ts":1527813804,"i":5722,"p":"خوب","f":"khob","g":"khob","e":"sleep, dream","c":"n. m."},{"ts":1527812815,"i":5845,"p":"خوندیتوب","f":"khwundeetob","g":"khwundeetob","e":"safety, security","c":"n. m."},{"ts":1527813763,"i":6382,"p":"دین","f":"deen","g":"deen","e":"religion, faith","c":"n. m."},{"ts":1527811517,"i":7793,"p":"سفر","f":"safar","g":"safar","e":"journey, travel","c":"n. m."},{"ts":1527815389,"i":8993,"p":"عمر","f":"Úmur","g":"Umur","e":"age, life","c":"n. m."},{"ts":1527816746,"i":9057,"p":"غاښ","f":"ghaax","g":"ghaax","e":"tooth","c":"n. m.","ec":"tooth","ep":"teeth"},{"ts":1527812631,"i":9326,"p":"غوږ","f":"ghwuG, ghwaG","g":"ghwug,ghwag","e":"ear","c":"n. m."},{"ts":1527812265,"i":9488,"p":"فرمان","f":"farmaan","g":"farmaan","e":"decree, order","c":"n. m."},{"ts":1527817205,"i":9561,"p":"فلم","f":"film","g":"film","e":"film, movie","c":"n. m."},{"ts":1527812727,"i":9897,"p":"کال","f":"kaal","g":"kaal","e":"year","c":"n. m."},{"ts":1527812817,"i":9963,"p":"کتاب","f":"kitáab","g":"kitaab","e":"book","c":"n. m."},{"ts":1527812611,"i":10692,"p":"ګام","f":"gaam","g":"gaam","e":"step, move","c":"n. m."},{"ts":1527812641,"i":10857,"p":"ګل","f":"gUl","g":"gUl","e":"rose, flower","c":"n. m."},{"ts":1527812650,"i":10943,"p":"ګواښ","f":"gwaax","g":"gwaax","e":"threat, danger, challeng","c":"n. m."},{"ts":1527813521,"i":11613,"p":"ماتم","f":"maatam","g":"maatam","e":"mourning, grief, grieving, deep sorrow","c":"n. m."},{"ts":1527812176,"i":11658,"p":"ماښام","f":"maaxaam","g":"maaxaam","e":"evening","c":"n. m."},{"ts":1527813601,"i":12137,"p":"مرګ","f":"marg","g":"marg","e":"death","c":"n. m."},{"ts":1527817691,"i":12267,"p":"مستقبل","f":"mUstaqbil","g":"mUstakbil","e":"future","c":"n. m."},{"ts":1527811866,"i":13500,"p":"نقصان","f":"nUqsaan","g":"nUksaan","e":"damage, defect, loss","c":"n. m."},{"ts":1527815122,"i":13655,"p":"نوم","f":"noom","g":"noom","e":"name","c":"n. m.","ppp":"نمونه","ppf":"nUmoona"},{"ts":1527812661,"i":13888,"p":"هلک","f":"halík, halúk","g":"halik,haluk","e":"boy, young lad","c":"n. m. anim."},{"ts":1566476070874,"i":14064,"p":"واټ","f":"waaT","g":"waaT","e":"street, road","c":"n. m."},{"ts":1527816036,"i":14100,"p":"واک","f":"waak","g":"waak","e":"authority, power","c":"n. m."},{"ts":1527815400,"i":14148,"p":"وخت","f":"wakht","g":"wakht","e":"time","c":"n. m."},{"ts":1527818582,"i":14153,"p":"ودانښت","f":"wadaanuxt","g":"wadaanuxt","e":"building, prosperity, habitable state","c":"n. m."},{"ts":1527811441,"i":14162,"p":"ور","f":"war","g":"war","e":"door, gate, entrance","c":"n. m.","infap":"وره","infaf":"wru","infbp":"ور","infbf":"wr"},{"ts":1527815406,"i":14333,"p":"وطن","f":"watán","g":"watan","e":"homeland, home country","c":"n. m."},{"ts":1573149648251,"i":14335,"p":"وطن وال","f":"watanwaal","g":"watanwaal","e":"fellow country-man","c":"n. m.","ec":"fellow country-man","ep":"fellow country-men"},{"ts":1586428847646,"i":14338,"p":"وطنوال","f":"watanwáal","g":"watanwaal","e":"national (person), a citizen or person of that land","c":"n. m."},{"ts":1527822208,"i":14339,"p":"وطواط","f":"watwáat","g":"watwaat","e":"bat, coward, pipsqueak, hesitant person","c":"n. m."},{"ts":1527819571,"i":14410,"p":"وهم","f":"wáhum, wahm","g":"wahum,wahm","e":"apprehension, anxiety, suspicion; imagination, whims, some problem made up in someone’s head","c":"n. m.","app":"اهوام","apf":"ahwáam"},{"ts":1527816332,"i":14427,"p":"ویاړ","f":"wyaaR","g":"wyaaR","e":"pride, glory","c":"n. m."},{"ts":1527815408,"i":14439,"p":"ویده","f":"weedú","g":"weedu","e":"asleep, sleeping","c":"adj."},{"ts":1527812796,"i":8616,"p":"ښه","f":"xu","g":"xu","e":"good","c":"adj."},{"ts":1527821744,"i":72,"p":"آشپز","f":"aashpáz","g":"aashpaz","e":"cook, chef","c":"n. m. anim. unisex"},{"ts":1527812461,"i":154,"p":"اتل","f":"atul","g":"atul","e":"hero, brave","c":"n. m. anim. unisex"},{"ts":1527821649,"i":184,"p":"اثرناک","f":"asarnáak","g":"asarnaak","e":"impressive, effective, influencing","c":"adj.","l":1527815870},{"ts":1527818704,"i":352,"p":"ارت","f":"arát","g":"arat","e":"wide, spacious, extensive","c":"adj."},{"ts":1578340121962,"i":448,"p":"ازاد","f":"azáad","g":"azaad","e":"free, released","c":"adj."},{"ts":1527819418,"i":5452,"p":"خپلواک","f":"khpulwaak","g":"khpulwaak","e":"independent, free, autonomous","c":"adj."},{"ts":1527817146,"i":537,"p":"استوګن","f":"astogan","g":"astogan","e":"resident; established, installed, settled","c":"n. m. unisex / adj."},{"ts":1527813713,"i":858,"p":"امیدوار","f":"Umeedwaar","g":"Umeedwaar","e":"hopeful, pregnant","c":"adj."},{"ts":1527819451,"i":971,"p":"انګرېز","f":"angréz","g":"angrez","e":"Englishman, English (adjective)","c":"n. m. anim. unisex / adj."},{"ts":1527820346,"i":990,"p":"انلاین","f":"anlaayn","g":"anlaayn","e":"on-line","c":"adj."},{"ts":1527813667,"i":1002,"p":"اهم","f":"ahám","g":"aham","e":"important","c":"adj."},{"ts":1598724912198,"i":1028,"p":"اوچ","f":"ooch","g":"ooch","e":"dry","c":"adj."},{"ts":1527815138,"i":1048,"p":"اورپک","f":"orpak","g":"orpak","e":"insurgent, wicked, terrorist","c":"n. m. anim. / adj."},{"ts":1586452587974,"i":1072,"p":"اوزګار","f":"oozgáar","g":"oozgaar","e":"free, unoccupied, available, at leisure","c":"adj."},{"ts":1527816489,"i":1178,"p":"ایماندار","f":"eemaandaar","g":"eemaandaar","e":"faithful, believer, devoted, correct, true","c":"adj. / n. m. anim. unisex"},{"ts":1527820433,"i":1203,"p":"باتور","f":"baatóor","g":"baatoor","e":"courageous, brave, valiant","c":"adj."},{"ts":1527813425,"i":1375,"p":"بخیل","f":"bakheel","g":"bakheel","e":"stingy, miserly, closefisted","c":"adj."},{"ts":1527812511,"i":1376,"p":"بد","f":"bud, bad","g":"bud,bad","e":"bad","c":"adj."},{"ts":1527812518,"i":1448,"p":"برابر","f":"buraabur","g":"buraabur","e":"equal, even, all good","c":"adj."},{"ts":1527811861,"i":1464,"p":"بربنډ","f":"barbunD","g":"barbunD","e":"naked; bare","c":"adj."},{"ts":1527811511,"i":1622,"p":"بشپړ","f":"bushpuR","g":"bushpuR","e":"full, complete, total, exhaustive, fulfilled, finished, utmost, superior, mature","c":"adj."},{"ts":1527812515,"i":1675,"p":"بل","f":"bul","g":"bul","e":"other, next","c":"adj."},{"ts":1527815725,"i":1683,"p":"بلد","f":"balad","g":"balad","e":"knowledgeable, informed, acquainted, accustomed, used to, familiar with","c":"adj."},{"ts":1577301753727,"i":1719,"p":"بند","f":"band","g":"band","e":"closed, blocked, stopped","c":"adj."},{"ts":1527812490,"i":1941,"p":"بې کار","f":"be kaar","g":"bekaar","e":"useless","c":"adj."},{"ts":1527812031,"i":2061,"p":"بېل","f":"bel","g":"bel","e":"separate, different, various","c":"adj."},{"ts":1527815144,"i":2155,"p":"پاک","f":"paak","g":"paak","e":"clean, pure","c":"adj."},{"ts":1527815201,"i":2233,"p":"پټ","f":"puT","g":"puT","e":"hidden","c":"adj."},{"ts":1527815179,"i":2549,"p":"پلن","f":"plun","g":"plun","e":"wide, broad, flat, dull, vapid","c":"adj."},{"ts":1527819059,"i":2615,"p":"پنډ","f":"punD","g":"punD","e":"thick, fat","c":"adj."},{"ts":1611767359178,"i":3279,"p":"ترسناک","f":"tarsnáak","g":"tarsnaak","e":"compassionate","c":"adj."},{"ts":1527813270,"i":3345,"p":"تروش","f":"troosh","g":"troosh","e":"sour; sarcasm","c":"adj. / n. m."},{"ts":1527813817,"i":3739,"p":"تنګ","f":"tang","g":"tang","e":"narrow, tight, cramped, constrained; troubled, bothered, annoyed","c":"adj."},{"ts":1527816354,"i":3937,"p":"تیار","f":"tayaar","g":"tayaar","e":"ready, prepared","c":"adj."},{"ts":1527817056,"i":3967,"p":"تېز","f":"tez","g":"tez","e":"sharp, pointed, quick, fast","c":"adj."},{"ts":1527814076,"i":4147,"p":"ټولنیز","f":"Toluneez","g":"Toluneez","e":"social","c":"adj."},{"ts":1527819864,"i":4170,"p":"ټیټ","f":"TeeT","g":"TeeT","e":"short, low, inferior","c":"adj."},{"ts":1527811894,"i":4197,"p":"ټینګ","f":"Teeng","g":"Teeng","e":"firm, thick, strong, tough, rigid","c":"adj."},{"ts":1527812943,"i":4203,"p":"ثابت","f":"saabit","g":"saabit","e":"constant, firm, fixed, stable, established, proven","c":"adj."},{"ts":1527813085,"i":4216,"p":"ثقیل","f":"saqeel","g":"sakeel","e":"heavy, difficult, hard to digest, indigestible, lazy, burdensome","c":"adj."},{"ts":1527820479,"i":4275,"p":"جاهل","f":"jaahíl","g":"jaahil","e":"ignorant, stupid","c":"adj."},{"ts":1588160800930,"i":4313,"p":"جراح","f":"jarráah","g":"jarraah","e":"surgeon","c":"n. m. anim. unisex"},{"ts":1527812707,"i":4377,"p":"جګ","f":"jig, jug","g":"jig,jug","e":"high, tall","c":"adj."},{"ts":1527816944,"i":4503,"p":"جوت","f":"jawat","g":"jawat","e":"clear, evident, explained, apparent, established","c":"adj."},{"ts":1527822996,"i":4513,"p":"جوخت","f":"jokht","g":"jokht","e":"alongside, adjoining, next to, very close","c":"adj."},{"ts":1527812711,"i":4519,"p":"جوړ","f":"joR","g":"joR","e":"well, healthy, whole, made","c":"adj."},{"ts":1527816323,"i":4602,"p":"ځلاند","f":"dzalaand","g":"dzalaand","e":"shining, sparkling, outstanding, brilliant","c":"adj."},{"ts":1527812291,"i":4639,"p":"ځوان","f":"dzwaan","g":"dzwaan","e":"young, youth, youthful","c":"n. m. anim. unisex / adj."},{"ts":1527820112,"i":4648,"p":"ځوړند","f":"dzwáRund","g":"dzwaRund","e":"hanging","c":"adj."},{"ts":1527819672,"i":4708,"p":"چالاک","f":"chaaláak","g":"chaalaak","e":"crafty, sly, tricky; quick, fast, nimble","c":"adj."},{"ts":1527811230,"i":4753,"p":"چټک","f":"chaTak","g":"chaTak","e":"quick, fast","c":"adj."},{"ts":1527812524,"i":4853,"p":"چلان","f":"chalaan","g":"chalaan","e":"started, in motion","c":"adj."},{"ts":1527815370,"i":5076,"p":"څرګند","f":"tsărgund","g":"tsargund","e":"clear, obvious, apparent, disclosed","c":"adj."},{"ts":1576366107077,"i":5103,"p":"څک","f":"tsak","g":"tsak","e":"straight, upright, pricked up, erect, alert","c":"adj."},{"ts":1527812113,"i":5210,"p":"حاضر","f":"haazir, haazur","g":"haazir,haazur","e":"present, on hand, ready, available, appearing; ready, prepared","c":"adj.","app":"حاضرین","apf":"haazireen"},{"ts":1527820699,"i":5222,"p":"حامل","f":"haamíl","g":"haamil","e":"carrying, transporting, conveying, pregnant","c":"adj."},{"ts":1527819824,"i":5259,"p":"حریص","f":"harées","g":"harees","e":"greedy, mean","c":"adj."},{"ts":1527812669,"i":5270,"p":"حساس","f":"hasaas","g":"hasaas","e":"sensitive, delicate","c":"adj."},{"ts":1527812057,"i":5405,"p":"خام","f":"khaam","g":"khaam","e":"raw, unripe, immature","c":"adj."},{"ts":1527811523,"i":5423,"p":"خاین","f":"khaayin","g":"khaayin","e":"traitor, treacherous","c":"n. m. anim. unisex / adj."},{"ts":1527814219,"i":5448,"p":"خپل","f":"khpul","g":"khpul","e":"relative; one's own, farmiliar","c":"adj. / n. m."},{"ts":1527812795,"i":5454,"p":"خپلوان","f":"khpulwaan","g":"khpulwaan","e":"relative","c":"n. m. anim. unisex / adj. ??"},{"ts":1527812808,"i":5695,"p":"خوار","f":"khwaar","g":"khwaar","e":"poor, pitiful, miserable, thin","c":"adj."},{"ts":1527814880,"i":6261,"p":"دنګ","f":"dung","g":"dung","e":"tall, strapping","c":"adj."},{"ts":1527812537,"i":6395,"p":"ډاډمن","f":"DaaDmun","g":"DaaDmun","e":"assured, secure, confident","c":"adj."},{"ts":1527812583,"i":6459,"p":"ډک","f":"Duk","g":"Duk","e":"full","c":"adj."},{"ts":1527822674,"i":6501,"p":"ډنګر","f":"Dungár, Dangár","g":"Dungar,Dangar","e":"singular and plural cattle; bull, ox; thin, skinny, gaunt, emaciated","c":"adj."},{"ts":1527817256,"i":6507,"p":"ډوب","f":"Doob","g":"Doob","e":"drowned, sunk, submerged","c":"adj."},{"ts":1527814277,"i":6939,"p":"روغ","f":"rogh","g":"rogh","e":"healthy, well, intact, good, built-up","c":"adj."},{"ts":1609780006604,"i":7068,"p":"زرخېز","f":"zarkhéz","g":"zarkhez","e":"rich, fruitful","c":"adj."},{"ts":1527817116,"i":7075,"p":"زرغون","f":"zarghóon","g":"zarghoon","e":"green, flourishing, flowering, growing; immature, unripe","c":"adj."},{"ts":1527814026,"i":7086,"p":"زرین","f":"zareen","g":"zareen","e":"golden","c":"adj."},{"ts":1567594312839,"i":7108,"p":"زړه ور","f":"zuRawár","g":"zuRawar","e":"brave, courageous","c":"adj."},{"ts":1527815848,"i":7331,"p":"ژمن","f":"jzman","g":"jzman","e":"dedicated, committed","c":"adj."},{"ts":1527813498,"i":7492,"p":"سپک","f":"spuk","g":"spuk","e":"light; dishonorable, not respectable","c":"adj."},{"ts":1578329248464,"i":7522,"p":"سپین","f":"speen","g":"speen","e":"white (fig. clear, honest, beautiful)","c":"adj."},{"ts":1527811860,"i":7544,"p":"ستر","f":"stur","g":"stur","e":"big, large, great","c":"adj."},{"ts":1527820178,"i":7592,"p":"ستونزمن","f":"stoonzmán","g":"stoonzman","e":"difficult, hard, problematic, fraught with difficulties, tough, awkward","c":"adj."},{"ts":1527815246,"i":7624,"p":"سخت","f":"sakht","g":"sakht","e":"hard, difficult","c":"adj."},{"ts":1527817262,"i":8432,"p":"شنډ","f":"shanD","g":"shanD","e":"barren, sterile, unfruitful, neutralized, diffused","c":"adj."},{"ts":1527813426,"i":8496,"p":"شوم","f":"shoom","g":"shoom","e":"stingy, miserly, closefisted","c":"adj."},{"ts":1527812625,"i":9086,"p":"غټ","f":"ghuT, ghaT","g":"ghuT,ghaT","e":"big, fat","c":"adj."},{"ts":1527811846,"i":9911,"p":"کامیاب","f":"kaamyaab","g":"kaamyaab","e":"successful","c":"adj."},{"ts":1527823678,"i":9933,"p":"کاهل","f":"kaahíl","g":"kaahil","e":"lazy, sluggish, stagnant","c":"adj."},{"ts":1527814896,"i":9945,"p":"کبرجن","f":"kaburjun, kibrjun","g":"kaburjun,kibrjun","e":"proud, arrogant","c":"adj."},{"ts":1527813117,"i":10270,"p":"کلک","f":"klak, kluk","g":"klak,kluk","e":"firm, solid, staunch, steadfast, serious, hard, unwavering","c":"adj."},{"ts":1578769492475,"i":10299,"p":"کم","f":"kam","g":"kam","e":"few, little","c":"adj."},{"ts":1578769409512,"i":10332,"p":"کمزور","f":"kamzór","g":"kamzor","e":"weak","c":"adj."},{"ts":1527812639,"i":10758,"p":"ګران","f":"graan","g":"graan","e":"dear, valuable, expensive, difficult","c":"adj."},{"ts":1527816786,"i":10770,"p":"ګرد","f":"gurd","g":"gurd","e":"all, entire, whole, everything; round circular","c":"adj."},{"ts":1527814811,"i":10797,"p":"ګرم","f":"garm, garum","g":"garm,garum","e":"warm, hot","c":"adj."},{"ts":1527817662,"i":10798,"p":"ګرم","f":"gram","g":"gram","e":"guilty, blamed, culprit, culpable","c":"adj."},{"ts":1527812308,"i":10929,"p":"ګڼ","f":"gaN","g":"gaN","e":"thick, dense, heavy, deep, lots","c":"adj."},{"ts":1527813848,"i":11594,"p":"لېوال","f":"lewaal","g":"lewaal","e":"desiring, eager, thirsting, lover","c":"adj."},{"ts":1527816011,"i":11611,"p":"مات","f":"maat","g":"maat","e":"broken, split, defeated","c":"adj."},{"ts":1527812881,"i":11650,"p":"ماشوم","f":"maashoom","g":"maashoom","e":"child, kid","c":"n. m. anim. unisex","ec":"child","ep":"children"},{"ts":1527817007,"i":11688,"p":"مالوم","f":"maaloom","g":"maaloom","e":"known","c":"adj."},{"ts":1527814321,"i":11832,"p":"مثبت","f":"mUsbat","g":"mUsbat","e":"positive; proven","c":"adj."},{"ts":1527811264,"i":11943,"p":"محکوم","f":"mahkoom","g":"mahkoom","e":"condemned, sentenced, criminal; subjugated","c":"adj."},{"ts":1527814802,"i":12095,"p":"مردار","f":"mUrdáar","g":"mUrdaar","e":"foul, unclean, dirty","c":"adj."},{"ts":1527821812,"i":12518,"p":"مغرور","f":"maghróor","g":"maghroor","e":"haughty, arrogant, conceited","c":"adj."},{"ts":1527820222,"i":12617,"p":"ملاست","f":"mlaast","g":"mlaast","e":"lying down, lying","c":"adj."},{"ts":1527814344,"i":12842,"p":"مهم","f":"mUhím","g":"mUhim","e":"important","c":"adj."},{"ts":1527816033,"i":13132,"p":"نادر","f":"naadir","g":"naadir","e":"uncommon","c":"adj."},{"ts":1527815106,"i":13170,"p":"ناست","f":"naast","g":"naast","e":"sitting, seated","c":"adj."},{"ts":1527815127,"i":13322,"p":"نرس","f":"nars, nursa","g":"nars,nursa","e":"nurse","c":"n. m. anim. unisex"},{"ts":1527821673,"i":13532,"p":"نمجن","f":"namjún","g":"namjun","e":"moist, damp, wet","c":"adj."},{"ts":1527815130,"i":14135,"p":"وچ","f":"wuch, wUch","g":"wuch,wUch","e":"dry, land, ground","c":"adj. / n. m."},{"ts":1527817486,"i":14172,"p":"وران","f":"wraan","g":"wraan","e":"ruined, destroyed; destructive, bad, naughty","c":"adj."},{"ts":1527814373,"i":14208,"p":"ورک","f":"wruk","g":"wruk","e":"lost","c":"adj."},{"ts":1527822838,"i":14229,"p":"وروست","f":"wrost","g":"wrost","e":"decayed, spoiled, rotten","c":"adj."},{"ts":1609949334478,"i":14242,"p":"وریت","f":"wreet","g":"wreet","e":"roasted, grilled, barbequed, roast, burnt","c":"adj."},{"ts":1527811544,"i":14368,"p":"ولاړ","f":"waláaR, wuláaR","g":"walaaR,wulaaR","e":"standing","c":"adj."},{"ts":1527815498,"i":14487,"p":"یاد","f":"yaad","g":"yaad","e":"aforementioned","c":"adj."},{"ts":1527815434,"i":14508,"p":"یخ","f":"yakh, yukh","g":"yakh,yukh","e":"cold","c":"n. m. / adj."},{"ts":1568926976497,"i":734,"p":"اکسرې","f":"iksre","g":"iksre","e":"x-ray","c":"n. f."},{"ts":1602179757779,"i":769,"p":"الف بې","f":"alif be","g":"alifbe","e":"alphabet","c":"n. f."},{"ts":1527813840,"i":1146,"p":"ایرې","f":"eere","g":"eere","e":"ashes","c":"n. f. pl.","l":1527813839},{"ts":1527816692,"i":1184,"p":"اینکې","f":"aynake","g":"aynake","e":"glasses, spectacles","c":"n. f. pl."},{"ts":1527819286,"i":2151,"p":"پاشتقې","f":"paashtáqe","g":"paashtake","e":"stairs, steps, staircase","c":"n. f. pl."},{"ts":1527816299,"i":2887,"p":"پیسې","f":"peyse","g":"peyse","e":"money (plural of پېسې)","c":"n. f. pl."},{"ts":1527814529,"i":3347,"p":"تروې","f":"turwe","g":"turwe","e":"buttermilk","c":"n. f. pl."},{"ts":1527816369,"i":3823,"p":"تورسرې","f":"torsăre","g":"torsare","e":"widow, woman","c":"n. f."},{"ts":1577408787088,"i":7481,"p":"سپرې","f":"spre","g":"spre","e":"sprey (as in a medicinal spray)","c":"n. f."},{"ts":1527822255,"i":7516,"p":"سپېدې","f":"spedé","g":"spede","e":"break of dawn, first light of day, sunrise","c":"n. f. pl."},{"ts":1626765107329,"i":8301,"p":"شرې","f":"sharé","g":"share","e":"chickenpox, chicken pox","c":"n. f. pl."},{"ts":1527815008,"i":8469,"p":"شودې","f":"shoodé","g":"shoode","e":"milk","c":"n. f. pl."},{"ts":1527822131,"i":8494,"p":"شولې","f":"shole","g":"shole","e":"raw rice, unprocessed rice","c":"n. f. pl."},{"ts":1527815009,"i":8520,"p":"شیدې","f":"sheede","g":"sheede","e":"milk (plural of شيده)","c":"n. f. pl."},{"ts":1527823571,"i":8640,"p":"ښیالمې","f":"xyaalmé","g":"xyaalme","e":"spit, saliva","c":"n. f. pl."},{"ts":1527816530,"i":8653,"p":"ښینې","f":"xeene","g":"xeene","e":"sister in law","c":"n. f."},{"ts":1527823567,"i":11103,"p":"لاړې","f":"laaRe","g":"laaRe","e":"spit, saliva, slobber, slime","c":"n. f. pl."},{"ts":1527822275,"i":11497,"p":"لوښې","f":"looxe","g":"looxe","e":"dishes, pots, pans","c":"n. f. pl."},{"ts":1617443138210,"i":11894,"p":"مچیازې","f":"michyaaze, muchyaaze","g":"michyaaze,muchyaaze","e":"urine, pee, piss","c":"n. f. pl."},{"ts":1527814420,"i":12277,"p":"مستې","f":"maste","g":"maste","e":"yogurt","c":"n. f. pl."},{"ts":1577999538077,"i":13840,"p":"هرې","f":"hire","g":"hire","e":"a sound/cry used to drive sheep on","c":"n. f."},{"ts":1586551382412,"i":14249,"p":"وریژې","f":"wreejze","g":"wreejze","e":"rice","c":"n. f. pl."},{"ts":1527820261,"i":14583,"p":"یوې","f":"yuwe","g":"yuwe","e":"plow, plowing, plough, ploughing","c":"n. f."},{"ts":1527820771,"i":5,"p":"آباداني","f":"aabaadaanee","g":"aabaadaanee","e":"population, number of settlers; prosperity, well-being; organization of public services and amenities; construction","c":"n. f."},{"ts":1527813939,"i":54,"p":"آزادي","f":"aazaadee","g":"aazaadee","e":"freedom, independence","c":"n. f."},{"ts":1527818402,"i":160,"p":"اتلولي","f":"atalwalée","g":"atalwalee","e":"championship; courage","c":"n. f."},{"ts":1527814060,"i":477,"p":"اساني","f":"asaanee","g":"asaanee","e":"ease","c":"n. f."},{"ts":1527821293,"i":802,"p":"امادګي","f":"amaadagee","g":"amaadagee","e":"preparation, readiness, planning","c":"n. f."},{"ts":1527819502,"i":1217,"p":"باچهي","f":"baachahee","g":"baachahee","e":"kingship, kingdom, rule, throne, authority","c":"n. f."},{"ts":1527820035,"i":1222,"p":"باداري","f":"baadaaree","g":"baadaaree","e":"dominion, holding sway over someone","c":"n. f."},{"ts":1527817732,"i":1388,"p":"بدبختي","f":"badbakhtee","g":"badbakhtee","e":"misfortune, difficulty","c":"n. f."},{"ts":1588786872582,"i":1421,"p":"بدنامي","f":"badnaamee","g":"badnaamee","e":"shame, disrepute, dishonour","c":"n. f."},{"ts":1573682378816,"i":2075,"p":"بیماري","f":"beemaaree","g":"beemaaree","e":"sickness, illness","c":"n. f."},{"ts":1527816817,"i":2163,"p":"پاکوالي","f":"paakwaalee","g":"paakwaalee","e":"cleanliness, hygiene","c":"n. f."},{"ts":1586204619186,"i":2368,"p":"پرهېزګاري","f":"parhezgaaree","g":"parhezgaaree","e":"righteousness, abstinence, self-control","c":"n. f."},{"ts":1584444376984,"i":2526,"p":"پلارواکي","f":"plaarwaakee","g":"plaarwaakee","e":"patriarchy","c":"n. f."},{"ts":1527818744,"i":3296,"p":"ترکاڼي","f":"tarkaaNee","g":"tarkaaNee","e":"carpentry","c":"n. f."},{"ts":1527815337,"i":3408,"p":"تسلي","f":"tasallee","g":"tasallee","e":"consolation, comfort, satisfaction","c":"n. f."},{"ts":1527819521,"i":5803,"p":"خوشالي","f":"khoshaalee","g":"khoshaalee","e":"happiness (خوشحالي)","c":"n. f."},{"ts":1527818037,"i":5808,"p":"خوشبختي","f":"khooshbakhtee","g":"khooshbakhtee","e":"good fortune, good luck, hapiness","c":"n. f."},{"ts":1527815914,"i":5811,"p":"خوشبیني","f":"khooshbeenee","g":"khooshbeenee","e":"optimism","c":"n. f."},{"ts":1527811877,"i":6324,"p":"دوستي","f":"dostee","g":"dostee","e":"friendship","c":"n. f."},{"ts":1527818019,"i":6329,"p":"دوکانداري","f":"dookaandaaree","g":"dookaandaaree","e":"shopkeeping, retail store selling","c":"n. f."},{"ts":1527822080,"i":6381,"p":"دېموکراسي","f":"demokraasee","g":"demokraasee","e":"democracy","c":"n. f."},{"ts":1527813462,"i":10660,"p":"کیلي","f":"keelee","g":"keelee","e":"key","c":"n. f."},{"ts":1527814492,"i":10700,"p":"ګاوداري","f":"gaawdaaree","g":"gaawdaaree","e":"cattle farming","c":"n. f."},{"ts":1610013679820,"i":14226,"p":"ورورولي","f":"wrorwalée","g":"wrorwalee","e":"brotherhood","c":"n. f."},{"ts":1527821971,"i":1714,"p":"بن","f":"bun","g":"bun","e":"second wife of own husband","c":"n. f."},{"ts":1527816397,"i":3335,"p":"ترور","f":"tror","g":"tror","e":"aunt","c":"n. f. anim.","ppp":"تریندې","ppf":"treynde"},{"ts":1578704593901,"i":3709,"p":"تندار","f":"tandaar","g":"tandaar","e":"aunt (paternal uncle's wife)","c":"n. f."},{"ts":1527812785,"i":5750,"p":"خور","f":"khor","g":"khor","e":"sister","c":"n. f. irreg. anim.","ppp":"خویندې","ppf":"khweynde"},{"ts":1527812861,"i":11462,"p":"لور","f":"loor","g":"loor","e":"daughter","c":"n. f. anim.","ppp":"لوڼې","ppf":"looNe"},{"ts":1527812928,"i":12895,"p":"مور","f":"mor","g":"mor","e":"mother, mom","c":"n. f. anim.","ppp":"میندې, میېندې","ppf":"méynde, myénde"},{"ts":1527812912,"i":13012,"p":"مېرمن","f":"mermán","g":"merman","e":"lady, woman, wife","c":"n. f."},{"ts":1527816476,"i":13019,"p":"مېرېنۍ خور","f":"merenuy khor","g":"merenuykhor","e":"stepsister, half sister","c":"n. f."},{"ts":1527823521,"i":13358,"p":"نږور","f":"nGor","g":"ngor","e":"daughter-in-law","c":"n. f. anim.","ppp":"نږیندې","ppf":"nGeynde"},{"ts":1527816350,"i":14216,"p":"ورندار","f":"wrundaar","g":"wrundaar","e":"brothers wife, sister-in-law","c":"n. f."},{"ts":1527816485,"i":14563,"p":"یور","f":"yor","g":"yor","e":"wife of husbands brother, wife of brother-in-law","c":"n. f. anim.","ppp":"یوڼې","ppf":"yóoNe"},{"ts":1527821817,"i":721,"p":"اکا","f":"akáa","g":"akaa","e":"uncle (paternal)","c":"n. m."},{"ts":1527816411,"i":1194,"p":"بابا","f":"baabaa","g":"baabaa","e":"father, grandfather (vocative or in child's speech)","c":"n. m."},{"ts":1527819439,"i":1216,"p":"باچا","f":"baacháa","g":"baachaa","e":"king, ruler, president, padishah","c":"n. m."},{"ts":1527823298,"i":1264,"p":"باښه","f":"baaxá","g":"baaxa","e":"sparrow-hawk, eagle","c":"n. f."},{"ts":1527817718,"i":1727,"p":"بنده","f":"bandá","g":"banda","e":"slave, servant, a human, person (as in a slave of God)","c":"n. m."},{"ts":1527815031,"i":1732,"p":"بندي","f":"bandee","g":"bandee","e":"prisoner, captive","c":"n. m."},{"ts":1527815142,"i":2112,"p":"پاچا","f":"paachaa","g":"paachaa","e":"king","c":"n. m."},{"ts":1527817280,"i":4306,"p":"جذامي","f":"jUzaamee","g":"jUzaamee","e":"leper","c":"n. m."},{"ts":1527814236,"i":4795,"p":"چرسي","f":"charsee","g":"charsee","e":"pot smoker, pothead, someone addicted to marijuana, pot, hash","c":"n. m."},{"ts":1578618561154,"i":5202,"p":"حاجي","f":"haajee","g":"haajee","e":"Haji, someone who has gone on the Hajj","c":"n. m."},{"ts":1527821193,"i":5224,"p":"حامي","f":"haamee","g":"haamee","e":"supporter, protector, defender, patron, saviour","c":"n. m."},{"ts":1591711877815,"i":6294,"p":"دوبي","f":"dobée","g":"dobee","e":"washerman, someone who does the laundry","c":"n. m."},{"ts":1527820139,"i":6693,"p":"ربابي","f":"rabaabee","g":"rabaabee","e":"rabab player, rubab player","c":"n. m."},{"ts":1619278755267,"i":6696,"p":"ربړنه","f":"rabaRúna","g":"rabaRuna","e":"troubling, pestering","c":"n. f."},{"ts":1577066022588,"i":7412,"p":"ساقي","f":"saaqée","g":"saakee","e":"cupbearer, butler, bartender, alchohol maker","c":"n. m."},{"ts":1527822817,"i":7469,"p":"سپاهي","f":"sipaahee","g":"sipaahee","e":"soldier, warrior, guard","c":"n. m."},{"ts":1527812975,"i":7838,"p":"سلماني","f":"salmaanee","g":"salmaanee","e":"barber, hairdresser","c":"n. m."},{"ts":1527819414,"i":8188,"p":"شاهزاده","f":"shaahzaadá","g":"shaahzaada","e":"prince","c":"n. m."},{"ts":1527818084,"i":8261,"p":"شرابي","f":"sharaabee","g":"sharaabee","e":"drinker, drunkard, alcoholic, wine-bibber","c":"n. m."},{"ts":1527821950,"i":8446,"p":"شهزاده","f":"shahzaadá","g":"shahzaada","e":"prince","c":"n. m."},{"ts":1588158828142,"i":8589,"p":"ښکاري","f":"xkaaree","g":"xkaaree","e":"hunter","c":"n. m."},{"ts":1527815206,"i":9621,"p":"قاضي","f":"qaazee","g":"kaazee","e":"judge, religious authority/judge","c":"n. m."},{"ts":1527818500,"i":9678,"p":"قراردادي","f":"qaraardaadee","g":"karaardaadee","e":"contractor, supplier","c":"n. m."},{"ts":1527816446,"i":9892,"p":"کاکا","f":"kaakaa","g":"kaakaa","e":"paternal uncle, term of address for elderly man","c":"n. m."},{"ts":1595232159907,"i":10724,"p":"ګدا","f":"gadáa","g":"gadaa","e":"begger, panhandler","c":"n. m."},{"ts":1527816512,"i":11146,"p":"لالا","f":"laalaa","g":"laalaa","e":"elder brother, general form of familiar and respectful address","c":"n. m."},{"ts":1527812878,"i":11695,"p":"ماما","f":"maamaa","g":"maamaa","e":"uncle (maternal), respectful form of address","c":"n. m."},{"ts":1610556640847,"i":12099,"p":"مردمشماري","f":"mărdamshUmaaree","g":"mardamshUmaaree","e":"census","c":"n. f."},{"ts":1527815484,"i":12608,"p":"ملا","f":"mUllaa","g":"mUllaa","e":"mullah, priest","c":"n. m."},{"ts":1527821714,"i":12856,"p":"موازي","f":"mUwaazée","g":"mUwaazee","e":"parallel, matching, appropriate, identical","c":"adj."},{"ts":1527816514,"i":12886,"p":"موچي","f":"mochee","g":"mochee","e":"shoemaker, shoe repairman, cobbler","c":"n. m."},{"ts":1527823093,"i":13276,"p":"نبي","f":"nabee","g":"nabee","e":"prophet","c":"n. m. anim.","app":"انبیا","apf":"ambiyáa"},{"ts":1579041957559,"i":13314,"p":"ندا","f":"nadáa","g":"nadaa","e":"call, appeal, shout, summoning","c":"n. f."},{"ts":1527816253,"i":13608,"p":"نواسه","f":"nawaasa","g":"nawaasa","e":"grandson","c":"n. m."},{"ts":1527819971,"i":14113,"p":"والي","f":"waalée","g":"waalee","e":"governor","c":"n. m."},{"ts":1527818948,"i":174,"p":"اټسکی","f":"aTúskey","g":"aTuskey","e":"sneezing, sneeze","c":"n. m."},{"ts":1573681135691,"i":349,"p":"اربکی","f":"arbakéy","g":"arbakey","e":"tribal constable, tribal offical with police powers","c":"n. m."},{"ts":1573659054031,"i":365,"p":"ارتوالی","f":"artwáaley, aratwáaley","g":"artwaaley,aratwaaley","e":"width, spaciousness","c":"n. m."},{"ts":1527811890,"i":456,"p":"ازغی","f":"azghéy","g":"azghey","e":"thorn, prickle","c":"n. m."},{"ts":1527817036,"i":487,"p":"استازی","f":"astáazey","g":"astaazey","e":"representative, envoy, ambassador, commissioner","c":"n. m. unisex"},{"ts":1527816982,"i":538,"p":"استوګنځی","f":"astogundzéy","g":"astogundzey","e":"residence, dwelling; hostel, dormitory","c":"n. m."},{"ts":1527818489,"i":565,"p":"اسوېلی","f":"aswéley","g":"asweley","e":"yawn, sigh, deep breath, shivering","c":"n. m."},{"ts":1527822497,"i":993,"p":"اننګی","f":"anangéy","g":"anangey","e":"cheek","c":"n. m."},{"ts":1527821967,"i":1013,"p":"اوبسپی","f":"obspéy","g":"obspey","e":"beaver, seal","c":"n. m."},{"ts":1527822190,"i":1038,"p":"اور غالی","f":"orgháaley","g":"orghaaley","e":"stove, oven, furnace, hearth, floor of a fireplace","c":"n. m."},{"ts":1527821545,"i":1052,"p":"اورشیندی","f":"orsheendéy","g":"orsheendey","e":"volcano","c":"n. m."},{"ts":1527819192,"i":1054,"p":"اورګاډی","f":"orgáaDey","g":"orgaaDey","e":"train","c":"n. m."},{"ts":1527815585,"i":1068,"p":"اوړی","f":"óRey","g":"oRey","e":"summer","c":"n. m."},{"ts":1623044357441,"i":1334,"p":"ببوتنکی","f":"bubootúnkey","g":"bubootunkey","e":"tuft, clump, shock of hair","c":"n. m."},{"ts":1527821668,"i":1360,"p":"بڅری","f":"batsúrey","g":"batsurey","e":"spark, speck, flicker","c":"n. m."},{"ts":1527821239,"i":1443,"p":"بډوری","f":"baDóorey","g":"baDoorey","e":"kidney","c":"n. m."},{"ts":1527821099,"i":1508,"p":"برغوږی","f":"barghwáGey","g":"barghwagey","e":"earring","c":"n. m."},{"ts":1527822629,"i":1509,"p":"برغولی","f":"barghóley","g":"bargholey","e":"lid, cover","c":"n. m."},{"ts":1527811903,"i":1550,"p":"بری","f":"baréy","g":"barey","e":"success, victory","c":"n. m."},{"ts":1594904072731,"i":1747,"p":"بنګړی","f":"bangRéy","g":"bangRey","e":"bracelet","c":"n. m."},{"ts":1527817159,"i":1799,"p":"بوټی","f":"bóoTey","g":"booTey","e":"plant","c":"n. m."},{"ts":1527815055,"i":1828,"p":"بوږنوړی","f":"boGnwaRey","g":"bognwaRey","e":"terrible","c":"adj."},{"ts":1610618917483,"i":2173,"p":"پالنځی","f":"paalundzéy","g":"paalundzey","e":"orphanage, nursery","c":"n. m."},{"ts":1527814666,"i":2199,"p":"پای ټکی","f":"paayTákey","g":"paayTakey","e":"final point, end point","c":"n. m."},{"ts":1527816195,"i":2242,"p":"پټکی","f":"paTkéy","g":"paTkey","e":"small turban","c":"n. m."},{"ts":1527811611,"i":2248,"p":"پټی","f":"paTéy","g":"paTey","e":"field, place where crops are sown","c":"n. m."},{"ts":1588762458105,"i":2269,"p":"پخلنځی","f":"pukhlandzéy","g":"pukhlandzey","e":"kitchen","c":"n. m."},{"ts":1527816059,"i":2270,"p":"پخلی","f":"pakhléy","g":"pakhley","e":"cooking, preparation of food; wisdom, maturity","c":"n. m."},{"ts":1527821241,"i":2339,"p":"پرګی","f":"purgéy, pirgéy","g":"purgey,pirgey","e":"acorn","c":"n. m."},{"ts":1527813812,"i":2434,"p":"پړونی","f":"paRóoney","g":"paRooney","e":"veil, covering for women, cover","c":"n. m."},{"ts":1527822385,"i":2435,"p":"پړی","f":"púRey","g":"puRey","e":"rope, cable, cord","c":"n. m."},{"ts":1527812980,"i":2449,"p":"پس پسی","f":"puspuséy","g":"puspusey","e":"whispering, murmuring, rumor, gossip","c":"n. m."},{"ts":1527814005,"i":2465,"p":"پسرلی","f":"psarléy, pusărléy","g":"psarley,pusarley","e":"spring, springtime (season)","c":"n. m."},{"ts":1527821229,"i":2496,"p":"پښتورګی","f":"paxtawúrgey","g":"paxtawurgey","e":"kidney","c":"n. m."},{"ts":1527817035,"i":2536,"p":"پلاوی","f":"pláawey","g":"plaawey","e":"delegation, delegate, mission","c":"n. m."},{"ts":1527815187,"i":2749,"p":"پوزی","f":"pozéy","g":"pozey","e":"mat","c":"n. m."},{"ts":1527816627,"i":2753,"p":"پوستکی","f":"postukéy","g":"postukey","e":"fleece, pelt, skin, shell, rind, bark; ear lobe","c":"n. m."},{"ts":1527819332,"i":2764,"p":"پوښتورګی","f":"pooxtawúrgey","g":"pooxtawurgey","e":"kidney","c":"n. m."},{"ts":1527819496,"i":2786,"p":"پوهاوی","f":"pohaawéy","g":"pohaawey","e":"understanding, comprehension","c":"n. m."},{"ts":1527815168,"i":2821,"p":"پېټی","f":"peTéy","g":"peTey","e":"load, weight, burden","c":"n. m."},{"ts":1527815927,"i":2867,"p":"پېرونکی","f":"peróonkey","g":"peroonkey","e":"customer","c":"n. m. anim. unisex"},{"ts":1527815017,"i":2869,"p":"پېروی","f":"perúwey, peráwey","g":"peruwey,perawey","e":"cream","c":"n. m."},{"ts":1527815325,"i":3039,"p":"تاوتریخوالی","f":"taawtreekhwáaley","g":"taawtreekhwaaley","e":"violence","c":"n. m."},{"ts":1611397750325,"i":3045,"p":"تاوی","f":"taawéy","g":"taawey","e":"screwdriver, screw","c":"n. m."},{"ts":1622374978659,"i":3069,"p":"تبرګی","f":"tubúrgey","g":"tuburgey","e":"hatchet","c":"n. m."},{"ts":1527818705,"i":3153,"p":"تخرګی","f":"tkhurgéy","g":"tkhurgey","e":"gusset (in a shirt)","c":"n. m."},{"ts":1527814392,"i":3385,"p":"تړونی","f":"taRóoney","g":"taRooney","e":"band, bandage","c":"n. m."},{"ts":1527822723,"i":3446,"p":"تشی","f":"túshey","g":"tushey","e":"empty space, void, side, groin","c":"n. m."},{"ts":1577585114379,"i":3649,"p":"تلی","f":"táley","g":"taley","e":"sole (of a shoe); yard, compound; palm","c":"n. m."},{"ts":1527816630,"i":3723,"p":"تندی","f":"tandéy","g":"tandey","e":"forehead, brow, slope","c":"n. m."},{"ts":1527821980,"i":3762,"p":"تڼی","f":"taNéy","g":"taNey","e":"bellyband (of a harness)","c":"n. m."},{"ts":1527819719,"i":3833,"p":"توری","f":"tórey","g":"torey","e":"spleen","c":"n. m."},{"ts":1527819721,"i":3834,"p":"توری","f":"toréy","g":"torey","e":"letter, letter of the alphabet","c":"n. m."},{"ts":1527819622,"i":3859,"p":"توغندی","f":"toghandéy","g":"toghandey","e":"rocket, missile","c":"n. m."},{"ts":1527814705,"i":3887,"p":"توکی","f":"tókey","g":"tokey","e":"element, item, material; thing, material, kind, type","c":"n. m."},{"ts":1527819563,"i":4062,"p":"ټکری","f":"TUkréy","g":"TUkrey","e":"piece, small piece; a length (of cloth); blanket","c":"n. m."},{"ts":1577408381145,"i":4063,"p":"ټکری","f":"Tikréy","g":"Tikrey","e":"shawl, head-covering","c":"n. m."},{"ts":1527814667,"i":4075,"p":"ټکی","f":"Tákey","g":"Takey","e":"word; point; dot","c":"n. m."},{"ts":1527813617,"i":4182,"p":"ټیکری","f":"Teekréy","g":"Teekrey","e":"shawl, head covering","c":"n. m."},{"ts":1527819733,"i":4605,"p":"ځلمی","f":"dzalméy","g":"dzalmey","e":"young, youth, young lad","c":"n. m."},{"ts":1527815465,"i":4693,"p":"چارواکی","f":"chaarwáakey","g":"chaarwaakey","e":"official authority, official, authority","c":"n. m. anim. unisex"},{"ts":1527822356,"i":4883,"p":"چنجی","f":"chinjéy","g":"chinjey","e":"worm, small insect","c":"n. m."},{"ts":1527822808,"i":4902,"p":"چنی","f":"chanéy","g":"chaney","e":"basin, bowl","c":"n. m."},{"ts":1527822357,"i":5003,"p":"چینجی","f":"cheenjéy","g":"cheenjey","e":"worm, small insect","c":"n. m."},{"ts":1527819046,"i":5015,"p":"څاڅکی","f":"tsáatskey","g":"tsaatskey","e":"drop","c":"n. m."},{"ts":1527817874,"i":5087,"p":"څرنګوالی","f":"tsurangwáaley","g":"tsurangwaaley","e":"quality, nature","c":"n. m."},{"ts":1527814041,"i":5092,"p":"څړمنی","f":"tsaRmúney","g":"tsaRmuney","e":"spring (season)","c":"n. m."},{"ts":1573055311846,"i":5430,"p":"خبرداری","f":"khabardáarey","g":"khabardaarey","e":"warning, notice, alarm","c":"n. m."},{"ts":1527820324,"i":5471,"p":"خټکی","f":"khaTakéy","g":"khaTakey","e":"melon","c":"n. m."},{"ts":1527819828,"i":6080,"p":"درناوی","f":"dranaawéy","g":"dranaawey","e":"weight; respect, honour","c":"n. m."},{"ts":1588161660483,"i":6418,"p":"ډانګوری","f":"Daangooréy","g":"Daangoorey","e":"crutch, walking-stick, cane","c":"n. m."},{"ts":1527819732,"i":7143,"p":"زلمی","f":"zalméy","g":"zalmey","e":"young, youth, young lad","c":"n. m."},{"ts":1527813708,"i":7274,"p":"زېری","f":"zérey","g":"zerey","e":"good news, gospel","c":"n. m."},{"ts":1588758498458,"i":7279,"p":"زېړی","f":"zeRéy","g":"zeRey","e":"jaundice","c":"n. m."},{"ts":1571626392709,"i":7283,"p":"زېږنځی","f":"zeGundzéy","g":"zegundzey","e":"birthplace","c":"n. m."},{"ts":1527815698,"i":7335,"p":"ژمی","f":"jzúmey, jzímey","g":"jzumey,jzimey","e":"winter","c":"n. m."},{"ts":1573686563723,"i":7358,"p":"ژی","f":"jzey","g":"jzey","e":"wineskin, bagpipe, skin for carrying liquid","c":"n. m."},{"ts":1527815239,"i":7383,"p":"ساتېری","f":"saatérey","g":"saaterey","e":"entertainment, fun, recreation","c":"n. m."},{"ts":1527813725,"i":7399,"p":"ساری","f":"sáarey","g":"saarey","e":"equal, equivalent, match, precedent","c":"n. m."},{"ts":1527814021,"i":7478,"p":"سپرلی","f":"sparléy","g":"sparley","e":"spring (season)","c":"n. m."},{"ts":1527813509,"i":7493,"p":"سپکاوی","f":"spukaawéy","g":"spukaawey","e":"insult, disgrace, defamation, disrespect","c":"n. m."},{"ts":1527815298,"i":7530,"p":"سپیناوی","f":"speenaawéy","g":"speenaawey","e":"clarification, attestation","c":"n. m."},{"ts":1578002674551,"i":7548,"p":"سترغلی","f":"sturghúley","g":"sturghuley","e":"eye-socket, eyelid; orbit","c":"n. m."},{"ts":1527811999,"i":7584,"p":"ستوری","f":"stórey","g":"storey","e":"star","c":"n. m."},{"ts":1527817001,"i":7595,"p":"ستونی","f":"stóoney","g":"stooney","e":"throat, larynx","c":"n. m."},{"ts":1527813511,"i":7695,"p":"سرخوږی","f":"sărkhooGéy, sărkhwuGéy","g":"sarkhoogey,sarkhwugey","e":"headache, trouble","c":"n. m."},{"ts":1527815251,"i":7770,"p":"سړی","f":"saRéy","g":"saRey","e":"man","c":"n. m.","ec":"man","ep":"men"},{"ts":1527819850,"i":7778,"p":"سږی","f":"súGey","g":"sugey","e":"lung","c":"n. m."},{"ts":1527812302,"i":7993,"p":"سوری","f":"sooréy","g":"soorey","e":"hole, slit, opening","c":"n. m."},{"ts":1527818221,"i":8063,"p":"سوی","f":"swey","g":"swey","e":"burning, zeal, fervour","c":"n. m."},{"ts":1527812304,"i":8141,"p":"سیوری","f":"syórey, syóorey","g":"syorey,syoorey","e":"shade, shadow","c":"n. m."},{"ts":1527815268,"i":8516,"p":"شی","f":"shey","g":"shey","e":"thing","c":"n. m.","ppp":"شیان، شیونه","ppf":"sheyáan, sheyóona"},{"ts":1527822527,"i":8578,"p":"ښتګری","f":"xatgaréy","g":"xatgarey","e":"ankle, ankle-bone","c":"n. m."},{"ts":1527812793,"i":8629,"p":"ښوونځی","f":"xowundzéy","g":"xowundzey","e":"school","c":"n. m."},{"ts":1527821064,"i":8634,"p":"ښویکی","f":"xwayakéy","g":"xwayakey","e":"a quick, clever, agile, bright man; a swindler, a fraud","c":"n. m."},{"ts":1527822650,"i":9090,"p":"غټوالی","f":"ghaTwáaley","g":"ghaTwaaley","e":"size, largeness, bigness","c":"n. m."},{"ts":1527814569,"i":9156,"p":"غړی","f":"ghúRey","g":"ghuRey","e":"member","c":"n. m.‌ unisex"},{"ts":1527817627,"i":9176,"p":"غشی","f":"ghúshey","g":"ghushey","e":"arrow","c":"n. m."},{"ts":1527822913,"i":9233,"p":"غمی","f":"ghaméy","g":"ghamey","e":"precious stone, precious stone in a signet ring","c":"n. m."},{"ts":1527816181,"i":9796,"p":"قی","f":"qey","g":"key","e":"vomit, nausea (Arabic)","c":"n. m."},{"ts":1527814715,"i":9856,"p":"کاروونکی","f":"kaarawóonkey","g":"kaarawoonkey","e":"user","c":"n. m. anim. unisex"},{"ts":1527823295,"i":9931,"p":"کاڼی","f":"káaNey","g":"kaaNey","e":"stone, rock","c":"n. m."},{"ts":1527818563,"i":9950,"p":"کبوړی","f":"kabóoRey","g":"kabooRey","e":"muscle","c":"n. m."},{"ts":1527822824,"i":9964,"p":"کتاب ګوټی","f":"kitaabgóTey","g":"kitaabgoTey","e":"booklet, notebook","c":"n. m."},{"ts":1582388629980,"i":10186,"p":"کسی","f":"kúsey","g":"kusey","e":"pupil (of an eye)","c":"n. m."},{"ts":1594906790729,"i":10251,"p":"ککی","f":"kakéy","g":"kakey","e":"child","c":"n. m. anim. unisex","ec":"child","ep":"children"},{"ts":1527812836,"i":10291,"p":"کلی","f":"kúley, kíley","g":"kuley,kiley","e":"village","c":"n. m."},{"ts":1610616852625,"i":10404,"p":"کنګرېزی","f":"kangrezéy","g":"kangrezey","e":"echo","c":"n. m."},{"ts":1527819196,"i":10679,"p":"ګاډی","f":"gáaDey","g":"gaaDey","e":"car, train","c":"n. m."},{"ts":1579016593220,"i":10927,"p":"ګنی","f":"ganéy","g":"ganey","e":"beehive; wasps' nest","c":"n. m."},{"ts":1527819076,"i":10975,"p":"ګوډاګی","f":"gooDaagéy","g":"gooDaagey","e":"doll, puppet","c":"n. m."},{"ts":1527822505,"i":11031,"p":"ګومبوری","f":"goombooréy","g":"goomboorey","e":"cheek","c":"n. m."},{"ts":1527819079,"i":11126,"p":"لاسپوڅی","f":"laaspotséy","g":"laaspotsey","e":"puppet","c":"n. m."},{"ts":1573149568665,"i":11129,"p":"لاسرسی","f":"laasraséy","g":"laasrasey","e":"access, availability","c":"n. m."},{"ts":1527817464,"i":11226,"p":"لرګی","f":"largéy","g":"largey","e":"wood, timber","c":"n. m."},{"ts":1527822801,"i":11271,"p":"لستوڼی","f":"lastóNey","g":"lastoNey","e":"sleeve","c":"n. m."},{"ts":1527814401,"i":11435,"p":"لوبونی","f":"lobawúney","g":"lobawuney","e":"toy","c":"n. m."},{"ts":1527814519,"i":11467,"p":"لوری","f":"lórey","g":"lorey","e":"side, direction","c":"n. m."},{"ts":1527823103,"i":11552,"p":"لیدلوری","f":"leedlórey","g":"leedlorey","e":"perspective, viewpoint","c":"n. m."},{"ts":1527819920,"i":11654,"p":"ماشی","f":"máashey","g":"maashey","e":"mosquito, midge","c":"n. m."},{"ts":1527820224,"i":11892,"p":"مچوژی","f":"muchwajzéy","g":"muchwajzey","e":"fly swatter","c":"n. m."},{"ts":1527817770,"i":12196,"p":"مړی","f":"múRey","g":"muRey","e":"dead body, corpse","c":"n. m."},{"ts":1527813189,"i":12820,"p":"منی","f":"máney","g":"maney","e":"fall, autumn","c":"n. m."},{"ts":1527812421,"i":13031,"p":"مېږی","f":"meGéy","g":"megey","e":"ant","c":"n. m."},{"ts":1527819227,"i":13393,"p":"نشتوالی","f":"nashtwáaley","g":"nashtwaaley","e":"lack, absence","c":"n. m."},{"ts":1527823577,"i":13683,"p":"نیالګی","f":"niyaalgéy","g":"niyaalgey","e":"sapling, seedling, sprout, young tree","c":"n. m."},{"ts":1527812073,"i":13819,"p":"هډوکی","f":"haDóokey","g":"haDookey","e":"bone","c":"n. m."},{"ts":1527812668,"i":13832,"p":"هرکلی","f":"hărkáley","g":"harkaley","e":"welcome","c":"n. m."},{"ts":1588153218244,"i":13856,"p":"هسکوالی","f":"haskwáaley","g":"haskwaaley","e":"height, elevation, tallness","c":"n. m."},{"ts":1585309922022,"i":14110,"p":"والګی","f":"waalgéy","g":"waalgey","e":"flu, respiratory illness, influenza, cold","c":"n. m."},{"ts":1527821465,"i":14392,"p":"ولی","f":"wuléy","g":"wuley","e":"shoulder","c":"n. m."},{"ts":1527822004,"i":33,"p":"آخرینی","f":"aakhireenéy","g":"aakhireeney","e":"last, final, latest","c":"adj."},{"ts":1591872915426,"i":697,"p":"افغانی","f":"afghaanéy","g":"afghaaney","e":"Afghan (person)","c":"n. m. anim. unisex"},{"ts":1612616237182,"i":2160,"p":"پاکستانی","f":"paakistaanéy","g":"paakistaaney","e":"Pakistani (person)","c":"n. m. anim. unisex"},{"ts":1527813400,"i":1086,"p":"اوسنی","f":"oosanéy","g":"oosaney","e":"current, present","c":"adj."},{"ts":1527815661,"i":1106,"p":"اولنی","f":"awwalunéy","g":"awwaluney","e":"first, beginning","c":"adj."},{"ts":1527812476,"i":1357,"p":"بچی","f":"bachéy","g":"bachey","e":"child, offspring","c":"n. m. anim. unisex","ec":"child","ep":"children"},{"ts":1527816646,"i":1783,"p":"بهرنی","f":"baharanéy, bahranéy","g":"baharaney,bahraney","e":"foreigner, foreign; outside, outer","c":"adj."},{"ts":1527818769,"i":2027,"p":"بېړنی","f":"beRanéy","g":"beRaney","e":"emergency","c":"adj."},{"ts":1592382613021,"i":2277,"p":"پخوانی","f":"pakhwaanéy","g":"pakhwaaney","e":"old, ancient, previous, former","c":"adj."},{"ts":1527819532,"i":2317,"p":"پردی","f":"pradéy, prudéy","g":"pradey,prudey","e":"foreign, unrelated, another('s)","c":"adj."},{"ts":1577381894391,"i":2357,"p":"پرنګی","f":"parangéy","g":"parangey","e":"Englishman, Westerner, foreigner","c":"n. m. unisex / adj."},{"ts":1527820194,"i":2531,"p":"پلانکی","f":"pulaankéy","g":"pulaankey","e":"so-and-so, such-and-such, ambiguous pronoun (فلان)","c":"adj. / n. m. anim. unisex"},{"ts":1527820130,"i":2571,"p":"پلوی","f":"palawéy","g":"palawey","e":"adherent, supporter; the outside or further ox in a team of oxes grinding or threshing","c":"n. m. anim. unisex"},{"ts":1582390092514,"i":2728,"p":"پورتنی","f":"portinéy","g":"portiney","e":"upper, above","c":"adj."},{"ts":1610617741649,"i":4626,"p":"ځنډنی","f":"dzanDanéy, dzanDunéy","g":"dzanDaney,dzanDuney","e":"old, ancient","c":"adj."},{"ts":1610793723568,"i":4996,"p":"چېلی","f":"cheléy","g":"cheley","e":"ram, goat","c":"n. m. anim. unisex"},{"ts":1527819362,"i":5794,"p":"خوسی","f":"khooséy","g":"khoosey","e":"calf (animal)","c":"n. m. anim. unisex","ec":"calf","ep":"calves"},{"ts":1590052667427,"i":6047,"p":"درستی","f":"drustéy, drastéy","g":"drustey,drastey","e":"witness","c":"n. m. anim. unisex"},{"ts":1527822854,"i":7011,"p":"ړومبی","f":"Roombéy","g":"Roombey","e":"first, before","c":"adj."},{"ts":1527820213,"i":7152,"p":"زمری","f":"zmaréy","g":"zmarey","e":"lion","c":"n. m. anim. unisex"},{"ts":1527813923,"i":7355,"p":"ژوندی","f":"jzwundéy","g":"jzwundey","e":"living","c":"adj."},{"ts":1527815299,"i":7506,"p":"سپی","f":"spéy","g":"spey","e":"dog","c":"n. m. anim. unisex"},{"ts":1527820788,"i":8563,"p":"ښارنی","f":"xaaranéy","g":"xaaraney","e":"city, urban","c":"adj."},{"ts":1527812822,"i":10470,"p":"کوچنی","f":"koochnéy","g":"koochney","e":"little, small; child, little one","c":"adj. / n. m. anim. unisex"},{"ts":1527823742,"i":10472,"p":"کوچی","f":"kochéy","g":"kochey","e":"migratory, nomadic","c":"adj."},{"ts":1527818765,"i":10832,"p":"ګړندی","f":"guRandéy","g":"guRandey","e":"speedy, high speed, fast, quick","c":"adj."},{"ts":1527819130,"i":10864,"p":"ګلالی","f":"gUlaaléy","g":"gUlaaley","e":"pretty, beautiful, lovely, cute, sweet","c":"adj."},{"ts":1576101261017,"i":10924,"p":"ګنګی","f":"gUngéy, gangéy","g":"gUngey,gangey","e":"mute, dumb (person)","c":"n. m. anim. unisex / adj."},{"ts":1582316583262,"i":11170,"p":"لاندینی","f":"laandeenéy","g":"laandeeney","e":"lower, bottom","c":"adj."},{"ts":1527816249,"i":11370,"p":"لمسی","f":"lmaséy","g":"lmasey","e":"grandchild","c":"n. m. anim. unisex","ec":"grandchild","ep":"grandchildren"},{"ts":1527813472,"i":11514,"p":"لومړنی","f":"loomRanéy","g":"loomRaney","e":"first","c":"adj."},{"ts":1527813132,"i":11516,"p":"لومړی","f":"loomRéy","g":"loomRey","e":"first","c":"adj."},{"ts":1527819910,"i":11798,"p":"متلی","f":"mutléy","g":"mutley","e":"slippery, smooth","c":"adj."},{"ts":1527820414,"i":12735,"p":"منځنی","f":"mandzunéy","g":"mandzuney","e":"middle, central","c":"adj."},{"ts":1527811202,"i":12983,"p":"میاشتنی","f":"miyaashtanéy","g":"miyaashtaney","e":"monthly","c":"adj."},{"ts":1527819320,"i":13335,"p":"نری","f":"naréy","g":"narey","e":"thin; mild; high (pitch)","c":"adj."},{"ts":1527816251,"i":13537,"p":"نمسی","f":"nmaséy","g":"nmasey","e":"grandchild","c":"n. m. anim. unisex","ec":"grandchild","ep":"grandchildren"},{"ts":1527821373,"i":14002,"p":"هوسی","f":"hoséy","g":"hosey","e":"deer","c":"n. m. anim. unisex","ec":"deer","ep":"deer"},{"ts":1527813636,"i":14236,"p":"وروستی","f":"wroostéy","g":"wroostey","e":"last, latest, recent","c":"adj."},{"ts":1527815430,"i":14555,"p":"یوازنی","f":"yawaazunéy","g":"yawaazuney","e":"only, unique, sole","c":"adj."},{"ts":1582853867682,"i":1088,"p":"اوسېدونکی","f":"osedóonkey","g":"osedoonkey","e":"resident","c":"n. m. anim. unisex"},{"ts":1527813469,"i":1372,"p":"بخښونکی","f":"bakhxóonkey","g":"bakhxoonkey","e":"forgiving","c":"adj."},{"ts":1527817829,"i":2735,"p":"پوروړی","f":"porwáRey, porawúRey","g":"porwaRey,porawuRey","e":"debtor, in debt","c":"n. m. anim. unisex"},{"ts":1527815205,"i":2813,"p":"پیاوړی","f":"pyaawáRey","g":"pyaawaRey","e":"powerful, strong, great","c":"adj."},{"ts":1527815924,"i":2866,"p":"پېرودونکی","f":"perodóonkey","g":"perodoonkey","e":"customer","c":"n. m. anim. unisex"},{"ts":1527819604,"i":3363,"p":"ترینګلی","f":"treengúley","g":"treenguley","e":"tense, stern, grim, sour, moody (person)","c":"adj."},{"ts":1527813406,"i":3373,"p":"تړلی","f":"taRuley","g":"taRuley","e":"bound, tied, closed","c":"adj."},{"ts":1527815381,"i":3392,"p":"تږی","f":"túGey","g":"tugey","e":"thirsty","c":"adj."},{"ts":1527817607,"i":3813,"p":"تور مخی","f":"tormúkhey","g":"tormukhey","e":"disgraceful, shameful, dishonered","c":"adj."},{"ts":1527822859,"i":5046,"p":"څپولی","f":"tsapoley","g":"tsapoley","e":"dishevelled, messy, curly (with hair etc.)","c":"adj."},{"ts":1527811466,"i":5193,"p":"څېړونکی","f":"tseRóonkey","g":"tseRoonkey","e":"researcher","c":"n. m. anim. unisex"},{"ts":1527812377,"i":5310,"p":"حکم منونکی","f":"hUkum munóonkey","g":"hUkummunoonkey","e":"obedient, submissive","c":"adj."},{"ts":1527817299,"i":5354,"p":"حیرانوونکی","f":"heyraanawóonkey","g":"heyraanawoonkey","e":"amazing, surprising","c":"adj."},{"ts":1527813282,"i":5527,"p":"خرڅوونکی","f":"khartsawóonkey","g":"khartsawoonkey","e":"seller","c":"n. m. anim. unisex"},{"ts":1527812809,"i":5696,"p":"خوار ځواکی","f":"khwaar dzwáakey","g":"khwaardzwaakey","e":"malnourished, underfed","c":"adj."},{"ts":1591871233587,"i":5784,"p":"خوږژبی","f":"khoGjzubey","g":"khogjzubey","e":"well-spoken","c":"adj."},{"ts":1527814118,"i":6036,"p":"دردوونکی","f":"dărdawóonkey","g":"dardawoonkey","e":"painful, hurtful, agonizing","c":"adj."},{"ts":1527820657,"i":6128,"p":"درېیمګړی","f":"dre`yamgúRey","g":"dreyamguRey","e":"mediator, arbitrator","c":"n. m. anim. unisex"},{"ts":1527815713,"i":6603,"p":"راتلونکی","f":"raatlóonkey","g":"raatloonkey","e":"coming, future","c":"adj."},{"ts":1527812142,"i":6794,"p":"رښتنی","f":"rixtíney","g":"rixtiney","e":"truthful, true","c":"adj."},{"ts":1527812161,"i":6795,"p":"رښتونی","f":"rixtóoney","g":"rixtooney","e":"truthful","c":"adj."},{"ts":1527811507,"i":6801,"p":"رښتینی","f":"rixtéeney","g":"rixteeney","e":"true, truthful, righteous, good","c":"adj."},{"ts":1527813758,"i":7054,"p":"زدکوونکی","f":"zdakawóonkey","g":"zdakawoonkey","e":"student, learner, pupil","c":"n. m. anim. unisex"},{"ts":1577058349091,"i":7095,"p":"زړه پوری","f":"zRupóorey","g":"zRupoorey","e":"interesting, entertaining, attractive, pleasant","c":"adj."},{"ts":1527817400,"i":7103,"p":"زړه سواندی","f":"zRuswaandey","g":"zRuswaandey","e":"merciful, compassionate, soft-hearted","c":"adj."},{"ts":1527819587,"i":7304,"p":"ژباړونکی","f":"jzbaaRóonkey","g":"jzbaaRoonkey","e":"translator","c":"n. m. anim. unisex"},{"ts":1527814888,"i":7326,"p":"ژغورونکی","f":"jzghoróonkey","g":"jzghoroonkey","e":"savior, saviour, rescuer","c":"n. m. anim. unisex"},{"ts":1527818109,"i":7512,"p":"سپېڅلی","f":"spetsúley","g":"spetsuley","e":"absolutely or perfectly clean, uncontaminated, pure (holy, magnificent – سپيڅلي??)","c":"adj."},{"ts":1527811338,"i":7524,"p":"سپین زړی","f":"speenzuRey","g":"speenzuRey","e":"sincere hearted, candid, trusting","c":"adj."},{"ts":1527815306,"i":7562,"p":"ستړی","f":"stúRey","g":"stuRey","e":"tired","c":"adj."},{"ts":1527822745,"i":7605,"p":"سټکوری","f":"suTkóorey","g":"suTkoorey","e":"burned, charred; wrinkling, puckering; seared, scorched; frozen stiff with cold; withered","c":"adj."},{"ts":1527817442,"i":7628,"p":"سخت زړی","f":"sakhtzúRey","g":"sakhtzuRey","e":"heard-hearted, cruel, heartless, callous","c":"adj."},{"ts":1527816932,"i":7685,"p":"سرتېری","f":"sărtérey","g":"sarterey","e":"soldier","c":"n. m. anim. unisex"},{"ts":1527820170,"i":7909,"p":"سندرغاړی","f":"sandurgháaRey","g":"sandurghaaRey","e":"singer","c":"n. m. anim. unisex"},{"ts":1527819964,"i":7966,"p":"سوځېدونکی","f":"swadzedóonkey","g":"swadzedoonkey","e":"burning","c":"adj."},{"ts":1527821951,"i":8062,"p":"سوی","f":"súwey","g":"suwey","e":"burned","c":"adj."},{"ts":1527812779,"i":8602,"p":"ښکلی","f":"xkÚley","g":"xkUley","e":"beautiful","c":"adj."},{"ts":1527812806,"i":8630,"p":"ښوونکی","f":"xUwóonkey","g":"xUwoonkey","e":"teacher","c":"n. m. anim. unisex"},{"ts":1527811350,"i":9216,"p":"غلی","f":"ghúley","g":"ghuley","e":"quiet, silent","c":"adj."},{"ts":1527819637,"i":9843,"p":"کارکوونکی","f":"kaarkawóonkey","g":"kaarkawoonkey","e":"worker","c":"n. m. anim. unisex"},{"ts":1527818613,"i":10335,"p":"کمزوری","f":"kamzórey","g":"kamzorey","e":"weak, feeble, frail, faint, poor","c":"adj."},{"ts":1595516629483,"i":10415,"p":"کڼوونکی","f":"kaNawóonkey","g":"kaNawoonkey","e":"deafening","c":"adj.","l":1578770339559},{"ts":1527820661,"i":13063,"p":"مېنځګړی","f":"mendzgúRey","g":"mendzguRey","e":"mediator, go-between, arbitrator","c":"n. m. anim. unisex"},{"ts":1527814047,"i":13659,"p":"نوموړی","f":"noomwáRey","g":"noomwaRey","e":"aforesaid, above-mentioned","c":"adj."},{"ts":1527813822,"i":13669,"p":"نوی","f":"núwey","g":"nuwey","e":"new","c":"adj."},{"ts":1586453720908,"i":13805,"p":"هڅوونکی","f":"hatsawóonkey","g":"hatsawoonkey","e":"encouraging / encourager","c":"adj."},{"ts":1588163180700,"i":14045,"p":"هېښوونکی","f":"hexawóonkey","g":"hexawoonkey","e":"stunning, shocking, perplexing, amazing","c":"adj."},{"ts":1527823715,"i":14263,"p":"وړکوټی","f":"waRkóTey","g":"waRkoTey","e":"small, little; (also as a child)","c":"adj."},{"ts":1527823714,"i":14264,"p":"وړکی","f":"waRÚkey","g":"waRUkey","e":"small, little; (also as a child)","c":"adj."},{"ts":1527815403,"i":14269,"p":"وړوکی","f":"waRóokey","g":"waRookey","e":"little, small","c":"adj."},{"ts":1527813916,"i":14293,"p":"وژونکی","f":"wajzóonkey","g":"wajzoonkey","e":"killing, lethal, deadly","c":"adj."},{"ts":1527815424,"i":14302,"p":"وږی","f":"wúGey","g":"wugey","e":"hungry","c":"adj."},{"ts":1527823713,"i":14418,"p":"ووړکی","f":"wóRkey","g":"woRkey","e":"small, little; (also as a child)","c":"adj."},{"ts":1527816455,"i":14462,"p":"وېشلی","f":"weshúley","g":"weshuley","e":"separated, divided","c":"adj."},{"ts":1527812798,"i":5621,"p":"خفه","f":"khúfa","g":"khufa","e":"sad, upset, angry; choked, suffocated","c":"adj."},{"ts":1527812792,"i":5802,"p":"خوشاله","f":"khoshaala","g":"khoshaala","e":"happy, glad","c":"adj."},{"ts":1527812761,"i":8574,"p":"ښایسته","f":"xáaysta","g":"xaaysta","e":"beautiful","c":"adj."},{"ts":1527812156,"i":688,"p":"افسر","f":"afsar","g":"afsar","e":"officer","c":"n. m. anim. unisex"},{"ts":1527815137,"i":1049,"p":"اورپکی","f":"orpákey","g":"orpakey","e":"instigator, insurgent, terrorist","c":"n. m. anim. unisex"},{"ts":1623044005072,"i":1698,"p":"بلواګر","f":"balwaagar","g":"balwaagar","e":"insurrectionist, rebel","c":"n. m. anim. unisex"},{"ts":1527817965,"i":2176,"p":"پالونکی","f":"paalóonkey","g":"paaloonkey","e":"keeper, one who brings up, raises (cattle etc.)","c":"n. m. anim. unisex"},{"ts":1527819228,"i":2543,"p":"پلټونکی","f":"pulaTóonkey","g":"pulaToonkey","e":"inspector, detective, person checking people at the doors etc.","c":"n. m. anim. unisex"},{"ts":1527816431,"i":3336,"p":"ترورزی","f":"trorzéy","g":"trorzey","e":"cousin (of paternal aunt)","c":"n. m. anim. unisex","ppp":"ترورزامن","ppf":"trorzaamun"},{"ts":1527820820,"i":3509,"p":"تعقیبوونکی","f":"ta'qeebawóonkey","g":"takeebawoonkey","e":"follower","c":"n. m. anim. unisex"},{"ts":1586270915475,"i":3934,"p":"تي لرونکی","f":"tee laróonkey","g":"teelaroonkey","e":"mammal","c":"adj. / n. m. anim. unisex"},{"ts":1613563994424,"i":4125,"p":"ټوقمار","f":"Toqmaar","g":"Tokmaar","e":"joker, jester, mocker","c":"n. m. anim. unisex"},{"ts":1527812802,"i":5499,"p":"خر","f":"khur","g":"khur","e":"donkey","c":"n. m. anim. unisex irreg.","infap":"خره","infaf":"khru","infbp":"خر","infbf":"khr"},{"ts":1527822535,"i":5853,"p":"خیاط","f":"khayáat","g":"khayaat","e":"tailor","c":"n. m. anim. unisex"},{"ts":1622873938137,"i":6053,"p":"درغلګر","f":"darghalgar","g":"darghalgar","e":"crook, swindler, criminal","c":"n. m. anim. unisex"},{"ts":1527820656,"i":6125,"p":"دریمګړی","f":"driyamgúRey","g":"driyamguRey","e":"mediator, arbitrator","c":"n. m. anim. unisex"},{"ts":1614081825855,"i":6670,"p":"راهب","f":"raahib","g":"raahib","e":"priest, monk/nun","c":"n. m. anim. unisex"},{"ts":1610447830096,"i":7644,"p":"سخی","f":"skhéy","g":"skhey","e":"calf; bull-calf","c":"n. m. anim. unisex"},{"ts":1527811519,"i":7794,"p":"سفیر","f":"safeer","g":"safeer","e":"embassador, ambassador","c":"n. m. anim. unisex"},{"ts":1622366208373,"i":7807,"p":"سکرتر","f":"sakratár","g":"sakratar","e":"secretary","c":"n. m. anim. unisex"},{"ts":1566468540788,"i":8064,"p":"سوی","f":"sooy","g":"sooy","e":"rabbit","c":"n. m. anim. unisex","ec":"rabbit"},{"ts":1527819801,"i":8117,"p":"سیلانی","f":"seylaanéy","g":"seylaaney","e":"tourist, sightseer, visitor","c":"n. m. anim. unisex"},{"ts":1527815279,"i":8219,"p":"شپونکی","f":"shpoonkéy","g":"shpoonkey","e":"shepherd","c":"n. m. anim. unisex"},{"ts":1527819173,"i":8437,"p":"شنونکی","f":"shanóonkey","g":"shanoonkey","e":"analyst, examiner","c":"n. m. anim. unisex"},{"ts":1527815436,"i":8816,"p":"ظالم","f":"zaalim","g":"zaalim","e":"tyrant, oppressor, cruel person","c":"n. m. anim. unisex / adj."},{"ts":1527818632,"i":9078,"p":"غبرګونی","f":"ghbargóoney","g":"ghbargooney","e":"twin","c":"n. m. anim. unisex"},{"ts":1527812624,"i":9190,"p":"غل","f":"ghul","g":"ghul","e":"thief","c":"n. m. anim. unisex irreg.","infap":"غله","infaf":"ghlu","infbp":"غل","infbf":"ghl"},{"ts":1613561408232,"i":9724,"p":"قصوروار","f":"qUsoorwáar","g":"kUsoorwaar","e":"guilty, at fault","c":"adj. / n. m. anim. unisex"},{"ts":1527816256,"i":10161,"p":"کړوسی","f":"kaRwaséy","g":"kaRwasey","e":"great-grandchild","c":"n. m. anim. unisex"},{"ts":1527812174,"i":10703,"p":"ګاونډی","f":"gaawanDéy","g":"gaawanDey","e":"neighbour","c":"n. m. anim. unisex / adj."},{"ts":1579030083953,"i":10885,"p":"ګناه ګار","f":"gUnaahgáar","g":"gUnaahgaar","e":"sinner, sinful","c":"n. m. anim. unisex"},{"ts":1527822661,"i":11430,"p":"لوبغاړی","f":"lobgháaRey","g":"lobghaaRey","e":"athlete, player; actor; mischevious, playful (of a child)","c":"n. m. anim. unisex / adj."},{"ts":1589885143650,"i":11511,"p":"لومبړ","f":"loombáR","g":"loombaR","e":"fox","c":"n. m. anim. unisex"},{"ts":1527812043,"i":11578,"p":"لیکوال","f":"leekwaal","g":"leekwaal","e":"writer, author","c":"n. m. anim. unisex"},{"ts":1527820680,"i":11602,"p":"لېونی","f":"lewanéy","g":"lewaney","e":"crazy, insane, mad person","c":"n. m. anim. unisex / adj."},{"ts":1527814445,"i":11698,"p":"مامور","f":"maamóor","g":"maamoor","e":"officer, clerk (as in government worker); assigned, appointed, given orders or istructions (Arabic), authorized, sent on business","c":"adj. / n. m. anim. unisex"},{"ts":1527818760,"i":12045,"p":"مدني فاعل","f":"madanee faa'al","g":"madaneefaaal","e":"civil activist","c":"n. m. anim. unisex"},{"ts":1527821523,"i":12171,"p":"مریی","f":"mrayéy","g":"mrayey","e":"slave, servant","c":"n. m. anim. unisex"},{"ts":1527814159,"i":12666,"p":"ملګری","f":"malgúrey","g":"malgurey","e":"friend, companion","c":"n. m. anim. unisex"},{"ts":1527823403,"i":13072,"p":"مینه وال","f":"meenawáal","g":"meenawaal","e":"fan, someone who loves or appreciates someone or something","c":"n. m. anim. unisex"},{"ts":1527816254,"i":13631,"p":"نوسی","f":"nwaséy","g":"nwasey","e":"grandchild","c":"n. m. anim. unisex"},{"ts":1527814806,"i":13913,"p":"همځولی","f":"hamdzóley","g":"hamdzoley","e":"peer, someone of the same age, someone born in the same year","c":"n. m. anim. unisex"},{"ts":1527812684,"i":13936,"p":"همکار","f":"hamkaar","g":"hamkaar","e":"co-worker, fellow worker, collaborator, aid","c":"n. m. anim. unisex"},{"ts":1527811732,"i":13966,"p":"هنر مند","f":"hUnarmand","g":"hUnarmand","e":"artist, performer","c":"n. m. anim. unisex"},{"ts":1591027046896,"i":14276,"p":"وز","f":"wuz","g":"wuz","e":"goat","c":"n. m. anim. unisex"},{"ts":1611395180139,"i":14337,"p":"وطندار","f":"watandáar","g":"watandaar","e":"fellow countryman, person from the same country","c":"n. m. anim. unisex"},{"ts":1527811296,"i":14363,"p":"وکیل","f":"wakeel","g":"wakeel","e":"lawyer, proxy holder","c":"n. m. anim. unisex","app":"وکلا","apf":"waklaa"},{"ts":1527813585,"i":14364,"p":"وګړی","f":"wagúRey","g":"waguRey","e":"person, human being, creature","c":"n. m. anim. unisex","ec":"person","ep":"people"},{"ts":1527814672,"i":14431,"p":"ویاند","f":"wayaand","g":"wayaand","e":"spokesperson, spokesman, newcaster","c":"n. m. anim. unisex","ec":"spokesperson","ep":"spokespeople"},{"ts":1586454081484,"i":14506,"p":"یتیم","f":"yateem","g":"yateem","e":"orphan","c":"n. m. anim. unisex"},{"ts":1527816016,"i":2495,"p":"پښتو","f":"puxto","g":"puxto","e":"Pashto, Pashtunwali","c":"n. f.","ec":"Pashto"},{"ts":1527816778,"i":1074,"p":"اوږد","f":"ooGd, ooGud","g":"oogd,oogud","e":"long","c":"adj.","infap":"اوږده","infaf":"ooGdu","infbp":"اوږد","infbf":"ooGd"},{"ts":1527822706,"i":1110,"p":"اوم","f":"oom","g":"oom","e":"raw, uncooked; blunt, crude; unripe, immature, not fully developed","c":"adj.","infap":"اومه","infaf":"oomu","infbp":"اوم","infbf":"oom"},{"ts":1527813293,"i":7981,"p":"سور","f":"soor","g":"soor","e":"red; hot; angry","c":"adj.","infap":"سره","infaf":"sru","infbp":"سر","infbf":"sr"},{"ts":1527815265,"i":8542,"p":"شین","f":"sheen","g":"sheen","e":"green, blue; unripe, immature","c":"adj. irreg.","infap":"شنه","infaf":"shnu","infbp":"شن","infbf":"shn"},{"ts":1527815087,"i":12174,"p":"مړ","f":"muR","g":"muR","e":"dead","c":"adj.","infap":"مړه","infaf":"mRu","infbp":"مړ","infbf":"mR"},{"ts":1527814151,"i":12605,"p":"مل","f":"mal","g":"mal","e":"companion, associate, friend; accompanying, being with","c":"n. m. anim. unisex / adj.","infap":"مله","infaf":"mlu","infbp":"مل","infbf":"ml"},{"ts":1527813580,"i":14545,"p":"یو","f":"yo","g":"yo","e":"one","c":"num.","infap":"یوه","infaf":"yawu","infbp":"یو","infbf":"yaw"},{"ts":1527819345,"i":2472,"p":"پسه","f":"psu","g":"psu","e":"sheep, ram","c":"n. m.","ppp":"پسونه","ppf":"pusoona","ec":"sheep","ep":"sheep"},{"ts":1527822173,"i":4249,"p":"جاړه","f":"jaaRú","g":"jaaRu","e":"bush, shrub","c":"n. m."},{"ts":1527813508,"i":7092,"p":"زړه","f":"zRu","g":"zRu","e":"heart","c":"n. m.","noInf":true,"ppp":"زړونه","ppf":"zRoona"},{"ts":1588857967561,"i":9258,"p":"غوایه","f":"ghwaayú","g":"ghwaayu","e":"bull","c":"n. m. anim."},{"ts":1527817108,"i":9827,"p":"کاته","f":"kaatu","g":"kaatu","e":"look, gaze, examination, inspection, spying","c":"n. m."},{"ts":1527817768,"i":9846,"p":"کارګه","f":"kaargú","g":"kaargu","e":"raven, crow","c":"n. m. anim."},{"ts":1527819245,"i":10493,"p":"کوربانه","f":"korbaanú","g":"korbaanu","e":"master of house, head of family, married man","c":"n. m."},{"ts":1527818516,"i":11346,"p":"لمبېده","f":"lambedú","g":"lambedu","e":"swimming, bathing","c":"n. m."},{"ts":1527813986,"i":11352,"p":"لمر پرېواته","f":"lmarprewaatu","g":"lmarprewaatu","e":"sunset, west","c":"n. m."},{"ts":1527813992,"i":11358,"p":"لمر لوېده","f":"lmarlwedu","g":"lmarlwedu","e":"sunset","c":"n. m."},{"ts":1527813987,"i":11360,"p":"لمرخاته","f":"lmarkhaatu","g":"lmarkhaatu","e":"sunrise, east","c":"n. m."},{"ts":1527818255,"i":11604,"p":"لېوه","f":"lewú","g":"lewu","e":"wolf, wild dog","c":"n. m.","ppp":"لېوان","ppf":"lewáan","ec":"wolf","ep":"wolves"},{"ts":1527821522,"i":12170,"p":"مریه","f":"mrayú","g":"mrayu","e":"slave, servant","c":"n. m."},{"ts":1527812911,"i":13024,"p":"مېړه","f":"meRu","g":"meRu","e":"husband, brave","c":"n. m."},{"ts":1527811626,"i":13516,"p":"نکېده","f":"nukedu","g":"nukedu","e":"impracticability, impossibility, improbability","c":"n. m."},{"ts":1527816410,"i":13721,"p":"نیکه","f":"neekú","g":"neeku","e":"grandfather, grandpa","c":"n. m."},{"ts":1527822420,"i":14107,"p":"واګه","f":"waagu","g":"waagu","e":"rein, bridle (for horses); string for trousers, string used inside to hold up the partoog/shalwar","c":"n. m."},{"ts":1527816357,"i":14170,"p":"وراره","f":"wraaru","g":"wraaru","e":"nephew, brother's son","c":"n. m.","ppp":"وریرونه","ppf":"wreeroona"},{"ts":1527823225,"i":14389,"p":"وله","f":"wUlú","g":"wUlu","e":"flock, herd, drove","c":"n. m."},{"ts":1527814789,"i":14465,"p":"وېښته","f":"wextu","g":"wextu","e":"hair","c":"n. m."},{"ts":1527815394,"i":14068,"p":"واده","f":"waadú","g":"waadu","e":"wedding, marriage","c":"n. m."},{"ts":1527818017,"i":178,"p":"اټۍ","f":"aTúy","g":"aTuy","e":"store, shop","c":"n. f."},{"ts":1527812694,"i":906,"p":"انجنۍ","f":"injUnúy","g":"injUnuy","e":"girl","c":"n. f."},{"ts":1527815140,"i":1113,"p":"اونۍ","f":"onúy, ownúy, owunúy","g":"onuy,ownuy,owunuy","e":"week","c":"n. f."},{"ts":1566476931206,"i":1337,"p":"بتۍ","f":"batúy","g":"batuy","e":"lamp, light","c":"n. f."},{"ts":1527822192,"i":1342,"p":"بټۍ","f":"baTúy","g":"baTuy","e":"stove, oven, furnace","c":"n. f."},{"ts":1527820828,"i":1358,"p":"بچۍ","f":"bachúy","g":"bachuy","e":"daughter, girl","c":"n. f."},{"ts":1527822974,"i":1673,"p":"بګۍ","f":"bagúy","g":"baguy","e":"cart, buggy, stroller","c":"n. f."},{"ts":1591805634565,"i":2766,"p":"پوښتۍ","f":"pooxtúy","g":"pooxtuy","e":"rib","c":"n. f."},{"ts":1586276322639,"i":4115,"p":"ټوپۍ","f":"Topúy","g":"Topuy","e":"hat, cap","c":"n. f."},{"ts":1527820058,"i":4116,"p":"ټوټکۍ","f":"ToTakúy","g":"ToTakuy","e":"kneecap, patella","c":"n. f."},{"ts":1527812564,"i":6510,"p":"ډوډۍ","f":"DoDúy","g":"DoDuy","e":"bread, food, meal","c":"n. f."},{"ts":1527821555,"i":7359,"p":"ژۍ","f":"jzúy","g":"jzuy","e":"edge, verge, side","c":"n. f."},{"ts":1527814788,"i":7505,"p":"سپوږمۍ","f":"spoGmúy","g":"spogmuy","e":"moon","c":"n. f."},{"ts":1527820120,"i":9377,"p":"غونډۍ","f":"ghwunDúy","g":"ghwunDuy","e":"hill, hillrock, mound","c":"n. f."},{"ts":1527814203,"i":10056,"p":"کرسۍ","f":"kUrsúy","g":"kUrsuy","e":"chair, seat, stool","c":"n. f."},{"ts":1527812045,"i":10130,"p":"کړکۍ","f":"kuRkúy","g":"kuRkuy","e":"window","c":"n. f."},{"ts":1527816026,"i":10163,"p":"کړۍ","f":"kaRúy","g":"kaRuy","e":"ring, curl; handcuffs, link, chain, fetter; loom; department, section","c":"n. f."},{"ts":1527813870,"i":10194,"p":"کشتۍ","f":"kishtúy","g":"kishtuy","e":"boat, ship","c":"n. f."},{"ts":1527821895,"i":10980,"p":"ګوډۍ","f":"gooDúy","g":"gooDuy","e":"doll","c":"n. f."},{"ts":1527814564,"i":11021,"p":"ګولۍ","f":"golúy","g":"goluy","e":"pill tablet; bullet","c":"n. f."},{"ts":1527811763,"i":11319,"p":"لکۍ","f":"lakúy","g":"lakuy","e":"tail","c":"n. f."},{"ts":1527812659,"i":13878,"p":"هګۍ","f":"hagúy","g":"haguy","e":"egg","c":"n. f."},{"ts":1527821372,"i":14003,"p":"هوسۍ","f":"hosúy","g":"hosuy","e":"gazelle, antelope","c":"n. f."},{"ts":1527815154,"i":2197,"p":"پای","f":"paay","g":"paay","e":"end, finish, close, conclusion","c":"n. m."},{"ts":1527812594,"i":4575,"p":"ځای","f":"dzaay","g":"dzaay","e":"place, space","c":"n. m."},{"ts":1527812525,"i":4723,"p":"چای","f":"chaay","g":"chaay","e":"tea","c":"n. m."},{"ts":1527812783,"i":5487,"p":"خدای","f":"khUdaay","g":"khUdaay","e":"God, Lord","c":"n. m. anim.","ec":"God","ep":"gods"},{"ts":1527819514,"i":5983,"p":"دای","f":"daay","g":"daay","e":"tier, row, foundation (masonry etc.)","c":"n. m."},{"ts":1610797797756,"i":7434,"p":"سای","f":"saay","g":"saay","e":"hollow, depression","c":"n. m.","ec":"hollow"},{"ts":1527822345,"i":7664,"p":"سرای","f":"saráay","g":"saraay","e":"caravansary, inn, large house","c":"n. m.","ec":"carvansary"},{"ts":1586598425514,"i":1858,"p":"بوی","f":"booy","g":"booy","e":"smell","c":"n. m.","ec":"smell"},{"ts":1527814511,"i":5851,"p":"خوی","f":"khooy","g":"khooy","e":"character, nature, disposition, habit","c":"n. m."}]; +export default nounsAdjs; \ No newline at end of file diff --git a/src/types.ts b/src/types.ts index bef2807..8db91ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -473,3 +473,167 @@ export type DisplayFormSubgroup = { } export type AayTail = "ey" | "aay"; + +export type NounEntry = DictionaryEntry & { c: string } & { __brand: "a noun entry" }; +export type MascNounEntry = NounEntry & { __brand2: "a masc noun entry" }; +export type FemNounEntry = NounEntry & { __brand2: "a fem noun entry" }; +export type UnisexNounEntry = MascNounEntry & { __brand3: "a unisex noun entry" }; +export type AdverbEntry = DictionaryEntry & { c: string } & { __brand: "an adverb entry" }; +export type LocativeAdverbEntry = AdverbEntry & { __brand2: "a locative adverb entry" }; +export type AdjectiveEntry = DictionaryEntry & { c: string } & { __brand: "an adjective entry" }; +export type VerbEntry = { + entry: DictionaryEntry & { __brand: "a verb entry" }, + // TODO: the compliment could also be typed? Maybe? + complement?: DictionaryEntry, +}; + +export type SingularEntry = T & { __brand7: "a singular noun - as opposed to an always plural noun" }; +export type PluralNounEntry = T & { __brand7: "a noun that is always plural" }; + +export type Pattern1Entry = T & { __brand3: "basic inflection pattern" }; +export type Pattern2Entry = T & { __brand3: "ending in unstressed ی pattern" }; +export type Pattern3Entry = T & { __brand3: "ending in stressed ی pattern" }; +export type Pattern4Entry = T & { __brand3: "Pashtoon pattern" }; +export type Pattern5Entry = T & { __brand3: "short squish pattern" }; +export type Pattern6FemEntry = T & { __brand3: "non anim. ending in ي" }; +export type NonInflecting = T & { __brand3: "non-inflecting" }; + +export type Entry = NounEntry | AdjectiveEntry | AdverbEntry | VerbEntry; + +export type Words = { + nouns: NounEntry[], + adjectives: AdjectiveEntry[], + verbs: VerbEntry[], + adverbs: AdverbEntry[], +} + +export type VPSelection = { + type: "VPSelection", + subject: NPSelection, + object: Exclude, + verb: Exclude, +}; + +// TODO: make this Rendered with recursive Rendered<> +export type VPRendered = { + type: "VPRendered", + king: "subject" | "object", + servant: "subject" | "object" | undefined, + isPast: boolean, + isTransitive: boolean, + isCompound: "stative" | "dynamic" | false, + subject: Rendered, + object: Rendered | ObjectNP, + verb: VerbRendered, + englishBase?: string[], +} + +export type VerbTense = "presentVerb" + | "subjunctiveVerb" + | "perfectiveFuture" + | "imperfectiveFuture" + | "perfectivePast" + | "imperfectivePast" + | "habitualPerfectivePast" + | "habitualImperfectivePast"; + +export type EquativeTense = "present" | "subjunctive" | "habitual" | "past" | "future" | "wouldBe" | "pastSubjunctive"; +export type NounNumber = "singular" | "plural"; + +export type PerfectTense = `${EquativeTense} perfect`; + +export type VerbSelection = { + type: "verb", + verb: VerbEntry, + dynAuxVerb?: VerbEntry, + object: VerbObject, // TODO: should have a locked in (but number changeable noun) here for dynamic compounds + transitivity: Transitivity, + isCompound: "stative" | "dynamic" | false, + voice: "active" | "passive", + changeTransitivity?: (t: "transitive" | "grammatically transitive") => VerbSelection, + changeStatDyn?: (t: "stative" | "dynamic") => VerbSelection, + changeVoice?: (v: "active" | "passive", subj?: NPSelection) => VerbSelection, + // TODO: changeStativeDynamic + // TODO: add in aspect element here?? + negative: boolean, +} & ({ + tense: VerbTense, + tenseCategory: "basic" | "modal", +} | { + tense: PerfectTense, + tenseCategory: "perfect" +}); + +export type VerbRendered = Omit & { + ps: { + head: PsString | undefined, + rest: SingleOrLengthOpts< + PsString[] + >, + }, + hasBa: boolean, + person: Person, +}; + +export type VerbObject = + // transitive verb - object not selected yet + undefined | + // transitive verb - obect selected + NPSelection | + // grammatically transitive verb with unspoken 3rd pers masc plur entity + // or intransitive "none" + ObjectNP; + +export type NPSelection = NounSelection | PronounSelection | ParticipleSelection; + +export type NPType = "noun" | "pronoun" | "participle"; + +export type ObjectNP = "none" | Person.ThirdPlurMale; + +// TODO require/import Person and PsString +export type NounSelection = { + type: "noun", + entry: NounEntry, + gender: Gender, + number: NounNumber, + dynamicComplement?: boolean, + // TODO: Implement + // adjectives: [], + // TODO: Implement + // possesor: NPSelection | undefined, + /* method only present if it's possible to change gender */ + changeGender?: (gender: Gender) => NounSelection, + /* method only present if it's possible to change number */ + changeNumber?: (number: NounNumber) => NounSelection, +}; + +// take an argument for subject/object in rendering English +export type PronounSelection = { + type: "pronoun", + person: Person, + distance: "near" | "far", +}; + +export type ParticipleSelection = { + type: "participle", + verb: VerbEntry, +}; + +// not object +// type Primitive = string | Function | number | boolean | Symbol | undefined | null; +// If T has key K ("user"), replace it +export type ReplaceKey = T extends Record ? (Omit & Record) : T; + +export type FormVersion = { removeKing: boolean, shrinkServant: boolean }; + +export type Rendered = ReplaceKey< + Omit, + "e", + string +> & { + ps: PsString[], + e?: string, + inflected: boolean, + person: Person, +}; +// TODO: recursive changing this down into the possesor etc. diff --git a/yarn.lock b/yarn.lock index 956123f..b7f182c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -209,6 +209,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" @@ -541,6 +546,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" @@ -1164,6 +1176,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.12.0", "@babel/runtime@^7.13.10": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" @@ -1219,6 +1238,89 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@emotion/babel-plugin@^11.7.1": + version "11.7.2" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" + integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/runtime" "^7.13.10" + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.5" + "@emotion/serialize" "^1.0.2" + babel-plugin-macros "^2.6.1" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.0.13" + +"@emotion/cache@^11.4.0", "@emotion/cache@^11.7.1": + version "11.7.1" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539" + integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A== + dependencies: + "@emotion/memoize" "^0.7.4" + "@emotion/sheet" "^1.1.0" + "@emotion/utils" "^1.0.0" + "@emotion/weak-memoize" "^0.2.5" + stylis "4.0.13" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== + +"@emotion/react@^11.1.1": + version "11.9.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.9.0.tgz#b6d42b1db3bd7511e7a7c4151dc8bc82e14593b8" + integrity sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@emotion/babel-plugin" "^11.7.1" + "@emotion/cache" "^11.7.1" + "@emotion/serialize" "^1.0.3" + "@emotion/utils" "^1.1.0" + "@emotion/weak-memoize" "^0.2.5" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.3.tgz#99e2060c26c6292469fb30db41f4690e1c8fea63" + integrity sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA== + dependencies: + "@emotion/hash" "^0.8.0" + "@emotion/memoize" "^0.7.4" + "@emotion/unitless" "^0.7.5" + "@emotion/utils" "^1.0.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" + integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" + integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== + +"@emotion/weak-memoize@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -1975,6 +2077,13 @@ dependencies: "@types/react" "*" +"@types/react-transition-group@^4.4.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== + dependencies: + "@types/react" "*" + "@types/react-transition-group@^4.4.1": version "4.4.3" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" @@ -2798,7 +2907,7 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@2.8.0: +babel-plugin-macros@2.8.0, babel-plugin-macros@^2.6.1: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== @@ -3670,7 +3779,7 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -5211,6 +5320,11 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5664,6 +5778,13 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" @@ -7326,6 +7447,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -9106,6 +9232,15 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" +prop-types@^15.6.0: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -9354,7 +9489,7 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== -react-is@^16.3.2, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9454,7 +9589,20 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" -react-transition-group@^4.4.1: +react-select@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.2.2.tgz#3d5edf0a60f1276fd5f29f9f90a305f0a25a5189" + integrity sha512-miGS2rT1XbFNjduMZT+V73xbJEeMzVkJOz727F6MeAr2hKE0uUSA8Ff7vD44H32x2PD3SRB6OXTY/L+fTV3z9w== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.1.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^5.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + +react-transition-group@^4.3.0, react-transition-group@^4.4.1: version "4.4.2" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== @@ -10305,7 +10453,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10631,6 +10779,11 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylis@4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" + integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"