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
+
+
+}
+
+export default EntrySelect;
\ No newline at end of file
diff --git a/src/components/np-picker/NPNounPicker.tsx b/src/components/np-picker/NPNounPicker.tsx
new file mode 100644
index 0000000..10f6b2e
--- /dev/null
+++ b/src/components/np-picker/NPNounPicker.tsx
@@ -0,0 +1,163 @@
+import {
+ makeNounSelection,
+} from "./picker-tools";
+import * as T from "../../types";
+import ButtonSelect from "../ButtonSelect";
+import InlinePs from "../InlinePs";
+// import { useState } from "react";
+// import { isFemNounEntry, isPattern1Entry, isPattern2Entry, isPattern3Entry, isPattern4Entry, isPattern5Entry, isPattern6FemEntry } from "../../lib/type-predicates";
+import EntrySelect from "../EntrySelect";
+
+// const filterOptions = [
+// {
+// label: "1",
+// value: "1",
+// },
+// {
+// label: "2",
+// value: "2",
+// },
+// {
+// label: "3",
+// value: "3",
+// },
+// {
+// label: "4",
+// value: "4",
+// },
+// {
+// label: "5",
+// value: "5",
+// },
+// {
+// label: "6",
+// value: "6",
+// },
+// ];
+
+// type FilterPattern = "1" | "2" | "3" | "4" | "5" | "6";
+
+// function nounFilter(p: FilterPattern | undefined) {
+// return p === undefined
+// ? () => true
+// : (p === "1")
+// ? isPattern1Entry
+// : (p === "2")
+// ? isPattern2Entry
+// : (p === "3")
+// ? isPattern3Entry
+// : (p === "4")
+// ? isPattern4Entry
+// : (p === "5")
+// ? isPattern5Entry
+// : (p === "6")
+// ? (n: NounEntry) => (isFemNounEntry(n) && isPattern6FemEntry(n))
+// : () => true;
+// }
+
+function NPNounPicker(props: ({
+ nouns: T.NounEntry[],
+} | {
+ nouns: (s: string) => T.NounEntry[],
+ getNounByTs: (ts: number) => T.NounEntry | undefined;
+}) & {
+ noun: T.NounSelection | undefined,
+ onChange: (p: T.NounSelection | undefined) => void,
+ clearButton?: JSX.Element,
+ opts: T.TextOptions,
+}) {
+ // const [patternFilter, setPatternFilter] = useState(undefined);
+ // const [showFilter, setShowFilter] = useState(false)
+ // const nounsFiltered = props.nouns
+ // .filter(nounFilter(patternFilter))
+ // .sort((a, b) => (a.p.localeCompare(b.p, "af-PS")));
+ function onEntrySelect(entry: T.NounEntry | undefined) {
+ if (!entry) {
+ return props.onChange(undefined);
+ }
+ props.onChange(makeNounSelection(entry));
+ }
+ // function handleFilterClose() {
+ // setPatternFilter(undefined);
+ // setShowFilter(false);
+ // }
+ return
+
+ {props.clearButton}
+ {/* {(!showFilter && !(noun?.dynamicComplement)) &&
+
+
} */}
+
+ {/* {showFilter &&
+
+
Filter by inflection pattern
+
X
+
+
+
} */}
+ {!(props.noun && props.noun.dynamicComplement) ?
+
+
:
+ {props.noun &&
+
Included in Dyn. Compound:
+
+
+ {{ p: props.noun.entry.p, f: props.noun.entry.f }}
+
+
{props.noun.entry.e}
+
+
}
+
}
+ {props.noun &&
+
+ {props.noun.changeGender ? {
+ if (!props.noun || !props.noun.changeGender) return;
+ props.onChange(props.noun.changeGender(g));
+ }}
+ /> : props.noun.gender === "masc" ? "Masc." : "Fem."}
+
+
+ {props.noun.changeNumber ? {
+ if (!props.noun || !props.noun.changeNumber) return;
+ props.onChange(props.noun.changeNumber(n));
+ }}
+ /> : props.noun.number === "singular" ? "Sing." : "Plur."}
+
+
}
+
;
+}
+
+export default NPNounPicker;
\ No newline at end of file
diff --git a/src/components/np-picker/NPParticiplePicker.tsx b/src/components/np-picker/NPParticiplePicker.tsx
new file mode 100644
index 0000000..1b2ac06
--- /dev/null
+++ b/src/components/np-picker/NPParticiplePicker.tsx
@@ -0,0 +1,50 @@
+import EntrySelect from "../EntrySelect";
+import * as T from "../../types";
+
+function makeParticipleSelection(verb: T.VerbEntry): T.ParticipleSelection {
+ return {
+ type: "participle",
+ verb,
+ };
+}
+
+function NPParticiplePicker(props: ({
+ verbs: T.VerbEntry[],
+} | {
+ verbs: (s: string) => T.VerbEntry[],
+ getVerbByTs: (ts: number) => T.VerbEntry | undefined;
+}) & {
+ participle: T.ParticipleSelection | undefined,
+ onChange: (p: T.ParticipleSelection | undefined) => void,
+ clearButton: JSX.Element,
+ opts: T.TextOptions,
+}) {
+ function onEntrySelect(entry: T.VerbEntry | undefined) {
+ if (!entry) {
+ props.onChange(undefined);
+ return;
+ }
+ props.onChange(makeParticipleSelection(entry));
+ }
+ return
+ {props.clearButton}
+
+ {props.participle &&
}
+
;
+}
+
+export default NPParticiplePicker;
\ No newline at end of file
diff --git a/src/components/np-picker/NPPicker.tsx b/src/components/np-picker/NPPicker.tsx
new file mode 100644
index 0000000..c0c999d
--- /dev/null
+++ b/src/components/np-picker/NPPicker.tsx
@@ -0,0 +1,113 @@
+import PronounPicker from "./NPPronounPicker";
+import NounPicker from "./NPNounPicker";
+import ParticiplePicker from "./NPParticiplePicker";
+// import { getEnglishPronoun } from "../../lib/english-pronoun-tools";
+// import { ButtonSelect } from "@lingdocs/pashto-inflector";
+import {
+ randomPerson,
+} from "../../lib/np-tools";
+import { useState, useEffect } from "react";
+import * as T from "../../types";
+// import { capitalizeFirstLetter } from "../../lib/text-tools";
+
+const npTypes: T.NPType[] = ["pronoun", "noun", "participle"];
+
+function NPPicker(props: {
+ onChange: (nps: T.NPSelection | undefined) => void,
+ np: T.NPSelection | undefined,
+ counterPart: T.NPSelection | T.VerbObject | undefined,
+ asObject?: boolean,
+ opts: T.TextOptions,
+} & ({
+ nouns: (s: string) => T.NounEntry[],
+ verbs: (s: string) => T.VerbEntry[],
+ getNounByTs: (ts: number) => T.NounEntry | undefined,
+ getVerbByTs: (ts: number) => T.VerbEntry | undefined,
+} | {
+ nouns: T.NounEntry[],
+ verbs: T.VerbEntry[],
+})) {
+ const [npType, setNpType] = useState(props.np ? props.np.type : undefined);
+ useEffect(() => {
+ setNpType(props.np ? props.np.type : undefined);
+ }, [props.np]);
+ function handleClear() {
+ if (props.np && props.np.type === "noun" && props.np.dynamicComplement) return;
+ setNpType(undefined);
+ props.onChange(undefined);
+ }
+ function handleNPTypeChange(ntp: T.NPType) {
+ if (ntp === "pronoun") {
+ const person = randomPerson({ counterPart: props.counterPart });
+ const pronoun: T.PronounSelection = {
+ type: "pronoun",
+ person,
+ distance: "far",
+ };
+ setNpType(ntp);
+ props.onChange(pronoun);
+ } else {
+ props.onChange(undefined);
+ setNpType(ntp);
+ }
+ }
+ const isDynamicComplement = props.np && props.np.type === "noun" && props.np.dynamicComplement;
+ const clearButton = ;
+ return
+ {!npType &&
+ {/*
+ Choose NP
+
*/}
+ {npTypes.map((npt) =>
+
+
)}
+
}
+ {(npType === "pronoun" && props.np?.type === "pronoun")
+ ?
+ : npType === "noun"
+ ?
+ : npType === "participle"
+ ?
+ : null
+ }
+
;
+}
+
+// {(npType && !isDynamicComplement) && }
+
+export default NPPicker;
\ No newline at end of file
diff --git a/src/components/np-picker/NPPronounPicker.tsx b/src/components/np-picker/NPPronounPicker.tsx
new file mode 100644
index 0000000..792068b
--- /dev/null
+++ b/src/components/np-picker/NPPronounPicker.tsx
@@ -0,0 +1,147 @@
+import * as T from "../../types";
+import ButtonSelect from "../ButtonSelect";
+import useStickyState from "../../lib/useStickyState";
+import classNames from "classnames";
+
+const gColors = {
+ masc: "LightSkyBlue",
+ fem: "pink",
+};
+
+const labels = (asObject: boolean) => ({
+ persons: [
+ ["1st", "1st pl."],
+ ["2nd", "2nd pl."],
+ ["3rd", "3rd pl."],
+ ],
+ e: asObject ? [
+ ["me", "us"],
+ ["you", "you pl."],
+ [{ masc: "him/it", fem: "her/it"}, "them"],
+ ] : [
+ ["I", "We"],
+ ["You", "You pl."],
+ [{ masc: "He/It", fem: "She/It"}, "They"],
+ ],
+ p: {
+ far: [
+ ["زه", "مونږ"],
+ ["ته", "تاسو"],
+ ["هغه", "هغوي"],
+ ],
+ near: [
+ ["زه", "مونږ"],
+ ["ته", "تاسو"],
+ [{ masc: "دی", fem: "دا" }, "دوي"],
+ ],
+ },
+});
+
+
+type PickerState = { row: number, col: number, gender: T.Gender };
+
+function personToPickerState(person: T.Person): PickerState {
+ const col = person > 5 ? 1 : 0;
+ const row = Math.floor((person > 5 ? (person - 6) : person) / 2);
+ const gender: T.Gender = (person % 2) ? "fem" : "masc";
+ return { col, row, gender };
+}
+
+function pickerStateToPerson(s: PickerState): T.Person {
+ return (s.row * 2)
+ + (s.gender === "masc" ? 0 : 1)
+ + (6 * s.col);
+}
+
+function NPPronounPicker({ onChange, pronoun, asObject, clearButton, opts }: {
+ pronoun: T.PronounSelection,
+ onChange: (p: T.PronounSelection) => void,
+ asObject?: boolean,
+ clearButton?: JSX.Element,
+ opts: T.TextOptions,
+}) {
+ const [display, setDisplay] = useStickyState<"persons" | "p" | "e">("persons", "prounoun-picker-display");
+
+ const p = personToPickerState(pronoun.person);
+ function handleClick(row: number, col: number) {
+ const person = pickerStateToPerson({ ...p, row, col });
+ onChange({
+ ...pronoun,
+ person,
+ });
+ }
+ function handleGenderChange(gender: T.Gender) {
+ const person = pickerStateToPerson({ ...p, gender });
+ onChange({
+ ...pronoun,
+ person,
+ });
+ }
+ function handlePronounTypeChange(distance: "far" | "near") {
+ onChange({
+ ...pronoun,
+ distance,
+ });
+ }
+ function handleDisplayChange() {
+ const newPerson = display === "persons"
+ ? "p"
+ : display === "p"
+ ? "e"
+ : "persons";
+ setDisplay(newPerson);
+ }
+ const prs = labels(!!asObject)[display];
+ const pSpec = "near" in prs ? prs[pronoun.distance] : prs;
+ return
+ {clearButton}
+
+ handlePronounTypeChange(g as "far" | "near")}
+ />
+
+
+
+
+ {pSpec.map((rw, i) => (
+
+ {rw.map((r, j) => {
+ const active = (p.row === i && p.col === j)
+ return handleClick(i, j)}
+ className={classNames({ "table-active": active })}
+ style={{
+ backgroundColor: active ? gColors[p.gender] : "inherit",
+ padding: "0.25rem 0",
+ }}
+ >
+
+ {typeof r === "string" ? r : r[p.gender]}
+
+ | ;
+ })}
+
+ ))}
+
+
+
+ Masc.
, value: "masc", color: gColors.masc },
+ { label:
Fem.
, value: "fem", color: gColors.fem },
+ ]}
+ value={p.gender}
+ handleChange={(g) => handleGenderChange(g as T.Gender)}
+ />
+
+ ;
+};
+
+export default NPPronounPicker;
\ No newline at end of file
diff --git a/src/components/np-picker/picker-tools.tsx b/src/components/np-picker/picker-tools.tsx
new file mode 100644
index 0000000..30ba8d2
--- /dev/null
+++ b/src/components/np-picker/picker-tools.tsx
@@ -0,0 +1,115 @@
+import {
+ isPluralNounEntry,
+ isMascNounEntry,
+ isUnisexNounEntry,
+ isVerbEntry,
+} from "../../lib/type-predicates";
+import {
+ getEnglishParticiple,
+ getEnglishVerb,
+} from "../../lib/np-tools";
+import * as T from "../../types";
+import {
+ removeFVarients,
+} from "../../lib/accent-and-ps-utils";
+import {
+ getEnglishWord,
+} from "../../lib/get-english-word";
+import { phoneticsToDiacritics } from "../../lib/phonetics-to-diacritics";
+import {
+ convertSpelling,
+} from "../../lib/convert-spelling";
+import {
+ translatePhonetics,
+} from "../../lib/translate-phonetics";
+
+export const zIndexProps = {
+ menuPortalTarget: document.body,
+ styles: { menuPortal: (base: any) => ({ ...base, zIndex: 9999 }) },
+};
+
+export function makeVerbSelectOption(e: T.VerbEntry, opts: T.TextOptions): { value: string, label: string | JSX.Element } {
+ const eng = getEnglishVerb(e.entry);
+ const ps = plainTextPsAdjustment(
+ { p: e.entry.p, f: removeFVarients(e.entry.f) },
+ opts,
+ );
+ return {
+ label: `${ps.p} - ${ps.f} (${eng})`,
+ value: e.entry.ts.toString(),
+ };
+}
+
+function plainTextPsAdjustment(ps: T.PsString, opts: T.TextOptions): T.PsString {
+ function getP(ps: T.PsString): string {
+ const p = opts.diacritics
+ ? (phoneticsToDiacritics(ps.p, ps.f) || ps.p)
+ : ps.p;
+ return convertSpelling(p, opts.spelling);
+ }
+ function getF(f: string): string {
+ if (opts.phonetics === "none") {
+ return "";
+ }
+ return opts.phonetics === "lingdocs"
+ ? f
+ : translatePhonetics(f, {
+ dialect: opts.dialect,
+ // @ts-ignore - weird TS not picking up the elimination of "none herre"
+ system: opts.phonetics,
+ });
+ }
+ return { p: getP(ps), f: getF(ps.f) };
+}
+
+export function makeSelectOption(
+ e: T.DictionaryEntry | T.VerbEntry | T.NounEntry | T.AdjectiveEntry | T.LocativeAdverbEntry,
+ opts: T.TextOptions,
+): { value: string, label: string } {
+ const entry = "entry" in e ? e.entry : e;
+ const eng = (isVerbEntry(e))
+ ? (getEnglishParticiple(e.entry))
+ : getEnglishWord(e);
+ const english = typeof eng === "string"
+ ? eng
+ : !eng
+ ? ""
+ : ("singular" in eng && eng.singular !== undefined)
+ ? eng.singular
+ : eng.plural;
+ const ps = plainTextPsAdjustment(
+ { p: entry.p, f: removeFVarients(entry.f) },
+ opts,
+ );
+ return {
+ label: `${ps.p} - ${ps.f} (${english})`,
+ value: entry.ts.toString(),
+ };
+}
+
+export function makeNounSelection(entry: T.NounEntry, dynamicComplement?: true): T.NounSelection {
+ const number = isPluralNounEntry(entry) ? "plural" : "singular";
+ return {
+ type: "noun",
+ entry,
+ gender: isMascNounEntry(entry) ? "masc" : "fem",
+ number,
+ dynamicComplement,
+ ...isUnisexNounEntry(entry) ? {
+ changeGender: function(gender: T.Gender): T.NounSelection {
+ return {
+ ...this,
+ gender,
+ };
+ },
+ } : {},
+ ...number === "singular" ? {
+ changeNumber: function(number: T.NounNumber): T.NounSelection {
+ return {
+ ...this,
+ number,
+ };
+ },
+ } : {},
+ };
+}
\ No newline at end of file
diff --git a/src/components/verb-info/VerbTypeInfo.tsx b/src/components/verb-info/VerbTypeInfo.tsx
index 097470f..6f557c8 100644
--- a/src/components/verb-info/VerbTypeInfo.tsx
+++ b/src/components/verb-info/VerbTypeInfo.tsx
@@ -11,8 +11,8 @@ import InlinePs from "../InlinePs";
import Pashto from "../Pashto";
import Phonetics from "../Phonetics";
import {
- makePsString
-} from "../../lib/p-text-helpers";
+ makePsString,
+} from "../../lib/accent-and-ps-utils";
import { Modal } from "react-bootstrap";
import stativeCompTrans from "./stative-compound-transitive.svg";
import stativeCompIntrans from "./stative-compound-intransitive.svg";
diff --git a/src/components/vp-explorer/AbbreviationFormSelector.tsx b/src/components/vp-explorer/AbbreviationFormSelector.tsx
new file mode 100644
index 0000000..8cc49ac
--- /dev/null
+++ b/src/components/vp-explorer/AbbreviationFormSelector.tsx
@@ -0,0 +1,101 @@
+import ButtonSelect from "../ButtonSelect";
+import * as T from "../../types";
+
+const options = [
+ {
+ label: "Full",
+ value: "full",
+ },
+ {
+ label: "🚫 King",
+ value: "noKing",
+ },
+ {
+ label: "👶 Servant",
+ value: "shrinkServant",
+ },
+ {
+ label: "👶 🚫 Both",
+ value: "shortest",
+ },
+];
+
+function formToValue(f: T.FormVersion) {
+ if (f.removeKing === false && f.shrinkServant === false) {
+ return "full";
+ }
+ if (f.removeKing === true && f.shrinkServant === false) {
+ return "noKing";
+ }
+ if (f.removeKing === false && f.shrinkServant === true) {
+ return "shrinkServant";
+ }
+ if (f.removeKing === true && f.shrinkServant === true) {
+ return "shortest";
+ }
+ throw new Error("unrecognized abbreviation form");
+}
+
+function limitOptions(adjustable: "both" | "king" | "servant") {
+ if (adjustable === "both") {
+ return options;
+ }
+ if (adjustable === "king") {
+ return options.filter(o => !["shrinkServant", "shortest"].includes(o.value));
+ }
+ if (adjustable === "servant") {
+ return options.filter(o => !["noKing", "shortest"].includes(o.value));
+ }
+}
+
+function limitValue(value: string, adjustable: "both" | "king" | "servant") {
+ if (adjustable === "both") return value;
+ if (adjustable === "king") {
+ return (value === "shortest")
+ ? "noKing"
+ : (value === "shrinkServant")
+ ? "full"
+ : value;
+ }
+ if (adjustable === "servant") {
+ return (value === "shortest")
+ ? "shrinkServant"
+ : (value === "noKing")
+ ? "full"
+ : value;
+ }
+ throw new Error("unrecognized adjustable value");
+}
+
+function AbbreviationFormSelector({ form, onChange, adjustable }: {
+ form: T.FormVersion,
+ onChange: (f: T.FormVersion) => void,
+ adjustable: "both" | "king" | "servant",
+}) {
+ function handleChange(f: "full" | "noKing" | "shrinkServant" | "shortest") {
+ if (f === "full") {
+ onChange({ removeKing: false, shrinkServant: false });
+ } else if (f === "noKing") {
+ onChange({ removeKing: true, shrinkServant: false });
+ } else if (f === "shrinkServant") {
+ onChange({ removeKing: false, shrinkServant: true });
+ } else if (f === "shortest") {
+ onChange({ removeKing: true, shrinkServant: true });
+ }
+ }
+ // TODO: limit display of shrinking options based on the verb type
+ return
+ {/*
Abbreviation Options
*/}
+
+
+}
+
+export default AbbreviationFormSelector;
\ No newline at end of file
diff --git a/src/components/vp-explorer/ChartDisplay.tsx b/src/components/vp-explorer/ChartDisplay.tsx
new file mode 100644
index 0000000..34ccd03
--- /dev/null
+++ b/src/components/vp-explorer/ChartDisplay.tsx
@@ -0,0 +1,27 @@
+import { getTenseVerbForm } from "../../lib/phrase-building/vp-tools";
+import VerbFormDisplay from "../VerbFormDisplay";
+import { conjugateVerb } from "../../lib/verb-conjugation";
+import * as T from "../../types";
+
+function ChartDisplay({ VS, opts }: { VS: T.VerbSelection, opts: T.TextOptions }) {
+ const rawConjugations = conjugateVerb(VS.verb.entry, VS.verb.complement);
+ if (!rawConjugations) {
+ return Error conjugating verb
;
+ }
+ const conjugations = ("stative" in rawConjugations)
+ ? rawConjugations[VS.isCompound === "stative" ? "stative" : "dynamic"]
+ : ("transitive" in rawConjugations)
+ ? rawConjugations[VS.transitivity === "grammatically transitive" ? "grammaticallyTransitive" : "transitive"]
+ : rawConjugations;
+ const form = getTenseVerbForm(conjugations, VS.tense, VS.tenseCategory, VS.voice);
+ return
+
+
;
+}
+
+export default ChartDisplay;
\ No newline at end of file
diff --git a/src/components/vp-explorer/TensePicker.tsx b/src/components/vp-explorer/TensePicker.tsx
new file mode 100644
index 0000000..ff1f17a
--- /dev/null
+++ b/src/components/vp-explorer/TensePicker.tsx
@@ -0,0 +1,178 @@
+import Select from "react-select";
+import {
+ zIndexProps,
+} from "../np-picker/picker-tools";
+import * as T from "../../types";
+import ButtonSelect from "../ButtonSelect";
+import { isPerfectTense } from "../../lib/phrase-building/vp-tools";
+
+const tenseOptions: { label: string | JSX.Element, value: T.VerbTense }[] = [{
+ label: present
,
+ value: "presentVerb",
+}, {
+ label: subjunctive
,
+ value: "subjunctiveVerb",
+}, {
+ label: imperfective future
,
+ value: "imperfectiveFuture",
+}, {
+ label: perfective future
,
+ value: "perfectiveFuture",
+}, {
+ label: continuous past
,
+ value: "imperfectivePast",
+}, {
+ label: simple past
,
+ value: "perfectivePast",
+}, {
+ label: habitual continual past
,
+ value: "habitualImperfectivePast",
+}, {
+ label: habitual simple past
,
+ value: "habitualPerfectivePast",
+}];
+
+const perfectTenseOptions: { label: string | JSX.Element, value: T.PerfectTense }[] = [{
+ label: "Present Perfect",
+ value: "present perfect",
+}, {
+ label: "Habitual Perfect",
+ value: "habitual perfect",
+}, {
+ label: "Subjunctive Perfect",
+ value: "subjunctive perfect",
+}, {
+ label: "Future Perfect",
+ value: "future perfect",
+}, {
+ label: "Past Perfect",
+ value: "past perfect",
+}, {
+ label: `"Would Be" Perfect`,
+ value: "wouldBe perfect",
+}, {
+ label: "Past Subjunctive Perfect",
+ value: "pastSubjunctive perfect",
+}];
+
+function TensePicker({ onChange, verb, mode }: {
+ verb: T.VerbSelection | undefined,
+ onChange: (p: T.VerbSelection | undefined) => void,
+ mode: "charts" | "phrases",
+}) {
+ function onTenseSelect(o: { value: T.VerbTense | T.PerfectTense } | null) {
+ const value = o?.value ? o.value : undefined;
+ if (verb && value) {
+ if (isPerfectTense(value)) {
+ onChange({
+ ...verb,
+ tense: value,
+ tenseCategory: "perfect",
+ });
+ } else {
+ onChange({
+ ...verb,
+ tense: value,
+ tenseCategory: verb.tenseCategory === "perfect" ? "basic" : verb.tenseCategory,
+ });
+ }
+ }
+ }
+ function moveTense(dir: "forward" | "back") {
+ if (!verb) return;
+ return () => {
+ const tenses = verb.tenseCategory === "perfect" ? perfectTenseOptions : tenseOptions;
+ const currIndex = tenses.findIndex(tn => tn.value === verb.tense)
+ if (currIndex === -1) {
+ console.error("error moving tense", dir);
+ return;
+ }
+ const newIndex = dir === "forward"
+ ? ((currIndex + 1) % tenses.length)
+ : (currIndex === 0 ? (tenses.length - 1) : (currIndex - 1))
+ const newTense = tenses[newIndex];
+ onTenseSelect(newTense);
+ };
+ }
+ function onPosNegSelect(value: string) {
+ if (verb) {
+ onChange({
+ ...verb,
+ negative: value === "true",
+ });
+ }
+ }
+ function onTenseCategorySelect(value: "basic" | "modal" | "perfect") {
+ if (verb) {
+ if (value === "perfect") {
+ onChange({
+ ...verb,
+ tenseCategory: value,
+ tense: isPerfectTense(verb.tense) ? verb.tense : "present perfect",
+ });
+ } else {
+ onChange({
+ ...verb,
+ tenseCategory: value,
+ tense: isPerfectTense(verb.tense) ? "presentVerb" : verb.tense,
+ });
+ }
+ }
+ }
+ const tOptions = (verb?.tenseCategory === "perfect") ? perfectTenseOptions : tenseOptions;
+ return
+
+
+
Tense:
+ {verb &&
+
+
}
+
+
+
;
+}
+
+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 &&
}
+ {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"