urdu-text-utils 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +41 -1
- package/dist/index.cjs +367 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +174 -6
- package/dist/index.d.ts +174 -6
- package/dist/index.iife.js +1 -1
- package/dist/index.iife.js.map +1 -1
- package/dist/index.js +359 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.iife.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chars.ts","../src/normalize.ts","../src/numbers.ts","../src/detect.ts","../src/stats.ts","../src/stopwords.ts","../src/collate.ts","../src/search.ts","../src/dictionary.ts","../src/transliterate.ts","../src/date.ts","../src/stemmer.ts","../src/names.ts"],"names":["DIACRITIC_RANGES","DIACRITICS_RE","TATWEEL_RE","INVISIBLE_RE","ZWNJ_RE","ARABIC_LETTER_RANGES","ARABIC_LETTER_RE","ANY_LETTER_RE_G","URDU_DIGITS","ARABIC_INDIC_DIGITS","ASCII_DIGITS","ANY_DIGIT_RE_G","SENTENCE_SPLIT_RE","WORD_SPLIT_RE","URDU_LETTERS","LETTER_MAP","ch","aliases","alias","digitTargets","PUNCTUATION_MAP","DIGIT_LOOKUP","set","i","normalizeUrdu","input","options","compatibility","stripDiacritics","stripTatweel","stripZwnj","collapseWhitespace","digits","urduPunctuation","text","digitTarget","out","mapped","value","punct","removeDiacritics","foldUrdu","SETS","VALUE_OF","convert","target","toUrduDigits","toEnglishDigits","toArabicIndicDigits","convertNumbers","to","parseUrduNumber","ascii","ONES","TEENS_AND_TENS","numberToUrduWords","scales","parts","rest","size","name","count","tens","urduRatio","letters","urdu","isUrdu","threshold","minLetters","URDU_ONLY","hasUrduSpecificLetters","countWords","splitWords","w","SENTENCE_ABBREVIATIONS","ABBREV_PATTERN","countSentences","splitSentences","preserveTerminators","PROTECTED_DOT","PROTECTED_URDU_FULL_STOP","sanitized","match","s","analyzeUrdu","characters","charactersNoSpaces","words","sentences","paragraphs","p","URDU_STOP_WORDS","toStopWordSet","custom","isStopWord","word","customStopWords","normalized","filterStopWords","stopSet","removeStopWords","PRIMARY_LETTERS","letter","WEIGHTS","index","baseWeight","NON_LETTER_BASE","weightsOf","weight","compareUrdu","b","left","right","length","diff","sortUrdu","items","descending","getText","key","item","sorted","a","editDistance","limit","previous","_","current","rowMin","j","cost","scoreOf","query","queryWords","textWords","matched","qw","tw","searchUrdu","searchUrduRanked","r","fuzzy","maxDistance","sortByScore","read","folded","results","score","highlightUrdu","wrap","m","foldedQuery","sourceChars","foldedChars","sourceIndexOf","f","haystack","cursor","from","hit","startSource","endSource","WORD_DICTIONARY","ROMAN_VARIANTS","DIGRAPHS","LETTERS","VOWEL_LETTERS","roman","vowel","romanizeWord","dictionary","chars","pieces","last","pair","digraph","next","romanize","chunk","ROMAN_DICTIONARY","urduWord","ROMAN_RULES","romanWordToUrdu","lower","position","pattern","replacement","romanToUrdu","urduSlug","separator","maxLength","preserveUrdu","allowed","slug","part","lastSeparator","URDU_MONTHS_GREGORIAN","URDU_MONTHS_HIJRI","URDU_WEEKDAYS","parseDateInput","date","getUrduMonthName","monthIndex","calendar","normalizedIndex","idx","getUrduWeekdayName","dayIndex","formatUrduDate","d","year","month","dayOfMonth","dayOfWeek","hours24","hours12","minutes","seconds","pad","n","periodDetailed","periodSimple","tokenValues","regex","val","timeAgoUrdu","relativeTo","now","addSuffix","formatNum","num","diffMs","isPast","absDiffSeconds","hours","days","weeks","months","years","URDU_PREFIXES","URDU_SUFFIXES","PROTECTED_WORDS","applySuffixStripping","suffixes","minLen","suf","remainder","applyPrefixStripping","prefixes","pref","getAffixes","clean","doSuffixes","doPrefixes","detectedSuffix","detectedPrefix","sRes","pRes","stemUrdu","stemUrduText","token","URDU_FIRST_NAMES","URDU_FAMILY_NAMES","HONORIFICS","NAME_PREFIXES","ENGLISH_TO_URDU","table","englishWord","ENGLISH_NAME_ALIASES","transliterateSingleName","urduName","result","honorific","firstName","familyName","prefix","transliterateNameWord","consonants","base","transliterateNameToEnglish","preserveCase","includeHonorifics","transliterateNameToUrdu","englishName","reverseTransliterateName","extractNameParts","fullName","honorifics","suffix","nameWords"],"mappings":"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A,iCACA,sCAAA,CACA,gCAAA,CACA,iCACA,oBAAA,CACA,gCAAA,CACA,0BAAA,CACA,gCAAA,CACA,qBACA,0BAAA,CACA,0BAAA,CACA,oBAAA,CACA,gCAAA,CACA,2BACA,0BAAA,CACA,oBAAA,CACA,0BAAA,CACA,gCAAA,CAGA,qBACA,cAAA,CACA,oBAAA,CACA,2BACA,oBAAA,CACA,cAAA,CACA,qBACA,cAAA,CACA,cAAA,CACA,0BAAA,CACA,cAAA,CACA,eACA,0BAAA,CACA,4CAAA,CACA,iCACA,sCAAA,CACA,0BAAA,CACA,2BACA,gCAAA,CACA,gCAAA,CACA,0BAAA,CACA,sCAAA,CACA,uCACA,sCAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,qBACA,oBAAA,CACA,gCAAA,CACA,oBAAA,CACA,oBAAA,CACA,qBAGA,cAAA,CACA,cAAA,CACA,eACA,cAAA,CACA,cAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,gCAAA,CACA,gCAAA,CACA,iCACA,sCAAA,CACA,sCAAA,CACA,uCACA,0BAAA,CACA,0BAAA,CACA,2BACA,cAAA,CACA,0BAAA,CACA,0BAAA,CACA,0BAAA,CACA,qBACA,cAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,gCAAA,CACA,2BACA,0BAAA,CACA,gCAAA,CACA,cAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,oBAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,gCAAA,CACA,gCAAA,CACA,cAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,oBAAA,CACA,0BAAA,CACA,oBAAA,CACA,qBACA,0BAAA,CACA,0BAAA,CACA,0BAAA,CACA,0BAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,cAAA,CACA,cAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CACA,cAAA,CACA,qBACA,0BAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CAGA,0BAAA,CACA,0BAAA,CA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","file":"index.iife.js","sourcesContent":["/**\n * Shared Unicode building blocks for the Arabic script as used by Urdu.\n *\n * Blocks worth remembering:\n * U+0600-U+06FF Arabic (Urdu letters live here, plus the U+06Ax-U+06Dx extras)\n * U+0750-U+077F Arabic Supplement\n * U+08A0-U+08FF Arabic Extended-A\n * U+FB50-U+FDFF Arabic Presentation Forms-A\n * U+FE70-U+FEFC Arabic Presentation Forms-B\n *\n * Every class below is written with \\u escapes on purpose: these characters are\n * invisible or shape-shifting in an editor, and a silently wrong literal is the\n * single easiest way to break an Urdu pipeline.\n */\n\n/**\n * Combining marks: harakat (ً-ٟ), quranic annotation (ۖ-ۭ),\n * superscript alef (ٰ) and the ؐ-ؚ honorific marks.\n * Deliberately excludes U+06D4 (Urdu full stop ۔), U+06D2 (ے) and U+06D3 (ۓ).\n */\nexport const DIACRITIC_RANGES = \"\\\\u0610-\\\\u061A\\\\u064B-\\\\u065F\\\\u0670\\\\u06D6-\\\\u06ED\";\n\nexport const DIACRITICS_RE = new RegExp(`[${DIACRITIC_RANGES}]`, \"gu\");\n\n/** Tatweel / kashida U+0640 — display padding, never meaning. */\nexport const TATWEEL_RE = /ـ/gu;\n\n/** Bidi controls, joiners and BOM that leak in from copy-paste. ZWNJ is handled separately. */\nexport const INVISIBLE_RE = /[----]/gu;\n\n/** Zero-width non-joiner U+200C: occasionally meaningful, so stripped only on request. */\nexport const ZWNJ_RE = //gu;\n\nconst ARABIC_SCRIPT_RANGES = \"\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\u08A0-\\\\u08FF\\\\uFB50-\\\\uFDFF\\\\uFE70-\\\\uFEFC\";\n\n/** Any Arabic-script character: letters, marks, punctuation, digits, presentation forms. */\nexport const ARABIC_SCRIPT_RE = new RegExp(`[${ARABIC_SCRIPT_RANGES}]`, \"u\");\n\n/**\n * Whole-string match for a single Urdu word (dictionary keys and values):\n * Arabic-script characters plus ZWNJ/ZWJ — the joiners are meaningful inside\n * words such as جزاکاللہ — and nothing else. Rejects whitespace and\n * foreign-script lookalikes (Devanagari, Gurmukhi, Latin) that would silently\n * break lookups, so data-table integrity tests can share one definition.\n */\nexport const ARABIC_WORD_RE = new RegExp(`^[${ARABIC_SCRIPT_RANGES}\\\\u200C\\\\u200D]+$`, \"u\");\n\nconst ARABIC_LETTER_RANGES =\n \"\\\\u0620-\\\\u063F\\\\u0641-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FF\" +\n \"\\\\u0750-\\\\u077F\\\\u08A0-\\\\u08FF\\\\uFB50-\\\\uFDFF\\\\uFE70-\\\\uFEFC\";\n\n/** Arabic-script letters only — no marks, no digits, no punctuation, no tatweel. */\nexport const ARABIC_LETTER_RE = new RegExp(`[${ARABIC_LETTER_RANGES}]`, \"u\");\nexport const ARABIC_LETTER_RE_G = new RegExp(`[${ARABIC_LETTER_RANGES}]`, \"gu\");\n\n/** Letters of any script — the denominator when measuring \"how Urdu is this text\". */\nexport const ANY_LETTER_RE = /\\p{L}/u;\nexport const ANY_LETTER_RE_G = /\\p{L}/gu;\n\n/** Urdu digits ۰-۹ (U+06F0) and Arabic-Indic digits ٠-٩ (U+0660) are two distinct blocks. */\nexport const URDU_DIGITS = \"۰۱۲۳۴۵۶۷۸۹\";\nexport const ARABIC_INDIC_DIGITS = \"٠١٢٣٤٥٦٧٨٩\";\nexport const ASCII_DIGITS = \"0123456789\";\n\nexport const ANY_DIGIT_RE_G = new RegExp(`[${ASCII_DIGITS}${URDU_DIGITS}${ARABIC_INDIC_DIGITS}]`, \"gu\");\n\n/** Sentence terminators: Urdu full stop ۔, Arabic question mark ؟, ASCII . ! ? and ellipsis. */\nexport const SENTENCE_SPLIT_RE = /[۔؟?!.…]+/u;\n\n/** Word separators: whitespace plus punctuation that cannot occur inside an Urdu word. */\nexport const WORD_SPLIT_RE =\n /[\\s،؛؟۔٫٬…!-\\/:-@\\[-`{-~‐-‧«»‘’“”]+/u;\n\n// ---------------------------------------------------------------------------\n// Canonical Urdu letter inventory\n// ---------------------------------------------------------------------------\n\n// Unlike the regex ranges above, letters here are written as literals: they are\n// data keys, not patterns, and several are referenced from normalize.ts,\n// collate.ts and transliterate.ts. Non-obvious codepoints carry comments.\n\nexport interface UrduLetter {\n /** The canonical Urdu letter. */\n ch: string;\n /** Default Roman Urdu value, used when no positional rule applies. */\n roman: string;\n /** The letter carries a vowel in Roman output (drives the schwa rule). */\n vowel?: boolean;\n /** Alternate spellings in the wild that normalizeUrdu folds to this letter. */\n aliases?: string[];\n /** Hamza-carrying letter: collates as its base letter with a secondary tiebreaker. */\n variantOf?: string;\n}\n\n/**\n * The canonical Urdu alphabet (حروف تہجی) in alphabetical order — the single\n * source of truth for the letter inventory shared by normalization, collation\n * and transliteration:\n *\n * - {@link URDU_LETTERS} order defines collation (primary letters only;\n * hamza variants carry {@link UrduLetter.variantOf});\n * - {@link UrduLetter.roman} and {@link UrduLetter.vowel} feed transliteration;\n * - {@link UrduLetter.aliases} are the Arabic-keyboard and historical spellings\n * that normalization folds onto the canonical letter.\n *\n * Keeping one table means adding a letter updates all three consumers at once\n * instead of three hand-maintained maps drifting apart.\n */\nexport const URDU_LETTERS: readonly UrduLetter[] = [\n { ch: \"ا\", roman: \"a\", vowel: true, aliases: [\"أ\", \"إ\", \"ٱ\", \"ٲ\", \"ٳ\"] }, // alef + hamza/wasla forms\n { ch: \"آ\", roman: \"aa\", vowel: true }, // alef madda — a real Urdu letter\n { ch: \"ب\", roman: \"b\" },\n { ch: \"پ\", roman: \"p\" },\n { ch: \"ت\", roman: \"t\" },\n { ch: \"ٹ\", roman: \"t\" },\n { ch: \"ث\", roman: \"s\" },\n { ch: \"ج\", roman: \"j\" },\n { ch: \"چ\", roman: \"ch\" },\n { ch: \"ح\", roman: \"h\" },\n { ch: \"خ\", roman: \"kh\" },\n { ch: \"د\", roman: \"d\" },\n { ch: \"ڈ\", roman: \"d\" },\n { ch: \"ذ\", roman: \"z\" },\n { ch: \"ر\", roman: \"r\" },\n { ch: \"ڑ\", roman: \"r\" },\n { ch: \"ز\", roman: \"z\" },\n { ch: \"ژ\", roman: \"zh\" },\n { ch: \"س\", roman: \"s\" },\n { ch: \"ش\", roman: \"sh\" },\n { ch: \"ص\", roman: \"s\" },\n { ch: \"ض\", roman: \"z\" },\n { ch: \"ط\", roman: \"t\" },\n { ch: \"ظ\", roman: \"z\" },\n { ch: \"ع\", roman: \"a\", vowel: true },\n { ch: \"غ\", roman: \"gh\" },\n { ch: \"ف\", roman: \"f\" },\n { ch: \"ق\", roman: \"q\" },\n { ch: \"ک\", roman: \"k\", aliases: [\"ك\", \"ڪ\"] }, // arabic kaf, swash kaf\n { ch: \"گ\", roman: \"g\" },\n { ch: \"ل\", roman: \"l\" },\n { ch: \"م\", roman: \"m\" },\n { ch: \"ن\", roman: \"n\" },\n { ch: \"ں\", roman: \"n\" }, // noon ghunna\n { ch: \"و\", roman: \"o\", vowel: true, aliases: [\"ۋ\", \"ۆ\", \"ۇ\"] }, // ve, oe, u\n { ch: \"ؤ\", roman: \"o\", vowel: true, variantOf: \"و\" }, // waw with hamza — kept, hamza is meaningful\n { ch: \"ہ\", roman: \"h\", aliases: [\"ه\", \"ۀ\", \"ة\", \"ۃ\", \"ە\"] }, // arabic heh, heh-yeh-above, teh marbuta, ae\n { ch: \"ۂ\", roman: \"h\", vowel: true, variantOf: \"ہ\" }, // heh goal with hamza above\n { ch: \"ھ\", roman: \"h\" }, // do-chashmi heh — distinct letter, aspirates the consonant before it\n { ch: \"ء\", roman: \"\" }, // hamza\n { ch: \"ی\", roman: \"i\", vowel: true, aliases: [\"ي\", \"ى\", \"ۍ\", \"ې\", \"ؠ\"] }, // arabic yeh, alef maksura, yeh-with-tail, pashto e, kashmiri yeh\n { ch: \"ئ\", roman: \"i\", vowel: true, variantOf: \"ی\" }, // yeh with hamza above\n { ch: \"ے\", roman: \"e\", vowel: true }, // bari ye — distinct letter\n { ch: \"ۓ\", roman: \"e\", vowel: true, variantOf: \"ے\" }, // bari ye with hamza\n];\n","import {\n ARABIC_INDIC_DIGITS,\n ASCII_DIGITS,\n DIACRITICS_RE,\n INVISIBLE_RE,\n TATWEEL_RE,\n URDU_DIGITS,\n URDU_LETTERS,\n ZWNJ_RE,\n} from \"./chars.js\";\nimport type { DigitStyle } from \"./numbers.js\";\n\n/**\n * Arabic-script spellings that Urdu writes with a different letter.\n *\n * The direction matters and is a common source of bugs: Urdu uses\n * ہ (U+06C1 heh goal) and ی (U+06CC farsi yeh), NOT the Arabic\n * ه (U+0647) and ي (U+064A). Text pasted from Arabic keyboards,\n * Windows-1256 conversions or older CMSes carries the Arabic forms,\n * which then fail every naive `===` comparison.\n *\n * The alias lists live on the canonical letters in chars.ts (URDU_LETTERS) and\n * are inverted here, so the fold set and the letter inventory can never drift.\n */\nconst LETTER_MAP: Record<string, string> = {};\nfor (const { ch, aliases } of URDU_LETTERS) {\n for (const alias of aliases ?? []) {\n LETTER_MAP[alias] = ch;\n }\n}\n\nconst digitTargets: Record<DigitStyle, string> = {\n urdu: URDU_DIGITS,\n english: ASCII_DIGITS,\n arabic: ARABIC_INDIC_DIGITS,\n};\n\nexport interface NormalizeOptions {\n /** Apply Unicode NFKC first, folding presentation forms (ﻻ, ﮐ) back to real letters. Default `true`. */\n compatibility?: boolean;\n /** Strip harakat and quranic marks. Default `false` — see {@link removeDiacritics}. */\n stripDiacritics?: boolean;\n /** Remove tatweel/kashida padding. Default `true`. */\n stripTatweel?: boolean;\n /** Remove zero-width non-joiner. Default `false`, since ZWNJ can be meaningful. */\n stripZwnj?: boolean;\n /** Collapse whitespace runs to a single space and trim. Default `true`. */\n collapseWhitespace?: boolean;\n /** Rewrite every digit to one style. Default `\"preserve\"`. */\n digits?: DigitStyle | \"preserve\";\n /** Map ASCII `,` `;` `?` to Urdu `،` `؛` `؟`. Default `false`. */\n urduPunctuation?: boolean;\n}\n\nconst PUNCTUATION_MAP: Record<string, string> = {\n \",\": \"،\", // ،\n \";\": \"؛\", // ؛\n \"?\": \"؟\", // ؟\n};\n\nconst DIGIT_LOOKUP = new Map<string, number>();\nfor (const set of [ASCII_DIGITS, URDU_DIGITS, ARABIC_INDIC_DIGITS]) {\n for (let i = 0; i < 10; i++) DIGIT_LOOKUP.set(set[i]!, i);\n}\n\n/**\n * Fold an Urdu string to a single canonical Unicode form.\n *\n * @example\n * normalizeUrdu(\"كيا حال ہے\") // \"کیا حال ہے\"\n */\nexport function normalizeUrdu(input: string, options: NormalizeOptions = {}): string {\n if (!input) return \"\";\n\n const {\n compatibility = true,\n stripDiacritics = false,\n stripTatweel = true,\n stripZwnj = false,\n collapseWhitespace = true,\n digits = \"preserve\",\n urduPunctuation = false,\n } = options;\n\n let text = compatibility ? input.normalize(\"NFKC\") : input.normalize(\"NFC\");\n\n text = text.replace(INVISIBLE_RE, \"\");\n if (stripZwnj) text = text.replace(ZWNJ_RE, \"\");\n if (stripTatweel) text = text.replace(TATWEEL_RE, \"\");\n if (stripDiacritics) text = text.replace(DIACRITICS_RE, \"\");\n\n const digitTarget = digits === \"preserve\" ? null : digitTargets[digits];\n\n let out = \"\";\n for (const ch of text) {\n const mapped = LETTER_MAP[ch];\n if (mapped !== undefined) {\n out += mapped;\n continue;\n }\n if (digitTarget) {\n const value = DIGIT_LOOKUP.get(ch);\n if (value !== undefined) {\n out += digitTarget[value];\n continue;\n }\n }\n if (urduPunctuation) {\n const punct = PUNCTUATION_MAP[ch];\n if (punct !== undefined) {\n out += punct;\n continue;\n }\n }\n out += ch;\n }\n\n if (collapseWhitespace) out = out.replace(/\\s+/gu, \" \").trim();\n\n return out;\n}\n\n/**\n * Strip harakat, quranic annotation marks and superscript alef.\n * Keeps ۔ ے ۓ, which are letters/punctuation rather than marks.\n *\n * @example\n * removeDiacritics(\"مُحَمَّد\") // \"محمد\"\n */\nexport function removeDiacritics(input: string): string {\n if (!input) return \"\";\n return input.normalize(\"NFC\").replace(DIACRITICS_RE, \"\");\n}\n\n/**\n * The comparison key used by {@link searchUrdu} and {@link sortUrdu}:\n * normalized, diacritic-free, lowercased, whitespace-collapsed.\n * Two strings that a reader would call \"the same word\" should fold to the same key.\n */\nexport function foldUrdu(input: string): string {\n return normalizeUrdu(input, {\n stripDiacritics: true,\n stripZwnj: true,\n collapseWhitespace: true,\n }).toLowerCase();\n}\n","import { ARABIC_INDIC_DIGITS, ASCII_DIGITS, URDU_DIGITS } from \"./chars.js\";\n\nconst SETS = {\n urdu: URDU_DIGITS,\n english: ASCII_DIGITS,\n arabic: ARABIC_INDIC_DIGITS,\n} as const;\n\nexport type DigitStyle = keyof typeof SETS;\n\nconst VALUE_OF = new Map<string, number>();\nfor (const set of Object.values(SETS)) {\n for (let i = 0; i < 10; i++) VALUE_OF.set(set[i]!, i);\n}\n\nfunction convert(input: string, target: DigitStyle): string {\n if (!input) return \"\";\n const digits = SETS[target];\n let out = \"\";\n for (const ch of input) {\n const value = VALUE_OF.get(ch);\n out += value === undefined ? ch : digits[value];\n }\n return out;\n}\n\n/** `12345` -> `۱۲۳۴۵`. Accepts Arabic-Indic digits as input too. */\nexport function toUrduDigits(input: string): string {\n return convert(input, \"urdu\");\n}\n\n/** `۱۲۳۴۵` -> `12345`. Safe to feed into `Number()` afterwards. */\nexport function toEnglishDigits(input: string): string {\n return convert(input, \"english\");\n}\n\n/** `۱۲۳۴۵` -> `١٢٣٤٥` (Arabic-Indic, U+0660 block — a different block from Urdu's). */\nexport function toArabicIndicDigits(input: string): string {\n return convert(input, \"arabic\");\n}\n\n/**\n * Rewrite every digit in `input` to one style.\n *\n * @example\n * convertNumbers(\"12345\") // \"۱۲۳۴۵\"\n * convertNumbers(\"۱۲۳۴۵\", \"english\") // \"12345\"\n */\nexport function convertNumbers(input: string, to: DigitStyle = \"urdu\"): string {\n return convert(input, to);\n}\n\n/**\n * Parse a number written with Urdu or Arabic-Indic digits.\n * Handles the Urdu decimal separator ٫ and thousands separator ٬.\n * Returns `NaN` when the string is not a number.\n */\nexport function parseUrduNumber(input: string): number {\n if (!input) return NaN;\n const ascii = toEnglishDigits(input)\n .replace(/[٬,\\s]/gu, \"\")\n .replace(/٫/gu, \".\");\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/u.test(ascii)) return NaN;\n return Number(ascii);\n}\n\nconst ONES = [\"\", \"ایک\", \"دو\", \"تین\", \"چار\", \"پانچ\", \"چھ\", \"سات\", \"آٹھ\", \"نو\"];\nconst TEENS_AND_TENS: Record<number, string> = {\n 10: \"دس\",\n 11: \"گیارہ\",\n 12: \"بارہ\",\n 13: \"تیرہ\",\n 14: \"چودہ\",\n 15: \"پندرہ\",\n 16: \"سولہ\",\n 17: \"سترہ\",\n 18: \"اٹھارہ\",\n 19: \"انیس\",\n 20: \"بیس\",\n 30: \"تیس\",\n 40: \"چالیس\",\n 50: \"پچاس\",\n 60: \"ساٹھ\",\n 70: \"ستر\",\n 80: \"اسی\",\n 90: \"نوے\",\n 100: \"سو\",\n};\n\n/**\n * Spell a whole number in Urdu words, using the South Asian scale\n * (ہزار, لاکھ, کروڑ, ارب) rather than the western million/billion scale.\n *\n * Coverage note: 21-99 that are not multiples of ten are written compositionally\n * (`اکیس` etc. are irregular in real Urdu, so this returns `بیس ایک`-style forms\n * only as a fallback). Marked experimental for that reason.\n *\n * @experimental\n */\nexport function numberToUrduWords(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n if (!Number.isInteger(value)) throw new TypeError(\"numberToUrduWords expects an integer\");\n if (value < 0) return `منفی ${numberToUrduWords(-value)}`;\n if (value === 0) return \"صفر\";\n\n const scales: Array<[number, string]> = [\n [10_000_000, \"کروڑ\"],\n [100_000, \"لاکھ\"],\n [1_000, \"ہزار\"],\n [100, \"سو\"],\n ];\n\n const parts: string[] = [];\n let rest = value;\n for (const [size, name] of scales) {\n if (rest >= size) {\n const count = Math.floor(rest / size);\n rest %= size;\n parts.push(`${numberToUrduWords(count)} ${name}`);\n }\n }\n if (rest > 0) {\n if (TEENS_AND_TENS[rest]) {\n parts.push(TEENS_AND_TENS[rest]!);\n } else if (rest < 10) {\n parts.push(ONES[rest]!);\n } else {\n const tens = Math.floor(rest / 10) * 10;\n parts.push(`${TEENS_AND_TENS[tens] ?? \"\"} ${ONES[rest % 10] ?? \"\"}`.trim());\n }\n }\n return parts.join(\" \").replace(/\\s+/gu, \" \").trim();\n}\n","import { ANY_LETTER_RE_G, ARABIC_LETTER_RE } from \"./chars.js\";\n\nexport interface IsUrduOptions {\n /**\n * Minimum share of Arabic-script letters among all letters, 0-1. Default `0.5`.\n * A ratio rather than \"contains any Urdu\" so that a mostly-English string with\n * one Urdu word does not count as Urdu.\n */\n threshold?: number;\n /** Require at least this many Arabic-script letters. Default `1`. */\n minLetters?: number;\n}\n\n/**\n * Ratio of Arabic-script letters to all letters, 0-1.\n * Returns 0 for text with no letters at all (digits, punctuation, emoji).\n */\nexport function urduRatio(input: string): number {\n if (!input) return 0;\n let letters = 0;\n let urdu = 0;\n for (const ch of input.match(ANY_LETTER_RE_G) ?? []) {\n letters++;\n if (ARABIC_LETTER_RE.test(ch)) urdu++;\n }\n return letters === 0 ? 0 : urdu / letters;\n}\n\n/**\n * Is this text Urdu (more precisely: predominantly Arabic-script)?\n *\n * The Arabic script is shared by Urdu, Arabic, Persian, Pashto and others, so\n * this cannot distinguish Urdu from Arabic on script alone. Use\n * {@link hasUrduSpecificLetters} when that distinction matters.\n *\n * @example\n * isUrdu(\"آپ کیسے ہیں؟\") // true\n */\nexport function isUrdu(input: string, options: IsUrduOptions = {}): boolean {\n const { threshold = 0.5, minLetters = 1 } = options;\n if (!input) return false;\n\n let letters = 0;\n let urdu = 0;\n for (const ch of input.match(ANY_LETTER_RE_G) ?? []) {\n letters++;\n if (ARABIC_LETTER_RE.test(ch)) urdu++;\n }\n if (urdu < minLetters) return false;\n return letters > 0 && urdu / letters >= threshold;\n}\n\n/** Letters that exist in Urdu but not in Arabic — the only reliable script-level signal. */\nconst URDU_ONLY = new Set([\n \"ٹ\", // ٹ tteh\n \"ڈ\", // ڈ ddal\n \"ڑ\", // ڑ rreh\n \"ں\", // ں noon ghunna\n \"ے\", // ے bari ye\n \"ۓ\", // ۓ bari ye with hamza\n \"ہ\", // ہ heh goal\n \"ھ\", // ھ do-chashmi heh\n \"ک\", // ک keheh\n \"گ\", // گ gaf\n \"چ\", // چ tcheh\n \"پ\", // پ peh\n \"ژ\", // ژ jeh\n \"ی\", // ی farsi yeh\n]);\n\n/**\n * True when the text contains at least one letter that Arabic does not use.\n * Cheap way to separate Urdu/Persian-family text from Arabic text.\n */\nexport function hasUrduSpecificLetters(input: string): boolean {\n for (const ch of input) if (URDU_ONLY.has(ch)) return true;\n return false;\n}\n","import {\n ANY_DIGIT_RE_G,\n DIACRITICS_RE,\n SENTENCE_SPLIT_RE,\n WORD_SPLIT_RE,\n} from \"./chars.js\";\nimport { urduRatio } from \"./detect.js\";\n\n/** Words in the text. Splits on whitespace and punctuation, so `ہے۔` counts once. */\nexport function countWords(input: string): number {\n return splitWords(input).length;\n}\n\n/** The word list behind {@link countWords}. Useful for tokenizing before search or indexing. */\nexport function splitWords(input: string): string[] {\n if (!input) return [];\n return input\n .split(WORD_SPLIT_RE)\n .map((w) => w.trim())\n .filter((w) => w.length > 0);\n}\n\nexport interface SplitSentenceOptions {\n /** If true, the sentence-ending punctuation (۔ ؟ ! . etc.) is preserved with each sentence. Default `false`. */\n preserveTerminators?: boolean;\n}\n\n/** Common Urdu abbreviations and honorifics that should not cause false sentence splits. */\nexport const SENTENCE_ABBREVIATIONS = [\n \"ڈاکٹر\",\n \"پروفیسر\",\n \"انجینئر\",\n \"ایڈووکیٹ\",\n \"جناب\",\n \"صاحب\",\n \"صاحبہ\",\n \"محترم\",\n \"محترمہ\",\n \"مولانا\",\n \"مفتی\",\n \"علامہ\",\n \"بیگم\",\n \"وغیرہ\",\n \"رحمتہ\",\n \"رضی\",\n \"تعالی\",\n \"تعالیٰ\",\n \"علیہ\",\n \"السلام\",\n \"صلی\",\n \"وسلم\",\n];\n\nconst ABBREV_PATTERN = new RegExp(`(?:${SENTENCE_ABBREVIATIONS.join(\"|\")})[.۔]`, \"gu\");\n\n/**\n * Sentences count, split on Urdu and standard terminators (۔ ؟ ! . …).\n * Protects common titles, abbreviations, and numeric decimals from false splits.\n */\nexport function countSentences(input: string, options?: SplitSentenceOptions): number {\n return splitSentences(input, options).length;\n}\n\n/**\n * Split text into sentences using Urdu punctuation rules.\n *\n * Handles Urdu full stop `۔`, Arabic question mark `؟`, exclamation `!`,\n * ASCII `.`, `?`, `!`, and ellipses `…`, while protecting abbreviations and numbers.\n *\n * @param input - Input text.\n * @param options - Options controlling termination preservation.\n *\n * @example\n * splitSentences(\"پاکستان ایک خوبصورت ملک ہے۔ اس کی تاریخ پرانی ہے۔\")\n * // [\"پاکستان ایک خوبصورت ملک ہے\", \"اس کی تاریخ پرانی ہے\"]\n */\nexport function splitSentences(input: string, options: SplitSentenceOptions = {}): string[] {\n if (!input) return [];\n\n const { preserveTerminators = false } = options;\n\n // Placeholder for protected dots\n const PROTECTED_DOT = \"\\uE000\";\n const PROTECTED_URDU_FULL_STOP = \"\\uE001\";\n\n let sanitized = input\n // Protect decimal numbers (1.5, 3.14, ۱٫۵)\n .replace(/(\\d)\\.(\\d)/gu, `$1${PROTECTED_DOT}$2`)\n // Protect abbreviations followed by dot or Urdu full stop\n .replace(ABBREV_PATTERN, (match) => {\n return match.replace(/\\./g, PROTECTED_DOT).replace(/۔/g, PROTECTED_URDU_FULL_STOP);\n });\n\n if (preserveTerminators) {\n // Split keeping delimiter\n const matches = sanitized.match(/[^۔؟?!.…]+[۔؟?!.…]+|[^۔؟?!.…]+$/gu) ?? [];\n return matches\n .map((s) =>\n s\n .replace(new RegExp(PROTECTED_DOT, \"gu\"), \".\")\n .replace(new RegExp(PROTECTED_URDU_FULL_STOP, \"gu\"), \"۔\")\n .trim(),\n )\n .filter((s) => s.length > 0);\n }\n\n return sanitized\n .split(SENTENCE_SPLIT_RE)\n .map((s) =>\n s\n .replace(new RegExp(PROTECTED_DOT, \"gu\"), \".\")\n .replace(new RegExp(PROTECTED_URDU_FULL_STOP, \"gu\"), \"۔\")\n .trim(),\n )\n .filter((s) => s.length > 0);\n}\n\nexport interface UrduStats {\n /** Every codepoint, including spaces and diacritics. */\n characters: number;\n charactersNoSpaces: number;\n words: number;\n sentences: number;\n /** Whitespace-delimited blocks separated by a blank line. */\n paragraphs: number;\n /** Share of Arabic-script letters among all letters, 0-100, rounded. */\n urduPercentage: number;\n diacritics: number;\n digits: number;\n averageWordsPerSentence: number;\n /** At 180 Urdu words per minute — slower than English because the script is denser. */\n readingTimeMinutes: number;\n}\n\n/**\n * Character, word, sentence and script statistics for a block of text.\n *\n * @example\n * analyzeUrdu(\"پاکستان ایک خوبصورت ملک ہے۔ اس کی آبادی زیادہ ہے۔\")\n */\nexport function analyzeUrdu(input: string): UrduStats {\n const text = input ?? \"\";\n const characters = [...text].length;\n const charactersNoSpaces = [...text.replace(/\\s/gu, \"\")].length;\n const words = countWords(text);\n const sentences = countSentences(text);\n const paragraphs = text\n .split(/\\n\\s*\\n/u)\n .map((p) => p.trim())\n .filter((p) => p.length > 0).length;\n\n return {\n characters,\n charactersNoSpaces,\n words,\n sentences,\n paragraphs,\n urduPercentage: Math.round(urduRatio(text) * 100),\n diacritics: (text.match(DIACRITICS_RE) ?? []).length,\n digits: (text.match(ANY_DIGIT_RE_G) ?? []).length,\n averageWordsPerSentence: sentences === 0 ? 0 : Math.round((words / sentences) * 10) / 10,\n readingTimeMinutes: Math.round((words / 180) * 10) / 10,\n };\n}\n","import { normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\n\n/**\n * Standard list of Urdu stop words.\n *\n * Covers pronouns, postpositions, auxiliaries, conjunctions, particles,\n * and high-frequency functional words used across Urdu texts.\n * All keys are canonical normalized Urdu.\n */\nexport const URDU_STOP_WORDS = new Set([\n // Tense auxiliaries & copulas\n \"ہے\",\n \"ہیں\",\n \"ہوں\",\n \"ہو\",\n \"تھا\",\n \"تھی\",\n \"تھے\",\n \"تھیں\",\n \"ہوگا\",\n \"ہوگی\",\n \"ہونگے\",\n \"ہوںگے\",\n \"ہونا\",\n \"ہونے\",\n \"ہوا\",\n \"ہوئی\",\n \"ہوئے\",\n\n // Postpositions, relations & prepositions\n \"کا\",\n \"کی\",\n \"کے\",\n \"کو\",\n \"نے\",\n \"سے\",\n \"پر\",\n \"تک\",\n \"میں\",\n \"لیے\",\n \"ساتھ\",\n \"بغیر\",\n \"طرح\",\n \"طرف\",\n \"بارے\",\n \"بعد\",\n \"پہلے\",\n \"دوران\",\n \"درمیان\",\n \"علاوہ\",\n \"سوائے\",\n \"سوا\",\n \"مطابق\",\n \"باعث\",\n \"ذریعے\",\n \"تحت\",\n \"اوپر\",\n \"نیچے\",\n \"آگے\",\n \"پیچھے\",\n \"اندر\",\n \"باہر\",\n \"پاس\",\n \"قریب\",\n \"نزدیک\",\n\n // Conjunctions & discourse markers\n \"اور\",\n \"یا\",\n \"اگر\",\n \"لیکن\",\n \"مگر\",\n \"تو\",\n \"بھی\",\n \"ہی\",\n \"نہ\",\n \"نہیں\",\n \"مت\",\n \"نا\",\n \"بلکہ\",\n \"حالانکہ\",\n \"چونکہ\",\n \"کیونکہ\",\n \"تاکہ\",\n \"ورنہ\",\n \"البتہ\",\n \"مثلاً\",\n \"یعنی\",\n \"خصوصاً\",\n \"عموماً\",\n \"چنانچہ\",\n \"خواہ\",\n \"چاہے\",\n \"گویا\",\n \"تاہم\",\n \"نیز\",\n \"حتی\",\n \"وغیرہ\",\n \"صرف\",\n \"محض\",\n \"فقط\",\n\n // Pronouns, determiners & question words\n \"ہم\",\n \"تم\",\n \"آپ\",\n \"وہ\",\n \"یہ\",\n \"میرا\",\n \"میری\",\n \"میرے\",\n \"ہمارا\",\n \"ہماری\",\n \"ہمارے\",\n \"تمہارا\",\n \"تمہاری\",\n \"تمہارے\",\n \"آپکا\",\n \"آپکی\",\n \"آپکے\",\n \"اس\",\n \"اسکا\",\n \"اسکی\",\n \"اسکے\",\n \"اسے\",\n \"ان\",\n \"انکا\",\n \"انکی\",\n \"انکے\",\n \"انہیں\",\n \"مجھے\",\n \"ہمیں\",\n \"تمہیں\",\n \"جس\",\n \"جسکا\",\n \"جسکی\",\n \"جسکے\",\n \"جسے\",\n \"جن\",\n \"جنکا\",\n \"جنکی\",\n \"جنکے\",\n \"جنہوں\",\n \"انہوں\",\n \"کس\",\n \"کسکا\",\n \"کسکی\",\n \"کسکے\",\n \"کسے\",\n \"کسکو\",\n \"کون\",\n \"کیا\",\n \"کہاں\",\n \"کدھر\",\n \"ادھر\",\n \"جدھر\",\n \"کب\",\n \"کیوں\",\n \"کیسے\",\n \"کیسا\",\n \"کیسی\",\n \"کتنا\",\n \"کتنی\",\n \"کتنے\",\n \"جو\",\n \"سب\",\n \"سبھی\",\n \"کوئی\",\n \"کچھ\",\n \"ہر\",\n \"ایک\",\n \"اپنا\",\n \"اپنی\",\n \"اپنے\",\n \"خود\",\n\n // Common light/auxiliary verb forms\n \"کرنا\",\n \"کرتا\",\n \"کرتی\",\n \"کرتے\",\n \"کریں\",\n \"کرو\",\n \"کر\",\n \"کرنے\",\n \"کیے\",\n \"جانا\",\n \"جاتا\",\n \"جاتی\",\n \"جاتے\",\n \"جائے\",\n \"جائیں\",\n \"جاؤ\",\n \"جا\",\n \"جانے\",\n \"گیا\",\n \"گئی\",\n \"گئے\",\n \"آنا\",\n \"آتا\",\n \"آتی\",\n \"آتے\",\n \"آئے\",\n \"آئیں\",\n \"آیا\",\n \"آئی\",\n \"آنے\",\n \"آؤ\",\n \"آ\",\n \"دینا\",\n \"دیتا\",\n \"دیتی\",\n \"دیتے\",\n \"دیا\",\n \"دیے\",\n \"دے\",\n \"دو\",\n \"دیں\",\n \"دینے\",\n \"لینا\",\n \"لیتا\",\n \"لیتی\",\n \"لیتے\",\n \"لیا\",\n \"لے\",\n \"لو\",\n \"لیں\",\n \"لینے\",\n \"رہنا\",\n \"رہا\",\n \"رہی\",\n \"رہے\",\n \"رہتا\",\n \"رہتی\",\n \"رہتے\",\n \"رہنے\",\n \"سکنا\",\n \"سکتا\",\n \"سکتی\",\n \"سکتے\",\n \"والا\",\n \"والی\",\n \"والے\",\n]);\n\nfunction toStopWordSet(custom?: Set<string> | string[]): Set<string> {\n if (!custom) return URDU_STOP_WORDS;\n if (custom instanceof Set) return custom;\n return new Set(custom.map((w) => normalizeUrdu(w.trim())));\n}\n\n/**\n * Checks if a given Urdu word is a stop word.\n *\n * @param word - Word to test.\n * @param customStopWords - Optional custom stop words set or array. Defaults to {@link URDU_STOP_WORDS}.\n *\n * @example\n * isStopWord(\"اور\") // true\n * isStopWord(\"کتاب\") // false\n */\nexport function isStopWord(word: string, customStopWords?: Set<string> | string[]): boolean {\n if (!word) return false;\n const normalized = normalizeUrdu(word.trim());\n const stopSet = toStopWordSet(customStopWords);\n return stopSet.has(normalized);\n}\n\n/**\n * Filters out stop words from an array of words.\n *\n * @param words - Array of words to filter.\n * @param customStopWords - Optional custom stop words set or array.\n *\n * @example\n * filterStopWords([\"یہ\", \"ایک\", \"اچھی\", \"کتاب\", \"ہے\"]) // [\"اچھی\", \"کتاب\"]\n */\nexport function filterStopWords(\n words: string[],\n customStopWords?: Set<string> | string[],\n): string[] {\n if (!words || words.length === 0) return [];\n const stopSet = toStopWordSet(customStopWords);\n return words.filter((w) => {\n const normalized = normalizeUrdu(w.trim());\n return normalized.length > 0 && !stopSet.has(normalized);\n });\n}\n\n/**\n * Removes stop words from an Urdu text string, returning the cleaned text.\n *\n * @param text - Input Urdu text.\n * @param customStopWords - Optional custom stop words set or array.\n *\n * @example\n * removeStopWords(\"یہ ایک بہترین کتاب ہے\") // \"بہترین کتاب\"\n */\nexport function removeStopWords(text: string, customStopWords?: Set<string> | string[]): string {\n if (!text) return \"\";\n const words = splitWords(text);\n const filtered = filterStopWords(words, customStopWords);\n return filtered.join(\" \");\n}\n","import { foldUrdu } from \"./normalize.js\";\nimport { URDU_LETTERS } from \"./chars.js\";\n\n/**\n * Urdu alphabetical order (حروف تہجی).\n *\n * `Intl.Collator(\"ur\")` is not usable here: in most runtimes the `ur` locale\n * falls back to root Arabic collation, which orders ک/گ/ٹ/ڈ/ڑ/ں/ے by codepoint\n * instead of by their place in the Urdu alphabet. So the order comes from the\n * shared letter inventory in {@link URDU_LETTERS} (chars.ts), which lists the\n * alphabet in collation order.\n *\n * Hamza variants (ؤ, ئ, ۂ, ۓ) carry {@link UrduLetter.variantOf}: they get the\n * weight of their base letter plus a tiebreaker, so `پاؤں` sorts next to `پاوں`\n * rather than at the end of the list.\n */\n\n/** Letters with their own primary weight; hamza variants collate with their base. */\nconst PRIMARY_LETTERS = URDU_LETTERS.filter((letter) => letter.variantOf === undefined);\n\nconst WEIGHTS = new Map<string, [number, number]>();\nPRIMARY_LETTERS.forEach((letter, index) => WEIGHTS.set(letter.ch, [(index + 1) * 10, 0]));\nfor (const letter of URDU_LETTERS) {\n if (letter.variantOf === undefined) continue;\n const baseWeight = WEIGHTS.get(letter.variantOf);\n if (baseWeight) WEIGHTS.set(letter.ch, [baseWeight[0], 1]);\n}\n\n/** Non-alphabet characters sort after every Urdu letter, ordered by codepoint. */\nconst NON_LETTER_BASE = (PRIMARY_LETTERS.length + 1) * 10;\n\nfunction weightsOf(text: string): number[] {\n const out: number[] = [];\n for (const ch of text) {\n const weight = WEIGHTS.get(ch);\n if (weight) {\n out.push(weight[0], weight[1]);\n } else if (ch === \" \") {\n out.push(1, 0); // spaces sort before letters, so \"ابو بکر\" precedes \"ابوبکر\"\n } else {\n out.push(NON_LETTER_BASE + (ch.codePointAt(0) ?? 0), 0);\n }\n }\n return out;\n}\n\n/**\n * Comparator for Urdu strings, usable directly in `Array.prototype.sort`.\n * Diacritics and Unicode variants are folded first, so spelling noise does not\n * change the order.\n */\nexport function compareUrdu(a: string, b: string): number {\n const left = weightsOf(foldUrdu(a));\n const right = weightsOf(foldUrdu(b));\n const length = Math.min(left.length, right.length);\n for (let i = 0; i < length; i++) {\n const diff = left[i]! - right[i]!;\n if (diff !== 0) return diff;\n }\n return left.length - right.length;\n}\n\nexport interface SortOptions<T> {\n /** Sort descending. Default `false`. */\n descending?: boolean;\n /** Read the sort key out of each item, for sorting objects. */\n getText?: (item: T) => string;\n}\n\n/**\n * Sort strings in Urdu alphabetical order.\n *\n * @example\n * sortUrdu([\"گل\", \"آم\", \"بادام\"]) // [\"آم\", \"بادام\", \"گل\"]\n */\nexport function sortUrdu<T>(items: readonly T[], options: SortOptions<T> = {}): T[] {\n const { descending = false, getText } = options;\n const key = getText ?? ((item: T) => String(item));\n const sorted = [...items].sort((a, b) => compareUrdu(key(a), key(b)));\n return descending ? sorted.reverse() : sorted;\n}\n","import { foldUrdu, normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\n\nexport interface SearchOptions<T> {\n /** Read the searchable text out of each item, for searching objects. */\n getText?: (item: T) => string;\n /**\n * Allow small spelling differences via edit distance on individual words.\n * Costs O(query x item) per candidate word, so it runs only after the exact\n * substring pass fails. Default `false`.\n */\n fuzzy?: boolean;\n /** Maximum edit distance per word when `fuzzy` is on. Default `1`. */\n maxDistance?: number;\n /** Cap the number of results. */\n limit?: number;\n /** Return matches ordered by score (best first) instead of input order. Default `true`. */\n sortByScore?: boolean;\n}\n\nexport interface SearchResult<T> {\n item: T;\n /** 1 = exact fold match, 0.9 = prefix, 0.8 = substring, lower = fuzzy word match. */\n score: number;\n}\n\n/** Levenshtein distance with early exit once the limit is exceeded. */\nexport function editDistance(a: string, b: string, limit = Infinity): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > limit) return limit + 1;\n\n let previous = Array.from({ length: b.length + 1 }, (_, i) => i);\n let current = new Array<number>(b.length + 1);\n\n for (let i = 1; i <= a.length; i++) {\n current[0] = i;\n let rowMin = current[0]!;\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n current[j] = Math.min(current[j - 1]! + 1, previous[j]! + 1, previous[j - 1]! + cost);\n rowMin = Math.min(rowMin, current[j]!);\n }\n if (rowMin > limit) return limit + 1;\n [previous, current] = [current, previous];\n }\n return previous[b.length]!;\n}\n\nfunction scoreOf(query: string, text: string, options: { fuzzy: boolean; maxDistance: number }): number {\n if (!query) return 0;\n if (text === query) return 1;\n if (text.startsWith(query)) return 0.9;\n if (text.includes(query)) return 0.8;\n\n if (!options.fuzzy) return 0;\n\n // Compare word by word: a one-letter typo inside a long sentence should still hit.\n const queryWords = splitWords(query);\n const textWords = splitWords(text);\n if (queryWords.length === 0 || textWords.length === 0) return 0;\n\n let matched = 0;\n for (const qw of queryWords) {\n const limit = Math.min(options.maxDistance, Math.max(1, Math.floor(qw.length / 3)));\n const hit = textWords.some(\n (tw) => tw.includes(qw) || editDistance(qw, tw, limit) <= limit,\n );\n if (hit) matched++;\n }\n if (matched === 0) return 0;\n return (matched / queryWords.length) * 0.7;\n}\n\n/**\n * Search a list of Urdu strings, ignoring diacritics and Unicode variant spellings.\n *\n * Both sides are folded with {@link foldUrdu} first, so `محمد` matches `مُحَمَّد`\n * and Arabic-keyboard `محمد` (with ه/ي) matches Urdu-keyboard `محمد`.\n *\n * @example\n * searchUrdu(\"محمد\", [\"مُحَمَّد علی\", \"احمد\", \"محمد خان\"])\n * // [\"مُحَمَّد علی\", \"محمد خان\"]\n */\nexport function searchUrdu<T = string>(\n query: string,\n items: readonly T[],\n options: SearchOptions<T> = {},\n): T[] {\n return searchUrduRanked(query, items, options).map((r) => r.item);\n}\n\n/** Same as {@link searchUrdu} but keeps the match scores. */\nexport function searchUrduRanked<T = string>(\n query: string,\n items: readonly T[],\n options: SearchOptions<T> = {},\n): Array<SearchResult<T>> {\n const { getText, fuzzy = false, maxDistance = 1, limit, sortByScore = true } = options;\n const read = getText ?? ((item: T) => String(item));\n\n const folded = foldUrdu(query);\n if (!folded) return [];\n\n const results: Array<SearchResult<T>> = [];\n for (const item of items) {\n const score = scoreOf(folded, foldUrdu(read(item)), { fuzzy, maxDistance });\n if (score > 0) results.push({ item, score });\n }\n\n if (sortByScore) results.sort((a, b) => b.score - a.score);\n return limit === undefined ? results : results.slice(0, limit);\n}\n\n/**\n * Highlight every occurrence of `query` in `text` by wrapping it.\n * Matching is diacritic-insensitive, but the returned string keeps the original\n * spelling and diacritics intact — offsets are mapped back to the source.\n */\nexport function highlightUrdu(\n text: string,\n query: string,\n wrap: (match: string) => string = (m) => `<mark>${m}</mark>`,\n): string {\n const foldedQuery = foldUrdu(query);\n if (!foldedQuery || !text) return text;\n\n // Fold character by character so folded offsets map back to source offsets.\n const sourceChars = [...text];\n const foldedChars: string[] = [];\n const sourceIndexOf: number[] = [];\n sourceChars.forEach((ch, i) => {\n // Per-character folding must keep whitespace, otherwise multi-word queries\n // could never match: foldUrdu() trims, and a lone space would fold to \"\".\n const folded = normalizeUrdu(ch, {\n stripDiacritics: true,\n stripZwnj: true,\n collapseWhitespace: false,\n }).toLowerCase();\n for (const f of folded) {\n foldedChars.push(f);\n sourceIndexOf.push(i);\n }\n });\n\n const haystack = foldedChars.join(\"\");\n let out = \"\";\n let cursor = 0; // index into sourceChars\n let from = 0; // index into haystack\n\n for (;;) {\n const hit = haystack.indexOf(foldedQuery, from);\n if (hit === -1) break;\n const startSource = sourceIndexOf[hit]!;\n const endSource = (sourceIndexOf[hit + foldedQuery.length - 1] ?? startSource) + 1;\n out += sourceChars.slice(cursor, startSource).join(\"\");\n out += wrap(sourceChars.slice(startSource, endSource).join(\"\"));\n cursor = endSource;\n from = hit + foldedQuery.length;\n }\n\n out += sourceChars.slice(cursor).join(\"\");\n return out;\n}\n","/**\n * Urdu -> Roman Urdu dictionary for the transliteration layer.\n *\n * Every entry here is a word the rule engine would otherwise get wrong, because\n * Urdu script omits short vowels: the rules see کتاب as k-t-aa-b and cannot know\n * that a reader supplies \"kitaab\". So the dictionary carries the vowels and the\n * rules only handle whatever falls through.\n *\n * Roman spellings follow the most common conventions in Pakistani usage\n * (`kaisay`, `bohat`, `mohabbat`) rather than a strict academic scheme, since the\n * output is meant for slugs, search keys and human readers.\n *\n * The reverse direction is derived from this map, so a duplicate Roman value\n * means the later Urdu word wins as the reverse target. Where that matters, the\n * preferred reverse form is pinned explicitly in `transliterate.ts` or `ROMAN_VARIANTS`.\n */\nexport const WORD_DICTIONARY: Record<string, string> = {\n // ---- pronouns, determiners, question words ----\n \"میں\": \"mein\",\n \"ہم\": \"hum\",\n \"تم\": \"tum\",\n \"آپ\": \"aap\",\n \"وہ\": \"woh\",\n \"یہ\": \"yeh\",\n \"میرا\": \"mera\",\n \"میری\": \"meri\",\n \"میرے\": \"mere\",\n \"ہمارا\": \"hamara\",\n \"ہماری\": \"hamari\",\n \"ہمارے\": \"hamaray\",\n \"تمہارا\": \"tumhara\",\n \"تمہاری\": \"tumhari\",\n \"تمہارے\": \"tumharay\",\n \"آپکا\": \"aapka\",\n \"آپکی\": \"aapki\",\n \"آپکے\": \"aapke\",\n \"اس\": \"is\",\n \"اسکا\": \"iska\",\n \"اسکی\": \"iski\",\n \"اسکے\": \"iske\",\n \"ان\": \"un\",\n \"انکا\": \"unka\",\n \"انکی\": \"unki\",\n \"انکے\": \"unke\",\n \"مجھے\": \"mujhe\",\n \"ہمیں\": \"humein\",\n \"تمہیں\": \"tumhein\",\n \"انہیں\": \"unhein\",\n \"اسے\": \"isay\",\n \"جسے\": \"jisay\",\n \"کسے\": \"kisay\",\n \"کس\": \"kis\",\n \"کسکا\": \"kiska\",\n \"کسکی\": \"kiski\",\n \"کسکے\": \"kiske\",\n \"کسکو\": \"kisko\",\n \"جن\": \"jin\",\n \"جنکا\": \"jinka\",\n \"جنکی\": \"jinki\",\n \"جنکے\": \"jinke\",\n \"جنہوں\": \"jinhon\",\n \"انہوں\": \"unhon\",\n \"اپنا\": \"apna\",\n \"اپنی\": \"apni\",\n \"اپنے\": \"apnay\",\n \"خود\": \"khud\",\n \"کون\": \"kaun\",\n \"کیا\": \"kya\",\n \"کہاں\": \"kahan\",\n \"کدھر\": \"kidhar\",\n \"ادھر\": \"idhar\",\n \"جدھر\": \"jidhar\",\n \"کب\": \"kab\",\n \"کیوں\": \"kyun\",\n \"کیسے\": \"kaisay\",\n \"کیسا\": \"kaisa\",\n \"کیسی\": \"kaisi\",\n \"کتنا\": \"kitna\",\n \"کتنی\": \"kitni\",\n \"کتنے\": \"kitnay\",\n \"جو\": \"jo\",\n \"جس\": \"jis\",\n \"جسکو\": \"jisko\",\n \"جسکا\": \"jiska\",\n \"جسکی\": \"jiski\",\n \"جسکے\": \"jiske\",\n \"سب\": \"sab\",\n \"سبھی\": \"sabhi\",\n \"کوئی\": \"koi\",\n \"کچھ\": \"kuch\",\n \"ہر\": \"har\",\n \"ایک\": \"aik\",\n\n // ---- function words, prepositions, conjunctions ----\n \"اور\": \"aur\",\n \"یا\": \"ya\",\n \"اگر\": \"agar\",\n \"لیکن\": \"lekin\",\n \"مگر\": \"magar\",\n \"تو\": \"to\",\n \"بھی\": \"bhi\",\n \"نہ\": \"na\",\n \"نہیں\": \"nahi\",\n \"مت\": \"mat\",\n \"کا\": \"ka\",\n \"کی\": \"ki\",\n \"کے\": \"ke\",\n \"کو\": \"ko\",\n \"نے\": \"ne\",\n \"سے\": \"se\",\n \"پر\": \"par\",\n \"تک\": \"tak\",\n \"لیے\": \"liye\",\n \"ساتھ\": \"sath\",\n \"بغیر\": \"baghair\",\n \"وجہ\": \"wajah\",\n \"طرح\": \"tarah\",\n \"طرف\": \"taraf\",\n \"بارے\": \"baray\",\n \"بعد\": \"baad\",\n \"پہلے\": \"pehlay\",\n \"دوران\": \"doran\",\n \"درمیان\": \"darmiyan\",\n \"علاوہ\": \"alawa\",\n \"سوائے\": \"siwaye\",\n \"سوا\": \"siwa\",\n \"مطابق\": \"mutabiq\",\n \"باعث\": \"baais\",\n \"ذریعے\": \"zariye\",\n \"تحت\": \"tehat\",\n \"خلاف\": \"khilaf\",\n \"حق\": \"haq\",\n \"حتی\": \"hatta\",\n \"گویا\": \"goya\",\n \"چنانچہ\": \"chunancha\",\n \"خواہ\": \"khwah\",\n \"چاہے\": \"chahe\",\n \"بلکہ\": \"balkeh\",\n \"حالانکہ\": \"halankeh\",\n \"چونکہ\": \"chunkeh\",\n \"کیونکہ\": \"kyunkeh\",\n \"تاکہ\": \"taakeh\",\n \"ورنہ\": \"warna\",\n \"البتہ\": \"albatta\",\n \"مثلاً\": \"maslan\",\n \"یعنی\": \"yaani\",\n \"خصوصاً\": \"khasosan\",\n \"عموماً\": \"amuman\",\n \"فوراً\": \"fauran\",\n \"دوبارہ\": \"dobara\",\n \"یقیناً\": \"yaqeenan\",\n \"تقریباً\": \"taqreeban\",\n \"بعض\": \"baaz\",\n \"تمام\": \"tamam\",\n \"پورا\": \"poora\",\n \"پوری\": \"poori\",\n \"پورے\": \"pooray\",\n \"آدھا\": \"aadha\",\n \"دونوں\": \"donon\",\n \"تینوں\": \"teenon\",\n \"چاروں\": \"charon\",\n \"سارا\": \"sara\",\n \"ساری\": \"sari\",\n \"سارے\": \"saray\",\n \"باقی\": \"baqi\",\n\n // ---- place and direction ----\n \"یہاں\": \"yahan\",\n \"وہاں\": \"wahan\",\n \"کہیں\": \"kahin\",\n \"وہیں\": \"wahin\",\n \"یہیں\": \"yahin\",\n \"سامنے\": \"samnay\",\n \"پیچھے\": \"peechay\",\n \"آگے\": \"agay\",\n \"اوپر\": \"oopar\",\n \"نیچے\": \"neechay\",\n \"اندر\": \"andar\",\n \"باہر\": \"bahar\",\n \"پاس\": \"paas\",\n \"دور\": \"door\",\n \"قریب\": \"qareeb\",\n \"دائیں\": \"dayen\",\n \"بائیں\": \"bayen\",\n \"سیدھا\": \"seedha\",\n \"الٹا\": \"ulta\",\n \"شمال\": \"shumal\",\n \"جنوب\": \"janoob\",\n \"مشرق\": \"mashriq\",\n \"مغرب\": \"maghrib\",\n \"وسط\": \"wast\",\n\n // ---- to be, and tense auxiliaries ----\n \"ہے\": \"hai\",\n \"ہیں\": \"hain\",\n \"ہوں\": \"hoon\",\n \"ہو\": \"ho\",\n \"تھا\": \"tha\",\n \"تھی\": \"thi\",\n \"تھے\": \"thay\",\n \"تھیں\": \"thein\",\n \"ہوگا\": \"hoga\",\n \"ہوگی\": \"hogi\",\n \"ہونگے\": \"honge\",\n \"ہوںگے\": \"honge\",\n \"ہونا\": \"hona\",\n \"ہوا\": \"hua\",\n \"ہوئی\": \"hui\",\n \"ہوئے\": \"hue\",\n\n // ---- common verbs & inflections ----\n \"کرنا\": \"karna\",\n \"کرتا\": \"karta\",\n \"کرتی\": \"karti\",\n \"کرتے\": \"karte\",\n \"کریں\": \"karain\",\n \"کرو\": \"karo\",\n \"کر\": \"kar\",\n \"کرنے\": \"karne\",\n \"کیے\": \"kiye\",\n \"جانا\": \"jana\",\n \"جاتا\": \"jata\",\n \"جاتی\": \"jati\",\n \"جاتے\": \"jate\",\n \"جائے\": \"jaye\",\n \"جائیں\": \"jayen\",\n \"جاؤ\": \"jao\",\n \"جا\": \"ja\",\n \"جانے\": \"jane\",\n \"گیا\": \"gaya\",\n \"گئی\": \"gayi\",\n \"گئے\": \"gaye\",\n \"آنا\": \"aana\",\n \"آتا\": \"aata\",\n \"آتی\": \"aati\",\n \"آتے\": \"aate\",\n \"آئے\": \"aaye\",\n \"آئیں\": \"aayen\",\n \"آیا\": \"aaya\",\n \"آئی\": \"aayi\",\n \"آنے\": \"aane\",\n \"آؤ\": \"aao\",\n \"آ\": \"aa\",\n \"دینا\": \"dena\",\n \"دیتا\": \"deta\",\n \"دیتی\": \"deti\",\n \"دیتے\": \"dete\",\n \"دیا\": \"diya\",\n \"دیے\": \"diye\",\n \"دے\": \"de\",\n \"دو\": \"do\",\n \"دیں\": \"dain\",\n \"دینے\": \"dene\",\n \"لینا\": \"lena\",\n \"لیتا\": \"leta\",\n \"لیتی\": \"leti\",\n \"لیتے\": \"lete\",\n \"لیا\": \"liya\",\n \"لے\": \"le\",\n \"لو\": \"lo\",\n \"لیں\": \"lain\",\n \"لینے\": \"lene\",\n \"کہنا\": \"kehna\",\n \"کہا\": \"kaha\",\n \"کہتا\": \"kehta\",\n \"کہتی\": \"kehti\",\n \"کہتے\": \"kehte\",\n \"کہو\": \"kaho\",\n \"کہنے\": \"kehne\",\n \"دیکھنا\": \"dekhna\",\n \"دیکھا\": \"dekha\",\n \"دیکھو\": \"dekho\",\n \"دیکھتا\": \"dekhta\",\n \"دیکھتی\": \"dekhti\",\n \"دیکھتے\": \"dekhte\",\n \"دیکھنے\": \"dekhne\",\n \"سننا\": \"sunna\",\n \"سنا\": \"suna\",\n \"سنو\": \"suno\",\n \"سنتا\": \"sunta\",\n \"سنتی\": \"sunti\",\n \"سنتے\": \"sunte\",\n \"سننے\": \"sunne\",\n \"بولنا\": \"bolna\",\n \"بولا\": \"bola\",\n \"بولو\": \"bolo\",\n \"بولتا\": \"bolta\",\n \"پڑھنا\": \"parhna\",\n \"پڑھا\": \"parha\",\n \"پڑھو\": \"parho\",\n \"پڑھتا\": \"parhta\",\n \"پڑھتی\": \"parhti\",\n \"پڑھتے\": \"parhte\",\n \"پڑھنے\": \"parhne\",\n \"لکھنا\": \"likhna\",\n \"لکھا\": \"likha\",\n \"لکھو\": \"likho\",\n \"لکھتا\": \"likhta\",\n \"لکھتی\": \"likhti\",\n \"لکھتے\": \"likhte\",\n \"لکھنے\": \"likhne\",\n \"سمجھنا\": \"samajhna\",\n \"سمجھا\": \"samjha\",\n \"سمجھ\": \"samajh\",\n \"سمجھو\": \"samjho\",\n \"سمجھنے\": \"samajhne\",\n \"سمجھانا\": \"samjhana\",\n \"سمجھایا\": \"samjhaya\",\n \"جاننا\": \"janna\",\n \"جانتا\": \"janta\",\n \"جانتی\": \"janti\",\n \"جانتے\": \"jante\",\n \"معلوم\": \"maloom\",\n \"چاہنا\": \"chahna\",\n \"چاہتا\": \"chahta\",\n \"چاہتی\": \"chahti\",\n \"چاہتے\": \"chahte\",\n \"چاہیے\": \"chahiye\",\n \"سکنا\": \"sakna\",\n \"سکتا\": \"sakta\",\n \"سکتی\": \"sakti\",\n \"سکتے\": \"sakte\",\n \"رہنا\": \"rehna\",\n \"رہا\": \"raha\",\n \"رہی\": \"rahi\",\n \"رہے\": \"rahe\",\n \"رہتا\": \"rehta\",\n \"رہتی\": \"rehti\",\n \"رہتے\": \"rehte\",\n \"رہنے\": \"rehne\",\n \"بننا\": \"banna\",\n \"بنانا\": \"banana\",\n \"بنایا\": \"banaya\",\n \"بنائی\": \"banayi\",\n \"بنائے\": \"banaye\",\n \"بنا\": \"bana\",\n \"ملنا\": \"milna\",\n \"ملا\": \"mila\",\n \"ملتا\": \"milta\",\n \"ملتی\": \"milti\",\n \"ملتے\": \"milte\",\n \"ملی\": \"mili\",\n \"ملے\": \"mile\",\n \"ملانا\": \"milana\",\n \"کھانا\": \"khana\",\n \"کھایا\": \"khaya\",\n \"کھاؤ\": \"khao\",\n \"کھاتا\": \"khata\",\n \"کھاتی\": \"khati\",\n \"پینا\": \"peena\",\n \"پیا\": \"piya\",\n \"پیو\": \"peeyo\",\n \"پیتا\": \"peeta\",\n \"سونا\": \"sona\",\n \"سویا\": \"soya\",\n \"سوتے\": \"sote\",\n \"اٹھنا\": \"uthna\",\n \"اٹھا\": \"utha\",\n \"اٹھو\": \"utho\",\n \"اٹھانا\": \"uthana\",\n \"اٹھایا\": \"uthaya\",\n \"بیٹھنا\": \"baithna\",\n \"بیٹھا\": \"baitha\",\n \"بیٹھو\": \"baitho\",\n \"چلنا\": \"chalna\",\n \"چلا\": \"chala\",\n \"چلو\": \"chalo\",\n \"چلتا\": \"chalta\",\n \"چلتی\": \"chalti\",\n \"چلتے\": \"chalte\",\n \"چلانا\": \"chalana\",\n \"چلایا\": \"chalaya\",\n \"دوڑنا\": \"daurna\",\n \"دوڑا\": \"daura\",\n \"بھاگنا\": \"bhagna\",\n \"بھاگا\": \"bhaga\",\n \"لانا\": \"lana\",\n \"لایا\": \"laya\",\n \"لائے\": \"laye\",\n \"لائی\": \"layi\",\n \"لاؤ\": \"lao\",\n \"رکھنا\": \"rakhna\",\n \"رکھا\": \"rakha\",\n \"رکھو\": \"rakho\",\n \"رکھتے\": \"rakhte\",\n \"مانگنا\": \"mangna\",\n \"مانگا\": \"manga\",\n \"پوچھنا\": \"poochna\",\n \"پوچھا\": \"poocha\",\n \"پوچھو\": \"poocho\",\n \"بتانا\": \"batana\",\n \"بتایا\": \"bataya\",\n \"بتاؤ\": \"batao\",\n \"کھولنا\": \"kholna\",\n \"کھولا\": \"khola\",\n \"کھلا\": \"khula\",\n \"مرنا\": \"marna\",\n \"مرا\": \"mara\",\n \"مرگیا\": \"margaya\",\n \"جینا\": \"jeena\",\n \"جیا\": \"jiya\",\n \"مارنا\": \"maarna\",\n \"مارا\": \"maara\",\n \"مارو\": \"maaro\",\n \"بچانا\": \"bachana\",\n \"بچایا\": \"bachaya\",\n \"بچنا\": \"bachna\",\n \"بچا\": \"bacha\",\n \"جلانا\": \"jalana\",\n \"جلایا\": \"jalaya\",\n \"جلنا\": \"jalna\",\n \"جلا\": \"jala\",\n \"بجھانا\": \"bujhana\",\n \"بجھنا\": \"bujhna\",\n \"ناچنا\": \"nachna\",\n \"گانا\": \"gana\",\n \"گایا\": \"gaya\",\n \"لڑنا\": \"larna\",\n \"لڑا\": \"lara\",\n \"جیتنا\": \"jeetna\",\n \"جیتا\": \"jeeta\",\n \"ہارنا\": \"haarna\",\n \"ہارا\": \"haara\",\n \"چھپانا\": \"chhupana\",\n \"چھپنا\": \"chhupna\",\n \"ڈھونڈنا\": \"dhoondna\",\n \"ڈھونڈا\": \"dhoonda\",\n \"بدلنا\": \"badalna\",\n \"بدلا\": \"badla\",\n \"رکنا\": \"rukna\",\n \"روکنا\": \"rokna\",\n \"روکا\": \"roka\",\n \"اڑنا\": \"urna\",\n \"اڑانا\": \"urana\",\n \"تیرنا\": \"tairna\",\n \"کھیلنا\": \"khelna\",\n \"کھیلا\": \"khela\",\n \"کھیلتا\": \"khelta\",\n \"ہنسنا\": \"hansna\",\n \"ہنسا\": \"hansa\",\n \"رونا\": \"rona\",\n \"رویا\": \"roya\",\n \"ڈرنا\": \"darna\",\n \"ڈرا\": \"dara\",\n \"ڈرانا\": \"darana\",\n \"بھولنا\": \"bhoolna\",\n \"بھولا\": \"bhoola\",\n \"یاد\": \"yaad\",\n \"سیکھنا\": \"seekhna\",\n \"سیکھا\": \"seekha\",\n \"سکھانا\": \"sikhana\",\n \"سکھایا\": \"sikhaya\",\n \"پکانا\": \"pakana\",\n \"پکایا\": \"pakaya\",\n \"پکنا\": \"pakna\",\n \"پکا\": \"paka\",\n \"دھونا\": \"dhona\",\n \"دھویا\": \"dhoya\",\n \"پہننا\": \"pehanna\",\n \"پہنا\": \"pehna\",\n \"اتارنا\": \"utarna\",\n \"اتارا\": \"utara\",\n \"اترو\": \"utro\",\n \"اترنا\": \"utarna\",\n \"بیچنا\": \"bechna\",\n \"بیچا\": \"becha\",\n \"خریدنا\": \"khareedna\",\n \"خریدا\": \"khareeda\",\n \"بھیجنا\": \"bhejna\",\n \"بھیجا\": \"bheja\",\n \"پہنچنا\": \"pohanchna\",\n \"پہنچا\": \"pohancha\",\n \"پہنچانا\": \"pohonchana\",\n \"نکلنا\": \"nikalna\",\n \"نکلا\": \"nikla\",\n \"نکالنا\": \"nikalna\",\n \"نکالا\": \"nikala\",\n \"گرنا\": \"girna\",\n \"گرا\": \"gira\",\n \"گرانا\": \"girana\",\n \"پکڑنا\": \"pakarna\",\n \"پکڑا\": \"pakra\",\n \"چھوڑنا\": \"chhorna\",\n \"چھوڑا\": \"chhora\",\n \"توڑنا\": \"torna\",\n \"توڑا\": \"tora\",\n \"ٹوٹنا\": \"tootna\",\n \"جوڑنا\": \"jorna\",\n \"جوڑا\": \"jora\",\n \"کاٹنا\": \"katna\",\n \"کاٹا\": \"kata\",\n \"ڈالنا\": \"daalna\",\n \"ڈالا\": \"dala\",\n \"ماننا\": \"manna\",\n \"مانا\": \"mana\",\n \"پہچاننا\": \"pehchanna\",\n \"پہچانا\": \"pehchana\",\n \"بلانا\": \"bulana\",\n \"بلایا\": \"bulaya\",\n \"پکارنا\": \"pukarna\",\n \"دکھانا\": \"dikhana\",\n \"دکھایا\": \"dikhaya\",\n \"سنانا\": \"sunana\",\n \"سنایا\": \"sunaya\",\n \"پھینکنا\": \"phenkna\",\n \"پھینکا\": \"phenka\",\n \"کھینچنا\": \"kheinchna\",\n \"کھینچا\": \"kheincha\",\n \"لیٹنا\": \"letna\",\n \"جاگنا\": \"jagna\",\n \"جگانا\": \"jagana\",\n \"کھلانا\": \"khilana\",\n \"پلانا\": \"pilana\",\n \"پلٹنا\": \"palatna\",\n \"لوٹنا\": \"lautna\",\n \"ٹوکنا\": \"tokna\",\n \"گزارنا\": \"guzarna\",\n \"گزرنا\": \"guzarna\",\n \"گزر\": \"guzar\",\n \"بیتنا\": \"beetna\",\n \"جھگڑنا\": \"jhagarna\",\n \"سہنا\": \"sehna\",\n \"کمانا\": \"kamana\",\n \"کمایا\": \"kamaya\",\n \"چھونا\": \"chhoona\",\n \"چکھنا\": \"chakhna\",\n \"سونگھنا\": \"soonghna\",\n \"گننا\": \"ginna\",\n \"تولنا\": \"tolna\",\n \"ناپنا\": \"naapna\",\n \"باندھنا\": \"bandhna\",\n \"باندھا\": \"bandha\",\n \"بھرنا\": \"bharna\",\n \"بھرا\": \"bhara\",\n \"ڈوبنا\": \"doobna\",\n \"ڈوبا\": \"dooba\",\n \"چمکنا\": \"chamakna\",\n \"چمکا\": \"chamka\",\n \"مہکنا\": \"mehakna\",\n \"گھومنا\": \"ghoomna\",\n \"پھرنا\": \"phirna\",\n \"چھیننا\": \"chheenna\",\n \"پھیلنا\": \"phailna\",\n \"پھیلانا\": \"phailana\",\n \"سمٹنا\": \"simatna\",\n \"والا\": \"wala\",\n \"والی\": \"wali\",\n \"والے\": \"walay\",\n \"شروع\": \"shuru\",\n \"ختم\": \"khatam\",\n \"بند\": \"band\",\n \"پیدا\": \"paida\",\n\n // ---- people and family ----\n \"آدمی\": \"aadmi\",\n \"عورت\": \"aurat\",\n \"لڑکا\": \"larka\",\n \"لڑکی\": \"larki\",\n \"لڑکے\": \"larke\",\n \"لڑکیاں\": \"larkiyan\",\n \"بچہ\": \"bacha\",\n \"بچی\": \"bachi\",\n \"بچے\": \"bache\",\n \"بچوں\": \"bachon\",\n \"ماں\": \"maan\",\n \"باپ\": \"baap\",\n \"والد\": \"walid\",\n \"والدہ\": \"walida\",\n \"والدین\": \"walidain\",\n \"امی\": \"ammi\",\n \"ابو\": \"abbu\",\n \"بھائی\": \"bhai\",\n \"بہن\": \"behan\",\n \"باجی\": \"baji\",\n \"آپی\": \"api\",\n \"بیٹا\": \"beta\",\n \"بیٹی\": \"beti\",\n \"بیٹے\": \"bete\",\n \"بیٹیاں\": \"betiyan\",\n \"پوتا\": \"pota\",\n \"پوتی\": \"poti\",\n \"نواسا\": \"nawasa\",\n \"نواسی\": \"nawasi\",\n \"دادا\": \"dada\",\n \"دادی\": \"dadi\",\n \"نانا\": \"nana\",\n \"نانی\": \"nani\",\n \"چچا\": \"chacha\",\n \"چچی\": \"chachi\",\n \"ماموں\": \"mamoon\",\n \"ممانی\": \"mami\",\n \"خالہ\": \"khala\",\n \"خالو\": \"khalu\",\n \"پھوپھی\": \"phupi\",\n \"پھوپھا\": \"phupha\",\n \"شوہر\": \"shauhar\",\n \"بیوی\": \"biwi\",\n \"دولہا\": \"dulha\",\n \"دلہن\": \"dulhan\",\n \"شادی\": \"shaadi\",\n \"نکاح\": \"nikah\",\n \"رشتہ\": \"rishta\",\n \"خاندان\": \"khandan\",\n \"مہمان\": \"mehman\",\n \"میزبان\": \"mezban\",\n \"دوست\": \"dost\",\n \"دشمن\": \"dushman\",\n \"پڑوسی\": \"parosi\",\n \"ہمسایہ\": \"humsaya\",\n \"ساتھی\": \"sathi\",\n \"بزرگ\": \"buzurg\",\n \"جوان\": \"jawan\",\n \"نوجوان\": \"naujawan\",\n \"بوڑھا\": \"boorha\",\n \"بوڑھی\": \"boorhi\",\n \"انسان\": \"insan\",\n \"لوگ\": \"log\",\n \"عوام\": \"awam\",\n \"شخص\": \"shakhs\",\n \"فرد\": \"fard\",\n\n // ---- professions & roles ----\n \"استاد\": \"ustad\",\n \"استانی\": \"ustani\",\n \"طالب\": \"talib\",\n \"شاگرد\": \"shagird\",\n \"ڈاکٹر\": \"doctor\",\n \"حکیم\": \"hakeem\",\n \"طبیب\": \"tabeeb\",\n \"نرس\": \"nurse\",\n \"سرجن\": \"surgeon\",\n \"وکیل\": \"wakeel\",\n \"جج\": \"judge\",\n \"منصف\": \"munsif\",\n \"کسان\": \"kisan\",\n \"زمیندار\": \"zameendar\",\n \"مزدور\": \"mazdoor\",\n \"کاریگر\": \"karigar\",\n \"درزی\": \"darzi\",\n \"موچی\": \"mochi\",\n \"دھوبی\": \"dhobi\",\n \"حجام\": \"hajam\",\n \"نائی\": \"nai\",\n \"باورچی\": \"bawarchi\",\n \"خانساماں\": \"khansama\",\n \"چوکیدار\": \"chowkidar\",\n \"گارڈ\": \"guard\",\n \"پولیس\": \"police\",\n \"سپاہی\": \"sipahi\",\n \"فوجی\": \"fauji\",\n \"افسر\": \"afsar\",\n \"مینیجر\": \"manager\",\n \"ڈائریکٹر\": \"director\",\n \"صدر\": \"sadar\",\n \"وزیر\": \"wazeer\",\n \"سفیر\": \"safeer\",\n \"تاجر\": \"tajir\",\n \"دکاندار\": \"dukandar\",\n \"ڈرائیور\": \"driver\",\n \"پائلٹ\": \"pilot\",\n \"انجینئر\": \"engineer\",\n \"سائنسدان\": \"sciencedan\",\n \"شاعر\": \"shair\",\n \"ادیب\": \"adeeb\",\n \"مصنف\": \"musannif\",\n \"صحافی\": \"sahafi\",\n \"فنکار\": \"fankar\",\n \"گلوکار\": \"gulokar\",\n \"اداکار\": \"adakar\",\n \"کھلاڑی\": \"khilari\",\n\n // ---- places & buildings ----\n \"گھر\": \"ghar\",\n \"مکان\": \"makan\",\n \"کمرہ\": \"kamra\",\n \"دروازہ\": \"darwaza\",\n \"کھڑکی\": \"khirki\",\n \"چھت\": \"chhat\",\n \"دیوار\": \"deewar\",\n \"فرش\": \"farsh\",\n \"صحن\": \"sehan\",\n \"خانہ\": \"khana\",\n \"مدرسہ\": \"madrasa\",\n \"سکول\": \"school\",\n \"کالج\": \"college\",\n \"یونیورسٹی\": \"university\",\n \"مکتب\": \"maktab\",\n \"جامعہ\": \"jamia\",\n \"لائبریری\": \"library\",\n \"ہسپتال\": \"hospital\",\n \"شفاخانہ\": \"shifakhana\",\n \"کلینک\": \"clinic\",\n \"دواخانہ\": \"dawakhana\",\n \"دکان\": \"dukan\",\n \"مارکیٹ\": \"market\",\n \"بازار\": \"bazaar\",\n \"مال\": \"mall\",\n \"پلازہ\": \"plaza\",\n \"ہوٹل\": \"hotel\",\n \"ریستوران\": \"restaurant\",\n \"ڈھابہ\": \"dhaba\",\n \"مسجد\": \"masjid\",\n \"مندر\": \"mandir\",\n \"گرجا\": \"girja\",\n \"مزار\": \"mazar\",\n \"درگاہ\": \"dargah\",\n \"قبرستان\": \"qabristan\",\n \"شہر\": \"shehar\",\n \"قصبہ\": \"qasba\",\n \"گاؤں\": \"gaon\",\n \"دیہات\": \"dehat\",\n \"ملک\": \"mulk\",\n \"وطن\": \"watan\",\n \"دنیا\": \"dunya\",\n \"جہاں\": \"jahan\",\n \"راستہ\": \"rasta\",\n \"سڑک\": \"sarak\",\n \"گلی\": \"gali\",\n \"کوچہ\": \"koocha\",\n \"محلہ\": \"mohalla\",\n \"چوک\": \"chowk\",\n \"شاہراہ\": \"shahrah\",\n \"پل\": \"pul\",\n \"باغ\": \"bagh\",\n \"پارک\": \"park\",\n \"میدان\": \"maidan\",\n \"اسٹیڈیم\": \"stadium\",\n \"دفتر\": \"daftar\",\n \"تھانہ\": \"thana\",\n \"چوکی\": \"chowki\",\n \"جیل\": \"jail\",\n \"قیدخانہ\": \"qaidkhana\",\n \"عدالت\": \"adalat\",\n \"کچہری\": \"kachehri\",\n \"اسٹیشن\": \"station\",\n \"ایئرپورٹ\": \"airport\",\n \"بندرگاہ\": \"bandargah\",\n \"کارخانہ\": \"karkhana\",\n \"فیکٹری\": \"factory\",\n\n // ---- English loanwords in everyday Urdu ----\n \"کمپیوٹر\": \"computer\",\n \"موبائل\": \"mobile\",\n \"فون\": \"phone\",\n \"انٹرنیٹ\": \"internet\",\n \"بس\": \"bus\",\n \"ٹرین\": \"train\",\n \"کار\": \"car\",\n \"سائیکل\": \"cycle\",\n \"موٹر\": \"motor\",\n \"ٹریفک\": \"traffic\",\n \"سگنل\": \"signal\",\n \"پیٹرول\": \"petrol\",\n \"ڈیزل\": \"diesel\",\n \"گیس\": \"gas\",\n \"بیٹری\": \"battery\",\n \"چارجر\": \"charger\",\n \"کیمرہ\": \"camera\",\n \"ریڈیو\": \"radio\",\n \"ٹیلیویژن\": \"television\",\n \"ٹیلیگرام\": \"telegram\",\n \"ویڈیو\": \"video\",\n \"آڈیو\": \"audio\",\n \"مائیک\": \"mic\",\n \"سپیکر\": \"speaker\",\n \"سکرین\": \"screen\",\n \"سافٹویئر\": \"software\",\n \"ہارڈویئر\": \"hardware\",\n \"ویب\": \"web\",\n \"ایپ\": \"app\",\n \"ایپلیکیشن\": \"application\",\n \"ایمیل\": \"email\",\n \"میسج\": \"message\",\n \"چیٹ\": \"chat\",\n \"آنلائن\": \"online\",\n \"آفلائن\": \"offline\",\n \"اکاؤنٹ\": \"account\",\n \"پاسورڈ\": \"password\",\n \"سیکیورٹی\": \"security\",\n \"سرور\": \"server\",\n \"نیٹورک\": \"network\",\n \"فائل\": \"file\",\n \"فولڈر\": \"folder\",\n \"لنک\": \"link\",\n \"پوسٹ\": \"post\",\n \"کمنٹ\": \"comment\",\n \"چینل\": \"channel\",\n \"گروپ\": \"group\",\n \"ڈاؤنلوڈ\": \"download\",\n \"اپلوڈ\": \"upload\",\n \"سرچ\": \"search\",\n \"کلک\": \"click\",\n \"ٹائپ\": \"type\",\n \"ٹیسٹ\": \"test\",\n \"نمبر\": \"number\",\n \"کلاس\": \"class\",\n \"ڈگری\": \"degree\",\n \"سسٹم\": \"system\",\n \"پروگرام\": \"program\",\n \"ٹیکنالوجی\": \"technology\",\n \"ڈیٹا\": \"data\",\n \"ٹکٹ\": \"ticket\",\n \"پاسپورٹ\": \"passport\",\n \"ویزا\": \"visa\",\n \"بینک\": \"bank\",\n \"چیک\": \"cheque\",\n \"کارڈ\": \"card\",\n \"ٹیکس\": \"tax\",\n \"بل\": \"bill\",\n \"وارڈ\": \"ward\",\n \"آپریشن\": \"operation\",\n \"ایمبولینس\": \"ambulance\",\n\n // ---- time, calendar, days, months, weather ----\n \"دن\": \"din\",\n \"رات\": \"raat\",\n \"صبح\": \"subah\",\n \"شام\": \"shaam\",\n \"سحر\": \"sehar\",\n \"دوپہر\": \"dopahar\",\n \"پہر\": \"pehar\",\n \"وقت\": \"waqt\",\n \"گھنٹہ\": \"ghanta\",\n \"منٹ\": \"minute\",\n \"سیکنڈ\": \"second\",\n \"لمحہ\": \"lamha\",\n \"ہفتہ\": \"hafta\",\n \"مہینہ\": \"maheena\",\n \"سال\": \"saal\",\n \"صدی\": \"sadi\",\n \"زمانہ\": \"zamana\",\n \"مدت\": \"muddat\",\n \"عمر\": \"umar\",\n \"آج\": \"aaj\",\n \"کل\": \"kal\",\n \"پرسوں\": \"parson\",\n \"ترسوں\": \"tarson\",\n \"ابھی\": \"abhi\",\n \"اب\": \"ab\",\n \"پھر\": \"phir\",\n \"تب\": \"tab\",\n \"جب\": \"jab\",\n \"ہمیشہ\": \"hamesha\",\n \"کبھی\": \"kabhi\",\n \"اکثر\": \"aksar\",\n \"روز\": \"roz\",\n \"روزانہ\": \"rozana\",\n \"ماہانہ\": \"mahana\",\n \"سالانہ\": \"salana\",\n \"پیر\": \"peer\",\n \"منگل\": \"mangal\",\n \"بدھ\": \"budh\",\n \"جمعرات\": \"jumeraat\",\n \"جمعہ\": \"jumma\",\n \"اتوار\": \"itwar\",\n \"جنوری\": \"january\",\n \"فروری\": \"february\",\n \"مارچ\": \"march\",\n \"اپریل\": \"april\",\n \"مئی\": \"may\",\n \"جون\": \"june\",\n \"جولائی\": \"july\",\n \"اگست\": \"august\",\n \"ستمبر\": \"september\",\n \"اکتوبر\": \"october\",\n \"نومبر\": \"november\",\n \"دسمبر\": \"december\",\n \"موسم\": \"mausam\",\n \"گرمی\": \"garmi\",\n \"سردی\": \"sardi\",\n \"بہار\": \"bahaar\",\n \"خزاں\": \"khazan\",\n \"برسات\": \"barsaat\",\n \"بارش\": \"barish\",\n \"دھوپ\": \"dhoop\",\n \"چھاؤں\": \"chhaon\",\n \"بادل\": \"badal\",\n \"برف\": \"baraf\",\n \"اولے\": \"olay\",\n \"کہر\": \"kohar\",\n \"دھند\": \"dhund\",\n \"آندھی\": \"aandhi\",\n \"طوفان\": \"toofan\",\n \"سیلاب\": \"sailab\",\n \"زلزلہ\": \"zalzala\",\n \"آسمان\": \"asman\",\n \"زمین\": \"zameen\",\n \"سورج\": \"sooraj\",\n \"چاند\": \"chand\",\n \"ستارہ\": \"sitara\",\n \"کہکشان\": \"kahkashan\",\n\n // ---- household objects, clothing, tools ----\n \"کتاب\": \"kitaab\",\n \"قلم\": \"qalam\",\n \"کاغذ\": \"kaghaz\",\n \"دوات\": \"dawat\",\n \"سیاہی\": \"siyahi\",\n \"پنسل\": \"pencil\",\n \"بستہ\": \"basta\",\n \"بیگ\": \"bag\",\n \"میز\": \"mez\",\n \"کرسی\": \"kursi\",\n \"الماری\": \"almari\",\n \"صوفہ\": \"sofa\",\n \"پلنگ\": \"palang\",\n \"بستر\": \"bistar\",\n \"گدا\": \"gadda\",\n \"چادر\": \"chadar\",\n \"تکیہ\": \"takiya\",\n \"کمبل\": \"kambal\",\n \"لحاف\": \"lihaf\",\n \"پردہ\": \"parda\",\n \"قالین\": \"qaleen\",\n \"چٹائی\": \"chatai\",\n \"پنکھا\": \"pankha\",\n \"چولہا\": \"choolha\",\n \"فریج\": \"fridge\",\n \"برتن\": \"bartan\",\n \"چمچ\": \"chamach\",\n \"کانٹا\": \"kanta\",\n \"چھری\": \"chhuri\",\n \"چاقو\": \"chaqoo\",\n \"پلیٹ\": \"plate\",\n \"پیالی\": \"pyali\",\n \"پیالہ\": \"pyala\",\n \"کپ\": \"cup\",\n \"گلاس\": \"glass\",\n \"جگ\": \"jug\",\n \"بوتل\": \"botal\",\n \"ڈبہ\": \"dabba\",\n \"بالٹی\": \"balti\",\n \"مگ\": \"mug\",\n \"جھاڑو\": \"jharoo\",\n \"صابن\": \"sabun\",\n \"تولیہ\": \"toliya\",\n \"آئینہ\": \"aaina\",\n \"شیشہ\": \"sheesha\",\n \"کنگھی\": \"kanghi\",\n \"سوئی\": \"sui\",\n \"دھاگہ\": \"dhaga\",\n \"قینچی\": \"qainchi\",\n \"تالا\": \"tala\",\n \"چابی\": \"chabi\",\n \"گھڑی\": \"ghari\",\n \"ٹوپی\": \"topi\",\n \"پگڑی\": \"pagri\",\n \"قمیض\": \"qameez\",\n \"شلوار\": \"shalwar\",\n \"پاجامہ\": \"pajama\",\n \"پینٹ\": \"pant\",\n \"شرٹ\": \"shirt\",\n \"کوٹ\": \"coat\",\n \"واسکوٹ\": \"waistcoat\",\n \"شال\": \"shawl\",\n \"دوپٹہ\": \"dupatta\",\n \"جراب\": \"jurab\",\n \"دستانے\": \"dastaney\",\n \"جوتا\": \"joota\",\n \"چپل\": \"chappal\",\n \"صندل\": \"sandal\",\n \"کپڑا\": \"kapra\",\n \"ریشم\": \"resham\",\n \"سوت\": \"soot\",\n \"اون\": \"oon\",\n\n // ---- food, spices, ingredients, kitchen ----\n \"پانی\": \"paani\",\n \"دودھ\": \"doodh\",\n \"دہی\": \"dahi\",\n \"مکھن\": \"makhan\",\n \"گھی\": \"ghee\",\n \"پنیر\": \"paneer\",\n \"ملائی\": \"malai\",\n \"چائے\": \"chai\",\n \"قہوہ\": \"qehwa\",\n \"کافی\": \"coffee\",\n \"شربت\": \"sharbat\",\n \"لسی\": \"lassi\",\n \"جوس\": \"juice\",\n \"روٹی\": \"roti\",\n \"نان\": \"naan\",\n \"پراٹھا\": \"paratha\",\n \"کلچہ\": \"kulcha\",\n \"چاول\": \"chawal\",\n \"بریانی\": \"biryani\",\n \"پلاؤ\": \"pulao\",\n \"سالن\": \"salan\",\n \"شوربہ\": \"shorba\",\n \"قورمہ\": \"qorma\",\n \"کڑاہی\": \"karahi\",\n \"نہاری\": \"nihari\",\n \"حلیم\": \"haleem\",\n \"کباب\": \"kabab\",\n \"تکہ\": \"tikka\",\n \"سموسہ\": \"samosa\",\n \"پکوڑا\": \"pakaura\",\n \"رول\": \"roll\",\n \"دال\": \"daal\",\n \"گوشت\": \"gosht\",\n \"قیمہ\": \"qeema\",\n \"مرغی\": \"murghi\",\n \"مچھلی\": \"machhli\",\n \"انڈا\": \"anda\",\n \"سبزی\": \"sabzi\",\n \"آٹا\": \"aata\",\n \"میدہ\": \"maida\",\n \"سوجی\": \"sooji\",\n \"بیسن\": \"besan\",\n \"تیل\": \"tel\",\n \"نمک\": \"namak\",\n \"چینی\": \"cheeni\",\n \"شکر\": \"shukr\",\n \"گڑ\": \"gur\",\n \"شہد\": \"shehad\",\n \"مرچ\": \"mirch\",\n \"ہلدی\": \"haldi\",\n \"دھنیا\": \"dhaniya\",\n \"زیرہ\": \"zeera\",\n \"لہسن\": \"lehsun\",\n \"ادرک\": \"adrak\",\n \"پیاز\": \"pyaz\",\n \"ٹماٹر\": \"tamatar\",\n \"آلو\": \"aloo\",\n \"گاجر\": \"gajar\",\n \"مولی\": \"mooli\",\n \"شلجم\": \"shaljam\",\n \"مٹر\": \"matar\",\n \"پالک\": \"palak\",\n \"میتھی\": \"methi\",\n \"گوبھی\": \"gobhi\",\n \"بینگن\": \"baingan\",\n \"بھنڈی\": \"bhindi\",\n \"کریلا\": \"karela\",\n \"کدو\": \"kaddu\",\n \"لوکی\": \"lauki\",\n \"ٹینڈا\": \"tinda\",\n \"کھیرا\": \"kheera\",\n \"پھل\": \"phal\",\n \"آم\": \"aam\",\n \"سیب\": \"saib\",\n \"کیلا\": \"kela\",\n \"انگور\": \"angoor\",\n \"انار\": \"anar\",\n \"امرود\": \"amrood\",\n \"مالٹا\": \"malta\",\n \"کینو\": \"kinnu\",\n \"لیمو\": \"leemo\",\n \"لیموں\": \"leemo\",\n \"تربوز\": \"tarbooz\",\n \"خربوزہ\": \"kharbooza\",\n \"آڑو\": \"aadoo\",\n \"خوبانی\": \"khubani\",\n \"ناشپاتی\": \"nashpati\",\n \"چیری\": \"cherry\",\n \"پپیتا\": \"papeeta\",\n \"لیچی\": \"lychee\",\n \"بادام\": \"badam\",\n \"پستہ\": \"pista\",\n \"اخروٹ\": \"akhrot\",\n \"کاجو\": \"kaju\",\n \"مونگفلی\": \"moongphali\",\n \"کشمش\": \"kishmish\",\n \"کھجور\": \"khajoor\",\n \"کھیر\": \"kheer\",\n \"حلوہ\": \"halwa\",\n \"زردہ\": \"zarda\",\n \"جامن\": \"jamun\",\n \"جلیبی\": \"jalebi\",\n \"برفی\": \"barfi\",\n \"رسگلہ\": \"rasgulla\",\n \"کلفی\": \"kulfi\",\n \"آئسکریم\": \"icecream\",\n \"کیک\": \"cake\",\n \"بسکٹ\": \"biscuit\",\n \"چاکلیٹ\": \"chocolate\",\n \"مٹھائی\": \"mithai\",\n \"سلاد\": \"salad\",\n \"رائتہ\": \"raita\",\n \"چٹنی\": \"chatni\",\n \"اچار\": \"achaar\",\n \"مربہ\": \"murabba\",\n\n // ---- anatomy & health ----\n \"دل\": \"dil\",\n \"دماغ\": \"dimagh\",\n \"جسم\": \"jism\",\n \"بدن\": \"badan\",\n \"جان\": \"jaan\",\n \"روح\": \"rooh\",\n \"سر\": \"sar\",\n \"کھوپڑی\": \"khopri\",\n \"پیشانی\": \"peshani\",\n \"ماتھا\": \"matha\",\n \"آنکھ\": \"aankh\",\n \"آنکھیں\": \"aankhein\",\n \"پلک\": \"palak\",\n \"ابرو\": \"abroo\",\n \"کان\": \"kaan\",\n \"ناک\": \"naak\",\n \"منہ\": \"munh\",\n \"ہونٹ\": \"hont\",\n \"دانت\": \"daant\",\n \"زبان\": \"zuban\",\n \"گلا\": \"gala\",\n \"گردن\": \"gardan\",\n \"کندھا\": \"kandha\",\n \"بازو\": \"bazu\",\n \"کہنی\": \"kohni\",\n \"کلائی\": \"kalai\",\n \"ہاتھ\": \"hath\",\n \"انگلی\": \"ungli\",\n \"انگلیاں\": \"ungliyan\",\n \"انگوٹھا\": \"angootha\",\n \"ناخن\": \"nakhun\",\n \"سینہ\": \"seena\",\n \"چھاتی\": \"chhati\",\n \"پیٹ\": \"pet\",\n \"کمر\": \"kamar\",\n \"پشت\": \"pusht\",\n \"ران\": \"raan\",\n \"گھٹنا\": \"ghutna\",\n \"ٹانگ\": \"taang\",\n \"ٹانگیں\": \"taangein\",\n \"پاؤں\": \"paon\",\n \"ایڑی\": \"eeri\",\n \"تالو\": \"talu\",\n \"ہڈی\": \"haddi\",\n \"خون\": \"khoon\",\n \"رگ\": \"rag\",\n \"پٹھا\": \"pattha\",\n \"جلد\": \"jild\",\n \"چمڑا\": \"chamra\",\n \"بال\": \"baal\",\n \"داڑھی\": \"darhi\",\n \"مونچھ\": \"moochh\",\n \"چہرہ\": \"chehra\",\n \"رخسار\": \"rukhsar\",\n \"گال\": \"gaal\",\n \"ٹھوڑی\": \"thori\",\n \"جگر\": \"jigar\",\n \"گردہ\": \"gurda\",\n \"پھیپھڑا\": \"phepra\",\n \"معدہ\": \"maida\",\n \"صحت\": \"sehat\",\n \"تندرستی\": \"tandurusti\",\n \"بیماری\": \"beemari\",\n \"مرض\": \"marz\",\n \"مریض\": \"mareez\",\n \"بخار\": \"bukhar\",\n \"درد\": \"dard\",\n \"تکلیف\": \"takleef\",\n \"کھانسی\": \"khansi\",\n \"نزلہ\": \"nazla\",\n \"زکام\": \"zukam\",\n \"الرجی\": \"allergy\",\n \"انفیکشن\": \"infection\",\n \"وائرس\": \"virus\",\n \"زخم\": \"zakhm\",\n \"چوٹ\": \"chot\",\n \"علاج\": \"ilaj\",\n \"دوا\": \"dawa\",\n \"ادویات\": \"adwiyat\",\n \"شفا\": \"shifa\",\n \"گولی\": \"goli\",\n \"ٹیکہ\": \"teeka\",\n \"مرہم\": \"marham\",\n \"پٹی\": \"patti\",\n\n // ---- feelings, morals, abstraction ----\n \"محبت\": \"mohabbat\",\n \"عشق\": \"ishq\",\n \"پیار\": \"pyaar\",\n \"الفت\": \"ulfat\",\n \"چاہت\": \"chahat\",\n \"نفرت\": \"nafrat\",\n \"حسد\": \"hasad\",\n \"کینہ\": \"keena\",\n \"بغض\": \"bughz\",\n \"خوشی\": \"khushi\",\n \"مسرت\": \"musarrat\",\n \"غم\": \"gham\",\n \"دکھ\": \"dukh\",\n \"رنج\": \"ranj\",\n \"الم\": \"alam\",\n \"افسوس\": \"afsos\",\n \"پچھتاوا\": \"pachtawa\",\n \"ندامت\": \"nadamat\",\n \"ڈر\": \"dar\",\n \"خوف\": \"khauf\",\n \"دہشت\": \"dehshat\",\n \"امید\": \"umeed\",\n \"آس\": \"aas\",\n \"یاس\": \"yaas\",\n \"مایوسی\": \"mayoosi\",\n \"یقین\": \"yaqeen\",\n \"اعتماد\": \"aitamad\",\n \"بھروسہ\": \"bharosa\",\n \"شک\": \"shak\",\n \"سچ\": \"sach\",\n \"جھوٹ\": \"jhoot\",\n \"انصاف\": \"insaf\",\n \"عدل\": \"adl\",\n \"ظلم\": \"zulm\",\n \"ستم\": \"sitam\",\n \"عزت\": \"izzat\",\n \"احترام\": \"ehtiram\",\n \"بےعزتی\": \"beizzati\",\n \"ذلت\": \"zillat\",\n \"رسوائی\": \"ruswai\",\n \"شکریہ\": \"shukriya\",\n \"صبر\": \"sabr\",\n \"احسان\": \"ehsan\",\n \"معاف\": \"maaf\",\n \"معافی\": \"maafi\",\n \"دعا\": \"dua\",\n \"بددعا\": \"baddua\",\n \"خواب\": \"khwab\",\n \"خیال\": \"khayal\",\n \"ارادہ\": \"irada\",\n \"خواہش\": \"khwahish\",\n \"تمنا\": \"tamanna\",\n \"آرزو\": \"aarzoo\",\n \"حسرت\": \"hasrat\",\n \"زندگی\": \"zindagi\",\n \"حیات\": \"hayat\",\n \"موت\": \"maut\",\n \"وفات\": \"wafat\",\n \"طاقت\": \"taqat\",\n \"قوت\": \"quwwat\",\n \"زور\": \"zor\",\n \"ہمت\": \"himmat\",\n \"حوصلہ\": \"hosla\",\n \"جذبہ\": \"jazba\",\n \"شوق\": \"shauq\",\n \"کمزوری\": \"kamzori\",\n \"ناتوانی\": \"natawani\",\n \"ضرورت\": \"zaroorat\",\n \"حاجت\": \"hajat\",\n \"مدد\": \"madad\",\n \"تعاون\": \"taawun\",\n \"کوشش\": \"koshish\",\n \"جدوجہد\": \"jaddojahad\",\n \"محنت\": \"mehnat\",\n \"مشقت\": \"mushaqqat\",\n \"کامیابی\": \"kamyabi\",\n \"فتح\": \"fateh\",\n \"ناکامی\": \"nakami\",\n \"شکست\": \"shikast\",\n \"ہار\": \"haar\",\n \"جیت\": \"jeet\",\n \"فیصلہ\": \"faisla\",\n \"رائے\": \"raye\",\n \"مشورہ\": \"mashwara\",\n \"غصہ\": \"ghussa\",\n \"طیش\": \"taish\",\n \"غرور\": \"ghuroor\",\n \"تکبر\": \"takabbur\",\n \"عاجزی\": \"aajzi\",\n \"انکساری\": \"inkisari\",\n \"سادگی\": \"sadgi\",\n \"صفائی\": \"safai\",\n \"پاکی\": \"paki\",\n \"شرم\": \"sharm\",\n \"حیا\": \"haya\",\n \"غیرت\": \"ghairat\",\n \"حمیت\": \"hameeyat\",\n \"اخلاق\": \"akhlaq\",\n \"شرافت\": \"sharafat\",\n \"دیانت\": \"diyanat\",\n \"امانت\": \"amanat\",\n \"خیانت\": \"khiyanat\",\n \"وفا\": \"wafa\",\n \"بےوفائی\": \"bewafai\",\n \"دوستی\": \"dosti\",\n \"دشمنی\": \"dushmani\",\n \"حیرت\": \"hairat\",\n \"تعجب\": \"taajjub\",\n \"راحت\": \"rahat\",\n \"سکون\": \"sakoon\",\n \"اطمینان\": \"itminan\",\n \"بےچینی\": \"bechaini\",\n \"اضطراب\": \"iztirab\",\n \"احساس\": \"ehsas\",\n \"شعور\": \"shaoor\",\n \"لاپرواہی\": \"laparwahi\",\n \"حقیقت\": \"haqeeqat\",\n \"راز\": \"raaz\",\n \"بھید\": \"bhed\",\n\n // ---- knowledge, education, language, arts ----\n \"علم\": \"ilm\",\n \"تعلیم\": \"taleem\",\n \"تربیت\": \"tarbiyat\",\n \"سبق\": \"sabaq\",\n \"درس\": \"dars\",\n \"امتحان\": \"imtihan\",\n \"آزمائش\": \"azmaish\",\n \"نتیجہ\": \"nateeja\",\n \"مسئلہ\": \"masla\",\n \"حل\": \"hal\",\n \"سوال\": \"sawal\",\n \"جواب\": \"jawab\",\n \"بحث\": \"behas\",\n \"مباحثہ\": \"mubahisa\",\n \"بات\": \"baat\",\n \"باتیں\": \"baatein\",\n \"گفتگو\": \"guftagu\",\n \"کلام\": \"kalam\",\n \"لفظ\": \"lafz\",\n \"الفاظ\": \"alfaz\",\n \"جملہ\": \"jumla\",\n \"فقرہ\": \"fiqra\",\n \"حرف\": \"harf\",\n \"حروف\": \"haroof\",\n \"معنی\": \"maani\",\n \"مطلب\": \"matlab\",\n \"نام\": \"naam\",\n \"پتہ\": \"pata\",\n \"خبر\": \"khabar\",\n \"اخبار\": \"akhbar\",\n \"رسالہ\": \"risala\",\n \"مجلہ\": \"majalla\",\n \"کہانی\": \"kahani\",\n \"قصہ\": \"qissa\",\n \"داستان\": \"dastan\",\n \"ناول\": \"novel\",\n \"افسانہ\": \"afsana\",\n \"مضمون\": \"mazmoon\",\n \"مقالہ\": \"maqala\",\n \"شعر\": \"sher\",\n \"اشعار\": \"ashaar\",\n \"غزل\": \"ghazal\",\n \"نظم\": \"nazm\",\n \"مرثیہ\": \"marsiya\",\n \"قصیدہ\": \"qaseeda\",\n \"ادب\": \"adab\",\n \"تاریخ\": \"tareekh\",\n \"جغرافیہ\": \"jughrafia\",\n \"ریاضی\": \"riyazi\",\n \"سائنس\": \"science\",\n \"فلسفہ\": \"falsafa\",\n \"منطق\": \"mantiq\",\n \"ثقافت\": \"saqafat\",\n \"تہذیب\": \"tehzeeb\",\n \"تمدن\": \"tamaddun\",\n \"رسم\": \"rasm\",\n \"رواج\": \"riwaj\",\n \"موسیقی\": \"moseeqi\",\n \"راگ\": \"raag\",\n \"ساز\": \"saaz\",\n \"تصویر\": \"tasweer\",\n \"نقشہ\": \"naqsha\",\n \"رنگ\": \"rang\",\n \"آواز\": \"awaz\",\n \"شور\": \"shor\",\n \"خاموشی\": \"khamoshi\",\n \"سکوت\": \"sakoot\",\n \"تحقیق\": \"tehqeeq\",\n \"تلاش\": \"talash\",\n \"کھوج\": \"khoj\",\n\n // ---- religion & spiritual ----\n \"نماز\": \"namaz\",\n \"صلوہ\": \"salat\",\n \"روزہ\": \"roza\",\n \"صوم\": \"saum\",\n \"زکوہ\": \"zakat\",\n \"حج\": \"hajj\",\n \"عمرہ\": \"umrah\",\n \"عید\": \"eid\",\n \"قربانی\": \"qurbani\",\n \"مذہب\": \"mazhab\",\n \"اسلام\": \"islam\",\n \"اللہ\": \"allah\",\n \"رب\": \"rabb\",\n \"خدا\": \"khuda\",\n \"رسول\": \"rasool\",\n \"نبی\": \"nabi\",\n \"پیغمبر\": \"paighambar\",\n \"صحابی\": \"sahabi\",\n \"صحابہ\": \"sahaba\",\n \"اہل\": \"ahl\",\n \"بیت\": \"bait\",\n \"قرآن\": \"quran\",\n \"حدیث\": \"hadees\",\n \"سنت\": \"sunnat\",\n \"شریعت\": \"shariat\",\n \"فقہ\": \"fiqh\",\n \"دین\": \"deen\",\n \"ایمان\": \"imaan\",\n \"عقیدہ\": \"aqeeda\",\n \"جنت\": \"jannat\",\n \"فردوس\": \"firdaus\",\n \"جہنم\": \"jahannum\",\n \"دوزخ\": \"dozakh\",\n \"فرشتہ\": \"farishta\",\n \"ملائکہ\": \"malaika\",\n \"شیطان\": \"shaitan\",\n \"ابلیس\": \"iblees\",\n \"جنات\": \"jinnat\",\n \"قیامت\": \"qayamat\",\n \"حشر\": \"hashr\",\n \"حساب\": \"hisaab\",\n \"میزان\": \"meezan\",\n \"صراط\": \"sirat\",\n \"عبادت\": \"ibadat\",\n \"بندگی\": \"bandagi\",\n \"سجدہ\": \"sajda\",\n \"رکوع\": \"rukoo\",\n \"تلاوت\": \"tilawat\",\n \"تسبیح\": \"tasbeeh\",\n \"ذکر\": \"zikr\",\n \"توبہ\": \"tauba\",\n \"استغفار\": \"istighfar\",\n \"ثواب\": \"sawab\",\n \"اجر\": \"ajar\",\n \"گناہ\": \"gunah\",\n \"معصیت\": \"masiyat\",\n \"عذاب\": \"azaab\",\n \"رحمت\": \"rehmat\",\n \"برکت\": \"barkat\",\n \"فضل\": \"fazal\",\n \"کرم\": \"karam\",\n \"نیکی\": \"naiki\",\n \"بدی\": \"badi\",\n \"تقوی\": \"taqwa\",\n \"پرہیزگاری\": \"parhezgari\",\n \"ولایت\": \"wilayat\",\n \"ولی\": \"wali\",\n \"صوفی\": \"sufi\",\n \"درویش\": \"darwesh\",\n \"فقیر\": \"faqeer\",\n\n // ---- news, politics, governance, law ----\n \"سیاست\": \"siyasat\",\n \"سیاسی\": \"siyasi\",\n \"الیکشن\": \"election\",\n \"انتخاب\": \"intikhab\",\n \"انتخابات\": \"intikhabat\",\n \"ووٹ\": \"vote\",\n \"امیدوار\": \"ummedwar\",\n \"پارٹی\": \"party\",\n \"جماعت\": \"jamaat\",\n \"اسمبلی\": \"assembly\",\n \"پارلیمنٹ\": \"parliament\",\n \"ایوان\": \"aiwan\",\n \"سینیٹ\": \"senate\",\n \"قانون\": \"qanoon\",\n \"دستور\": \"dastoor\",\n \"آئین\": \"aaeen\",\n \"جمہوریت\": \"jamhooriat\",\n \"آمریت\": \"aamriyat\",\n \"حکومت\": \"hukumat\",\n \"ریاست\": \"riyasat\",\n \"سلطنت\": \"saltanat\",\n \"حکمران\": \"hukmaran\",\n \"اپوزیشن\": \"opposition\",\n \"حزب\": \"hizb\",\n \"اختلاف\": \"ikhtilaf\",\n \"اتحاد\": \"ittehad\",\n \"تنظیم\": \"tanzeem\",\n \"ادارہ\": \"idara\",\n \"کمپنی\": \"company\",\n \"جرم\": \"jurm\",\n \"مجرم\": \"mujrim\",\n \"ملزم\": \"mulzim\",\n \"قیدی\": \"qaidi\",\n \"گواہ\": \"gawah\",\n \"شہادت\": \"shahadat\",\n \"ثبوت\": \"saboot\",\n \"سزا\": \"saza\",\n \"جرمانہ\": \"jurmana\",\n \"فوج\": \"fauj\",\n \"لشکر\": \"lashkar\",\n \"عساکر\": \"asakir\",\n \"جنگ\": \"jang\",\n \"معرکہ\": \"maraka\",\n \"لڑائی\": \"larai\",\n \"امن\": \"aman\",\n \"صلح\": \"sulah\",\n \"معاہدہ\": \"muahida\",\n \"پیمان\": \"paiman\",\n \"معیشت\": \"maeeshat\",\n \"اقتصادیات\": \"iqtisadiyat\",\n \"تجارت\": \"tijarat\",\n \"کاروبار\": \"karobar\",\n \"صنعت\": \"sanat\",\n \"حرفت\": \"hirfat\",\n \"بجٹ\": \"budget\",\n \"خسارہ\": \"khasara\",\n \"منافع\": \"munafa\",\n \"نقصان\": \"nuqsan\",\n \"ترقی\": \"taraqqi\",\n \"تنزل\": \"tanazzul\",\n \"منصوبہ\": \"mansooba\",\n \"پروجیکٹ\": \"project\",\n \"اعلان\": \"elaan\",\n \"اشتہار\": \"ishtihar\",\n \"رپورٹ\": \"report\",\n \"بیان\": \"bayan\",\n \"اجلاس\": \"ijlas\",\n \"کانفرنس\": \"conference\",\n \"دورہ\": \"dora\",\n \"ملاقات\": \"mulaqat\",\n \"مذاکرات\": \"muzakrat\",\n \"تقریب\": \"taqreeb\",\n \"جلسہ\": \"jalsa\",\n \"جلوس\": \"juloos\",\n \"ہڑتال\": \"hartal\",\n \"مظاہرہ\": \"muzahira\",\n \"احتجاج\": \"ehtejaj\",\n \"تقریر\": \"taqreer\",\n \"خطاب\": \"khitab\",\n \"پیغام\": \"paigham\",\n\n // ---- nature, environment, animals ----\n \"درخت\": \"darakht\",\n \"شجر\": \"shajar\",\n \"پودا\": \"pauda\",\n \"پودے\": \"pauday\",\n \"پتے\": \"pattay\",\n \"پھول\": \"phool\",\n \"کلی\": \"kali\",\n \"شاخ\": \"shaakh\",\n \"ٹہنی\": \"tahni\",\n \"جڑ\": \"jar\",\n \"تنا\": \"tana\",\n \"گھاس\": \"ghaas\",\n \"سبزہ\": \"sabza\",\n \"جنگل\": \"jungle\",\n \"بیابان\": \"bayaban\",\n \"صحرا\": \"sehra\",\n \"ریگستان\": \"registan\",\n \"پہاڑ\": \"pahar\",\n \"کوہ\": \"koh\",\n \"چوٹی\": \"choti\",\n \"وادی\": \"wadi\",\n \"درہ\": \"darra\",\n \"غار\": \"ghaar\",\n \"دریا\": \"darya\",\n \"نہر\": \"nehar\",\n \"ندی\": \"nadi\",\n \"نالہ\": \"nala\",\n \"سمندر\": \"samandar\",\n \"بحر\": \"behar\",\n \"ساحل\": \"sahil\",\n \"کنارہ\": \"kinara\",\n \"جزیرہ\": \"jazeera\",\n \"جھیل\": \"jheel\",\n \"تالاب\": \"talab\",\n \"حوض\": \"hauz\",\n \"کنواں\": \"kuan\",\n \"چشمہ\": \"chashma\",\n \"آبشار\": \"aabshar\",\n \"مٹی\": \"mitti\",\n \"ریت\": \"rait\",\n \"پتھر\": \"patthar\",\n \"چٹان\": \"chatan\",\n \"چاندی\": \"chandi\",\n \"تانبا\": \"tanba\",\n \"لوہا\": \"loha\",\n \"پیتل\": \"peetal\",\n \"کوئلہ\": \"koyla\",\n \"آگ\": \"aag\",\n \"شعلہ\": \"shola\",\n \"دھواں\": \"dhuwan\",\n \"راکھ\": \"raakh\",\n \"روشنی\": \"roshni\",\n \"نور\": \"noor\",\n \"اندھیرا\": \"andhera\",\n \"تاریکی\": \"tareeki\",\n \"سایہ\": \"saya\",\n \"کتا\": \"kutta\",\n \"کتیا\": \"kutiya\",\n \"بلی\": \"billi\",\n \"بلا\": \"billa\",\n \"گھوڑا\": \"ghora\",\n \"گھوڑی\": \"ghori\",\n \"گدھا\": \"gadha\",\n \"گدھی\": \"gadhi\",\n \"خچر\": \"khachhar\",\n \"گائے\": \"gaye\",\n \"بیل\": \"bail\",\n \"بچھڑا\": \"bachhra\",\n \"بھینس\": \"bhains\",\n \"بکری\": \"bakri\",\n \"بکرا\": \"bakra\",\n \"بھیڑ\": \"bheed\",\n \"دنبہ\": \"dumbah\",\n \"شیر\": \"sheer\",\n \"ببر\": \"babar\",\n \"چیتا\": \"cheeta\",\n \"تیندوا\": \"tendwa\",\n \"بھیڑیا\": \"bhediya\",\n \"لومڑی\": \"lomri\",\n \"ریچھ\": \"reech\",\n \"ہاتھی\": \"hathi\",\n \"ہتھنی\": \"hathni\",\n \"اونٹ\": \"oont\",\n \"سانڈنی\": \"sandni\",\n \"ہرن\": \"hiran\",\n \"سنگھا\": \"singha\",\n \"خرگوش\": \"khargosh\",\n \"بندر\": \"bandar\",\n \"چوہا\": \"chooha\",\n \"چوہیا\": \"chuhiya\",\n \"پرندہ\": \"parinda\",\n \"چرند\": \"charand\",\n \"پرند\": \"parand\",\n \"کوا\": \"kawa\",\n \"طوطا\": \"tota\",\n \"مینا\": \"maina\",\n \"چڑیا\": \"chiriya\",\n \"کبوتر\": \"kabootar\",\n \"فاختہ\": \"fakhta\",\n \"عقاب\": \"uqaab\",\n \"باز\": \"baaz\",\n \"شاہین\": \"shaheen\",\n \"چیل\": \"cheel\",\n \"گدھ\": \"gidh\",\n \"الو\": \"ulloo\",\n \"بگلا\": \"bagla\",\n \"بطخ\": \"battakh\",\n \"ہنس\": \"hans\",\n \"مور\": \"mor\",\n \"مرغ\": \"murgh\",\n \"مرغا\": \"murgha\",\n \"مرغابی\": \"murghabi\",\n \"کوئل\": \"koyal\",\n \"بلبل\": \"bulbul\",\n \"سانپ\": \"saanp\",\n \"ناگ\": \"naag\",\n \"چھپکلی\": \"chhipkali\",\n \"مگرمچھ\": \"magarmachh\",\n \"کچھوا\": \"kachhwa\",\n \"مینڈک\": \"maindak\",\n \"مچھر\": \"machhar\",\n \"مکھی\": \"makkhi\",\n \"مکڑی\": \"makri\",\n \"تتلی\": \"titli\",\n \"کیڑا\": \"keera\",\n \"کیڑے\": \"keeray\",\n \"پتنگا\": \"patanga\",\n \"چیونٹی\": \"cheenti\",\n \"بچھو\": \"bichhoo\",\n\n // ---- adjectives ----\n \"اچھا\": \"acha\",\n \"اچھی\": \"achi\",\n \"اچھے\": \"achay\",\n \"برا\": \"bura\",\n \"بری\": \"buri\",\n \"برے\": \"buray\",\n \"بڑا\": \"bara\",\n \"بڑی\": \"bari\",\n \"بڑے\": \"baray\",\n \"چھوٹا\": \"chhota\",\n \"چھوٹی\": \"chhoti\",\n \"چھوٹے\": \"chhotay\",\n \"نیا\": \"naya\",\n \"نئی\": \"nayi\",\n \"نئے\": \"naye\",\n \"پرانا\": \"purana\",\n \"پرانی\": \"purani\",\n \"پرانے\": \"puranay\",\n \"لمبا\": \"lamba\",\n \"لمبی\": \"lambi\",\n \"لمبے\": \"lambay\",\n \"موٹا\": \"mota\",\n \"موٹی\": \"moti\",\n \"موٹے\": \"motay\",\n \"پتلا\": \"patla\",\n \"پتلی\": \"patli\",\n \"پتلے\": \"patlay\",\n \"دبلا\": \"dubla\",\n \"تیز\": \"tez\",\n \"سست\": \"sust\",\n \"آہستہ\": \"ahista\",\n \"گرم\": \"garam\",\n \"ٹھنڈا\": \"thanda\",\n \"ٹھنڈی\": \"thandi\",\n \"ٹھنڈے\": \"thanday\",\n \"سرد\": \"sard\",\n \"خشک\": \"khushk\",\n \"گیلا\": \"geela\",\n \"گیلی\": \"geeli\",\n \"تر\": \"tarr\",\n \"میٹھا\": \"meetha\",\n \"میٹھی\": \"meethi\",\n \"میٹھے\": \"meethay\",\n \"کڑوا\": \"karwa\",\n \"کڑوی\": \"karwi\",\n \"کھٹا\": \"khatta\",\n \"کھٹی\": \"khatti\",\n \"نمکین\": \"namkeen\",\n \"پھیکا\": \"pheeka\",\n \"صاف\": \"saaf\",\n \"ستھرا\": \"suthra\",\n \"گندا\": \"ganda\",\n \"گندی\": \"gandi\",\n \"خالی\": \"khali\",\n \"بھری\": \"bhari\",\n \"بھرے\": \"bharay\",\n \"مشکل\": \"mushkil\",\n \"دشوار\": \"dushwar\",\n \"آسان\": \"aasan\",\n \"سہل\": \"sehal\",\n \"ضروری\": \"zaroori\",\n \"لازمی\": \"lazmi\",\n \"مکمل\": \"mukammal\",\n \"ادھورا\": \"adhoora\",\n \"تیار\": \"tayyar\",\n \"خوش\": \"khush\",\n \"ناراض\": \"naraz\",\n \"خفا\": \"khafa\",\n \"پریشان\": \"pareshan\",\n \"اداس\": \"udaas\",\n \"غمگین\": \"ghamgeen\",\n \"تھکا\": \"thaka\",\n \"تھکی\": \"thaki\",\n \"تھکے\": \"thakay\",\n \"بیمار\": \"beemar\",\n \"تندرست\": \"tandurust\",\n \"امیر\": \"ameer\",\n \"غریب\": \"ghareeb\",\n \"نادار\": \"nadar\",\n \"مفلس\": \"muflis\",\n \"مشہور\": \"mashhoor\",\n \"معروف\": \"maroof\",\n \"گمنام\": \"gumnam\",\n \"خوبصورت\": \"khoobsurat\",\n \"بدصورت\": \"badsurat\",\n \"قبیح\": \"qabeeh\",\n \"ذہین\": \"zaheen\",\n \"عقلمند\": \"aqlmand\",\n \"دانا\": \"dana\",\n \"ہوشیار\": \"hoshiyar\",\n \"چالاک\": \"chalak\",\n \"بےوقوف\": \"bewaqoof\",\n \"احمق\": \"ahmaq\",\n \"نادان\": \"nadan\",\n \"بہادر\": \"bahadur\",\n \"شجاع\": \"shuja\",\n \"دلیر\": \"daler\",\n \"بزدل\": \"buzdil\",\n \"ڈرپوک\": \"darpok\",\n \"محنتی\": \"mehnati\",\n \"سچا\": \"sacha\",\n \"سچی\": \"sachi\",\n \"سچے\": \"sachay\",\n \"جھوٹا\": \"jhoota\",\n \"جھوٹی\": \"jhooti\",\n \"جھوٹے\": \"jhootay\",\n \"ایماندار\": \"imandar\",\n \"دیانتدار\": \"diyanatdar\",\n \"بےایمان\": \"beiman\",\n \"پیارا\": \"pyara\",\n \"پیاری\": \"pyari\",\n \"پیارے\": \"pyaray\",\n \"عجیب\": \"ajeeb\",\n \"انوکھا\": \"anokha\",\n \"نرالا\": \"nirala\",\n \"خاص\": \"khaas\",\n \"مخصوص\": \"makhsoos\",\n \"عام\": \"aam\",\n \"سستا\": \"sasta\",\n \"سستی\": \"sasti\",\n \"مہنگا\": \"mehanga\",\n \"مہنگی\": \"mehangi\",\n \"بھاری\": \"bhari\",\n \"وزنی\": \"wazni\",\n \"ہلکا\": \"halka\",\n \"ہلکی\": \"halki\",\n \"سخت\": \"sakht\",\n \"نرم\": \"naram\",\n \"ملائم\": \"mulaim\",\n \"روشن\": \"roshan\",\n \"تاریک\": \"tareek\",\n \"گہرا\": \"gehra\",\n \"گہری\": \"gehri\",\n \"اونچا\": \"ooncha\",\n \"اونچی\": \"oonchi\",\n \"پست\": \"past\",\n \"چوڑا\": \"chaura\",\n \"چوڑی\": \"chauri\",\n \"تنگ\": \"tang\",\n \"مضبوط\": \"mazboot\",\n \"پائیدار\": \"paayedar\",\n \"کمزور\": \"kamzor\",\n \"نازک\": \"nazuk\",\n\n // ---- colours ----\n \"سفید\": \"safaid\",\n \"کالا\": \"kala\",\n \"کالی\": \"kali\",\n \"کالے\": \"kalay\",\n \"سیاہ\": \"siyah\",\n \"سرخ\": \"surkh\",\n \"لال\": \"laal\",\n \"نیلا\": \"neela\",\n \"نیلی\": \"neeli\",\n \"نیلے\": \"neelay\",\n \"ہرا\": \"hara\",\n \"ہری\": \"hari\",\n \"ہرے\": \"haray\",\n \"سبز\": \"sabz\",\n \"پیلا\": \"peela\",\n \"پیلی\": \"peeli\",\n \"پیلے\": \"peelay\",\n \"زرد\": \"zard\",\n \"بھورا\": \"bhura\",\n \"بھوری\": \"bhuri\",\n \"گلابی\": \"gulabi\",\n \"نارنجی\": \"naranji\",\n \"جامنی\": \"jamni\",\n \"بیگنی\": \"baingani\",\n \"سرمئی\": \"surmai\",\n \"سنہری\": \"sunehri\",\n \"روپہلی\": \"rupahli\",\n\n // ---- numbers & ordinals ----\n \"صفر\": \"sifar\",\n \"تین\": \"teen\",\n \"چار\": \"char\",\n \"پانچ\": \"panch\",\n \"چھ\": \"chhe\",\n \"سات\": \"saat\",\n \"آٹھ\": \"aath\",\n \"نو\": \"nau\",\n \"دس\": \"das\",\n \"گیارہ\": \"gyarah\",\n \"بارہ\": \"barah\",\n \"تیرہ\": \"terah\",\n \"چودہ\": \"chaudah\",\n \"پندرہ\": \"pandrah\",\n \"سولہ\": \"solah\",\n \"سترہ\": \"satrah\",\n \"اٹھارہ\": \"atharah\",\n \"انیس\": \"unnees\",\n \"بیس\": \"bees\",\n \"اکیس\": \"ikkees\",\n \"بائیس\": \"baees\",\n \"تیئیس\": \"taees\",\n \"چوبیس\": \"chaubees\",\n \"پچیس\": \"pachees\",\n \"چھبیس\": \"chhabees\",\n \"ستائیس\": \"sataees\",\n \"اٹائیس\": \"athaees\",\n \"انتیس\": \"untees\",\n \"تیس\": \"tees\",\n \"چالیس\": \"chalees\",\n \"پچاس\": \"pachas\",\n \"ساٹھ\": \"saath\",\n \"ستر\": \"sattar\",\n \"اسی\": \"assi\",\n \"نوے\": \"nabbay\",\n \"سو\": \"so\",\n \"ہزار\": \"hazar\",\n \"لاکھ\": \"lakh\",\n \"کروڑ\": \"karor\",\n \"ارب\": \"arab\",\n \"پہلا\": \"pehla\",\n \"پہلی\": \"pehli\",\n \"دوسرا\": \"dosra\",\n \"دوسری\": \"dosri\",\n \"دوسرے\": \"dosray\",\n \"تیسرا\": \"teesra\",\n \"تیسری\": \"teesri\",\n \"تیسرے\": \"teesray\",\n \"چوتھا\": \"chautha\",\n \"چوتھی\": \"chauthi\",\n \"چوتھے\": \"chauthay\",\n \"پانچواں\": \"panchwan\",\n \"پانچویں\": \"panchwein\",\n \"چھٹا\": \"chhatta\",\n \"چھٹی\": \"chhatti\",\n \"ساتواں\": \"saatwan\",\n \"ساتویں\": \"saatwein\",\n \"آٹھواں\": \"aathwan\",\n \"آٹھویں\": \"aathwein\",\n \"نواں\": \"nawwan\",\n \"نویں\": \"nawein\",\n \"دسواں\": \"daswan\",\n \"دسویں\": \"daswein\",\n \"آخری\": \"aakhri\",\n \"اول\": \"awwal\",\n \"دوم\": \"dom\",\n \"سوم\": \"som\",\n\n // ---- greetings, discourse markers, interjections ----\n \"سلام\": \"salam\",\n \"خداحافظ\": \"khudahafiz\",\n \"حافظ\": \"hafiz\",\n \"مہربانی\": \"meherbani\",\n \"مبارک\": \"mubarak\",\n \"مبارکباد\": \"mubarakbaad\",\n \"خوشامد\": \"khushamad\",\n \"خوشامدید\": \"khushamdeed\",\n \"اہلاً\": \"ahlan\",\n \"وسہلاً\": \"wasahlan\",\n \"ہاں\": \"haan\",\n \"جی\": \"ji\",\n \"ٹھیک\": \"theek\",\n \"درست\": \"durust\",\n \"صحیح\": \"sahi\",\n \"غلط\": \"ghalat\",\n \"بالکل\": \"bilkul\",\n \"ضرور\": \"zaroor\",\n \"شاید\": \"shayad\",\n \"کاش\": \"kaash\",\n \"واہ\": \"waah\",\n \"شاباش\": \"shabash\",\n \"آفرین\": \"aafreen\",\n \"مرحبا\": \"marhaba\",\n \"سبحان\": \"subhan\",\n \"الحمد\": \"alhamd\",\n \"ماشاء\": \"masha\",\n \"انشاء\": \"insha\",\n \"جلدی\": \"jaldi\",\n \"شتابی\": \"shitabi\",\n \"دیر\": \"der\",\n \"تاخیر\": \"takheer\",\n \"آرام\": \"aaram\",\n \"تھوڑا\": \"thora\",\n \"تھوڑی\": \"thori\",\n \"تھوڑے\": \"thoray\",\n \"زیادہ\": \"ziyada\",\n \"بہت\": \"bohat\",\n \"کم\": \"kam\",\n \"صرف\": \"sirf\",\n \"محض\": \"mahez\",\n \"فقط\": \"faqat\",\n \"واقعی\": \"waqai\",\n \"مچ\": \"mach\",\n\n // ---- cities, regions, countries ----\n \"پاکستان\": \"pakistan\",\n \"کراچی\": \"karachi\",\n \"لاہور\": \"lahore\",\n \"آباد\": \"abad\",\n \"راولپنڈی\": \"rawalpindi\",\n \"پشاور\": \"peshawar\",\n \"کوئٹہ\": \"quetta\",\n \"ملتان\": \"multan\",\n \"فیصل\": \"faisal\",\n \"سیالکوٹ\": \"sialkot\",\n \"گوجرانوالہ\": \"gujranwala\",\n \"حیدرآباد\": \"hyderabad\",\n \"بہاولپور\": \"bahawalpur\",\n \"سرگودھا\": \"sargodha\",\n \"سکھر\": \"sukkur\",\n \"لاڑکانہ\": \"larkana\",\n \"شیخوپورہ\": \"sheikhupura\",\n \"جھنگ\": \"jhang\",\n \"گجرات\": \"gujrat\",\n \"مردان\": \"mardan\",\n \"قصور\": \"kasur\",\n \"صوابی\": \"swabi\",\n \"ایبٹ\": \"abbott\",\n \"گلگت\": \"gilgit\",\n \"بلتستان\": \"baltistan\",\n \"مظفرآباد\": \"muzaffarabad\",\n \"گوادر\": \"gwadar\",\n \"سکردو\": \"skardu\",\n \"سوات\": \"swat\",\n \"چترال\": \"chitral\",\n \"پنجاب\": \"punjab\",\n \"سندھ\": \"sindh\",\n \"بلوچستان\": \"balochistan\",\n \"خیبر\": \"khyber\",\n \"پختونخوا\": \"pakhtunkhwa\",\n \"کشمیر\": \"kashmir\",\n \"بھارت\": \"bharat\",\n \"ہندوستان\": \"hindustan\",\n \"چین\": \"cheen\",\n \"افغانستان\": \"afghanistan\",\n \"ایران\": \"iran\",\n \"سعودی\": \"saudi\",\n \"عرب\": \"arab\",\n \"امارات\": \"imarat\",\n \"دبئی\": \"dubai\",\n \"قطر\": \"qatar\",\n \"کویت\": \"kuwait\",\n \"بحرین\": \"bahrain\",\n \"عمان\": \"oman\",\n \"عراق\": \"iraq\",\n \"فلسطین\": \"palestine\",\n \"اردن\": \"urdan\",\n \"مصر\": \"misr\",\n \"ترکی\": \"turkey\",\n \"برطانیہ\": \"bartania\",\n \"لندن\": \"london\",\n \"امریکہ\": \"amreeka\",\n \"واشنگٹن\": \"washington\",\n \"نیویارک\": \"newyork\",\n \"کینیڈا\": \"canada\",\n \"جرمنی\": \"germany\",\n \"فرانس\": \"france\",\n \"پیرس\": \"paris\",\n \"اٹلی\": \"italy\",\n \"روس\": \"roos\",\n \"ماسکو\": \"moscow\",\n \"جاپان\": \"japan\",\n \"ٹوکیو\": \"tokyo\",\n \"آسٹریلیا\": \"australia\",\n \"بیجنگ\": \"beijing\",\n \"دہلی\": \"delhi\",\n \"قاہرہ\": \"cairo\",\n \"مکہ\": \"makkah\",\n \"مدینہ\": \"madina\",\n \"مقدس\": \"muqaddas\",\n\n // ---- names that appear constantly in Urdu content ----\n \"محمد\": \"muhammad\",\n \"احمد\": \"ahmed\",\n \"علی\": \"ali\",\n \"خان\": \"khan\",\n \"زید\": \"zaid\",\n \"حسن\": \"hasan\",\n \"حسین\": \"hussain\",\n \"عثمان\": \"usman\",\n \"ابوبکر\": \"abubakar\",\n \"بلال\": \"bilal\",\n \"اسلم\": \"aslam\",\n \"حمزہ\": \"hamza\",\n \"سعد\": \"saad\",\n \"خالد\": \"khalid\",\n \"طارق\": \"tariq\",\n \"ولید\": \"waleed\",\n \"شاہ\": \"shah\",\n \"چوہدری\": \"chaudhary\",\n \"شیخ\": \"sheikh\",\n \"سید\": \"syed\",\n \"قریشی\": \"qureshi\",\n \"بٹ\": \"butt\",\n \"مغل\": \"mughal\",\n \"انصاری\": \"ansari\",\n \"فاروق\": \"farooq\",\n \"سلمان\": \"salman\",\n \"عمران\": \"imran\",\n \"نوید\": \"naveed\",\n \"کامران\": \"kamran\",\n \"ارسلان\": \"arslan\",\n \"عرفان\": \"irfan\",\n \"رضوان\": \"rizwan\",\n \"عدنان\": \"adnan\",\n \"فیضان\": \"faizan\",\n \"شہزاد\": \"shehzad\",\n \"وقار\": \"waqar\",\n \"بابر\": \"babar\",\n \"رضا\": \"raza\",\n \"طاہر\": \"tahir\",\n \"ناصر\": \"nasir\",\n \"زبیر\": \"zubair\",\n \"سہیل\": \"sohail\",\n \"ندیم\": \"nadeem\",\n \"وسیم\": \"waseem\",\n \"نعیم\": \"naeem\",\n \"سلیم\": \"saleem\",\n \"جمیل\": \"jameel\",\n \"راشد\": \"rashid\",\n \"ساجد\": \"sajid\",\n \"ماجد\": \"majid\",\n \"عابد\": \"abid\",\n \"زاہد\": \"zahid\",\n \"شاہد\": \"shahid\",\n \"زین\": \"zain\",\n \"حارث\": \"haris\",\n \"ریان\": \"rayyan\",\n \"قاسم\": \"qasim\",\n \"طیب\": \"tayyab\",\n \"ابراہیم\": \"ibrahim\",\n \"اسماعیل\": \"ismail\",\n \"اسحاق\": \"ishaq\",\n \"یعقوب\": \"yaqoob\",\n \"یوسف\": \"yousuf\",\n \"موسی\": \"musa\",\n \"عیسی\": \"eesa\",\n \"داؤد\": \"dawood\",\n \"سلیمان\": \"sulaiman\",\n \"یونس\": \"younus\",\n \"ایوب\": \"ayub\",\n \"ہارون\": \"haroon\",\n \"یحیی\": \"yahya\",\n \"فاطمہ\": \"fatima\",\n \"عائشہ\": \"ayesha\",\n \"مریم\": \"maryam\",\n \"زینب\": \"zainab\",\n \"خدیجہ\": \"khadija\",\n \"حفصہ\": \"hafsa\",\n \"سارہ\": \"sara\",\n \"ہدی\": \"huda\",\n \"ثنا\": \"sana\",\n \"حنا\": \"hina\",\n \"اقرا\": \"iqra\",\n \"سدرہ\": \"sidra\",\n \"اقصی\": \"aqsa\",\n \"فرح\": \"farah\",\n \"ندا\": \"nida\",\n \"صبا\": \"saba\",\n \"مہوش\": \"mehwish\",\n \"انعم\": \"anam\",\n \"ارم\": \"iram\",\n \"بشری\": \"bushra\",\n \"سمیرا\": \"sumaira\",\n \"نازیہ\": \"nazia\",\n \"شازیہ\": \"shazia\",\n \"روبینہ\": \"rubina\",\n \"نسرین\": \"nasreen\",\n \"یاسمین\": \"yasmeen\",\n \"ثمینہ\": \"samina\",\n \"پروین\": \"parveen\",\n \"شبانہ\": \"shabana\",\n \"فرزانہ\": \"farzana\",\n \"طاہرہ\": \"tahira\",\n \"عصمت\": \"ismat\",\n \"نصرت\": \"nusrat\",\n\n // ---- classical, poetic and literary vocabulary ----\n \"گلستاں\": \"gulistan\",\n \"گلشن\": \"gulshan\",\n \"بہاراں\": \"baharan\",\n \"پروانہ\": \"parwana\",\n \"شمع\": \"shama\",\n \"ساقی\": \"saqi\",\n \"میخانہ\": \"maikhana\",\n \"جام\": \"jaam\",\n \"صراحی\": \"surahi\",\n \"رند\": \"rind\",\n \"محتسب\": \"muhtasib\",\n \"قاصد\": \"qasid\",\n \"پیامبر\": \"payambar\",\n \"رقیب\": \"raqeeb\",\n \"حبیب\": \"habeeb\",\n \"محبوب\": \"mahboob\",\n \"معشوق\": \"mashooq\",\n \"صنم\": \"sanam\",\n \"سنگدل\": \"sangdil\",\n \"بیدرد\": \"bedard\",\n \"غمگسار\": \"ghamgusar\",\n \"مسیحا\": \"maseeha\",\n \"ناصح\": \"nasih\",\n \"واعظ\": \"waiz\",\n \"تشنہ\": \"tishna\",\n \"گیسو\": \"gesu\",\n \"زلف\": \"zulf\",\n \"دیدار\": \"deedar\",\n \"جلوہ\": \"jalwa\",\n \"حجاب\": \"hijab\",\n \"نقاب\": \"niqab\",\n \"سوز\": \"soz\",\n \"آہنگ\": \"aahang\",\n \"نغمہ\": \"naghma\",\n \"ترانہ\": \"tarana\",\n \"داستاں\": \"dastan\",\n \"حور\": \"hoor\",\n \"پری\": \"pari\",\n \"دیو\": \"deo\",\n \"جادو\": \"jadoo\",\n \"طلسم\": \"tilism\",\n \"افسون\": \"afsoon\",\n \"سحرانگیز\": \"sehrangeez\",\n \"فسوں\": \"fusoon\",\n \"جنوں\": \"junoon\",\n \"سودا\": \"sauda\",\n \"وحشت\": \"wahshat\",\n \"ارمان\": \"arman\",\n \"ذوق\": \"zauq\",\n \"وجد\": \"wajd\",\n \"مستی\": \"masti\",\n \"کیف\": \"kaif\",\n \"خمار\": \"khumar\",\n \"نشہ\": \"nasha\",\n \"بےخودی\": \"bekhudi\",\n\n // ---- commerce, finance and modern technology ----\n \"خریداری\": \"khareedari\",\n \"فروخت\": \"farokht\",\n \"سرمایہ\": \"sarmaya\",\n \"قرضہ\": \"qarza\",\n \"بینکاری\": \"bainkari\",\n \"قسط\": \"qist\",\n \"ادائیگی\": \"adaigi\",\n \"آمدنی\": \"aamdani\",\n \"خرچہ\": \"kharcha\",\n \"بچت\": \"bachat\",\n \"محصول\": \"mahsool\",\n \"مالیت\": \"maliyat\",\n \"کتابت\": \"kitabat\",\n \"منڈی\": \"mandi\",\n \"نیلامی\": \"neelami\",\n \"بولی\": \"boli\",\n \"شراکت\": \"sharakat\",\n \"حصص\": \"hisas\",\n \"اسٹاک\": \"stock\",\n \"دولت\": \"daulat\",\n \"ثروت\": \"sarwat\",\n \"غربت\": \"ghurbat\",\n \"افلاس\": \"iflas\",\n \"پروفائل\": \"profile\",\n \"سیٹنگز\": \"settings\",\n \"نوٹیفکیشن\": \"notification\",\n \"سائٹ\": \"site\",\n \"پورٹل\": \"portal\",\n\n // ---- administration, law, governance and politics ----\n \"عدلیہ\": \"adliya\",\n \"مقننہ\": \"muqannana\",\n \"انتظامیہ\": \"intizamia\",\n \"حکمرانی\": \"hukmrani\",\n \"جمہوریہ\": \"jamhooria\",\n \"صدارت\": \"sadarat\",\n \"وزارت\": \"wazarat\",\n \"سفارت\": \"safarat\",\n \"قونصل\": \"consul\",\n \"سفارتخانہ\": \"safaratkhana\",\n \"آئینی\": \"aaeeni\",\n \"دستوری\": \"dastoori\",\n \"فوجداری\": \"faujdari\",\n \"دیوانی\": \"deewani\",\n \"مقدمہ\": \"muqaddama\",\n \"سماعت\": \"samaat\",\n \"درخواست\": \"darkhwast\",\n \"اپیل\": \"appeal\",\n \"ضمانت\": \"zamanat\",\n \"بریت\": \"bariyat\",\n \"عمرقید\": \"umrqaid\",\n \"پھانسی\": \"phansi\",\n \"وکالت\": \"wukalat\",\n \"حقوق\": \"huqooq\",\n \"فرائض\": \"faraiz\",\n \"شہری\": \"shahri\",\n \"شہریت\": \"shahriyat\",\n \"شناخت\": \"shanakht\",\n \"نادرا\": \"nadra\",\n \"مجلس\": \"majlis\",\n \"شوری\": \"shoora\",\n \"حلیف\": \"haleef\",\n \"مخالف\": \"mukhalif\",\n \"بغاوت\": \"baghawat\",\n\n // ---- geography, nature and terrain ----\n \"خطہ\": \"khitta\",\n \"صوبہ\": \"sooba\",\n \"ضلع\": \"zila\",\n \"تحصیل\": \"tehsil\",\n \"یونین\": \"union\",\n \"کونسل\": \"council\",\n \"قریہ\": \"qarya\",\n \"بستی\": \"basti\",\n \"شہرستان\": \"shehristan\",\n \"نخلستان\": \"nakhalistan\",\n \"کوہسار\": \"kohsar\",\n \"کہسار\": \"kuhsar\",\n \"گھاٹی\": \"ghati\",\n \"وادیاں\": \"wadiyan\",\n \"کھائی\": \"khaai\",\n \"خلیج\": \"khaleej\",\n \"راس\": \"raas\",\n\n // ---- verbs and verbal inflections ----\n \"مانتے\": \"mante\",\n \"مانتی\": \"manti\",\n \"مانو\": \"mano\",\n \"ٹھہرنا\": \"theharna\",\n \"ٹھہرا\": \"thehra\",\n \"ٹھہرو\": \"thehro\",\n \"ٹھہرتے\": \"thehrte\",\n \"سمجھاؤ\": \"samjhao\",\n \"پہنچاؤ\": \"pohonchao\",\n \"لٹانا\": \"lutana\",\n \"لٹایا\": \"lutaya\",\n \"لوٹا\": \"loota\",\n \"پکارا\": \"pukara\",\n \"پکارو\": \"pukaro\",\n \"جھکنا\": \"jhukna\",\n \"جھکا\": \"jhuka\",\n \"جھکاؤ\": \"jhukao\",\n \"جھکانا\": \"jhukana\",\n \"تھامنا\": \"thamna\",\n \"تھاما\": \"thama\",\n \"تھامو\": \"thamo\",\n \"سنوارنا\": \"sanwarna\",\n \"سنوارا\": \"sanwara\",\n \"نکھارنا\": \"nikharna\",\n \"نکھارا\": \"nikhara\",\n \"سنبھالنا\": \"sambhalna\",\n \"سنبھالا\": \"sambhala\",\n \"سنبھالو\": \"sambhalo\",\n \"پچھتانا\": \"pachtana\",\n \"پچھتایا\": \"pachtaya\",\n \"گھبرانا\": \"ghabrana\",\n \"گھبرایا\": \"ghabraya\",\n \"مسکرانا\": \"muskurana\",\n \"مسکرایا\": \"muskuraya\",\n \"مسکراہٹ\": \"muskurahat\",\n \"جھنجھلانا\": \"jhanjhlana\",\n \"تلملانا\": \"tilmilana\",\n \"بلبلانا\": \"bilbilana\",\n \"کھلکھلانا\": \"khilkhilana\",\n \"کھٹکھٹانا\": \"khatkhatana\",\n \"جھلملانا\": \"jhilmilana\",\n \"چمچماتا\": \"chamchamata\",\n \"لہرانا\": \"lehrana\",\n \"لہرایا\": \"lehraya\",\n \"لہر\": \"lehar\",\n};\n\n/**\n * Extra Roman spellings that map back to Urdu, for the reverse direction only.\n *\n * Roman Urdu has no standard orthography, so the same word arrives spelled many\n * ways. These are the variants common enough to be worth hard-coding, plus\n * disambiguations where two Urdu words share one Roman form.\n */\nexport const ROMAN_VARIANTS: Record<string, string> = {\n hay: \"ہے\",\n he: \"ہے\",\n hei: \"ہے\",\n hein: \"ہیں\",\n hn: \"ہیں\",\n hain: \"ہیں\",\n hun: \"ہوں\",\n hoon: \"ہوں\",\n ap: \"آپ\",\n aap: \"آپ\",\n aapko: \"آپکو\",\n aapka: \"آپکا\",\n aapki: \"آپکی\",\n aapke: \"آپکے\",\n kaise: \"کیسے\",\n kese: \"کیسے\",\n kaisey: \"کیسے\",\n kaisa: \"کیسا\",\n kaisi: \"کیسی\",\n nam: \"نام\",\n naam: \"نام\",\n mai: \"میں\",\n main: \"میں\",\n me: \"میں\",\n mein: \"میں\",\n mujhe: \"مجھے\",\n mujhey: \"مجھے\",\n mjhe: \"مجھے\",\n mjhy: \"مجھے\",\n mj: \"مجھے\",\n humein: \"ہمیں\",\n hume: \"ہمیں\",\n hmein: \"ہمیں\",\n hmain: \"ہمیں\",\n tumhein: \"تمہیں\",\n tumhe: \"تمہیں\",\n tumhey: \"تمہیں\",\n tmhein: \"تمہیں\",\n tmhe: \"تمہیں\",\n unhein: \"انہیں\",\n unhe: \"انہیں\",\n unhey: \"انہیں\",\n inhein: \"انہیں\",\n inhe: \"انہیں\",\n usey: \"اسے\",\n usay: \"اسے\",\n use: \"اسے\",\n isay: \"اسے\",\n ise: \"اسے\",\n jisay: \"جسے\",\n jise: \"جسے\",\n kisay: \"کسے\",\n kise: \"کسے\",\n kyu: \"کیوں\",\n kyn: \"کیوں\",\n kyo: \"کیوں\",\n kyun: \"کیوں\",\n kyoon: \"کیوں\",\n kaha: \"کہاں\",\n kahan: \"کہاں\",\n khn: \"کہاں\",\n kidhar: \"کدھر\",\n idhar: \"ادھر\",\n jidhar: \"جدھر\",\n kab: \"کب\",\n kya: \"کیا\",\n kia: \"کیا\",\n kiya: \"کیا\",\n kuch: \"کچھ\",\n kuchh: \"کچھ\",\n kch: \"کچھ\",\n bhi: \"بھی\",\n b: \"بھی\",\n nahin: \"نہیں\",\n nahi: \"نہیں\",\n nai: \"نہیں\",\n nhi: \"نہیں\",\n nahe: \"نہیں\",\n nhn: \"نہیں\",\n bahut: \"بہت\",\n bhot: \"بہت\",\n bohot: \"بہت\",\n bohat: \"بہت\",\n bht: \"بہت\",\n achha: \"اچھا\",\n acha: \"اچھا\",\n accha: \"اچھا\",\n achi: \"اچھی\",\n achhi: \"اچھی\",\n ache: \"اچھے\",\n achay: \"اچھے\",\n shukria: \"شکریہ\",\n shukriya: \"شکریہ\",\n thx: \"شکریہ\",\n thanks: \"شکریہ\",\n plz: \"مہربانی\",\n please: \"مہربانی\",\n salaam: \"سلام\",\n salam: \"سلام\",\n mohabat: \"محبت\",\n muhabbat: \"محبت\",\n mohabbat: \"محبت\",\n pyar: \"پیار\",\n pyaar: \"پیار\",\n zindagi: \"زندگی\",\n zindgi: \"زندگی\",\n dost: \"دوست\",\n dst: \"دوست\",\n khush: \"خوش\",\n khushi: \"خوش\",\n theak: \"ٹھیک\",\n thik: \"ٹھیک\",\n theek: \"ٹھیک\",\n bhai: \"بھائی\",\n bhaiya: \"بھائی\",\n behen: \"بہن\",\n behan: \"بہن\",\n baji: \"باجی\",\n api: \"آپی\",\n ammi: \"امی\",\n ami: \"امی\",\n abbu: \"ابو\",\n abu: \"ابو\",\n paisay: \"پیسے\",\n paise: \"پیسے\",\n paisa: \"پیسہ\",\n kaam: \"کام\",\n kam: \"کم\",\n ghar: \"گھر\",\n ghr: \"گھر\",\n pehle: \"پہلے\",\n pehlay: \"پہلے\",\n pehly: \"پہلے\",\n baad: \"بعد\",\n bad: \"بعد\",\n lekin: \"لیکن\",\n lkn: \"لیکن\",\n magar: \"مگر\",\n mgr: \"مگر\",\n waqt: \"وقت\",\n wqt: \"وقت\",\n zroor: \"ضرور\",\n zaroor: \"ضرور\",\n zarur: \"ضرور\",\n zroori: \"ضروری\",\n zaroori: \"ضروری\",\n chahiye: \"چاہیے\",\n chahye: \"چاہیے\",\n chaheye: \"چاہیے\",\n khuda: \"خدا\",\n allah: \"اللہ\",\n hafiz: \"حافظ\",\n haafiz: \"حافظ\",\n khudahafiz: \"خداحافظ\",\n // aam is both آم (mango) and عام (common); the fruit is the likelier query.\n aam: \"آم\",\n hawa: \"ہوا\",\n // sona is both سونا (to sleep) and سونا (gold) — same spelling, no conflict.\n ho: \"ہو\",\n hoga: \"ہوگا\",\n hogi: \"ہوگی\",\n honge: \"ہوںگے\",\n karna: \"کرنا\",\n krna: \"کرنا\",\n karo: \"کرو\",\n kro: \"کرو\",\n dekhna: \"دیکھنا\",\n dekho: \"دیکھو\",\n sunna: \"سننا\",\n suno: \"سنو\",\n samajh: \"سمجھ\",\n smjh: \"سمجھ\",\n laikin: \"لیکن\",\n shukr: \"شکر\",\n sabr: \"صبر\",\n dil: \"دل\",\n kitab: \"کتاب\",\n kitaab: \"کتاب\",\n school: \"سکول\",\n college: \"کالج\",\n hospital: \"ہسپتال\",\n pal: \"پل\",\n daur: \"دور\",\n kurta: \"کرتا\",\n haseen: \"حسین\",\n malik: \"ملک\",\n kidhr: \"کدھر\",\n idhr: \"ادھر\",\n jdhr: \"جدھر\",\n thek: \"ٹھیک\",\n thk: \"ٹھیک\",\n sahi: \"صحیح\",\n galat: \"غلط\",\n ghalat: \"غلط\",\n sb: \"سب\",\n hmsha: \"ہمیشہ\",\n kbhi: \"کبھی\",\n aksar: \"اکثر\",\n behtareen: \"بہترین\",\n zabardast: \"زبردست\",\n shandar: \"شاندار\",\n khoob: \"خوب\",\n khub: \"خوب\",\n sharam: \"شرم\",\n haya: \"حیا\",\n ghairat: \"غیرت\",\n himmat: \"ہمت\",\n hosla: \"حوصلہ\",\n mashaallah: \"ماشاءاللہ\",\n inshaallah: \"انشاءاللہ\",\n mashallah: \"ماشاءاللہ\",\n inshallah: \"انشاءاللہ\",\n alhamdulillah: \"الحمدللہ\",\n jazakallah: \"جزاکاللہ\",\n // ---- additional Roman variants for common words ----\n // verbs\n hona: \"ہونا\",\n hua: \"ہوا\",\n hui: \"ہوئی\",\n hue: \"ہوئے\",\n jana: \"جانا\",\n jata: \"جاتا\",\n jati: \"جاتی\",\n gaya: \"گیا\",\n gayi: \"گئی\",\n aana: \"آنا\",\n aati: \"آتی\",\n aaya: \"آیا\",\n aayi: \"آئی\",\n dena: \"دینا\",\n deta: \"دیتا\",\n deti: \"دیتی\",\n diya: \"دیا\",\n lena: \"لینا\",\n leta: \"لیتا\",\n leti: \"لیتی\",\n liya: \"لیا\",\n kehna: \"کہنا\",\n kehta: \"کہتا\",\n kehti: \"کہتی\",\n dekhta: \"دیکھتا\",\n dekhti: \"دیکھتی\",\n dekha: \"دیکھا\",\n bolna: \"بولنا\",\n bolta: \"بولتا\",\n boli: \"بولی\",\n bola: \"بولا\",\n padhna: \"پڑھنا\",\n padhta: \"پڑھتا\",\n padhti: \"پڑھتی\",\n padha: \"پڑھا\",\n likhna: \"لکھنا\",\n likhta: \"لکھتا\",\n likhti: \"لکھتی\",\n likha: \"لکھا\",\n samajhna: \"سمجھنا\",\n samjha: \"سمجھا\",\n chahna: \"چاہنا\",\n chahta: \"چاہتا\",\n chahti: \"چاہتی\",\n sakna: \"سکنا\",\n sakta: \"سکتا\",\n sakti: \"سکتی\",\n rehna: \"رہنا\",\n rehta: \"رہتا\",\n rehti: \"رہتی\",\n raha: \"رہا\",\n rahi: \"رہی\",\n banna: \"بننا\",\n bana: \"بنا\",\n banana: \"بنانا\",\n banaya: \"بنایا\",\n milna: \"ملنا\",\n milta: \"ملتا\",\n milti: \"ملتی\",\n mila: \"ملا\",\n mili: \"ملی\",\n khata: \"کھاتا\",\n khati: \"کھاتی\",\n khaya: \"کھایا\",\n peena: \"پینا\",\n peeta: \"پیتا\",\n piya: \"پیا\",\n sota: \"سوتا\",\n soti: \"سوتی\",\n soya: \"سویا\",\n uthna: \"اٹھنا\",\n utha: \"اٹھا\",\n baithna: \"بیٹھنا\",\n baitha: \"بیٹھا\",\n chalta: \"چلتا\",\n chalti: \"چلتی\",\n chala: \"چلا\",\n rakhna: \"رکھنا\",\n rakha: \"رکھا\",\n maangna: \"مانگنا\",\n manga: \"مانگا\",\n puchna: \"پوچھنا\",\n poocha: \"پوچھا\",\n batana: \"بتانا\",\n bataya: \"بتایا\",\n kholna: \"کھولنا\",\n khola: \"کھولا\",\n marna: \"مرنا\",\n mara: \"مرا\",\n jeetna: \"جیتنا\",\n jeeta: \"جیتا\",\n haarna: \"ہارنا\",\n haara: \"ہارا\",\n badalna: \"بدلنا\",\n badla: \"بدلا\",\n rukna: \"رکنا\",\n rokna: \"روکنا\",\n roka: \"روکا\",\n khelna: \"کھیلنا\",\n khela: \"کھیلا\",\n hansna: \"ہنسنا\",\n hansa: \"ہنسا\",\n rona: \"رونا\",\n roya: \"رویا\",\n darna: \"ڈرنا\",\n dara: \"ڈرا\",\n bhoolna: \"بھولنا\",\n bhoola: \"بھولا\",\n seekhna: \"سیکھنا\",\n seekha: \"سیکھا\",\n sikhana: \"سکھانا\",\n sikhaya: \"سکھایا\",\n dhona: \"دھونا\",\n dhoya: \"دھویا\",\n pehanna: \"پہننا\",\n pehna: \"پہنا\",\n bechna: \"بیچنا\",\n becha: \"بیچا\",\n khareedna: \"خریدنا\",\n khareeda: \"خریدا\",\n bhejna: \"بھیجنا\",\n bheja: \"بھیجا\",\n nikalna: \"نکلنا\",\n nikla: \"نکلا\",\n girna: \"گرنا\",\n gira: \"گرا\",\n pakarna: \"پکڑنا\",\n pakra: \"پکڑا\",\n chhorna: \"چھوڑنا\",\n chhora: \"چھوڑا\",\n torna: \"توڑنا\",\n tora: \"توڑا\",\n katna: \"کاٹنا\",\n kata: \"کاٹا\",\n daalna: \"ڈالنا\",\n dala: \"ڈالا\",\n manna: \"ماننا\",\n mana: \"مانا\",\n bulana: \"بلانا\",\n bulaya: \"بلایا\",\n dikhana: \"دکھانا\",\n dikhaya: \"دکھایا\",\n phenkna: \"پھینکنا\",\n phenka: \"پھینکا\",\n letna: \"لیٹنا\",\n jagna: \"جاگنا\",\n lautna: \"لوٹنا\",\n guzarna: \"گزارنا\",\n kamana: \"کمانا\",\n kamaya: \"کمایا\",\n ginna: \"گننا\",\n bandhna: \"باندھنا\",\n bandha: \"باندھا\",\n bharna: \"بھرنا\",\n bhara: \"بھرا\",\n doobna: \"ڈوبنا\",\n chamakna: \"چمکنا\",\n ghoomna: \"گھومنا\",\n phirna: \"پھرنا\",\n phailna: \"پھیلنا\",\n // nouns\n insaan: \"انسان\",\n larka: \"لڑکا\",\n larki: \"لڑکی\",\n bacha: \"بچہ\",\n bachi: \"بچی\",\n maan: \"ماں\",\n baap: \"باپ\",\n beta: \"بیٹا\",\n beti: \"بیٹی\",\n dushman: \"دشمن\",\n makaan: \"مکان\",\n kamra: \"کمرہ\",\n darwaza: \"دروازہ\",\n khirki: \"کھڑکی\",\n chhat: \"چھت\",\n deewar: \"دیوار\",\n farsh: \"فرش\",\n qalam: \"قلم\",\n kaghaz: \"کاغذ\",\n mez: \"میز\",\n kursi: \"کرسی\",\n almari: \"الماری\",\n palang: \"پلنگ\",\n bistar: \"بستر\",\n parda: \"پردہ\",\n qaleen: \"قالین\",\n bartan: \"برتن\",\n chamach: \"چمچ\",\n plate: \"پلیٹ\",\n pyali: \"پیالی\",\n cup: \"کپ\",\n glass: \"گلاس\",\n botal: \"بوتل\",\n dabba: \"ڈبہ\",\n jharoo: \"جھاڑو\",\n sabun: \"صابن\",\n aaina: \"آئینہ\",\n sheesha: \"شیشہ\",\n kanghi: \"کنگھی\",\n sui: \"سوئی\",\n qainchi: \"قینچی\",\n tala: \"تالا\",\n chabi: \"چابی\",\n ghari: \"گھڑی\",\n topi: \"ٹوپی\",\n pagri: \"پگڑی\",\n qameez: \"قمیض\",\n shalwar: \"شلوار\",\n pajama: \"پاجامہ\",\n pant: \"پینٹ\",\n shirt: \"شرٹ\",\n coat: \"کوٹ\",\n shawl: \"شال\",\n dupatta: \"دوپٹہ\",\n joota: \"جوتا\",\n chappal: \"چپل\",\n sandal: \"صندل\",\n kapra: \"کپڑا\",\n doodh: \"دودھ\",\n dahi: \"دہی\",\n ghee: \"گھی\",\n chai: \"چائے\",\n qehwa: \"قہوہ\",\n coffee: \"کافی\",\n lassi: \"لسی\",\n juice: \"جوس\",\n roti: \"روٹی\",\n naan: \"نان\",\n paratha: \"پراٹھا\",\n chawal: \"چاول\",\n biryani: \"بریانی\",\n pulao: \"پلاؤ\",\n salan: \"سالن\",\n qorma: \"قورمہ\",\n nihari: \"نہاری\",\n haleem: \"حلیم\",\n kabab: \"کباب\",\n tikka: \"تکہ\",\n samosa: \"سموسہ\",\n daal: \"دال\",\n gosht: \"گوشت\",\n qeema: \"قیمہ\",\n murghi: \"مرغی\",\n machhli: \"مچھلی\",\n anda: \"انڈا\",\n sabzi: \"سبزی\",\n maida: \"میدہ\",\n namak: \"نمک\",\n cheeni: \"چینی\",\n mirch: \"مرچ\",\n haldi: \"ہلدی\",\n dhaniya: \"دھنیا\",\n zeera: \"زیرہ\",\n lehsun: \"لہسن\",\n adrak: \"ادرک\",\n pyaz: \"پیاز\",\n tamatar: \"ٹماٹر\",\n aloo: \"آلو\",\n gajar: \"گاجر\",\n matar: \"مٹر\",\n palak: \"پالک\",\n gobhi: \"گوبھی\",\n bhindi: \"بھنڈی\",\n karela: \"کریلا\",\n kaddu: \"کدو\",\n kheera: \"کھیرا\",\n phal: \"پھل\",\n saib: \"سیب\",\n kela: \"کیلا\",\n angoor: \"انگور\",\n anar: \"انار\",\n amrood: \"امرود\",\n tarbooz: \"تربوز\",\n badam: \"بادام\",\n pista: \"پستہ\",\n kaju: \"کاجو\",\n kheer: \"کھیر\",\n halwa: \"حلوہ\",\n zarda: \"زردہ\",\n jalebi: \"جلیبی\",\n kulfi: \"کلفی\",\n cake: \"کیک\",\n chocolate: \"چاکلیٹ\",\n mithai: \"مٹھائی\",\n salad: \"سلاد\",\n raita: \"رائتہ\",\n chatni: \"چٹنی\",\n achaar: \"اچار\",\n dimagh: \"دماغ\",\n jism: \"جسم\",\n sar: \"سر\",\n aankh: \"آنکھ\",\n aankhein: \"آنکھیں\",\n kaan: \"کان\",\n naak: \"ناک\",\n munh: \"منہ\",\n daant: \"دانت\",\n zuban: \"زبان\",\n gala: \"گلا\",\n gardan: \"گردن\",\n kandha: \"کندھا\",\n bazu: \"بازو\",\n hath: \"ہاتھ\",\n ungli: \"انگلی\",\n seena: \"سینہ\",\n pet: \"پیٹ\",\n kamar: \"کمر\",\n taang: \"ٹانگ\",\n paon: \"پاؤں\",\n haddi: \"ہڈی\",\n khoon: \"خون\",\n jild: \"جلد\",\n baal: \"بال\",\n chehra: \"چہرہ\",\n sehat: \"صحت\",\n beemari: \"بیماری\",\n dard: \"درد\",\n ilaj: \"علاج\",\n dawa: \"دوا\",\n goli: \"گولی\",\n ishq: \"عشق\",\n nafrat: \"نفرت\",\n gham: \"غم\",\n dukh: \"دکھ\",\n ummeed: \"امید\",\n yaqeen: \"یقین\",\n sach: \"سچ\",\n jhoot: \"جھوٹ\",\n insaf: \"انصاف\",\n zulm: \"ظلم\",\n izzat: \"عزت\",\n dua: \"دعا\",\n khwab: \"خواب\",\n khayal: \"خیال\",\n maut: \"موت\",\n taqat: \"طقت\",\n koshish: \"کوشش\",\n kamyabi: \"کامیابی\",\n nakami: \"ناکامی\",\n faisla: \"فیصلہ\",\n ghussa: \"غصہ\",\n akhlaq: \"اخلاق\",\n wafa: \"وفا\",\n dosti: \"دوستی\",\n sakoon: \"سکون\",\n ilm: \"علم\",\n taleem: \"تعلیم\",\n sabaq: \"سبق\",\n imtihan: \"امتحان\",\n masla: \"مسئلہ\",\n sawal: \"سوال\",\n jawab: \"جواب\",\n lafz: \"لفظ\",\n jumla: \"جملہ\",\n maani: \"معنی\",\n matlab: \"مطلب\",\n khabar: \"خبر\",\n akhbar: \"اخبار\",\n kahani: \"کہانی\",\n qissa: \"قصہ\",\n dastan: \"داستان\",\n novel: \"ناول\",\n mazmoon: \"مضمون\",\n ghazal: \"غزل\",\n nazm: \"نظم\",\n adab: \"ادب\",\n tareekh: \"تاریخ\",\n science: \"سائنس\",\n falsafa: \"فلسفہ\",\n saqafat: \"ثقافت\",\n tehzeeb: \"تہذیب\",\n moseeqi: \"موسیقی\",\n tasweer: \"تصویر\",\n rang: \"رنگ\",\n awaz: \"آواز\",\n khamoshi: \"خاموشی\",\n namaz: \"نماز\",\n roza: \"روزہ\",\n hajj: \"حج\",\n eid: \"عید\",\n qurbani: \"قربانی\",\n mazhab: \"مذہب\",\n rasool: \"رسول\",\n nabi: \"نبی\",\n quran: \"قرآن\",\n hadees: \"حدیث\",\n deen: \"دین\",\n imaan: \"ایمان\",\n jannat: \"جنت\",\n dozakh: \"دوزخ\",\n farishta: \"فرشتہ\",\n qayamat: \"قیامت\",\n ibadat: \"عبادت\",\n gunah: \"گناہ\",\n rehmat: \"رحمت\",\n barkat: \"برکت\",\n naiki: \"نیکی\",\n siyasat: \"سیاست\",\n election: \"الیکشن\",\n intikhab: \"انتخاب\",\n vote: \"ووٹ\",\n party: \"پارٹی\",\n jamaat: \"جماعت\",\n qanoon: \"قانون\",\n dastoor: \"دستور\",\n hukumat: \"حکومت\",\n jurm: \"جرم\",\n mujrim: \"مجرم\",\n saza: \"سزا\",\n fauj: \"فوج\",\n jang: \"جنگ\",\n larai: \"لڑائی\",\n aman: \"امن\",\n sulah: \"صلح\",\n tijarat: \"تجارت\",\n karobar: \"کاروبار\",\n sanat: \"صنعت\",\n taraqqi: \"ترقی\",\n report: \"رپورٹ\",\n conference: \"کانفرنس\",\n taqreer: \"تقریر\",\n aasman: \"آسمان\",\n zameen: \"زمین\",\n sooraj: \"سورج\",\n sitara: \"ستارہ\",\n pahaar: \"پہاڑ\",\n nadi: \"ندی\",\n darya: \"دریا\",\n samundar: \"سمندر\",\n jungle: \"جنگل\",\n bagh: \"باغ\",\n phool: \"پھول\",\n darakht: \"درخت\",\n pattay: \"پتّے\",\n machli: \"مچھلی\",\n parinday: \"پرندے\",\n kutta: \"کتا\",\n billi: \"بلی\",\n ghora: \"گھوڑا\",\n gaay: \"گائے\",\n bhains: \"بھیس\",\n bakra: \"بکرا\",\n mendha: \"میڈھا\",\n khargosh: \"خرگوش\",\n saanp: \"سانپ\",\n cheel: \"چیل\",\n kabootar: \"کبوتر\",\n tota: \"توتا\",\n ullu: \"الو\",\n chuha: \"چوہا\"\n};\n","/**\n * Transliteration between Urdu script and Roman Urdu.\n *\n * Read this before shipping it anywhere user-visible:\n *\n * Urdu script omits short vowels, so the mapping is genuinely ambiguous —\n * کتب is `kitab` or `kutub` depending on context, and no rule table can decide\n * which. The reverse direction is worse, because Roman Urdu has no standard\n * orthography (hai / hay / he / hei all occur in the wild).\n *\n * This module therefore works in two layers: a dictionary of common words, then\n * a rule fallback. Expect roughly 70% word accuracy on ordinary prose from the\n * rule layer, and treat every function here as `@experimental`. Anything better\n * needs a real lexicon plus a statistical model, which is planned for a later\n * release and deliberately not faked here.\n */\nimport { removeDiacritics, normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\nimport { URDU_LETTERS } from \"./chars.js\";\nimport { ROMAN_VARIANTS, WORD_DICTIONARY } from \"./dictionary.js\";\n\n\n/** Consonant + ھ (do-chashmi heh) forms one aspirated sound, so it is matched first. */\nconst DIGRAPHS: Record<string, string> = {\n \"بھ\": \"bh\",\n \"پھ\": \"ph\",\n \"تھ\": \"th\",\n \"ٹھ\": \"th\",\n \"جھ\": \"jh\",\n \"چھ\": \"chh\",\n \"دھ\": \"dh\",\n \"ڈھ\": \"dh\",\n \"ڑھ\": \"rh\",\n \"کھ\": \"kh\",\n \"گھ\": \"gh\",\n \"لھ\": \"lh\",\n \"مھ\": \"mh\",\n \"نھ\": \"nh\",\n \"رھ\": \"rh\",\n};\n\n// Default per-letter roman values and vowel flags come from the shared letter\n// inventory in chars.ts (URDU_LETTERS), so the rule fallback can never disagree\n// with collation or normalization about what counts as an Urdu letter.\nconst LETTERS: Record<string, string> = {};\nconst VOWEL_LETTERS = new Set<string>();\nfor (const { ch, roman, vowel } of URDU_LETTERS) {\n LETTERS[ch] = roman;\n if (vowel) VOWEL_LETTERS.add(ch);\n}\n\nfunction romanizeWord(word: string): string {\n const dictionary = WORD_DICTIONARY[word];\n if (dictionary) return dictionary;\n\n const chars = [...word];\n const pieces: Array<{ text: string; vowel: boolean }> = [];\n\n for (let i = 0; i < chars.length; i++) {\n const last = i === chars.length - 1;\n const pair = chars[i]! + (chars[i + 1] ?? \"\");\n const digraph = DIGRAPHS[pair];\n if (digraph) {\n pieces.push({ text: digraph, vowel: false });\n i++;\n continue;\n }\n\n const ch = chars[i]!;\n\n if (i === 0 && ch === \"ا\") {\n // Word-initial alef is a vowel carrier: اسلام -> islam, not aislam.\n const next = chars[1];\n if (next === \"و\") {\n pieces.push({ text: \"o\", vowel: true });\n i++;\n continue;\n }\n if (next === \"ی\") {\n pieces.push({ text: \"i\", vowel: true });\n i++;\n continue;\n }\n pieces.push({ text: \"a\", vowel: true });\n continue;\n }\n\n // Word-initially و and ی are consonants, not the vowels they spell elsewhere:\n // والا -> wala, یار -> yaar.\n if (i === 0 && ch === \"و\") {\n pieces.push({ text: \"w\", vowel: false });\n continue;\n }\n if (i === 0 && ch === \"ی\") {\n pieces.push({ text: \"y\", vowel: false });\n continue;\n }\n\n // Word-final ہ is the -a ending, not an audible h: کمرہ -> kamra, حصہ -> hasa.\n if (last && ch === \"ہ\" && pieces.length > 0) {\n pieces.push({ text: \"a\", vowel: true });\n continue;\n }\n\n // Final یں is the plural/oblique ending: سڑکیں -> sarkein, not sarkin.\n if (ch === \"ی\" && chars[i + 1] === \"ں\" && i + 1 === chars.length - 1) {\n pieces.push({ text: \"ein\", vowel: true });\n i++;\n continue;\n }\n\n // ی is \"i\" at the end of a word (لڑکی -> larki) but \"e\" inside one\n // (کھیل -> khel, تیز -> tez).\n if (ch === \"ی\" && !last) {\n pieces.push({ text: \"e\", vowel: true });\n continue;\n }\n\n pieces.push({ text: LETTERS[ch] ?? ch, vowel: VOWEL_LETTERS.has(ch) });\n }\n\n // Urdu does not write short vowels, so a word starting with two consonants comes\n // out unpronounceable (رہنے -> \"rhne\"). One schwa after the first consonant fixes\n // the common case without cascading guesses through the rest of the word.\n if (pieces.length > 2 && !pieces[0]!.vowel && !pieces[1]!.vowel) {\n pieces.splice(1, 0, { text: \"a\", vowel: true });\n }\n\n const out = pieces.map((p) => p.text).join(\"\");\n return out;\n}\n\n/**\n * Urdu script -> Roman Urdu.\n *\n * @experimental Rule + dictionary based; see the module note on accuracy.\n * @example\n * romanize(\"آپ کیسے ہیں\") // \"aap kaisay hain\"\n */\nexport function romanize(input: string, options: { capitalize?: boolean } = {}): string {\n if (!input) return \"\";\n const clean = removeDiacritics(normalizeUrdu(input));\n const roman = clean\n .split(/(\\s+)/u)\n .map((chunk) => (/^\\s+$/u.test(chunk) ? chunk : romanizeWord(chunk)))\n .join(\"\");\n if (!options.capitalize) return roman;\n return roman.charAt(0).toUpperCase() + roman.slice(1);\n}\n\n/** Roman spellings seen in the wild, mapped to their Urdu word. */\nconst ROMAN_DICTIONARY: Record<string, string> = {};\nfor (const [urduWord, roman] of Object.entries(WORD_DICTIONARY)) {\n ROMAN_DICTIONARY[roman] = urduWord;\n}\nObject.assign(ROMAN_DICTIONARY, ROMAN_VARIANTS);\n\nconst ROMAN_RULES: Array<[RegExp, string]> = [\n [/^kh/u, \"کھ\"],\n [/^gh/u, \"گھ\"],\n [/^chh/u, \"چھ\"],\n [/^ch/u, \"چ\"],\n [/^sh/u, \"ش\"],\n [/^th/u, \"تھ\"],\n [/^ph/u, \"پھ\"],\n [/^bh/u, \"بھ\"],\n [/^aa/u, \"آ\"],\n [/^oo/u, \"و\"],\n [/^ee/u, \"ی\"],\n [/^ai/u, \"ی\"],\n [/^b/u, \"ب\"],\n [/^p/u, \"پ\"],\n [/^t/u, \"ت\"],\n [/^j/u, \"ج\"],\n [/^d/u, \"د\"],\n [/^r/u, \"ر\"],\n [/^z/u, \"ز\"],\n [/^s/u, \"س\"],\n [/^f/u, \"ف\"],\n [/^q/u, \"ق\"],\n [/^k/u, \"ک\"],\n [/^g/u, \"گ\"],\n [/^l/u, \"ل\"],\n [/^m/u, \"م\"],\n [/^n/u, \"ن\"],\n [/^v|^w/u, \"و\"],\n [/^h/u, \"ہ\"],\n [/^y/u, \"ی\"],\n [/^a/u, \"ا\"],\n [/^e/u, \"ی\"],\n [/^i/u, \"ی\"],\n [/^o/u, \"و\"],\n [/^u/u, \"و\"],\n];\n\nfunction romanWordToUrdu(word: string): string {\n const lower = word.toLowerCase();\n const dictionary = ROMAN_DICTIONARY[lower];\n if (dictionary) return dictionary;\n\n let rest = lower;\n let out = \"\";\n let position = 0;\n while (rest.length > 0) {\n let matched = false;\n for (const [pattern, replacement] of ROMAN_RULES) {\n const hit = pattern.exec(rest);\n if (!hit) continue;\n // Short vowels are not written inside a word — only word-initially.\n const isShortVowel = /^[aeiou]$/u.test(hit[0]!);\n const skip = isShortVowel && position > 0 && rest.length > 1;\n if (!skip) out += replacement;\n rest = rest.slice(hit[0]!.length);\n position++;\n matched = true;\n break;\n }\n if (!matched) {\n out += rest[0]!;\n rest = rest.slice(1);\n position++;\n }\n }\n return out;\n}\n\n/**\n * Roman Urdu -> Urdu script.\n *\n * @experimental Substantially less accurate than {@link romanize}: Roman Urdu has\n * no standard spelling, so anything outside the dictionary is a guess.\n * @example\n * romanToUrdu(\"mera naam zaid hai\") // \"میرا نام زید ہے\"\n */\nexport function romanToUrdu(input: string): string {\n if (!input) return \"\";\n return input\n .split(/(\\s+)/u)\n .map((chunk) => (/^\\s+$/u.test(chunk) ? chunk : romanWordToUrdu(chunk)))\n .join(\"\");\n}\n\nexport interface SlugOptions {\n /** Word separator. Default `\"-\"`. */\n separator?: string;\n /** Cap the slug length, cutting at a word boundary. */\n maxLength?: number;\n /**\n * Keep Urdu characters instead of transliterating. Produces a percent-encoded\n * but human-readable URL, and avoids the accuracy problem entirely. Default `false`.\n */\n preserveUrdu?: boolean;\n}\n\n/**\n * URL slug from an Urdu title.\n *\n * @experimental in transliterating mode, for the reasons in the module note.\n * Pass `preserveUrdu: true` for a lossless slug.\n *\n * @example\n * urduSlug(\"میرا پہلا مضمون\") // \"mera-pehla-mazmoon\"\n * urduSlug(\"میرا پہلا مضمون\", { preserveUrdu: true }) // \"میرا-پہلا-مضمون\"\n */\nexport function urduSlug(input: string, options: SlugOptions = {}): string {\n const { separator = \"-\", maxLength, preserveUrdu = false } = options;\n if (!input) return \"\";\n\n const words = splitWords(removeDiacritics(normalizeUrdu(input)));\n const parts = preserveUrdu ? words : words.map(romanizeWord);\n\n // Built by joining cleaned tokens rather than by regex, so a caller-supplied\n // separator never has to be escaped into a pattern.\n const allowed = preserveUrdu ? /[^\\p{L}\\p{N}]+/gu : /[^a-z0-9]+/gu;\n let slug = parts\n .map((part) => part.toLowerCase().replace(allowed, \" \").trim())\n .flatMap((part) => part.split(/\\s+/u))\n .filter((part) => part.length > 0)\n .join(separator);\n\n if (maxLength && slug.length > maxLength) {\n slug = slug.slice(0, maxLength);\n const lastSeparator = slug.lastIndexOf(separator);\n if (lastSeparator > 0) slug = slug.slice(0, lastSeparator);\n }\n return slug;\n}\n","import { toUrduDigits } from \"./numbers.js\";\n\n/**\n * Gregorian month names in Urdu (standard literary transliterations).\n * Index 0 corresponds to January (جنوری).\n */\nexport const URDU_MONTHS_GREGORIAN = [\n \"جنوری\",\n \"فروری\",\n \"مارچ\",\n \"اپریل\",\n \"مئی\",\n \"جون\",\n \"جولائی\",\n \"اگست\",\n \"ستمبر\",\n \"اکتوبر\",\n \"نومبر\",\n \"دسمبر\",\n] as const;\n\n/**\n * Islamic (Hijri) month names in Urdu.\n * Index 0 corresponds to Muharram (محرم).\n */\nexport const URDU_MONTHS_HIJRI = [\n \"محرم\",\n \"صفر\",\n \"ربیع الاول\",\n \"ربیع الثانی\",\n \"جمادی الاول\",\n \"جمادی الثانی\",\n \"رجب\",\n \"شعبان\",\n \"رمضان المبارک\",\n \"شوال\",\n \"ذی القعدہ\",\n \"ذی الحجہ\",\n] as const;\n\n/**\n * Days of the week in Urdu.\n * Index 0 corresponds to Sunday (اتوار).\n */\nexport const URDU_WEEKDAYS = [\n \"اتوار\",\n \"پیر\",\n \"منگل\",\n \"بدھ\",\n \"جمعرات\",\n \"جمعہ\",\n \"ہفتہ\",\n] as const;\n\nexport interface FormatUrduDateOptions {\n /**\n * Digit style to use for numeric tokens (e.g. YYYY, MM, DD, HH, mm, ss).\n * @default \"urdu\"\n */\n digits?: \"urdu\" | \"english\";\n /**\n * Calendar month naming scheme to use for `MMMM` and `MMM`.\n * @default \"gregorian\"\n */\n calendar?: \"gregorian\" | \"hijri\";\n}\n\nexport interface TimeAgoOptions {\n /**\n * Digit style to use for counts (e.g. \"۵ منٹ پہلے\" vs \"5 منٹ پہلے\").\n * @default \"urdu\"\n */\n digits?: \"urdu\" | \"english\";\n /**\n * Whether to include the relative suffix/prefix (\"پہلے\" or \"بعد\").\n * When `false`, returns only the duration string (e.g. \"۵ منٹ\", \"ایک گھنٹہ\").\n * @default true\n */\n addSuffix?: boolean;\n}\n\nfunction parseDateInput(input: Date | string | number): Date | null {\n if (input instanceof Date) {\n return isNaN(input.getTime()) ? null : input;\n }\n const date = new Date(input);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Returns the Urdu name for a given month index (0 to 11).\n *\n * @param monthIndex - 0 for January / Muharram, 11 for December / Dhul Hijjah.\n * @param calendar - \"gregorian\" or \"hijri\". Default is \"gregorian\".\n */\nexport function getUrduMonthName(\n monthIndex: number,\n calendar: \"gregorian\" | \"hijri\" = \"gregorian\"\n): string {\n const normalizedIndex = Math.floor(monthIndex) % 12;\n const idx = normalizedIndex < 0 ? normalizedIndex + 12 : normalizedIndex;\n return calendar === \"hijri\" ? URDU_MONTHS_HIJRI[idx]! : URDU_MONTHS_GREGORIAN[idx]!;\n}\n\n/**\n * Returns the Urdu name for a day of the week (0 = Sunday, 6 = Saturday).\n */\nexport function getUrduWeekdayName(dayIndex: number): string {\n const normalizedIndex = Math.floor(dayIndex) % 7;\n const idx = normalizedIndex < 0 ? normalizedIndex + 7 : normalizedIndex;\n return URDU_WEEKDAYS[idx]!;\n}\n\n/**\n * Formats a Date object or timestamp into an Urdu formatted date string.\n *\n * Supported formatting tokens:\n * - `YYYY`: Full year (e.g. \"۲۰۲۶\")\n * - `YY`: Two-digit year (e.g. \"۲۶\")\n * - `MMMM`: Full Urdu month name (e.g. \"اگست\")\n * - `MMM`: Full Urdu month name (e.g. \"اگست\")\n * - `MM`: 2-digit month with leading zero (e.g. \"۰۸\")\n * - `M`: 1-digit month (e.g. \"۸\")\n * - `DD`: 2-digit day of month with leading zero (e.g. \"۰۵\")\n * - `D`: 1-digit day of month (e.g. \"۵\")\n * - `dddd`: Full day of the week (e.g. \"ہفتہ\", \"جمعہ\")\n * - `ddd`: Short day of the week (same in Urdu)\n * - `HH`: 24-hour hour with leading zero (00-23)\n * - `H`: 24-hour hour (0-23)\n * - `hh`: 12-hour hour with leading zero (01-12)\n * - `h`: 12-hour hour (1-12)\n * - `mm`: Minute with leading zero (00-59)\n * - `m`: Minute (0-59)\n * - `ss`: Second with leading zero (00-59)\n * - `s`: Second (0-59)\n * - `A`: Day period indicator in Urdu (\"صبح\", \"دوپہر\", \"شام\", \"رات\")\n * - `a`: Concise period indicator (\"صبح\", \"شام\")\n *\n * @example\n * formatUrduDate(new Date(2026, 7, 22), \"DD MMMM YYYY\")\n * // \"۲۲ اگست ۲۰۲۶\"\n *\n * formatUrduDate(new Date(2026, 7, 22, 14, 30), \"dddd، D MMMM YYYY، hh:mm A\")\n * // \"ہفتہ، ۲۲ اگست ۲۰۲۶، ۰۲:۳۰ دوپہر\"\n */\nexport function formatUrduDate(\n date: Date | string | number,\n pattern: string = \"DD MMMM YYYY\",\n options: FormatUrduDateOptions = {}\n): string {\n const d = parseDateInput(date);\n if (!d) return \"\";\n\n const digits = options.digits ?? \"urdu\";\n const calendar = options.calendar ?? \"gregorian\";\n\n const year = d.getFullYear();\n const month = d.getMonth();\n const dayOfMonth = d.getDate();\n const dayOfWeek = d.getDay();\n const hours24 = d.getHours();\n const hours12 = hours24 % 12 || 12;\n const minutes = d.getMinutes();\n const seconds = d.getSeconds();\n\n const pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\n\n // Day period calculation\n let periodDetailed: string;\n let periodSimple: string;\n if (hours24 >= 4 && hours24 < 12) {\n periodDetailed = \"صبح\";\n periodSimple = \"صبح\";\n } else if (hours24 >= 12 && hours24 < 16) {\n periodDetailed = \"دوپہر\";\n periodSimple = \"شام\";\n } else if (hours24 >= 16 && hours24 < 20) {\n periodDetailed = \"شام\";\n periodSimple = \"شام\";\n } else {\n periodDetailed = \"رات\";\n periodSimple = \"رات\";\n }\n\n const tokenValues: Record<string, string> = {\n YYYY: `${year}`,\n YY: `${year}`.slice(-2),\n MMMM: getUrduMonthName(month, calendar),\n MMM: getUrduMonthName(month, calendar),\n MM: pad(month + 1),\n M: `${month + 1}`,\n DD: pad(dayOfMonth),\n D: `${dayOfMonth}`,\n dddd: getUrduWeekdayName(dayOfWeek),\n ddd: getUrduWeekdayName(dayOfWeek),\n HH: pad(hours24),\n H: `${hours24}`,\n hh: pad(hours12),\n h: `${hours12}`,\n mm: pad(minutes),\n m: `${minutes}`,\n ss: pad(seconds),\n s: `${seconds}`,\n A: periodDetailed,\n a: periodSimple,\n };\n\n // Replace tokens by matching largest token keys first\n const regex = /YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|A|a/g;\n\n const result = pattern.replace(regex, (match) => {\n const val = tokenValues[match];\n if (val === undefined) return match;\n if (digits === \"urdu\" && /^\\d+$/.test(val)) {\n return toUrduDigits(val);\n }\n return val;\n });\n\n return result;\n}\n\n/**\n * Returns a human-friendly relative time string in Urdu.\n *\n * @example\n * timeAgoUrdu(Date.now() - 30 * 1000) // \"ابھی\"\n * timeAgoUrdu(Date.now() - 5 * 60 * 1000) // \"۵ منٹ پہلے\"\n * timeAgoUrdu(Date.now() - 3 * 3600 * 1000) // \"۳ گھنٹے پہلے\"\n * timeAgoUrdu(Date.now() - 86400 * 1000) // \"کل\"\n * timeAgoUrdu(Date.now() + 5 * 60 * 1000) // \"۵ منٹ بعد\"\n */\nexport function timeAgoUrdu(\n date: Date | string | number,\n relativeTo: Date | string | number = new Date(),\n options: TimeAgoOptions = {}\n): string {\n const d = parseDateInput(date);\n const now = parseDateInput(relativeTo);\n if (!d || !now) return \"\";\n\n const digits = options.digits ?? \"urdu\";\n const addSuffix = options.addSuffix ?? true;\n\n const formatNum = (num: number): string => {\n const s = `${num}`;\n return digits === \"urdu\" ? toUrduDigits(s) : s;\n };\n\n const diffMs = now.getTime() - d.getTime();\n const isPast = diffMs >= 0;\n const absDiffSeconds = Math.round(Math.abs(diffMs) / 1000);\n\n // Less than 45 seconds\n if (absDiffSeconds < 45) {\n return isPast ? \"ابھی\" : \"چند لمحے بعد\";\n }\n\n // Minutes (45s to 45m)\n const minutes = Math.round(absDiffSeconds / 60);\n if (minutes <= 45) {\n if (minutes === 1) {\n if (!addSuffix) return \"ایک منٹ\";\n return isPast ? \"ایک منٹ پہلے\" : \"ایک منٹ بعد\";\n }\n const count = formatNum(minutes);\n if (!addSuffix) return `${count} منٹ`;\n return isPast ? `${count} منٹ پہلے` : `${count} منٹ بعد`;\n }\n\n // Hours (45m to 22 hours)\n const hours = Math.round(minutes / 60);\n if (hours <= 22) {\n if (hours === 1) {\n if (!addSuffix) return \"ایک گھنٹہ\";\n return isPast ? \"ایک گھنٹہ پہلے\" : \"ایک گھنٹہ بعد\";\n }\n const count = formatNum(hours);\n if (!addSuffix) return `${count} گھنٹے`;\n return isPast ? `${count} گھنٹے پہلے` : `${count} گھنٹے بعد`;\n }\n\n // Days (22 hours to 6 days)\n const days = Math.round(hours / 24);\n if (days === 1) {\n return isPast ? \"کل\" : \"کل\";\n }\n if (days === 2) {\n return isPast ? \"پرسوں\" : \"پرسوں\";\n }\n if (days <= 6) {\n const count = formatNum(days);\n if (!addSuffix) return `${count} دن`;\n return isPast ? `${count} دن پہلے` : `${count} دن بعد`;\n }\n\n // Weeks (7 days to 28 days)\n const weeks = Math.round(days / 7);\n if (days <= 28) {\n if (weeks === 1) {\n if (!addSuffix) return \"ایک ہفتہ\";\n return isPast ? \"ایک ہفتہ پہلے\" : \"ایک ہفتہ بعد\";\n }\n const count = formatNum(weeks);\n if (!addSuffix) return `${count} ہفتے`;\n return isPast ? `${count} ہفتے پہلے` : `${count} ہفتے بعد`;\n }\n\n // Months (29 days to 320 days)\n const months = Math.round(days / 30.44);\n if (days <= 320) {\n if (months <= 1) {\n if (!addSuffix) return \"ایک ماہ\";\n return isPast ? \"ایک ماہ پہلے\" : \"ایک ماہ بعد\";\n }\n const count = formatNum(months);\n if (!addSuffix) return `${count} ماہ`;\n return isPast ? `${count} ماہ پہلے` : `${count} ماہ بعد`;\n }\n\n // Years (> 320 days)\n const years = Math.round(days / 365.25);\n if (years <= 1) {\n if (!addSuffix) return \"ایک سال\";\n return isPast ? \"ایک سال پہلے\" : \"ایک سال بعد\";\n }\n const count = formatNum(years);\n if (!addSuffix) return `${count} سال`;\n return isPast ? `${count} سال پہلے` : `${count} سال بعد`;\n}\n","import { normalizeUrdu, removeDiacritics } from \"./normalize.js\";\n\n/**\n * Canonical Urdu prefixes (سابقے) ordered by descending length.\n */\nexport const URDU_PREFIXES = [\n \"غیر\",\n \"خود\",\n \"اہل\",\n \"بے\",\n \"نا\",\n \"لا\",\n \"بد\",\n \"کم\",\n \"ان\",\n \"ہم\",\n \"با\",\n \"پُر\",\n] as const;\n\n/**\n * Canonical Urdu suffixes (لاحقے) ordered by descending length.\n */\nexport const URDU_SUFFIXES = [\n // Compound / multi-syllable suffixes\n \"یںگے\",\n \"ینگے\",\n \"ےگا\",\n \"ےگی\",\n \"ینگی\",\n \"داری\",\n \"گاری\",\n \"کاری\",\n \"سازی\",\n \"بازی\",\n \"مندی\",\n \"ترین\",\n \"ستان\",\n \"خانہ\",\n \"نامہ\",\n \"جات\",\n \"گان\",\n // Adjectival / nominal / agentive suffixes\n \"دار\",\n \"گار\",\n \"کار\",\n \"ساز\",\n \"باز\",\n \"مند\",\n \"ناک\",\n \"وار\",\n \"دان\",\n \"زار\",\n \"یت\",\n \"پن\",\n \"ائی\",\n \"تر\",\n // Plural & verbal inflections\n \"یاں\",\n \"ئیں\",\n \"ؤں\",\n \"یوں\",\n \"وں\",\n \"یں\",\n \"ات\",\n \"ہا\",\n \"ین\",\n \"تیں\",\n \"تا\",\n \"تی\",\n \"تے\",\n \"نا\",\n] as const;\n\n/**\n * Irreducible base words that must not have prefixes or suffixes stripped falsely.\n * Exported so the PHP port can consume the identical list via tables.json.\n */\nexport const PROTECTED_WORDS = new Set<string>([\n \"ہم\",\n \"نا\",\n \"لا\",\n \"بے\",\n \"یا\",\n \"تو\",\n \"پر\",\n \"سے\",\n \"کو\",\n \"کا\",\n \"کی\",\n \"کے\",\n \"میں\",\n \"نے\",\n \"ہے\",\n \"ہیں\",\n \"ہو\",\n \"تھا\",\n \"تھی\",\n \"تھے\",\n \"تھیں\",\n \"باغ\",\n \"نام\",\n \"سفر\",\n \"ہوا\",\n \"دل\",\n \"سر\",\n \"لب\",\n \"دست\",\n \"کار\",\n \"بار\",\n \"بال\",\n \"بان\",\n \"شام\",\n \"کام\",\n \"دام\",\n \"جام\",\n \"عام\",\n \"رام\",\n \"گام\",\n \"تار\",\n \"یار\",\n \"مار\",\n \"نار\",\n \"دار\",\n \"ہار\",\n \"زار\",\n \"غار\",\n \"رات\",\n \"بات\",\n \"مات\",\n \"ذات\",\n \"ہاتھ\",\n \"ساتھ\",\n \"دین\",\n \"تین\",\n \"چین\",\n \"بین\",\n \"زمین\",\n \"انسان\",\n \"احسان\",\n \"ایمان\",\n \"اسلام\",\n \"اعلان\",\n \"امکان\",\n \"ارمان\",\n \"افغان\",\n \"ایران\",\n \"عمران\",\n \"عثمان\",\n \"سلمان\",\n \"عرفان\",\n \"قرآن\",\n \"طوفان\",\n \"پہچان\",\n \"دکان\",\n \"مکان\",\n \"اسمان\",\n \"آسمان\",\n \"مہمان\",\n \"نقصان\",\n]);\n\nexport interface StemmerOptions {\n /**\n * Whether to strip canonical Urdu prefixes (e.g. بے-, نا-, غیر-, لا-).\n * @default true\n */\n stripPrefixes?: boolean;\n\n /**\n * Whether to strip canonical Urdu suffixes (e.g. -وں, -یں, -یاں, -دار, -تے).\n * @default true\n */\n stripSuffixes?: boolean;\n\n /**\n * Minimum character length of the remaining root word.\n * Prevents over-stemming of short roots.\n * @default 2\n */\n minStemLength?: number;\n\n /**\n * Custom list of prefixes to strip in addition to or in place of defaults.\n */\n customPrefixes?: string[];\n\n /**\n * Custom list of suffixes to strip in addition to or in place of defaults.\n */\n customSuffixes?: string[];\n\n /**\n * Map of exact exception words to their canonical stems.\n */\n exceptions?: Record<string, string>;\n}\n\nexport interface AffixBreakdown {\n /** The stripped prefix, if any */\n prefix?: string;\n /** The stemmed base root */\n stem: string;\n /** The stripped suffix, if any */\n suffix?: string;\n}\n\n/**\n * Strips a suffix from an Urdu word while applying morphological restoration rules:\n * - `لڑکیاں` -> `لڑکی` (restoring final `ی` after `-یاں`)\n * - `لڑکیوں` -> `لڑکی` (restoring final `ی` after `-یوں`)\n * - `دعائیں` -> `دعا` (restoring base before `-ئیں`)\n * - `دعاؤں` -> `دعا` (restoring base before `-ؤں`)\n * - `خوشبوئیں` -> `خوشبو` (restoring `و` before `-ئیں`)\n * - `خوشبوؤں` -> `خوشبو` (restoring `و` before `-ؤں`)\n */\nfunction applySuffixStripping(\n word: string,\n suffixes: readonly string[],\n minLen: number\n): { stem: string; suffix?: string } {\n if (word.length <= minLen) return { stem: word };\n\n // Special morphological restorations:\n // 1. Plurals ending in -یاں (e.g. لڑکیاں -> لڑکی, کہانیاں -> کہانی, تبدیلیاں -> تبدیلی)\n if (word.endsWith(\"یاں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: `${base}ی`, suffix: \"یاں\" };\n }\n\n // 2. Plurals ending in -یوں (e.g. لڑکیوں -> لڑکی, گاڑیوں -> گاڑی, صدیوں -> صدی)\n if (word.endsWith(\"یوں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: `${base}ی`, suffix: \"یوں\" };\n }\n\n // 3. Plurals ending in -ئیں (3 chars: ئ + ی + ں) -> e.g. دعائیں -> دعا, ہوائیں -> ہوا, خوشبوئیں -> خوشبو\n if (word.endsWith(\"ئیں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: base, suffix: \"ئیں\" };\n }\n\n // 4. Plurals ending in -ؤں (2 chars: ؤ + ں) -> e.g. دعاؤں -> دعا, ہواؤں -> ہوا, خوشبوؤں -> خوشبو\n if (word.endsWith(\"ؤں\") && word.length - 2 >= minLen) {\n const base = word.slice(0, -2);\n return { stem: base, suffix: \"ؤں\" };\n }\n\n for (const suf of suffixes) {\n if (word.endsWith(suf)) {\n const remainder = word.slice(0, -suf.length).replace(/[\\s\\u200C\\u200D]+$/, \"\");\n if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {\n return { stem: remainder, suffix: suf };\n }\n }\n }\n\n return { stem: word };\n}\n\n/**\n * Strips a prefix from an Urdu word with protected length and root checks.\n */\nfunction applyPrefixStripping(\n word: string,\n prefixes: readonly string[],\n minLen: number\n): { stem: string; prefix?: string } {\n if (word.length <= minLen) return { stem: word };\n\n for (const pref of prefixes) {\n if (word.startsWith(pref)) {\n const remainder = word.slice(pref.length).replace(/^[\\s\\u200C\\u200D]+/, \"\");\n if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {\n return { stem: remainder, prefix: pref };\n }\n }\n }\n\n return { stem: word };\n}\n\n/**\n * Analyzes an Urdu word and extracts its prefix, stem, and suffix.\n *\n * @example\n * getAffixes(\"بےوقوف\")\n * // { prefix: \"بے\", stem: \"وقوف\" }\n *\n * getAffixes(\"کتابیں\")\n * // { stem: \"کتاب\", suffix: \"یں\" }\n *\n * getAffixes(\"غیرملکیوں\")\n * // { prefix: \"غیر\", stem: \"ملکی\", suffix: \"یوں\" }\n *\n * getAffixes(\"نااہلی\")\n * // { prefix: \"نا\", stem: \"اہلی\" }\n */\nexport function getAffixes(\n input: string,\n options: StemmerOptions = {}\n): AffixBreakdown {\n if (!input || typeof input !== \"string\") {\n return { stem: \"\" };\n }\n\n const clean = removeDiacritics(normalizeUrdu(input.trim()));\n if (!clean) return { stem: \"\" };\n\n if (options.exceptions && options.exceptions[clean]) {\n return { stem: options.exceptions[clean]! };\n }\n\n if (PROTECTED_WORDS.has(clean)) {\n return { stem: clean };\n }\n\n const minLen = options.minStemLength ?? 2;\n const doSuffixes = options.stripSuffixes ?? true;\n const doPrefixes = options.stripPrefixes ?? true;\n\n const suffixes = options.customSuffixes ?? URDU_SUFFIXES;\n const prefixes = options.customPrefixes ?? URDU_PREFIXES;\n\n let current = clean;\n let detectedSuffix: string | undefined;\n let detectedPrefix: string | undefined;\n\n // 1. Suffix stripping\n if (doSuffixes) {\n const sRes = applySuffixStripping(current, suffixes, minLen);\n current = sRes.stem;\n detectedSuffix = sRes.suffix;\n }\n\n // 2. Prefix stripping\n if (doPrefixes) {\n const pRes = applyPrefixStripping(current, prefixes, minLen);\n current = pRes.stem;\n detectedPrefix = pRes.prefix;\n }\n\n return {\n prefix: detectedPrefix,\n stem: current,\n suffix: detectedSuffix,\n };\n}\n\n/**\n * Reduces an Urdu word to its morphological root/stem by stripping common prefixes,\n * plurals, tense inflections, and adjectival/nominal suffixes.\n *\n * @example\n * stemUrdu(\"کتابیں\") // \"کتاب\"\n * stemUrdu(\"لڑکیاں\") // \"لڑکی\"\n * stemUrdu(\"دعاؤں\") // \"دعا\"\n * stemUrdu(\"بےوقوف\") // \"وقوف\"\n * stemUrdu(\"نااہل\") // \"اہل\"\n * stemUrdu(\"خوبصورت ترین\") // \"خوبصورت\"\n */\nexport function stemUrdu(word: string, options: StemmerOptions = {}): string {\n return getAffixes(word, options).stem;\n}\n\n/**\n * Stems all words within a block of Urdu text while preserving punctuation,\n * whitespaces, and document formatting.\n *\n * Ideal for search engine indexing, TF-IDF scoring, and AI/LLM embeddings preprocessing.\n *\n * @example\n * stemUrduText(\"طلباء کتابیں پڑھتے ہیں اور کہانیاں سنتے ہیں۔\")\n * // \"طلباء کتاب پڑھ ہیں اور کہانی سن ہیں۔\"\n */\nexport function stemUrduText(text: string, options: StemmerOptions = {}): string {\n if (!text || typeof text !== \"string\") return \"\";\n\n // Split on word boundaries while keeping delimiters intact\n const tokens = text.split(/([\\s\\p{P}\\p{S}]+)/u);\n\n return tokens\n .map((token) => {\n // If token contains Urdu letters, stem it; otherwise leave as is\n if (/[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70-\\uFEFF]/.test(token)) {\n return stemUrdu(token, options);\n }\n return token;\n })\n .join(\"\");\n}\n","/**\n * Urdu name transliteration for Pakistani names.\n *\n * Handles common first names, family names, honorifics, and name prefixes.\n * Designed for forms, shipping labels, databases, and any context where\n * Urdu names need to appear in English (and vice versa).\n *\n * Uses a dictionary of ~300 common Pakistani names for accuracy, with\n * rule-based fallback for unknown names.\n */\nimport { removeDiacritics, normalizeUrdu } from \"./normalize.js\";\n\n// ============================================================================\n// NAME DICTIONARIES\n// ============================================================================\n\n/** Common Urdu first names mapped to their standard English spellings. */\nexport const URDU_FIRST_NAMES: Record<string, string> = {\n // Male names\n \"محمد\": \"Muhammad\",\n \"احمد\": \"Ahmed\",\n \"علی\": \"Ali\",\n \"عمر\": \"Umar\",\n \"عثمان\": \"Usman\",\n \"ابوبکر\": \"Abubakar\",\n \"یوسف\": \"Yusuf\",\n \"یعقوب\": \"Yaquob\",\n \"اسماعیل\": \"Ismail\",\n \"ابراہیم\": \"Ibrahim\",\n \"اسحاق\": \"Ishaq\",\n \"حسین\": \"Hussain\",\n \"حسن\": \"Hasan\",\n \"زید\": \"Zaid\",\n \"حمزہ\": \"Hamza\",\n \"سلمان\": \"Salman\",\n \"فرحان\": \"Farhan\",\n \"ادنان\": \"Adnan\",\n \"بلال\": \"Bilal\",\n \"طارق\": \"Tariq\",\n \"جاوید\": \"Javed\",\n \"عرفان\": \"Irfan\",\n \"کاشف\": \"Kashif\",\n \"ندیم\": \"Nadeem\",\n \"یاسر\": \"Yasir\",\n \"رضوان\": \"Rizwan\",\n \"فیصل\": \"Faisal\",\n \"خالد\": \"Khalid\",\n \"راشد\": \"Rashid\",\n \"شاہد\": \"Shahid\",\n \"سعید\": \"Saeed\",\n \"نعیم\": \"Naeem\",\n \"وسیم\": \"Waseem\",\n \"رفیق\": \"Rafiq\",\n \"جمیل\": \"Jamil\",\n \"زبیر\": \"Zubair\",\n \"طاہر\": \"Tahir\",\n \"عارف\": \"Arif\",\n \"نعمان\": \"Noman\",\n \"ثاقب\": \"Saqib\",\n \"عدیل\": \"Adeel\",\n \"عمران\": \"Imran\",\n \"فواد\": \"Fawad\",\n \"آصف\": \"Asif\",\n \"شعیب\": \"Shoaib\",\n \"زاہد\": \"Zahid\",\n \"عامر\": \"Amer\",\n \"مجید\": \"Majid\",\n \"سرفراز\": \"Sarfraz\",\n \"حمید\": \"Hamid\",\n \"نظیر\": \"Nazir\",\n \"قیصر\": \"Qaiser\",\n \"لطیف\": \"Latif\",\n \"تنویر\": \"Tanveer\",\n \"سلیمان\": \"Suleman\",\n \"افتخار\": \"Iftikhar\",\n \"شبیر\": \"Shabbir\",\n \"ساجد\": \"Sajid\",\n \"منصور\": \"Mansoor\",\n \"سلطان\": \"Sultan\",\n \"نصیر\": \"Nasir\",\n \"حبیب\": \"Habib\",\n \"مقصود\": \"Maqsood\",\n \"مسعود\": \"Masood\",\n \"سہیل\": \"Sohail\",\n \"اشرف\": \"Ashraf\",\n \"مبارک\": \"Mubarak\",\n \"فہد\": \"Fahad\",\n \"اظہر\": \"Azhar\",\n \"وکیل\": \"Wakeel\",\n \"رؤف\": \"Rauf\",\n \"دانیال\": \"Daniyal\",\n \"ذیشان\": \"Zeeshan\",\n \"مصطفی\": \"Mustafa\",\n\n // Female names\n \"فاطمہ\": \"Fatima\",\n \"عائشہ\": \"Ayesha\",\n \"خدیجہ\": \"Khadija\",\n \"حسنا\": \"Husna\",\n \"زینب\": \"Zainab\",\n \"آمنہ\": \"Amina\",\n \"سارا\": \"Sara\",\n \"ادیہ\": \"Adia\",\n \"نور\": \"Noor\",\n \"حرا\": \"Hira\",\n \"اقصی\": \"Aqsa\",\n \"ماہم\": \"Maham\",\n \"ایمان\": \"Iman\",\n \"لائبہ\": \"Laiba\",\n \"ہانیہ\": \"Hania\",\n \"رمشہ\": \"Rimsha\",\n \"میمونہ\": \"Memoona\",\n \"ثنا\": \"Sana\",\n \"حنا\": \"Hina\",\n \"اقرا\": \"Iqra\",\n \"فیزا\": \"Fiza\",\n \"فضہ\": \"Fizza\",\n \"سدرہ\": \"Sidra\",\n \"ردا\": \"Rida\",\n \"ندا\": \"Nida\",\n \"مومینہ\": \"Momina\",\n \"ثوبیہ\": \"Sobia\",\n \"نائلہ\": \"Naila\",\n \"بشری\": \"Bushra\",\n \"رخسانہ\": \"Rukhsana\",\n \"شازیہ\": \"Shazia\",\n \"ناہید\": \"Naheed\",\n \"پروین\": \"Parveen\",\n \"فرزانہ\": \"Farzana\",\n \"نازیہ\": \"Nazia\",\n \"صبیحہ\": \"Sabiha\",\n \"رباب\": \"Rubab\",\n \"صائمہ\": \"Saima\",\n \"مہرین\": \"Mehreen\",\n \"عنبرین\": \"Ambreen\",\n \"کائنات\": \"Kainat\",\n \"طاہرہ\": \"Tahira\",\n \"سمیعہ\": \"Samia\",\n \"سامیہ\": \"Samiya\",\n \"سلمی\": \"Salma\",\n \"روزینہ\": \"Rozina\",\n \"مریم\": \"Maryam\",\n \"رابعہ\": \"Rabia\",\n \"تسلیم\": \"Tasleem\",\n \"اسماء\": \"Asma\",\n \"ارم\": \"Iram\",\n \"ناز\": \"Naaz\",\n \"فرح\": \"Farah\",\n \"نادیہ\": \"Nadia\",\n \"سیما\": \"Seema\",\n \"ہما\": \"Huma\",\n \"نزہت\": \"Nuzhat\",\n \"عظمی\": \"Uzma\",\n \"کرن\": \"Kiran\",\n \"سمیرا\": \"Sumaira\",\n \"فرخندہ\": \"Farkhanda\",\n \"تسنیم\": \"Tasneem\",\n \"زبیدہ\": \"Zubaida\",\n \"جویریہ\": \"Javeria\",\n \"مہوش\": \"Mehwish\",\n \"عالیہ\": \"Alia\",\n};\n\n/** Common Urdu family/last names mapped to their standard English spellings. */\nexport const URDU_FAMILY_NAMES: Record<string, string> = {\n \"خان\": \"Khan\",\n \"شاہ\": \"Shah\",\n \"چوہدری\": \"Chaudhry\",\n \"ملک\": \"Malik\",\n \"شیخ\": \"Sheikh\",\n \"قریشی\": \"Qureshi\",\n \"سید\": \"Syed\",\n \"نیازی\": \"Niazi\",\n \"جدون\": \"Jadoon\",\n \"سواتی\": \"Swati\",\n \"کھٹک\": \"Khattak\",\n \"یوسفزئی\": \"Yusufzai\",\n \"کھوسہ\": \"Khosa\",\n \"تالپور\": \"Talpur\",\n \"جونیجو\": \"Junejo\",\n \"بھٹی\": \"Bhatti\",\n \"راجپوت\": \"Rajput\",\n \"سومرو\": \"Soomro\",\n \"دہار\": \"Dahar\",\n \"گیلانی\": \"Gillani\",\n \"ٹواناس\": \"Tiwanas\",\n \"ٹوانہ\": \"Tiwana\",\n \"دولتانی\": \"Doltani\",\n \"دالتانی\": \"Daltani\",\n \"گورچانی\": \"Gurchani\",\n \"رند\": \"Rind\",\n \"بگٹی\": \"Bugti\",\n \"مری\": \"Marri\",\n \"بزینجو\": \"Bizenjo\",\n \"مینگل\": \"Mengal\",\n \"زرداری\": \"Zardari\",\n \"بھٹو\": \"Bhutto\",\n \"شریف\": \"Sharif\",\n};\n\n/** Honorific titles used in Urdu names. */\nexport const HONORIFICS: Record<string, string> = {\n \"جناب\": \"Janab\",\n \"صاحب\": \"Sahib\",\n \"استاد\": \"Ustad\",\n \"حکیم\": \"Hakim\",\n \"ڈاکٹر\": \"Dr.\",\n \"پروفیسر\": \"Prof.\",\n \"انجینئر\": \"Eng.\",\n \"ایڈووکیٹ\": \"Adv.\",\n \"ریٹائرڈ\": \"Retd.\",\n \"شہید\": \"Shaheed\",\n};\n\n/** Name prefixes that are kept in both languages. */\nexport const NAME_PREFIXES: Record<string, string> = {\n \"سید\": \"Syed\",\n \"شیخ\": \"Sheikh\",\n \"چوہدری\": \"Chowdhury\",\n \"ملک\": \"Malik\",\n \"میاں\": \"Mian\",\n \"خان\": \"Khan\",\n \"بیگم\": \"Begum\",\n \"صاحب\": \"Sahib\",\n};\n\n/**\n * English → Urdu lookup derived from the forward name tables above.\n *\n * Built rather than hand-maintained so the two directions can never drift: a\n * canonical English spelling maps back to exactly the Urdu word it came from.\n * Alternate spellings that are not forward-table values are pinned separately.\n */\nconst ENGLISH_TO_URDU = new Map<string, string>();\nfor (const table of [HONORIFICS, URDU_FIRST_NAMES, URDU_FAMILY_NAMES, NAME_PREFIXES]) {\n for (const [urduWord, englishWord] of Object.entries(table)) {\n ENGLISH_TO_URDU.set(englishWord.toLowerCase(), urduWord);\n }\n}\n\n/**\n * Alternate English spellings of names already in the forward tables\n * (e.g. `Omar` for عمر, canonically spelled `Umar` in English).\n * Exported so the PHP port can consume the identical list via tables.json.\n */\nexport const ENGLISH_NAME_ALIASES: Record<string, string> = {\n hassan: \"حسن\", // vs. canonical Hasan\n omar: \"عمر\", // vs. canonical Umar\n omer: \"عمر\", // vs. canonical Umar\n yaqoob: \"یعقوب\", // vs. canonical Yaquob\n jameel: \"جمیل\", // vs. canonical Jamil\n majeed: \"مجید\", // vs. canonical Majid\n amna: \"آمنہ\", // vs. canonical Amina\n gilani: \"گیلانی\", // vs. canonical Gillani\n sahab: \"صاحب\", // vs. canonical Sahib\n doctor: \"ڈاکٹر\", // vs. canonical Dr.\n professor: \"پروفیسر\", // vs. canonical Prof.\n engineer: \"انجینئر\", // vs. canonical Eng.\n advocate: \"ایڈووکیٹ\", // vs. canonical Adv.\n retd: \"ریٹائرڈ\", // vs. canonical Retd.\n};\n\n// ============================================================================\n// NAME TRANSLITERATION RULES\n// ============================================================================\n\n/**\n * Transliterate a single Urdu name to English.\n * Handles names with optional honorifics and prefixes.\n */\nfunction transliterateSingleName(urduName: string): string {\n const normalized = removeDiacritics(normalizeUrdu(urduName));\n const words = normalized.split(/\\s+/).filter((w) => w.length > 0);\n\n const result: string[] = [];\n\n for (const word of words) {\n // Check if it's an honorific\n const honorific = HONORIFICS[word];\n if (honorific) {\n result.push(honorific);\n continue;\n }\n\n // Check if it's a known first name\n const firstName = URDU_FIRST_NAMES[word];\n if (firstName) {\n result.push(firstName);\n continue;\n }\n\n // Check if it's a known family name\n const familyName = URDU_FAMILY_NAMES[word];\n if (familyName) {\n result.push(familyName);\n continue;\n }\n\n // Check if it's a known prefix\n const prefix = NAME_PREFIXES[word];\n if (prefix) {\n result.push(prefix);\n continue;\n }\n\n // Rule-based fallback for unknown names\n result.push(transliterateNameWord(word));\n }\n\n return result.join(\" \");\n}\n\n/**\n * Rule-based transliteration for individual name words.\n */\nfunction transliterateNameWord(word: string): string {\n if (!word) return \"\";\n\n // Common Urdu letter patterns in names\n const consonants: Record<string, string> = {\n \"ب\": \"b\",\n \"پ\": \"p\",\n \"ت\": \"t\",\n \"ٹ\": \"t\",\n \"ج\": \"j\",\n \"چ\": \"ch\",\n \"ح\": \"h\",\n \"خ\": \"kh\",\n \"د\": \"d\",\n \"ڈ\": \"d\",\n \"ر\": \"r\",\n \"ڑ\": \"r\",\n \"ز\": \"z\",\n \"س\": \"s\",\n \"ش\": \"sh\",\n \"ص\": \"s\",\n \"ض\": \"z\",\n \"ط\": \"t\",\n \"ظ\": \"z\",\n \"ع\": \"a\",\n \"غ\": \"gh\",\n \"ف\": \"f\",\n \"ق\": \"q\",\n \"ک\": \"k\",\n \"گ\": \"g\",\n \"ل\": \"l\",\n \"م\": \"m\",\n \"ن\": \"n\",\n \"و\": \"w\",\n \"ہ\": \"h\",\n \"ھ\": \"h\",\n \"ی\": \"y\",\n };\n\n let result = \"\";\n const chars = [...word];\n\n for (let i = 0; i < chars.length; i++) {\n const ch = chars[i]!;\n const next = chars[i + 1];\n\n // Handle digraphs (consonant + ھ)\n if (next === \"ھ\" && consonants[ch]) {\n const base = consonants[ch];\n result += base + \"h\";\n i++; // Skip the ھ\n continue;\n }\n\n // Handle special cases\n if (ch === \"آ\") {\n result += \"Aa\";\n continue;\n }\n if (ch === \"ا\" && i === 0) {\n result += \"A\";\n continue;\n }\n if (ch === \"ا\") {\n result += \"a\";\n continue;\n }\n if (ch === \"ی\" && i === chars.length - 1) {\n result += \"i\";\n continue;\n }\n if (ch === \"ی\" && next === \"ں\") {\n result += \"ain\";\n i++; // Skip the ں\n continue;\n }\n if (ch === \"و\" && i === 0) {\n result += \"W\";\n continue;\n }\n if (ch === \"و\") {\n result += \"o\";\n continue;\n }\n\n // Regular consonant\n if (consonants[ch]) {\n result += consonants[ch];\n continue;\n }\n\n // Unknown character - keep as is\n result += ch;\n }\n\n // Capitalize first letter\n return result.charAt(0).toUpperCase() + result.slice(1);\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\nexport interface NameTransliterationOptions {\n /** Preserve the original case of the English name. Default: true (capitalized). */\n preserveCase?: boolean;\n /** Include honorifics in the output. Default: true. */\n includeHonorifics?: boolean;\n}\n\n/**\n * Transliterate an Urdu name to English.\n *\n * @example\n * transliterateNameToEnglish(\"محمد علی\") // \"Muhammad Ali\"\n * transliterateNameToEnglish(\"جناب خان صاحب\") // \"Janab Khan Sahib\"\n */\nexport function transliterateNameToEnglish(\n urduName: string,\n options: NameTransliterationOptions = {},\n): string {\n if (!urduName) return \"\";\n\n const { preserveCase = true, includeHonorifics = true } = options;\n\n const result = transliterateSingleName(urduName);\n\n if (!includeHonorifics) {\n // Remove honorifics from result\n return result\n .split(/\\s+/)\n .filter((word) => !Object.values(HONORIFICS).includes(word))\n .join(\" \");\n }\n\n return preserveCase ? result : result.toLowerCase();\n}\n\n/**\n * Transliterate an English name to Urdu script.\n *\n * @example\n * transliterateNameToUrdu(\"Muhammad Ali\") // \"محمد علی\"\n * transliterateNameToUrdu(\"Janab Khan Sahib\") // \"جناب خان صاحب\"\n */\nexport function transliterateNameToUrdu(englishName: string): string {\n if (!englishName) return \"\";\n\n const words = englishName.split(/\\s+/).filter((w) => w.length > 0);\n // Every canonical English spelling resolves through the derived dictionary, so\n // a word only falls through when it is an alternate spelling or an unknown name.\n return words.map((word) => reverseTransliterateName(word)).join(\" \");\n}\n\n/**\n * Reverse name lookup: the derived English → Urdu dictionary first, then the\n * pinned alternate spellings, then the word unchanged. Reverse transliteration\n * is deliberately not rule-based — Roman Urdu carries too little information to\n * guess reliably.\n */\nfunction reverseTransliterateName(englishName: string): string {\n const lower = englishName.toLowerCase();\n return ENGLISH_TO_URDU.get(lower) ?? ENGLISH_NAME_ALIASES[lower] ?? englishName;\n}\n\n/**\n * Extract name parts from a full Urdu name.\n *\n * @example\n * extractNameParts(\"جناب محمد علی خان صاحب\")\n * // { honorific: \"جناب\", firstName: \"محمد علی\", familyName: \"خان\", suffix: \"صاحب\" }\n */\nexport function extractNameParts(fullName: string): {\n honorific?: string;\n firstName: string;\n familyName?: string;\n suffix?: string;\n} {\n const normalized = removeDiacritics(normalizeUrdu(fullName));\n const words = normalized.split(/\\s+/).filter((w) => w.length > 0);\n\n const honorifics = Object.keys(HONORIFICS);\n const suffixes = [\"sahib\", \"sahab\", \"بیگم\", \"begum\"];\n\n let honorific: string | undefined;\n let suffix: string | undefined;\n const nameWords: string[] = [];\n\n for (const word of words) {\n // Check honorifics first (includes صاحب)\n if (honorifics.includes(word)) {\n // Only set honorific if not already set (first honorific wins)\n if (!honorific) {\n honorific = word;\n } else {\n // Second honorific becomes suffix\n suffix = word;\n }\n } else if (suffixes.includes(word)) {\n suffix = word;\n } else {\n nameWords.push(word);\n }\n }\n\n // Assume last word is family name if there are multiple words\n const familyName =\n nameWords.length > 1 ? nameWords[nameWords.length - 1] : undefined;\n const firstName =\n nameWords.length > 1\n ? nameWords.slice(0, -1).join(\" \")\n : nameWords[0] || \"\";\n\n return { honorific, firstName, familyName, suffix };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chars.ts","../src/normalize.ts","../src/numbers.ts","../src/detect.ts","../src/stats.ts","../src/stopwords.ts","../src/collate.ts","../src/search.ts","../src/dictionary.ts","../src/transliterate.ts","../src/date.ts","../src/stemmer.ts","../src/names.ts"],"names":["DIACRITIC_RANGES","DIACRITICS_RE","TATWEEL_RE","INVISIBLE_RE","ZWNJ_RE","ARABIC_LETTER_RANGES","ARABIC_LETTER_RE","ANY_LETTER_RE_G","URDU_DIGITS","ARABIC_INDIC_DIGITS","ASCII_DIGITS","ANY_DIGIT_RE_G","SENTENCE_SPLIT_RE","WORD_SPLIT_RE","URDU_LETTERS","LETTER_MAP","ch","aliases","alias","digitTargets","PUNCTUATION_MAP","DIGIT_LOOKUP","set","i","normalizeUrdu","input","options","compatibility","stripDiacritics","stripTatweel","stripZwnj","collapseWhitespace","digits","urduPunctuation","text","digitTarget","out","mapped","value","punct","removeDiacritics","foldUrdu","SETS","VALUE_OF","convert","target","toUrduDigits","toEnglishDigits","toArabicIndicDigits","convertNumbers","to","parseUrduNumber","ascii","SEPARATORS","URDU_ONES","URDU_TEENS_AND_TENS","URDU_TENS_UNITS","URDU_SCALES","URDU_ORDINAL_IRREGULARS","numberToUrduWords","parts","rest","size","name","count","irregular","tens","toDigitString","n","plain","exponential","lead","fraction","zeros","groupDigits","intStr","grouping","separator","lastThree","formatUrduNumber","decimals","separators","negative","abs","scale","intPart","scaledFraction","body","sign","formatUrduCurrency","style","unit","singularUnit","amount","toUrduOrdinal","gender","words","last","ordinated","urduRatio","letters","urdu","isUrdu","threshold","minLetters","URDU_ONLY","hasUrduSpecificLetters","countWords","splitWords","w","SENTENCE_ABBREVIATIONS","ABBREV_PATTERN","countSentences","splitSentences","preserveTerminators","PROTECTED_DOT","PROTECTED_URDU_FULL_STOP","sanitized","match","s","analyzeUrdu","characters","charactersNoSpaces","sentences","paragraphs","p","URDU_STOP_WORDS","toStopWordSet","custom","isStopWord","word","customStopWords","normalized","filterStopWords","stopSet","removeStopWords","PRIMARY_LETTERS","letter","WEIGHTS","index","baseWeight","NON_LETTER_BASE","weightsOf","weight","compareUrdu","b","left","right","length","diff","sortUrdu","items","descending","getText","key","item","sorted","a","editDistance","limit","previous","_","current","rowMin","j","cost","scoreOf","query","queryWords","textWords","matched","qw","tw","searchUrdu","searchUrduRanked","r","fuzzy","maxDistance","sortByScore","read","folded","results","score","highlightUrdu","wrap","m","foldedQuery","sourceChars","foldedChars","sourceIndexOf","haystack","cursor","from","hit","startSource","endSource","WORD_DICTIONARY","ROMAN_VARIANTS","DIGRAPHS","LETTERS","VOWEL_LETTERS","roman","vowel","romanizeWord","dictionary","chars","pieces","pair","digraph","next","romanize","chunk","ROMAN_DICTIONARY","urduWord","ROMAN_RULES","romanWordToUrdu","lower","position","pattern","replacement","romanToUrdu","urduSlug","maxLength","preserveUrdu","allowed","slug","part","lastSeparator","URDU_MONTHS_GREGORIAN","URDU_MONTHS_HIJRI","URDU_WEEKDAYS","parseDateInput","date","getUrduMonthName","monthIndex","calendar","normalizedIndex","idx","getUrduWeekdayName","dayIndex","formatUrduDate","d","year","month","dayOfMonth","dayOfWeek","hours24","hours12","minutes","seconds","pad","periodDetailed","periodSimple","tokenValues","regex","val","timeAgoUrdu","relativeTo","now","addSuffix","formatNum","num","diffMs","isPast","absDiffSeconds","hours","days","weeks","months","years","ENGLISH_MONTH_NAMES","ENGLISH_WEEKDAY_NAMES","MONTH_LOOKUP","lookup","WEEKDAY_TOKENS","URDU_PERIODS","resolveHour","hour","period","buildLocalDate","day","minute","second","expandYear","INVISIBLE_CHARS_RE","parseNumericDate","iso","dayFirst","parseUrduDate","numeric","numbers","rawToken","token","urduPeriod","time","only","first","URDU_PREFIXES","URDU_SUFFIXES","PROTECTED_WORDS","applySuffixStripping","suffixes","minLen","suf","remainder","applyPrefixStripping","prefixes","pref","getAffixes","clean","doSuffixes","doPrefixes","detectedSuffix","detectedPrefix","sRes","pRes","stemUrdu","stemUrduText","URDU_FIRST_NAMES","URDU_FAMILY_NAMES","HONORIFICS","NAME_PREFIXES","ENGLISH_TO_URDU","table","englishWord","ENGLISH_NAME_ALIASES","transliterateSingleName","urduName","result","honorific","firstName","familyName","prefix","transliterateNameWord","consonants","base","transliterateNameToEnglish","preserveCase","includeHonorifics","transliterateNameToUrdu","englishName","reverseTransliterateName","extractNameParts","fullName","honorifics","suffix","nameWords"],"mappings":"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AAA,CACA,oBAAA,CACA,oBAAA,CACA,0BAAA,CACA,0BAAA,CACA,oBAAA,CACA,qBACA,0BAAA,CACA,oBAAA,CACA,2BACA,gCAAA,CACA,sCAAA,CACA,iCACA,gCAAA,CACA,oBAAA,CACA,iCACA,0BAAA,CACA,gCAAA,CACA,qBACA,0BAAA,CACA,0BAAA,CACA,qBACA,gCAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CACA,0BAAA,CACA,iCAGA,oBAAA,CACA,cAAA,CACA,qBACA,0BAAA,CACA,oBAAA,CACA,eACA,oBAAA,CACA,cAAA,CACA,eACA,0BAAA,CACA,cAAA,CACA,eACA,0BAAA,CACA,4CAAA,CACA,iCACA,sCAAA,CACA,0BAAA,CACA,2BACA,gCAAA,CACA,gCAAA,CACA,2BACA,sCAAA,CACA,sCAAA,CACA,sCAAA,CACA,0BAAA,CACA,0BAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CACA,oBAAA,CACA,iCACA,oBAAA,CACA,oBAAA,CACA,qBAGA,cAAA,CACA,cAAA,CACA,eACA,cAAA,CACA,cAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,iCACA,gCAAA,CACA,gCAAA,CACA,uCACA,sCAAA,CACA,sCAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CACA,cAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,iCACA,0BAAA,CACA,0BAAA,CACA,iCACA,cAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,oBAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,gCAAA,CACA,gCAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,oBAAA,CACA,0BAAA,CACA,qBACA,oBAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,0BAAA,CACA,2BACA,0BAAA,CACA,cAAA,CACA,eACA,0BAAA,CACA,0BAAA,CACA,qBACA,cAAA,CACA,oBA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","file":"index.iife.js","sourcesContent":["/**\n * Shared Unicode building blocks for the Arabic script as used by Urdu.\n *\n * Blocks worth remembering:\n * U+0600-U+06FF Arabic (Urdu letters live here, plus the U+06Ax-U+06Dx extras)\n * U+0750-U+077F Arabic Supplement\n * U+08A0-U+08FF Arabic Extended-A\n * U+FB50-U+FDFF Arabic Presentation Forms-A\n * U+FE70-U+FEFC Arabic Presentation Forms-B\n *\n * Every class below is written with \\u escapes on purpose: these characters are\n * invisible or shape-shifting in an editor, and a silently wrong literal is the\n * single easiest way to break an Urdu pipeline.\n */\n\n/**\n * Combining marks: harakat (ً-ٟ), quranic annotation (ۖ-ۭ),\n * superscript alef (ٰ) and the ؐ-ؚ honorific marks.\n * Deliberately excludes U+06D4 (Urdu full stop ۔), U+06D2 (ے) and U+06D3 (ۓ).\n */\nexport const DIACRITIC_RANGES = \"\\\\u0610-\\\\u061A\\\\u064B-\\\\u065F\\\\u0670\\\\u06D6-\\\\u06ED\";\n\nexport const DIACRITICS_RE = new RegExp(`[${DIACRITIC_RANGES}]`, \"gu\");\n\n/** Tatweel / kashida U+0640 — display padding, never meaning. */\nexport const TATWEEL_RE = /ـ/gu;\n\n/** Bidi controls, joiners and BOM that leak in from copy-paste. ZWNJ is handled separately. */\nexport const INVISIBLE_RE = /[----]/gu;\n\n/** Zero-width non-joiner U+200C: occasionally meaningful, so stripped only on request. */\nexport const ZWNJ_RE = //gu;\n\nconst ARABIC_SCRIPT_RANGES = \"\\\\u0600-\\\\u06FF\\\\u0750-\\\\u077F\\\\u08A0-\\\\u08FF\\\\uFB50-\\\\uFDFF\\\\uFE70-\\\\uFEFC\";\n\n/** Any Arabic-script character: letters, marks, punctuation, digits, presentation forms. */\nexport const ARABIC_SCRIPT_RE = new RegExp(`[${ARABIC_SCRIPT_RANGES}]`, \"u\");\n\n/**\n * Whole-string match for a single Urdu word (dictionary keys and values):\n * Arabic-script characters plus ZWNJ/ZWJ — the joiners are meaningful inside\n * words such as جزاکاللہ — and nothing else. Rejects whitespace and\n * foreign-script lookalikes (Devanagari, Gurmukhi, Latin) that would silently\n * break lookups, so data-table integrity tests can share one definition.\n */\nexport const ARABIC_WORD_RE = new RegExp(`^[${ARABIC_SCRIPT_RANGES}\\\\u200C\\\\u200D]+$`, \"u\");\n\nconst ARABIC_LETTER_RANGES =\n \"\\\\u0620-\\\\u063F\\\\u0641-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FF\" +\n \"\\\\u0750-\\\\u077F\\\\u08A0-\\\\u08FF\\\\uFB50-\\\\uFDFF\\\\uFE70-\\\\uFEFC\";\n\n/** Arabic-script letters only — no marks, no digits, no punctuation, no tatweel. */\nexport const ARABIC_LETTER_RE = new RegExp(`[${ARABIC_LETTER_RANGES}]`, \"u\");\nexport const ARABIC_LETTER_RE_G = new RegExp(`[${ARABIC_LETTER_RANGES}]`, \"gu\");\n\n/** Letters of any script — the denominator when measuring \"how Urdu is this text\". */\nexport const ANY_LETTER_RE = /\\p{L}/u;\nexport const ANY_LETTER_RE_G = /\\p{L}/gu;\n\n/** Urdu digits ۰-۹ (U+06F0) and Arabic-Indic digits ٠-٩ (U+0660) are two distinct blocks. */\nexport const URDU_DIGITS = \"۰۱۲۳۴۵۶۷۸۹\";\nexport const ARABIC_INDIC_DIGITS = \"٠١٢٣٤٥٦٧٨٩\";\nexport const ASCII_DIGITS = \"0123456789\";\n\nexport const ANY_DIGIT_RE_G = new RegExp(`[${ASCII_DIGITS}${URDU_DIGITS}${ARABIC_INDIC_DIGITS}]`, \"gu\");\n\n/** Sentence terminators: Urdu full stop ۔, Arabic question mark ؟, ASCII . ! ? and ellipsis. */\nexport const SENTENCE_SPLIT_RE = /[۔؟?!.…]+/u;\n\n/** Word separators: whitespace plus punctuation that cannot occur inside an Urdu word. */\nexport const WORD_SPLIT_RE =\n /[\\s،؛؟۔٫٬…!-\\/:-@\\[-`{-~‐-‧«»‘’“”]+/u;\n\n// ---------------------------------------------------------------------------\n// Canonical Urdu letter inventory\n// ---------------------------------------------------------------------------\n\n// Unlike the regex ranges above, letters here are written as literals: they are\n// data keys, not patterns, and several are referenced from normalize.ts,\n// collate.ts and transliterate.ts. Non-obvious codepoints carry comments.\n\nexport interface UrduLetter {\n /** The canonical Urdu letter. */\n ch: string;\n /** Default Roman Urdu value, used when no positional rule applies. */\n roman: string;\n /** The letter carries a vowel in Roman output (drives the schwa rule). */\n vowel?: boolean;\n /** Alternate spellings in the wild that normalizeUrdu folds to this letter. */\n aliases?: string[];\n /** Hamza-carrying letter: collates as its base letter with a secondary tiebreaker. */\n variantOf?: string;\n}\n\n/**\n * The canonical Urdu alphabet (حروف تہجی) in alphabetical order — the single\n * source of truth for the letter inventory shared by normalization, collation\n * and transliteration:\n *\n * - {@link URDU_LETTERS} order defines collation (primary letters only;\n * hamza variants carry {@link UrduLetter.variantOf});\n * - {@link UrduLetter.roman} and {@link UrduLetter.vowel} feed transliteration;\n * - {@link UrduLetter.aliases} are the Arabic-keyboard and historical spellings\n * that normalization folds onto the canonical letter.\n *\n * Keeping one table means adding a letter updates all three consumers at once\n * instead of three hand-maintained maps drifting apart.\n */\nexport const URDU_LETTERS: readonly UrduLetter[] = [\n { ch: \"ا\", roman: \"a\", vowel: true, aliases: [\"أ\", \"إ\", \"ٱ\", \"ٲ\", \"ٳ\"] }, // alef + hamza/wasla forms\n { ch: \"آ\", roman: \"aa\", vowel: true }, // alef madda — a real Urdu letter\n { ch: \"ب\", roman: \"b\" },\n { ch: \"پ\", roman: \"p\" },\n { ch: \"ت\", roman: \"t\" },\n { ch: \"ٹ\", roman: \"t\" },\n { ch: \"ث\", roman: \"s\" },\n { ch: \"ج\", roman: \"j\" },\n { ch: \"چ\", roman: \"ch\" },\n { ch: \"ح\", roman: \"h\" },\n { ch: \"خ\", roman: \"kh\" },\n { ch: \"د\", roman: \"d\" },\n { ch: \"ڈ\", roman: \"d\" },\n { ch: \"ذ\", roman: \"z\" },\n { ch: \"ر\", roman: \"r\" },\n { ch: \"ڑ\", roman: \"r\" },\n { ch: \"ز\", roman: \"z\" },\n { ch: \"ژ\", roman: \"zh\" },\n { ch: \"س\", roman: \"s\" },\n { ch: \"ش\", roman: \"sh\" },\n { ch: \"ص\", roman: \"s\" },\n { ch: \"ض\", roman: \"z\" },\n { ch: \"ط\", roman: \"t\" },\n { ch: \"ظ\", roman: \"z\" },\n { ch: \"ع\", roman: \"a\", vowel: true },\n { ch: \"غ\", roman: \"gh\" },\n { ch: \"ف\", roman: \"f\" },\n { ch: \"ق\", roman: \"q\" },\n { ch: \"ک\", roman: \"k\", aliases: [\"ك\", \"ڪ\"] }, // arabic kaf, swash kaf\n { ch: \"گ\", roman: \"g\" },\n { ch: \"ل\", roman: \"l\" },\n { ch: \"م\", roman: \"m\" },\n { ch: \"ن\", roman: \"n\" },\n { ch: \"ں\", roman: \"n\" }, // noon ghunna\n { ch: \"و\", roman: \"o\", vowel: true, aliases: [\"ۋ\", \"ۆ\", \"ۇ\"] }, // ve, oe, u\n { ch: \"ؤ\", roman: \"o\", vowel: true, variantOf: \"و\" }, // waw with hamza — kept, hamza is meaningful\n { ch: \"ہ\", roman: \"h\", aliases: [\"ه\", \"ۀ\", \"ة\", \"ۃ\", \"ە\"] }, // arabic heh, heh-yeh-above, teh marbuta, ae\n { ch: \"ۂ\", roman: \"h\", vowel: true, variantOf: \"ہ\" }, // heh goal with hamza above\n { ch: \"ھ\", roman: \"h\" }, // do-chashmi heh — distinct letter, aspirates the consonant before it\n { ch: \"ء\", roman: \"\" }, // hamza\n { ch: \"ی\", roman: \"i\", vowel: true, aliases: [\"ي\", \"ى\", \"ۍ\", \"ې\", \"ؠ\"] }, // arabic yeh, alef maksura, yeh-with-tail, pashto e, kashmiri yeh\n { ch: \"ئ\", roman: \"i\", vowel: true, variantOf: \"ی\" }, // yeh with hamza above\n { ch: \"ے\", roman: \"e\", vowel: true }, // bari ye — distinct letter\n { ch: \"ۓ\", roman: \"e\", vowel: true, variantOf: \"ے\" }, // bari ye with hamza\n];\n","import {\n ARABIC_INDIC_DIGITS,\n ASCII_DIGITS,\n DIACRITICS_RE,\n INVISIBLE_RE,\n TATWEEL_RE,\n URDU_DIGITS,\n URDU_LETTERS,\n ZWNJ_RE,\n} from \"./chars.js\";\nimport type { DigitStyle } from \"./numbers.js\";\n\n/**\n * Arabic-script spellings that Urdu writes with a different letter.\n *\n * The direction matters and is a common source of bugs: Urdu uses\n * ہ (U+06C1 heh goal) and ی (U+06CC farsi yeh), NOT the Arabic\n * ه (U+0647) and ي (U+064A). Text pasted from Arabic keyboards,\n * Windows-1256 conversions or older CMSes carries the Arabic forms,\n * which then fail every naive `===` comparison.\n *\n * The alias lists live on the canonical letters in chars.ts (URDU_LETTERS) and\n * are inverted here, so the fold set and the letter inventory can never drift.\n */\nconst LETTER_MAP: Record<string, string> = {};\nfor (const { ch, aliases } of URDU_LETTERS) {\n for (const alias of aliases ?? []) {\n LETTER_MAP[alias] = ch;\n }\n}\n\nconst digitTargets: Record<DigitStyle, string> = {\n urdu: URDU_DIGITS,\n english: ASCII_DIGITS,\n arabic: ARABIC_INDIC_DIGITS,\n};\n\nexport interface NormalizeOptions {\n /** Apply Unicode NFKC first, folding presentation forms (ﻻ, ﮐ) back to real letters. Default `true`. */\n compatibility?: boolean;\n /** Strip harakat and quranic marks. Default `false` — see {@link removeDiacritics}. */\n stripDiacritics?: boolean;\n /** Remove tatweel/kashida padding. Default `true`. */\n stripTatweel?: boolean;\n /** Remove zero-width non-joiner. Default `false`, since ZWNJ can be meaningful. */\n stripZwnj?: boolean;\n /** Collapse whitespace runs to a single space and trim. Default `true`. */\n collapseWhitespace?: boolean;\n /** Rewrite every digit to one style. Default `\"preserve\"`. */\n digits?: DigitStyle | \"preserve\";\n /** Map ASCII `,` `;` `?` to Urdu `،` `؛` `؟`. Default `false`. */\n urduPunctuation?: boolean;\n}\n\nconst PUNCTUATION_MAP: Record<string, string> = {\n \",\": \"،\", // ،\n \";\": \"؛\", // ؛\n \"?\": \"؟\", // ؟\n};\n\nconst DIGIT_LOOKUP = new Map<string, number>();\nfor (const set of [ASCII_DIGITS, URDU_DIGITS, ARABIC_INDIC_DIGITS]) {\n for (let i = 0; i < 10; i++) DIGIT_LOOKUP.set(set[i]!, i);\n}\n\n/**\n * Fold an Urdu string to a single canonical Unicode form.\n *\n * @example\n * normalizeUrdu(\"كيا حال ہے\") // \"کیا حال ہے\"\n */\nexport function normalizeUrdu(input: string, options: NormalizeOptions = {}): string {\n if (!input) return \"\";\n\n const {\n compatibility = true,\n stripDiacritics = false,\n stripTatweel = true,\n stripZwnj = false,\n collapseWhitespace = true,\n digits = \"preserve\",\n urduPunctuation = false,\n } = options;\n\n let text = compatibility ? input.normalize(\"NFKC\") : input.normalize(\"NFC\");\n\n text = text.replace(INVISIBLE_RE, \"\");\n if (stripZwnj) text = text.replace(ZWNJ_RE, \"\");\n if (stripTatweel) text = text.replace(TATWEEL_RE, \"\");\n if (stripDiacritics) text = text.replace(DIACRITICS_RE, \"\");\n\n const digitTarget = digits === \"preserve\" ? null : digitTargets[digits];\n\n let out = \"\";\n for (const ch of text) {\n const mapped = LETTER_MAP[ch];\n if (mapped !== undefined) {\n out += mapped;\n continue;\n }\n if (digitTarget) {\n const value = DIGIT_LOOKUP.get(ch);\n if (value !== undefined) {\n out += digitTarget[value];\n continue;\n }\n }\n if (urduPunctuation) {\n const punct = PUNCTUATION_MAP[ch];\n if (punct !== undefined) {\n out += punct;\n continue;\n }\n }\n out += ch;\n }\n\n if (collapseWhitespace) out = out.replace(/\\s+/gu, \" \").trim();\n\n return out;\n}\n\n/**\n * Strip harakat, quranic annotation marks and superscript alef.\n * Keeps ۔ ے ۓ, which are letters/punctuation rather than marks.\n *\n * @example\n * removeDiacritics(\"مُحَمَّد\") // \"محمد\"\n */\nexport function removeDiacritics(input: string): string {\n if (!input) return \"\";\n return input.normalize(\"NFC\").replace(DIACRITICS_RE, \"\");\n}\n\n/**\n * The comparison key used by {@link searchUrdu} and {@link sortUrdu}:\n * normalized, diacritic-free, lowercased, whitespace-collapsed.\n * Two strings that a reader would call \"the same word\" should fold to the same key.\n */\nexport function foldUrdu(input: string): string {\n return normalizeUrdu(input, {\n stripDiacritics: true,\n stripZwnj: true,\n collapseWhitespace: true,\n }).toLowerCase();\n}\n","import { ARABIC_INDIC_DIGITS, ASCII_DIGITS, URDU_DIGITS } from \"./chars.js\";\n\nconst SETS = {\n urdu: URDU_DIGITS,\n english: ASCII_DIGITS,\n arabic: ARABIC_INDIC_DIGITS,\n} as const;\n\nexport type DigitStyle = keyof typeof SETS;\n\nconst VALUE_OF = new Map<string, number>();\nfor (const set of Object.values(SETS)) {\n for (let i = 0; i < 10; i++) VALUE_OF.set(set[i]!, i);\n}\n\nfunction convert(input: string, target: DigitStyle): string {\n if (!input) return \"\";\n const digits = SETS[target];\n let out = \"\";\n for (const ch of input) {\n const value = VALUE_OF.get(ch);\n out += value === undefined ? ch : digits[value];\n }\n return out;\n}\n\n/** `12345` -> `۱۲۳۴۵`. Accepts Arabic-Indic digits as input too. */\nexport function toUrduDigits(input: string): string {\n return convert(input, \"urdu\");\n}\n\n/** `۱۲۳۴۵` -> `12345`. Safe to feed into `Number()` afterwards. */\nexport function toEnglishDigits(input: string): string {\n return convert(input, \"english\");\n}\n\n/** `۱۲۳۴۵` -> `١٢٣٤٥` (Arabic-Indic, U+0660 block — a different block from Urdu's). */\nexport function toArabicIndicDigits(input: string): string {\n return convert(input, \"arabic\");\n}\n\n/**\n * Rewrite every digit in `input` to one style.\n *\n * @example\n * convertNumbers(\"12345\") // \"۱۲۳۴۵\"\n * convertNumbers(\"۱۲۳۴۵\", \"english\") // \"12345\"\n */\nexport function convertNumbers(input: string, to: DigitStyle = \"urdu\"): string {\n return convert(input, to);\n}\n\n/**\n * Parse a number written with Urdu or Arabic-Indic digits.\n * Handles the Urdu decimal separator ٫ and thousands separator ٬.\n * Returns `NaN` when the string is not a number.\n */\nexport function parseUrduNumber(input: string): number {\n if (!input) return NaN;\n const ascii = toEnglishDigits(input)\n .replace(/[٬,\\s]/gu, \"\")\n .replace(/٫/gu, \".\");\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/u.test(ascii)) return NaN;\n return Number(ascii);\n}\n\n/**\n * Separator characters for formatted numbers. The Urdu pair (٬ thousands,\n * ٫ decimal) comes from the Arabic-extended block that Urdu digits also live\n * in; English output uses the ASCII pair so it stays copy-pasteable.\n */\nconst SEPARATORS = {\n urdu: { group: \"٬\", decimal: \"٫\" },\n english: { group: \",\", decimal: \".\" },\n} as const;\n\n// ---------------------------------------------------------------------------\n// Word tables\n//\n// These are exported so scripts/generate-php-tables.mjs can flow them into\n// php/data/tables.json — the PHP port reads the same data instead of keeping a\n// hand-copied second set of number words.\n// ---------------------------------------------------------------------------\n\n/** Cardinal words for 0-9. Index 0 is empty: `0` is spelled `صفر` separately. */\nexport const URDU_ONES: readonly string[] = [\n \"\",\n \"ایک\",\n \"دو\",\n \"تین\",\n \"چار\",\n \"پانچ\",\n \"چھ\",\n \"سات\",\n \"آٹھ\",\n \"نو\",\n];\n\n/** Words for 10-20 plus every multiple of ten through 100. */\nexport const URDU_TEENS_AND_TENS: Readonly<Record<number, string>> = {\n 10: \"دس\",\n 11: \"گیارہ\",\n 12: \"بارہ\",\n 13: \"تیرہ\",\n 14: \"چودہ\",\n 15: \"پندرہ\",\n 16: \"سولہ\",\n 17: \"سترہ\",\n 18: \"اٹھارہ\",\n 19: \"انیس\",\n 20: \"بیس\",\n 30: \"تیس\",\n 40: \"چالیس\",\n 50: \"پچاس\",\n 60: \"ساٹھ\",\n 70: \"ستر\",\n 80: \"اسی\",\n 90: \"نوے\",\n 100: \"سو\",\n};\n\n/**\n * The 21-99 values that are irregular: Urdu does not compose them as\n * \"twenty-one\", each unit has its own word. Every non-multiple of ten from 21\n * to 99 appears here exactly once.\n *\n * A few of these spellings have documented variants (`26` also appears as\n * `چھببیس`; `92` as `بیانوے`). This table follows the standard textbook forms.\n */\nexport const URDU_TENS_UNITS: Readonly<Record<number, string>> = {\n 21: \"اکیس\",\n 22: \"بائیس\",\n 23: \"تئیس\",\n 24: \"چوبیس\",\n 25: \"پچیس\",\n 26: \"چھبیس\",\n 27: \"ستائیس\",\n 28: \"اٹھائیس\",\n 29: \"انتیس\",\n 31: \"اکتیس\",\n 32: \"بتیس\",\n 33: \"تینتیس\",\n 34: \"چونتیس\",\n 35: \"پینتیس\",\n 36: \"چھتیس\",\n 37: \"سینتیس\",\n 38: \"اڑتیس\",\n 39: \"انتالیس\",\n 41: \"اکتالیس\",\n 42: \"بیالیس\",\n 43: \"تینتالیس\",\n 44: \"چوالیس\",\n 45: \"پینتالیس\",\n 46: \"چھیالیس\",\n 47: \"سینتالیس\",\n 48: \"اڑتالیس\",\n 49: \"انچاس\",\n 51: \"اکیاون\",\n 52: \"باون\",\n 53: \"ترپن\",\n 54: \"چون\",\n 55: \"پچپن\",\n 56: \"چھپن\",\n 57: \"ستاون\",\n 58: \"اٹھاون\",\n 59: \"انسٹھ\",\n 61: \"اکسٹھ\",\n 62: \"باسٹھ\",\n 63: \"ترسٹھ\",\n 64: \"چونسٹھ\",\n 65: \"پینسٹھ\",\n 66: \"چھیاسٹھ\",\n 67: \"سڑسٹھ\",\n 68: \"اڑسٹھ\",\n 69: \"انہتر\",\n 71: \"اکہتر\",\n 72: \"بہتر\",\n 73: \"تہتر\",\n 74: \"چوہتر\",\n 75: \"پچہتر\",\n 76: \"چھہتر\",\n 77: \"ستتر\",\n 78: \"اٹھہتر\",\n 79: \"اناسی\",\n 81: \"اکیاسی\",\n 82: \"بیاسی\",\n 83: \"تراسی\",\n 84: \"چوراسی\",\n 85: \"پچاسی\",\n 86: \"چھیاسی\",\n 87: \"ستاسی\",\n 88: \"اٹھاسی\",\n 89: \"نواسی\",\n 91: \"اکانوے\",\n 92: \"بانوے\",\n 93: \"ترانوے\",\n 94: \"چورانوے\",\n 95: \"پچانوے\",\n 96: \"چھیانوے\",\n 97: \"ستانوے\",\n 98: \"اٹھانوے\",\n 99: \"نانوے\",\n};\n\n/**\n * The South Asian scale, largest first. `کھرب` is 10^11 and `ارب` is 10^9 —\n * note they are not the western billion/trillion, and each step below `کروڑ`\n * is two orders of magnitude, not three.\n */\nexport const URDU_SCALES: ReadonlyArray<readonly [number, string]> = [\n [100_000_000_000, \"کھرب\"],\n [1_000_000_000, \"ارب\"],\n [10_000_000, \"کروڑ\"],\n [100_000, \"لاکھ\"],\n [1_000, \"ہزار\"],\n [100, \"سو\"],\n];\n\n/**\n * Ordinals 1-6 are irregular; every larger ordinal is the last word of the\n * cardinal with `واں` (masculine) or `ویں` (feminine) attached.\n */\nexport const URDU_ORDINAL_IRREGULARS: Readonly<\n Record<number, { masculine: string; feminine: string }>\n> = {\n 1: { masculine: \"پہلا\", feminine: \"پہلی\" },\n 2: { masculine: \"دوسرا\", feminine: \"دوسری\" },\n 3: { masculine: \"تیسرا\", feminine: \"تیسری\" },\n 4: { masculine: \"چوتھا\", feminine: \"چوتھی\" },\n 5: { masculine: \"پانچواں\", feminine: \"پانچویں\" },\n 6: { masculine: \"چھٹا\", feminine: \"چھٹی\" },\n};\n\n/**\n * Spell a whole number in Urdu words, using the South Asian scale\n * (ہزار, لاکھ, کروڑ, ارب, کھرب) rather than the western million/billion scale.\n *\n * Every cardinal from 0 to 99 is a real irregular word — 21 is `اکیس`, not a\n * composed `بیس ایک` — and the scale words are exact up to 10^15, beyond which\n * JavaScript's own floating-point representation loses precision.\n *\n * @experimental The irregular 21-99 word table is transcribed from standard\n * textbook forms; a handful of those words have recognised variant spellings.\n *\n * @example\n * numberToUrduWords(1234567) // \"بارہ لاکھ چونتیس ہزار پانچ سو سڑسٹھ\"\n * numberToUrduWords(1e9) // \"ایک ارب\"\n */\nexport function numberToUrduWords(value: number): string {\n if (!Number.isFinite(value)) return \"\";\n if (!Number.isInteger(value)) throw new TypeError(\"numberToUrduWords expects an integer\");\n if (value < 0) return `منفی ${numberToUrduWords(-value)}`;\n if (value === 0) return \"صفر\";\n\n const parts: string[] = [];\n let rest = value;\n for (const [size, name] of URDU_SCALES) {\n if (rest >= size) {\n const count = Math.floor(rest / size);\n rest %= size;\n parts.push(`${numberToUrduWords(count)} ${name}`);\n }\n }\n if (rest > 0) {\n const irregular = URDU_TENS_UNITS[rest];\n if (irregular !== undefined) {\n parts.push(irregular);\n } else if (URDU_TEENS_AND_TENS[rest]) {\n parts.push(URDU_TEENS_AND_TENS[rest]!);\n } else if (rest < 10) {\n parts.push(URDU_ONES[rest]!);\n } else {\n // Unreachable while URDU_TENS_UNITS is complete; kept as a safety net so\n // a gap in the table degrades to composed words instead of throwing.\n const tens = Math.floor(rest / 10) * 10;\n parts.push(`${URDU_TEENS_AND_TENS[tens] ?? \"\"} ${URDU_ONES[rest % 10] ?? \"\"}`.trim());\n }\n }\n return parts.join(\" \").replace(/\\s+/gu, \" \").trim();\n}\n\nexport interface FormatUrduNumberOptions {\n /**\n * Digit block to emit. The separators follow it: Urdu digits pair with ٬/٫,\n * English digits with `,`/`.`.\n * @default \"urdu\"\n */\n digits?: \"urdu\" | \"english\";\n /**\n * `\"southAsian\"` groups as lakh/crore (12٬34٬567), `\"western\"` as thousands\n * (1٬234٬567), `\"none\"` emits no separators.\n * @default \"southAsian\"\n */\n grouping?: \"southAsian\" | \"western\" | \"none\";\n /**\n * Fraction digits, rounded half-up. Trailing zeros are dropped, so a whole\n * number never grows a decimal separator.\n *\n * Rounding is applied to the binary double, not to its decimal spelling, and\n * both language ports do the arithmetic identically. That keeps output\n * byte-identical between them, and it means values whose decimal form is not\n * exactly representable (2.675, 1.005) can round down rather than up. Asking\n * for many digits exposes the representation itself: 1234567.891 at\n * `decimals: 15` ends in the double's real binary noise. Keep this at 6 or\n * below for display; `decimalPlaces`-style rounding of exact decimals is out\n * of scope.\n * @default 2\n */\n decimals?: number;\n}\n\n/**\n * `String(n)` switches to exponential notation at 1e21, which would reach the\n * output as `1e+21` — and the grouping pass would then insert a separator into\n * the exponent itself (`1e,+21`). Grouping needs digits, so expand the\n * exponent into a plain integer string.\n */\nfunction toDigitString(n: number): string {\n const plain = String(n);\n const exponential = /^(\\d)(?:\\.(\\d+))?e\\+(\\d+)$/u.exec(plain);\n if (!exponential) return plain;\n const lead = exponential[1]!;\n const fraction = exponential[2] ?? \"\";\n const zeros = Number(exponential[3]) - fraction.length;\n return `${lead}${fraction}${\"0\".repeat(zeros)}`;\n}\n\n/** `1234567` -> `12٬34٬567`. See {@link FormatUrduNumberOptions}. */\nfunction groupDigits(intStr: string, grouping: FormatUrduNumberOptions[\"grouping\"], separator: string): string {\n if (grouping === \"none\" || separator === \"\") return intStr;\n if (grouping === \"western\") {\n return intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/gu, separator);\n }\n // South Asian: the last three digits form one group, then pairs.\n const lastThree = intStr.slice(-3);\n const rest = intStr.slice(0, -3);\n return rest === \"\" ? lastThree : `${rest.replace(/\\B(?=(\\d{2})+(?!\\d))/gu, separator)}${separator}${lastThree}`;\n}\n\n/**\n * Format a number the way Urdu software prints numbers, with South Asian\n * digit grouping and Urdu digits by default.\n *\n * Returns `\"\"` for `NaN` and infinities, matching `formatUrduDate`.\n *\n * A very large magnitude prints the shortest decimal that represents the\n * double, so beyond 2^53 the digits are the value the number really holds.\n *\n * @example\n * formatUrduNumber(1234567) // \"۱۲٬۳۴٬۵۶۷\"\n * formatUrduNumber(1234567, { grouping: \"western\" }) // \"۱٬۲۳۴٬۵۶۷\"\n * formatUrduNumber(1234, { digits: \"english\" }) // \"1,234\"\n * formatUrduNumber(-3.14159, { decimals: 3 }) // \"-۳٫۱۴۲\"\n */\nexport function formatUrduNumber(value: number, options: FormatUrduNumberOptions = {}): string {\n if (!Number.isFinite(value)) return \"\";\n\n const digits = options.digits ?? \"urdu\";\n const grouping = options.grouping ?? \"southAsian\";\n const decimals = Math.min(15, Math.max(0, Math.floor(options.decimals ?? 2)));\n const separators = SEPARATORS[digits];\n\n const negative = value < 0;\n const abs = Math.abs(value);\n const scale = 10 ** decimals;\n\n // Split the integer and fraction parts in double arithmetic before any\n // string handling, and round the fraction with floor(x + 0.5) — the same\n // operation the PHP port performs, so both languages round identically.\n let intPart = Math.floor(abs);\n let scaledFraction = Math.floor((abs - intPart) * scale + 0.5);\n if (scaledFraction >= scale) {\n intPart += 1;\n scaledFraction -= scale;\n }\n\n const intStr = groupDigits(toDigitString(intPart), grouping, separators.group);\n const fraction = String(scaledFraction).padStart(decimals, \"0\").replace(/0+$/u, \"\");\n const body = fraction === \"\" ? intStr : `${intStr}${separators.decimal}${fraction}`;\n const sign = negative ? \"-\" : \"\";\n\n return digits === \"urdu\" ? `${sign}${toUrduDigits(body)}` : `${sign}${body}`;\n}\n\nexport interface FormatUrduCurrencyOptions extends FormatUrduNumberOptions {\n /**\n * `\"digits\"` prints the amount as a formatted number, `\"words\"` spells it out.\n * @default \"digits\"\n */\n style?: \"digits\" | \"words\";\n /** Unit used for every amount except exactly one. @default \"روپے\" */\n unit?: string;\n /** Unit used for an amount of exactly one. @default \"روپیہ\" */\n singularUnit?: string;\n}\n\n/**\n * Format a money amount with the right Urdu unit for the quantity.\n *\n * @experimental The `\"words\"` style inherits the note on\n * {@link numberToUrduWords}, and like it requires a whole amount.\n *\n * @example\n * formatUrduCurrency(1500) // \"۱٬۵۰۰ روپے\"\n * formatUrduCurrency(1) // \"۱ روپیہ\"\n * formatUrduCurrency(1500, { style: \"words\" }) // \"ایک ہزار پانچ سو روپے\"\n * formatUrduCurrency(2.5, { unit: \"ڈالر\", singularUnit: \"ڈالر\" }) // \"۲٫۵ ڈالر\"\n */\nexport function formatUrduCurrency(value: number, options: FormatUrduCurrencyOptions = {}): string {\n if (!Number.isFinite(value)) return \"\";\n\n const style = options.style ?? \"digits\";\n const unit = options.unit ?? \"روپے\";\n const singularUnit = options.singularUnit ?? \"روپیہ\";\n\n const amount = style === \"words\" ? numberToUrduWords(value) : formatUrduNumber(value, options);\n if (amount === \"\") return \"\";\n\n return `${amount} ${Math.abs(value) === 1 ? singularUnit : unit}`;\n}\n\nexport interface UrduOrdinalOptions {\n /**\n * Urdu ordinals inflect for gender: `پہلا` (masculine) vs `پہلی` (feminine).\n * @default \"masculine\"\n */\n gender?: \"masculine\" | \"feminine\";\n}\n\n/**\n * Spell an ordinal in Urdu — `پہلا`, `دوسرا`, `اکیسواں`, `سواں`.\n *\n * 1-6 are irregular and come from a table; everything else is the last word of\n * the cardinal with the ordinal suffix, so `اکیس` becomes `اکیسواں` and `نوے`\n * becomes `نوےواں`. A word-final `و` contracts instead of doubling, which is\n * why `نو` becomes `نواں` (not `نوواں`) and `سو` becomes `سواں`.\n *\n * `0` returns `صفر`, since \"zeroth\" has no Urdu ordinal form. Returns `\"\"` for\n * non-finite input and throws for fractions, like {@link numberToUrduWords}.\n *\n * @experimental Inherits the note on {@link numberToUrduWords}.\n *\n * @example\n * toUrduOrdinal(1) // \"پہلا\"\n * toUrduOrdinal(1, { gender: \"feminine\" }) // \"پہلی\"\n * toUrduOrdinal(9) // \"نواں\"\n * toUrduOrdinal(21) // \"اکیسواں\"\n * toUrduOrdinal(100) // \"سواں\"\n * toUrduOrdinal(1100, { gender: \"feminine\" }) // \"ایک ہزار ایک سویں\"\n */\nexport function toUrduOrdinal(value: number, options: UrduOrdinalOptions = {}): string {\n if (!Number.isFinite(value)) return \"\";\n if (!Number.isInteger(value)) throw new TypeError(\"toUrduOrdinal expects an integer\");\n\n const gender = options.gender ?? \"masculine\";\n if (value < 0) return `منفی ${toUrduOrdinal(-value, options)}`;\n if (value === 0) return \"صفر\";\n\n const irregular = URDU_ORDINAL_IRREGULARS[value];\n if (irregular) return irregular[gender];\n\n const words = numberToUrduWords(value).split(\" \");\n const last = words.pop()!;\n // A final و contracts rather than doubling: نو -> نواں, سو -> سواں.\n const stem = last.endsWith(\"و\") ? last.slice(0, -1) : last;\n const ordinated = `${stem}${gender === \"feminine\" ? \"ویں\" : \"واں\"}`;\n\n // An exact scale value drops its `ایک`: 100th is `سواں`, not `ایک سواں`, and\n // 1000th is `ہزارواں`. A compound keeps it (1100th is `ایک ہزار ایک سواں`).\n const prefix = words.length === 1 && words[0] === \"ایک\" ? [] : words;\n\n return [...prefix, ordinated].join(\" \");\n}\n","import { ANY_LETTER_RE_G, ARABIC_LETTER_RE } from \"./chars.js\";\n\nexport interface IsUrduOptions {\n /**\n * Minimum share of Arabic-script letters among all letters, 0-1. Default `0.5`.\n * A ratio rather than \"contains any Urdu\" so that a mostly-English string with\n * one Urdu word does not count as Urdu.\n */\n threshold?: number;\n /** Require at least this many Arabic-script letters. Default `1`. */\n minLetters?: number;\n}\n\n/**\n * Ratio of Arabic-script letters to all letters, 0-1.\n * Returns 0 for text with no letters at all (digits, punctuation, emoji).\n */\nexport function urduRatio(input: string): number {\n if (!input) return 0;\n let letters = 0;\n let urdu = 0;\n for (const ch of input.match(ANY_LETTER_RE_G) ?? []) {\n letters++;\n if (ARABIC_LETTER_RE.test(ch)) urdu++;\n }\n return letters === 0 ? 0 : urdu / letters;\n}\n\n/**\n * Is this text Urdu (more precisely: predominantly Arabic-script)?\n *\n * The Arabic script is shared by Urdu, Arabic, Persian, Pashto and others, so\n * this cannot distinguish Urdu from Arabic on script alone. Use\n * {@link hasUrduSpecificLetters} when that distinction matters.\n *\n * @example\n * isUrdu(\"آپ کیسے ہیں؟\") // true\n */\nexport function isUrdu(input: string, options: IsUrduOptions = {}): boolean {\n const { threshold = 0.5, minLetters = 1 } = options;\n if (!input) return false;\n\n let letters = 0;\n let urdu = 0;\n for (const ch of input.match(ANY_LETTER_RE_G) ?? []) {\n letters++;\n if (ARABIC_LETTER_RE.test(ch)) urdu++;\n }\n if (urdu < minLetters) return false;\n return letters > 0 && urdu / letters >= threshold;\n}\n\n/** Letters that exist in Urdu but not in Arabic — the only reliable script-level signal. */\nconst URDU_ONLY = new Set([\n \"ٹ\", // ٹ tteh\n \"ڈ\", // ڈ ddal\n \"ڑ\", // ڑ rreh\n \"ں\", // ں noon ghunna\n \"ے\", // ے bari ye\n \"ۓ\", // ۓ bari ye with hamza\n \"ہ\", // ہ heh goal\n \"ھ\", // ھ do-chashmi heh\n \"ک\", // ک keheh\n \"گ\", // گ gaf\n \"چ\", // چ tcheh\n \"پ\", // پ peh\n \"ژ\", // ژ jeh\n \"ی\", // ی farsi yeh\n]);\n\n/**\n * True when the text contains at least one letter that Arabic does not use.\n * Cheap way to separate Urdu/Persian-family text from Arabic text.\n */\nexport function hasUrduSpecificLetters(input: string): boolean {\n for (const ch of input) if (URDU_ONLY.has(ch)) return true;\n return false;\n}\n","import {\n ANY_DIGIT_RE_G,\n DIACRITICS_RE,\n SENTENCE_SPLIT_RE,\n WORD_SPLIT_RE,\n} from \"./chars.js\";\nimport { urduRatio } from \"./detect.js\";\n\n/** Words in the text. Splits on whitespace and punctuation, so `ہے۔` counts once. */\nexport function countWords(input: string): number {\n return splitWords(input).length;\n}\n\n/** The word list behind {@link countWords}. Useful for tokenizing before search or indexing. */\nexport function splitWords(input: string): string[] {\n if (!input) return [];\n return input\n .split(WORD_SPLIT_RE)\n .map((w) => w.trim())\n .filter((w) => w.length > 0);\n}\n\nexport interface SplitSentenceOptions {\n /** If true, the sentence-ending punctuation (۔ ؟ ! . etc.) is preserved with each sentence. Default `false`. */\n preserveTerminators?: boolean;\n}\n\n/** Common Urdu abbreviations and honorifics that should not cause false sentence splits. */\nexport const SENTENCE_ABBREVIATIONS = [\n \"ڈاکٹر\",\n \"پروفیسر\",\n \"انجینئر\",\n \"ایڈووکیٹ\",\n \"جناب\",\n \"صاحب\",\n \"صاحبہ\",\n \"محترم\",\n \"محترمہ\",\n \"مولانا\",\n \"مفتی\",\n \"علامہ\",\n \"بیگم\",\n \"وغیرہ\",\n \"رحمتہ\",\n \"رضی\",\n \"تعالی\",\n \"تعالیٰ\",\n \"علیہ\",\n \"السلام\",\n \"صلی\",\n \"وسلم\",\n];\n\nconst ABBREV_PATTERN = new RegExp(`(?:${SENTENCE_ABBREVIATIONS.join(\"|\")})[.۔]`, \"gu\");\n\n/**\n * Sentences count, split on Urdu and standard terminators (۔ ؟ ! . …).\n * Protects common titles, abbreviations, and numeric decimals from false splits.\n */\nexport function countSentences(input: string, options?: SplitSentenceOptions): number {\n return splitSentences(input, options).length;\n}\n\n/**\n * Split text into sentences using Urdu punctuation rules.\n *\n * Handles Urdu full stop `۔`, Arabic question mark `؟`, exclamation `!`,\n * ASCII `.`, `?`, `!`, and ellipses `…`, while protecting abbreviations and numbers.\n *\n * @param input - Input text.\n * @param options - Options controlling termination preservation.\n *\n * @example\n * splitSentences(\"پاکستان ایک خوبصورت ملک ہے۔ اس کی تاریخ پرانی ہے۔\")\n * // [\"پاکستان ایک خوبصورت ملک ہے\", \"اس کی تاریخ پرانی ہے\"]\n */\nexport function splitSentences(input: string, options: SplitSentenceOptions = {}): string[] {\n if (!input) return [];\n\n const { preserveTerminators = false } = options;\n\n // Placeholder for protected dots\n const PROTECTED_DOT = \"\\uE000\";\n const PROTECTED_URDU_FULL_STOP = \"\\uE001\";\n\n let sanitized = input\n // Protect decimal numbers (1.5, 3.14, ۱٫۵)\n .replace(/(\\d)\\.(\\d)/gu, `$1${PROTECTED_DOT}$2`)\n // Protect abbreviations followed by dot or Urdu full stop\n .replace(ABBREV_PATTERN, (match) => {\n return match.replace(/\\./g, PROTECTED_DOT).replace(/۔/g, PROTECTED_URDU_FULL_STOP);\n });\n\n if (preserveTerminators) {\n // Split keeping delimiter\n const matches = sanitized.match(/[^۔؟?!.…]+[۔؟?!.…]+|[^۔؟?!.…]+$/gu) ?? [];\n return matches\n .map((s) =>\n s\n .replace(new RegExp(PROTECTED_DOT, \"gu\"), \".\")\n .replace(new RegExp(PROTECTED_URDU_FULL_STOP, \"gu\"), \"۔\")\n .trim(),\n )\n .filter((s) => s.length > 0);\n }\n\n return sanitized\n .split(SENTENCE_SPLIT_RE)\n .map((s) =>\n s\n .replace(new RegExp(PROTECTED_DOT, \"gu\"), \".\")\n .replace(new RegExp(PROTECTED_URDU_FULL_STOP, \"gu\"), \"۔\")\n .trim(),\n )\n .filter((s) => s.length > 0);\n}\n\nexport interface UrduStats {\n /** Every codepoint, including spaces and diacritics. */\n characters: number;\n charactersNoSpaces: number;\n words: number;\n sentences: number;\n /** Whitespace-delimited blocks separated by a blank line. */\n paragraphs: number;\n /** Share of Arabic-script letters among all letters, 0-100, rounded. */\n urduPercentage: number;\n diacritics: number;\n digits: number;\n averageWordsPerSentence: number;\n /** At 180 Urdu words per minute — slower than English because the script is denser. */\n readingTimeMinutes: number;\n}\n\n/**\n * Character, word, sentence and script statistics for a block of text.\n *\n * @example\n * analyzeUrdu(\"پاکستان ایک خوبصورت ملک ہے۔ اس کی آبادی زیادہ ہے۔\")\n */\nexport function analyzeUrdu(input: string): UrduStats {\n const text = input ?? \"\";\n const characters = [...text].length;\n const charactersNoSpaces = [...text.replace(/\\s/gu, \"\")].length;\n const words = countWords(text);\n const sentences = countSentences(text);\n const paragraphs = text\n .split(/\\n\\s*\\n/u)\n .map((p) => p.trim())\n .filter((p) => p.length > 0).length;\n\n return {\n characters,\n charactersNoSpaces,\n words,\n sentences,\n paragraphs,\n urduPercentage: Math.round(urduRatio(text) * 100),\n diacritics: (text.match(DIACRITICS_RE) ?? []).length,\n digits: (text.match(ANY_DIGIT_RE_G) ?? []).length,\n averageWordsPerSentence: sentences === 0 ? 0 : Math.round((words / sentences) * 10) / 10,\n readingTimeMinutes: Math.round((words / 180) * 10) / 10,\n };\n}\n","import { normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\n\n/**\n * Standard list of Urdu stop words.\n *\n * Covers pronouns, postpositions, auxiliaries, conjunctions, particles,\n * and high-frequency functional words used across Urdu texts.\n * All keys are canonical normalized Urdu.\n */\nexport const URDU_STOP_WORDS = new Set([\n // Tense auxiliaries & copulas\n \"ہے\",\n \"ہیں\",\n \"ہوں\",\n \"ہو\",\n \"تھا\",\n \"تھی\",\n \"تھے\",\n \"تھیں\",\n \"ہوگا\",\n \"ہوگی\",\n \"ہونگے\",\n \"ہوںگے\",\n \"ہونا\",\n \"ہونے\",\n \"ہوا\",\n \"ہوئی\",\n \"ہوئے\",\n\n // Postpositions, relations & prepositions\n \"کا\",\n \"کی\",\n \"کے\",\n \"کو\",\n \"نے\",\n \"سے\",\n \"پر\",\n \"تک\",\n \"میں\",\n \"لیے\",\n \"ساتھ\",\n \"بغیر\",\n \"طرح\",\n \"طرف\",\n \"بارے\",\n \"بعد\",\n \"پہلے\",\n \"دوران\",\n \"درمیان\",\n \"علاوہ\",\n \"سوائے\",\n \"سوا\",\n \"مطابق\",\n \"باعث\",\n \"ذریعے\",\n \"تحت\",\n \"اوپر\",\n \"نیچے\",\n \"آگے\",\n \"پیچھے\",\n \"اندر\",\n \"باہر\",\n \"پاس\",\n \"قریب\",\n \"نزدیک\",\n\n // Conjunctions & discourse markers\n \"اور\",\n \"یا\",\n \"اگر\",\n \"لیکن\",\n \"مگر\",\n \"تو\",\n \"بھی\",\n \"ہی\",\n \"نہ\",\n \"نہیں\",\n \"مت\",\n \"نا\",\n \"بلکہ\",\n \"حالانکہ\",\n \"چونکہ\",\n \"کیونکہ\",\n \"تاکہ\",\n \"ورنہ\",\n \"البتہ\",\n \"مثلاً\",\n \"یعنی\",\n \"خصوصاً\",\n \"عموماً\",\n \"چنانچہ\",\n \"خواہ\",\n \"چاہے\",\n \"گویا\",\n \"تاہم\",\n \"نیز\",\n \"حتی\",\n \"وغیرہ\",\n \"صرف\",\n \"محض\",\n \"فقط\",\n\n // Pronouns, determiners & question words\n \"ہم\",\n \"تم\",\n \"آپ\",\n \"وہ\",\n \"یہ\",\n \"میرا\",\n \"میری\",\n \"میرے\",\n \"ہمارا\",\n \"ہماری\",\n \"ہمارے\",\n \"تمہارا\",\n \"تمہاری\",\n \"تمہارے\",\n \"آپکا\",\n \"آپکی\",\n \"آپکے\",\n \"اس\",\n \"اسکا\",\n \"اسکی\",\n \"اسکے\",\n \"اسے\",\n \"ان\",\n \"انکا\",\n \"انکی\",\n \"انکے\",\n \"انہیں\",\n \"مجھے\",\n \"ہمیں\",\n \"تمہیں\",\n \"جس\",\n \"جسکا\",\n \"جسکی\",\n \"جسکے\",\n \"جسے\",\n \"جن\",\n \"جنکا\",\n \"جنکی\",\n \"جنکے\",\n \"جنہوں\",\n \"انہوں\",\n \"کس\",\n \"کسکا\",\n \"کسکی\",\n \"کسکے\",\n \"کسے\",\n \"کسکو\",\n \"کون\",\n \"کیا\",\n \"کہاں\",\n \"کدھر\",\n \"ادھر\",\n \"جدھر\",\n \"کب\",\n \"کیوں\",\n \"کیسے\",\n \"کیسا\",\n \"کیسی\",\n \"کتنا\",\n \"کتنی\",\n \"کتنے\",\n \"جو\",\n \"سب\",\n \"سبھی\",\n \"کوئی\",\n \"کچھ\",\n \"ہر\",\n \"ایک\",\n \"اپنا\",\n \"اپنی\",\n \"اپنے\",\n \"خود\",\n\n // Common light/auxiliary verb forms\n \"کرنا\",\n \"کرتا\",\n \"کرتی\",\n \"کرتے\",\n \"کریں\",\n \"کرو\",\n \"کر\",\n \"کرنے\",\n \"کیے\",\n \"جانا\",\n \"جاتا\",\n \"جاتی\",\n \"جاتے\",\n \"جائے\",\n \"جائیں\",\n \"جاؤ\",\n \"جا\",\n \"جانے\",\n \"گیا\",\n \"گئی\",\n \"گئے\",\n \"آنا\",\n \"آتا\",\n \"آتی\",\n \"آتے\",\n \"آئے\",\n \"آئیں\",\n \"آیا\",\n \"آئی\",\n \"آنے\",\n \"آؤ\",\n \"آ\",\n \"دینا\",\n \"دیتا\",\n \"دیتی\",\n \"دیتے\",\n \"دیا\",\n \"دیے\",\n \"دے\",\n \"دو\",\n \"دیں\",\n \"دینے\",\n \"لینا\",\n \"لیتا\",\n \"لیتی\",\n \"لیتے\",\n \"لیا\",\n \"لے\",\n \"لو\",\n \"لیں\",\n \"لینے\",\n \"رہنا\",\n \"رہا\",\n \"رہی\",\n \"رہے\",\n \"رہتا\",\n \"رہتی\",\n \"رہتے\",\n \"رہنے\",\n \"سکنا\",\n \"سکتا\",\n \"سکتی\",\n \"سکتے\",\n \"والا\",\n \"والی\",\n \"والے\",\n]);\n\nfunction toStopWordSet(custom?: Set<string> | string[]): Set<string> {\n if (!custom) return URDU_STOP_WORDS;\n if (custom instanceof Set) return custom;\n return new Set(custom.map((w) => normalizeUrdu(w.trim())));\n}\n\n/**\n * Checks if a given Urdu word is a stop word.\n *\n * @param word - Word to test.\n * @param customStopWords - Optional custom stop words set or array. Defaults to {@link URDU_STOP_WORDS}.\n *\n * @example\n * isStopWord(\"اور\") // true\n * isStopWord(\"کتاب\") // false\n */\nexport function isStopWord(word: string, customStopWords?: Set<string> | string[]): boolean {\n if (!word) return false;\n const normalized = normalizeUrdu(word.trim());\n const stopSet = toStopWordSet(customStopWords);\n return stopSet.has(normalized);\n}\n\n/**\n * Filters out stop words from an array of words.\n *\n * @param words - Array of words to filter.\n * @param customStopWords - Optional custom stop words set or array.\n *\n * @example\n * filterStopWords([\"یہ\", \"ایک\", \"اچھی\", \"کتاب\", \"ہے\"]) // [\"اچھی\", \"کتاب\"]\n */\nexport function filterStopWords(\n words: string[],\n customStopWords?: Set<string> | string[],\n): string[] {\n if (!words || words.length === 0) return [];\n const stopSet = toStopWordSet(customStopWords);\n return words.filter((w) => {\n const normalized = normalizeUrdu(w.trim());\n return normalized.length > 0 && !stopSet.has(normalized);\n });\n}\n\n/**\n * Removes stop words from an Urdu text string, returning the cleaned text.\n *\n * @param text - Input Urdu text.\n * @param customStopWords - Optional custom stop words set or array.\n *\n * @example\n * removeStopWords(\"یہ ایک بہترین کتاب ہے\") // \"بہترین کتاب\"\n */\nexport function removeStopWords(text: string, customStopWords?: Set<string> | string[]): string {\n if (!text) return \"\";\n const words = splitWords(text);\n const filtered = filterStopWords(words, customStopWords);\n return filtered.join(\" \");\n}\n","import { foldUrdu } from \"./normalize.js\";\nimport { URDU_LETTERS } from \"./chars.js\";\n\n/**\n * Urdu alphabetical order (حروف تہجی).\n *\n * `Intl.Collator(\"ur\")` is not usable here: in most runtimes the `ur` locale\n * falls back to root Arabic collation, which orders ک/گ/ٹ/ڈ/ڑ/ں/ے by codepoint\n * instead of by their place in the Urdu alphabet. So the order comes from the\n * shared letter inventory in {@link URDU_LETTERS} (chars.ts), which lists the\n * alphabet in collation order.\n *\n * Hamza variants (ؤ, ئ, ۂ, ۓ) carry {@link UrduLetter.variantOf}: they get the\n * weight of their base letter plus a tiebreaker, so `پاؤں` sorts next to `پاوں`\n * rather than at the end of the list.\n */\n\n/** Letters with their own primary weight; hamza variants collate with their base. */\nconst PRIMARY_LETTERS = URDU_LETTERS.filter((letter) => letter.variantOf === undefined);\n\nconst WEIGHTS = new Map<string, [number, number]>();\nPRIMARY_LETTERS.forEach((letter, index) => WEIGHTS.set(letter.ch, [(index + 1) * 10, 0]));\nfor (const letter of URDU_LETTERS) {\n if (letter.variantOf === undefined) continue;\n const baseWeight = WEIGHTS.get(letter.variantOf);\n if (baseWeight) WEIGHTS.set(letter.ch, [baseWeight[0], 1]);\n}\n\n/** Non-alphabet characters sort after every Urdu letter, ordered by codepoint. */\nconst NON_LETTER_BASE = (PRIMARY_LETTERS.length + 1) * 10;\n\nfunction weightsOf(text: string): number[] {\n const out: number[] = [];\n for (const ch of text) {\n const weight = WEIGHTS.get(ch);\n if (weight) {\n out.push(weight[0], weight[1]);\n } else if (ch === \" \") {\n out.push(1, 0); // spaces sort before letters, so \"ابو بکر\" precedes \"ابوبکر\"\n } else {\n out.push(NON_LETTER_BASE + (ch.codePointAt(0) ?? 0), 0);\n }\n }\n return out;\n}\n\n/**\n * Comparator for Urdu strings, usable directly in `Array.prototype.sort`.\n * Diacritics and Unicode variants are folded first, so spelling noise does not\n * change the order.\n */\nexport function compareUrdu(a: string, b: string): number {\n const left = weightsOf(foldUrdu(a));\n const right = weightsOf(foldUrdu(b));\n const length = Math.min(left.length, right.length);\n for (let i = 0; i < length; i++) {\n const diff = left[i]! - right[i]!;\n if (diff !== 0) return diff;\n }\n return left.length - right.length;\n}\n\nexport interface SortOptions<T> {\n /** Sort descending. Default `false`. */\n descending?: boolean;\n /** Read the sort key out of each item, for sorting objects. */\n getText?: (item: T) => string;\n}\n\n/**\n * Sort strings in Urdu alphabetical order.\n *\n * @example\n * sortUrdu([\"گل\", \"آم\", \"بادام\"]) // [\"آم\", \"بادام\", \"گل\"]\n */\nexport function sortUrdu<T>(items: readonly T[], options: SortOptions<T> = {}): T[] {\n const { descending = false, getText } = options;\n const key = getText ?? ((item: T) => String(item));\n const sorted = [...items].sort((a, b) => compareUrdu(key(a), key(b)));\n return descending ? sorted.reverse() : sorted;\n}\n","import { foldUrdu, normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\n\nexport interface SearchOptions<T> {\n /** Read the searchable text out of each item, for searching objects. */\n getText?: (item: T) => string;\n /**\n * Allow small spelling differences via edit distance on individual words.\n * Costs O(query x item) per candidate word, so it runs only after the exact\n * substring pass fails. Default `false`.\n */\n fuzzy?: boolean;\n /** Maximum edit distance per word when `fuzzy` is on. Default `1`. */\n maxDistance?: number;\n /** Cap the number of results. */\n limit?: number;\n /** Return matches ordered by score (best first) instead of input order. Default `true`. */\n sortByScore?: boolean;\n}\n\nexport interface SearchResult<T> {\n item: T;\n /** 1 = exact fold match, 0.9 = prefix, 0.8 = substring, lower = fuzzy word match. */\n score: number;\n}\n\n/** Levenshtein distance with early exit once the limit is exceeded. */\nexport function editDistance(a: string, b: string, limit = Infinity): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > limit) return limit + 1;\n\n let previous = Array.from({ length: b.length + 1 }, (_, i) => i);\n let current = new Array<number>(b.length + 1);\n\n for (let i = 1; i <= a.length; i++) {\n current[0] = i;\n let rowMin = current[0]!;\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n current[j] = Math.min(current[j - 1]! + 1, previous[j]! + 1, previous[j - 1]! + cost);\n rowMin = Math.min(rowMin, current[j]!);\n }\n if (rowMin > limit) return limit + 1;\n [previous, current] = [current, previous];\n }\n return previous[b.length]!;\n}\n\nfunction scoreOf(query: string, text: string, options: { fuzzy: boolean; maxDistance: number }): number {\n if (!query) return 0;\n if (text === query) return 1;\n if (text.startsWith(query)) return 0.9;\n if (text.includes(query)) return 0.8;\n\n if (!options.fuzzy) return 0;\n\n // Compare word by word: a one-letter typo inside a long sentence should still hit.\n const queryWords = splitWords(query);\n const textWords = splitWords(text);\n if (queryWords.length === 0 || textWords.length === 0) return 0;\n\n let matched = 0;\n for (const qw of queryWords) {\n const limit = Math.min(options.maxDistance, Math.max(1, Math.floor(qw.length / 3)));\n const hit = textWords.some(\n (tw) => tw.includes(qw) || editDistance(qw, tw, limit) <= limit,\n );\n if (hit) matched++;\n }\n if (matched === 0) return 0;\n return (matched / queryWords.length) * 0.7;\n}\n\n/**\n * Search a list of Urdu strings, ignoring diacritics and Unicode variant spellings.\n *\n * Both sides are folded with {@link foldUrdu} first, so `محمد` matches `مُحَمَّد`\n * and Arabic-keyboard `محمد` (with ه/ي) matches Urdu-keyboard `محمد`.\n *\n * @example\n * searchUrdu(\"محمد\", [\"مُحَمَّد علی\", \"احمد\", \"محمد خان\"])\n * // [\"مُحَمَّد علی\", \"محمد خان\"]\n */\nexport function searchUrdu<T = string>(\n query: string,\n items: readonly T[],\n options: SearchOptions<T> = {},\n): T[] {\n return searchUrduRanked(query, items, options).map((r) => r.item);\n}\n\n/** Same as {@link searchUrdu} but keeps the match scores. */\nexport function searchUrduRanked<T = string>(\n query: string,\n items: readonly T[],\n options: SearchOptions<T> = {},\n): Array<SearchResult<T>> {\n const { getText, fuzzy = false, maxDistance = 1, limit, sortByScore = true } = options;\n const read = getText ?? ((item: T) => String(item));\n\n const folded = foldUrdu(query);\n if (!folded) return [];\n\n const results: Array<SearchResult<T>> = [];\n for (const item of items) {\n const score = scoreOf(folded, foldUrdu(read(item)), { fuzzy, maxDistance });\n if (score > 0) results.push({ item, score });\n }\n\n if (sortByScore) results.sort((a, b) => b.score - a.score);\n return limit === undefined ? results : results.slice(0, limit);\n}\n\n/**\n * Highlight every occurrence of `query` in `text` by wrapping it.\n * Matching is diacritic-insensitive, but the returned string keeps the original\n * spelling and diacritics intact — offsets are mapped back to the source.\n */\nexport function highlightUrdu(\n text: string,\n query: string,\n wrap: (match: string) => string = (m) => `<mark>${m}</mark>`,\n): string {\n const foldedQuery = foldUrdu(query);\n if (!foldedQuery || !text) return text;\n\n // Fold character by character so folded offsets map back to source offsets.\n const sourceChars = [...text];\n const foldedChars: string[] = [];\n const sourceIndexOf: number[] = [];\n sourceChars.forEach((ch, i) => {\n // Per-character folding must keep whitespace, otherwise multi-word queries\n // could never match: foldUrdu() trims, and a lone space would fold to \"\".\n const folded = normalizeUrdu(ch, {\n stripDiacritics: true,\n stripZwnj: true,\n collapseWhitespace: false,\n }).toLowerCase();\n for (const f of folded) {\n foldedChars.push(f);\n sourceIndexOf.push(i);\n }\n });\n\n const haystack = foldedChars.join(\"\");\n let out = \"\";\n let cursor = 0; // index into sourceChars\n let from = 0; // index into haystack\n\n for (;;) {\n const hit = haystack.indexOf(foldedQuery, from);\n if (hit === -1) break;\n const startSource = sourceIndexOf[hit]!;\n const endSource = (sourceIndexOf[hit + foldedQuery.length - 1] ?? startSource) + 1;\n out += sourceChars.slice(cursor, startSource).join(\"\");\n out += wrap(sourceChars.slice(startSource, endSource).join(\"\"));\n cursor = endSource;\n from = hit + foldedQuery.length;\n }\n\n out += sourceChars.slice(cursor).join(\"\");\n return out;\n}\n","/**\n * Urdu -> Roman Urdu dictionary for the transliteration layer.\n *\n * Every entry here is a word the rule engine would otherwise get wrong, because\n * Urdu script omits short vowels: the rules see کتاب as k-t-aa-b and cannot know\n * that a reader supplies \"kitaab\". So the dictionary carries the vowels and the\n * rules only handle whatever falls through.\n *\n * Roman spellings follow the most common conventions in Pakistani usage\n * (`kaisay`, `bohat`, `mohabbat`) rather than a strict academic scheme, since the\n * output is meant for slugs, search keys and human readers.\n *\n * The reverse direction is derived from this map, so a duplicate Roman value\n * means the later Urdu word wins as the reverse target. Where that matters, the\n * preferred reverse form is pinned explicitly in `transliterate.ts` or `ROMAN_VARIANTS`.\n */\nexport const WORD_DICTIONARY: Record<string, string> = {\n // ---- pronouns, determiners, question words ----\n \"میں\": \"mein\",\n \"ہم\": \"hum\",\n \"تم\": \"tum\",\n \"آپ\": \"aap\",\n \"وہ\": \"woh\",\n \"یہ\": \"yeh\",\n \"میرا\": \"mera\",\n \"میری\": \"meri\",\n \"میرے\": \"mere\",\n \"ہمارا\": \"hamara\",\n \"ہماری\": \"hamari\",\n \"ہمارے\": \"hamaray\",\n \"تمہارا\": \"tumhara\",\n \"تمہاری\": \"tumhari\",\n \"تمہارے\": \"tumharay\",\n \"آپکا\": \"aapka\",\n \"آپکی\": \"aapki\",\n \"آپکے\": \"aapke\",\n \"اس\": \"is\",\n \"اسکا\": \"iska\",\n \"اسکی\": \"iski\",\n \"اسکے\": \"iske\",\n \"ان\": \"un\",\n \"انکا\": \"unka\",\n \"انکی\": \"unki\",\n \"انکے\": \"unke\",\n \"مجھے\": \"mujhe\",\n \"ہمیں\": \"humein\",\n \"تمہیں\": \"tumhein\",\n \"انہیں\": \"unhein\",\n \"اسے\": \"isay\",\n \"جسے\": \"jisay\",\n \"کسے\": \"kisay\",\n \"کس\": \"kis\",\n \"کسکا\": \"kiska\",\n \"کسکی\": \"kiski\",\n \"کسکے\": \"kiske\",\n \"کسکو\": \"kisko\",\n \"جن\": \"jin\",\n \"جنکا\": \"jinka\",\n \"جنکی\": \"jinki\",\n \"جنکے\": \"jinke\",\n \"جنہوں\": \"jinhon\",\n \"انہوں\": \"unhon\",\n \"اپنا\": \"apna\",\n \"اپنی\": \"apni\",\n \"اپنے\": \"apnay\",\n \"خود\": \"khud\",\n \"کون\": \"kaun\",\n \"کیا\": \"kya\",\n \"کہاں\": \"kahan\",\n \"کدھر\": \"kidhar\",\n \"ادھر\": \"idhar\",\n \"جدھر\": \"jidhar\",\n \"کب\": \"kab\",\n \"کیوں\": \"kyun\",\n \"کیسے\": \"kaisay\",\n \"کیسا\": \"kaisa\",\n \"کیسی\": \"kaisi\",\n \"کتنا\": \"kitna\",\n \"کتنی\": \"kitni\",\n \"کتنے\": \"kitnay\",\n \"جو\": \"jo\",\n \"جس\": \"jis\",\n \"جسکو\": \"jisko\",\n \"جسکا\": \"jiska\",\n \"جسکی\": \"jiski\",\n \"جسکے\": \"jiske\",\n \"سب\": \"sab\",\n \"سبھی\": \"sabhi\",\n \"کوئی\": \"koi\",\n \"کچھ\": \"kuch\",\n \"ہر\": \"har\",\n \"ایک\": \"aik\",\n\n // ---- function words, prepositions, conjunctions ----\n \"اور\": \"aur\",\n \"یا\": \"ya\",\n \"اگر\": \"agar\",\n \"لیکن\": \"lekin\",\n \"مگر\": \"magar\",\n \"تو\": \"to\",\n \"بھی\": \"bhi\",\n \"نہ\": \"na\",\n \"نہیں\": \"nahi\",\n \"مت\": \"mat\",\n \"کا\": \"ka\",\n \"کی\": \"ki\",\n \"کے\": \"ke\",\n \"کو\": \"ko\",\n \"نے\": \"ne\",\n \"سے\": \"se\",\n \"پر\": \"par\",\n \"تک\": \"tak\",\n \"لیے\": \"liye\",\n \"ساتھ\": \"sath\",\n \"بغیر\": \"baghair\",\n \"وجہ\": \"wajah\",\n \"طرح\": \"tarah\",\n \"طرف\": \"taraf\",\n \"بارے\": \"baray\",\n \"بعد\": \"baad\",\n \"پہلے\": \"pehlay\",\n \"دوران\": \"doran\",\n \"درمیان\": \"darmiyan\",\n \"علاوہ\": \"alawa\",\n \"سوائے\": \"siwaye\",\n \"سوا\": \"siwa\",\n \"مطابق\": \"mutabiq\",\n \"باعث\": \"baais\",\n \"ذریعے\": \"zariye\",\n \"تحت\": \"tehat\",\n \"خلاف\": \"khilaf\",\n \"حق\": \"haq\",\n \"حتی\": \"hatta\",\n \"گویا\": \"goya\",\n \"چنانچہ\": \"chunancha\",\n \"خواہ\": \"khwah\",\n \"چاہے\": \"chahe\",\n \"بلکہ\": \"balkeh\",\n \"حالانکہ\": \"halankeh\",\n \"چونکہ\": \"chunkeh\",\n \"کیونکہ\": \"kyunkeh\",\n \"تاکہ\": \"taakeh\",\n \"ورنہ\": \"warna\",\n \"البتہ\": \"albatta\",\n \"مثلاً\": \"maslan\",\n \"یعنی\": \"yaani\",\n \"خصوصاً\": \"khasosan\",\n \"عموماً\": \"amuman\",\n \"فوراً\": \"fauran\",\n \"دوبارہ\": \"dobara\",\n \"یقیناً\": \"yaqeenan\",\n \"تقریباً\": \"taqreeban\",\n \"بعض\": \"baaz\",\n \"تمام\": \"tamam\",\n \"پورا\": \"poora\",\n \"پوری\": \"poori\",\n \"پورے\": \"pooray\",\n \"آدھا\": \"aadha\",\n \"دونوں\": \"donon\",\n \"تینوں\": \"teenon\",\n \"چاروں\": \"charon\",\n \"سارا\": \"sara\",\n \"ساری\": \"sari\",\n \"سارے\": \"saray\",\n \"باقی\": \"baqi\",\n\n // ---- place and direction ----\n \"یہاں\": \"yahan\",\n \"وہاں\": \"wahan\",\n \"کہیں\": \"kahin\",\n \"وہیں\": \"wahin\",\n \"یہیں\": \"yahin\",\n \"سامنے\": \"samnay\",\n \"پیچھے\": \"peechay\",\n \"آگے\": \"agay\",\n \"اوپر\": \"oopar\",\n \"نیچے\": \"neechay\",\n \"اندر\": \"andar\",\n \"باہر\": \"bahar\",\n \"پاس\": \"paas\",\n \"دور\": \"door\",\n \"قریب\": \"qareeb\",\n \"دائیں\": \"dayen\",\n \"بائیں\": \"bayen\",\n \"سیدھا\": \"seedha\",\n \"الٹا\": \"ulta\",\n \"شمال\": \"shumal\",\n \"جنوب\": \"janoob\",\n \"مشرق\": \"mashriq\",\n \"مغرب\": \"maghrib\",\n \"وسط\": \"wast\",\n\n // ---- to be, and tense auxiliaries ----\n \"ہے\": \"hai\",\n \"ہیں\": \"hain\",\n \"ہوں\": \"hoon\",\n \"ہو\": \"ho\",\n \"تھا\": \"tha\",\n \"تھی\": \"thi\",\n \"تھے\": \"thay\",\n \"تھیں\": \"thein\",\n \"ہوگا\": \"hoga\",\n \"ہوگی\": \"hogi\",\n \"ہونگے\": \"honge\",\n \"ہوںگے\": \"honge\",\n \"ہونا\": \"hona\",\n \"ہوا\": \"hua\",\n \"ہوئی\": \"hui\",\n \"ہوئے\": \"hue\",\n\n // ---- common verbs & inflections ----\n \"کرنا\": \"karna\",\n \"کرتا\": \"karta\",\n \"کرتی\": \"karti\",\n \"کرتے\": \"karte\",\n \"کریں\": \"karain\",\n \"کرو\": \"karo\",\n \"کر\": \"kar\",\n \"کرنے\": \"karne\",\n \"کیے\": \"kiye\",\n \"جانا\": \"jana\",\n \"جاتا\": \"jata\",\n \"جاتی\": \"jati\",\n \"جاتے\": \"jate\",\n \"جائے\": \"jaye\",\n \"جائیں\": \"jayen\",\n \"جاؤ\": \"jao\",\n \"جا\": \"ja\",\n \"جانے\": \"jane\",\n \"گیا\": \"gaya\",\n \"گئی\": \"gayi\",\n \"گئے\": \"gaye\",\n \"آنا\": \"aana\",\n \"آتا\": \"aata\",\n \"آتی\": \"aati\",\n \"آتے\": \"aate\",\n \"آئے\": \"aaye\",\n \"آئیں\": \"aayen\",\n \"آیا\": \"aaya\",\n \"آئی\": \"aayi\",\n \"آنے\": \"aane\",\n \"آؤ\": \"aao\",\n \"آ\": \"aa\",\n \"دینا\": \"dena\",\n \"دیتا\": \"deta\",\n \"دیتی\": \"deti\",\n \"دیتے\": \"dete\",\n \"دیا\": \"diya\",\n \"دیے\": \"diye\",\n \"دے\": \"de\",\n \"دو\": \"do\",\n \"دیں\": \"dain\",\n \"دینے\": \"dene\",\n \"لینا\": \"lena\",\n \"لیتا\": \"leta\",\n \"لیتی\": \"leti\",\n \"لیتے\": \"lete\",\n \"لیا\": \"liya\",\n \"لے\": \"le\",\n \"لو\": \"lo\",\n \"لیں\": \"lain\",\n \"لینے\": \"lene\",\n \"کہنا\": \"kehna\",\n \"کہا\": \"kaha\",\n \"کہتا\": \"kehta\",\n \"کہتی\": \"kehti\",\n \"کہتے\": \"kehte\",\n \"کہو\": \"kaho\",\n \"کہنے\": \"kehne\",\n \"دیکھنا\": \"dekhna\",\n \"دیکھا\": \"dekha\",\n \"دیکھو\": \"dekho\",\n \"دیکھتا\": \"dekhta\",\n \"دیکھتی\": \"dekhti\",\n \"دیکھتے\": \"dekhte\",\n \"دیکھنے\": \"dekhne\",\n \"سننا\": \"sunna\",\n \"سنا\": \"suna\",\n \"سنو\": \"suno\",\n \"سنتا\": \"sunta\",\n \"سنتی\": \"sunti\",\n \"سنتے\": \"sunte\",\n \"سننے\": \"sunne\",\n \"بولنا\": \"bolna\",\n \"بولا\": \"bola\",\n \"بولو\": \"bolo\",\n \"بولتا\": \"bolta\",\n \"پڑھنا\": \"parhna\",\n \"پڑھا\": \"parha\",\n \"پڑھو\": \"parho\",\n \"پڑھتا\": \"parhta\",\n \"پڑھتی\": \"parhti\",\n \"پڑھتے\": \"parhte\",\n \"پڑھنے\": \"parhne\",\n \"لکھنا\": \"likhna\",\n \"لکھا\": \"likha\",\n \"لکھو\": \"likho\",\n \"لکھتا\": \"likhta\",\n \"لکھتی\": \"likhti\",\n \"لکھتے\": \"likhte\",\n \"لکھنے\": \"likhne\",\n \"سمجھنا\": \"samajhna\",\n \"سمجھا\": \"samjha\",\n \"سمجھ\": \"samajh\",\n \"سمجھو\": \"samjho\",\n \"سمجھنے\": \"samajhne\",\n \"سمجھانا\": \"samjhana\",\n \"سمجھایا\": \"samjhaya\",\n \"جاننا\": \"janna\",\n \"جانتا\": \"janta\",\n \"جانتی\": \"janti\",\n \"جانتے\": \"jante\",\n \"معلوم\": \"maloom\",\n \"چاہنا\": \"chahna\",\n \"چاہتا\": \"chahta\",\n \"چاہتی\": \"chahti\",\n \"چاہتے\": \"chahte\",\n \"چاہیے\": \"chahiye\",\n \"سکنا\": \"sakna\",\n \"سکتا\": \"sakta\",\n \"سکتی\": \"sakti\",\n \"سکتے\": \"sakte\",\n \"رہنا\": \"rehna\",\n \"رہا\": \"raha\",\n \"رہی\": \"rahi\",\n \"رہے\": \"rahe\",\n \"رہتا\": \"rehta\",\n \"رہتی\": \"rehti\",\n \"رہتے\": \"rehte\",\n \"رہنے\": \"rehne\",\n \"بننا\": \"banna\",\n \"بنانا\": \"banana\",\n \"بنایا\": \"banaya\",\n \"بنائی\": \"banayi\",\n \"بنائے\": \"banaye\",\n \"بنا\": \"bana\",\n \"ملنا\": \"milna\",\n \"ملا\": \"mila\",\n \"ملتا\": \"milta\",\n \"ملتی\": \"milti\",\n \"ملتے\": \"milte\",\n \"ملی\": \"mili\",\n \"ملے\": \"mile\",\n \"ملانا\": \"milana\",\n \"کھانا\": \"khana\",\n \"کھایا\": \"khaya\",\n \"کھاؤ\": \"khao\",\n \"کھاتا\": \"khata\",\n \"کھاتی\": \"khati\",\n \"پینا\": \"peena\",\n \"پیا\": \"piya\",\n \"پیو\": \"peeyo\",\n \"پیتا\": \"peeta\",\n \"سونا\": \"sona\",\n \"سویا\": \"soya\",\n \"سوتے\": \"sote\",\n \"اٹھنا\": \"uthna\",\n \"اٹھا\": \"utha\",\n \"اٹھو\": \"utho\",\n \"اٹھانا\": \"uthana\",\n \"اٹھایا\": \"uthaya\",\n \"بیٹھنا\": \"baithna\",\n \"بیٹھا\": \"baitha\",\n \"بیٹھو\": \"baitho\",\n \"چلنا\": \"chalna\",\n \"چلا\": \"chala\",\n \"چلو\": \"chalo\",\n \"چلتا\": \"chalta\",\n \"چلتی\": \"chalti\",\n \"چلتے\": \"chalte\",\n \"چلانا\": \"chalana\",\n \"چلایا\": \"chalaya\",\n \"دوڑنا\": \"daurna\",\n \"دوڑا\": \"daura\",\n \"بھاگنا\": \"bhagna\",\n \"بھاگا\": \"bhaga\",\n \"لانا\": \"lana\",\n \"لایا\": \"laya\",\n \"لائے\": \"laye\",\n \"لائی\": \"layi\",\n \"لاؤ\": \"lao\",\n \"رکھنا\": \"rakhna\",\n \"رکھا\": \"rakha\",\n \"رکھو\": \"rakho\",\n \"رکھتے\": \"rakhte\",\n \"مانگنا\": \"mangna\",\n \"مانگا\": \"manga\",\n \"پوچھنا\": \"poochna\",\n \"پوچھا\": \"poocha\",\n \"پوچھو\": \"poocho\",\n \"بتانا\": \"batana\",\n \"بتایا\": \"bataya\",\n \"بتاؤ\": \"batao\",\n \"کھولنا\": \"kholna\",\n \"کھولا\": \"khola\",\n \"کھلا\": \"khula\",\n \"مرنا\": \"marna\",\n \"مرا\": \"mara\",\n \"مرگیا\": \"margaya\",\n \"جینا\": \"jeena\",\n \"جیا\": \"jiya\",\n \"مارنا\": \"maarna\",\n \"مارا\": \"maara\",\n \"مارو\": \"maaro\",\n \"بچانا\": \"bachana\",\n \"بچایا\": \"bachaya\",\n \"بچنا\": \"bachna\",\n \"بچا\": \"bacha\",\n \"جلانا\": \"jalana\",\n \"جلایا\": \"jalaya\",\n \"جلنا\": \"jalna\",\n \"جلا\": \"jala\",\n \"بجھانا\": \"bujhana\",\n \"بجھنا\": \"bujhna\",\n \"ناچنا\": \"nachna\",\n \"گانا\": \"gana\",\n \"گایا\": \"gaya\",\n \"لڑنا\": \"larna\",\n \"لڑا\": \"lara\",\n \"جیتنا\": \"jeetna\",\n \"جیتا\": \"jeeta\",\n \"ہارنا\": \"haarna\",\n \"ہارا\": \"haara\",\n \"چھپانا\": \"chhupana\",\n \"چھپنا\": \"chhupna\",\n \"ڈھونڈنا\": \"dhoondna\",\n \"ڈھونڈا\": \"dhoonda\",\n \"بدلنا\": \"badalna\",\n \"بدلا\": \"badla\",\n \"رکنا\": \"rukna\",\n \"روکنا\": \"rokna\",\n \"روکا\": \"roka\",\n \"اڑنا\": \"urna\",\n \"اڑانا\": \"urana\",\n \"تیرنا\": \"tairna\",\n \"کھیلنا\": \"khelna\",\n \"کھیلا\": \"khela\",\n \"کھیلتا\": \"khelta\",\n \"ہنسنا\": \"hansna\",\n \"ہنسا\": \"hansa\",\n \"رونا\": \"rona\",\n \"رویا\": \"roya\",\n \"ڈرنا\": \"darna\",\n \"ڈرا\": \"dara\",\n \"ڈرانا\": \"darana\",\n \"بھولنا\": \"bhoolna\",\n \"بھولا\": \"bhoola\",\n \"یاد\": \"yaad\",\n \"سیکھنا\": \"seekhna\",\n \"سیکھا\": \"seekha\",\n \"سکھانا\": \"sikhana\",\n \"سکھایا\": \"sikhaya\",\n \"پکانا\": \"pakana\",\n \"پکایا\": \"pakaya\",\n \"پکنا\": \"pakna\",\n \"پکا\": \"paka\",\n \"دھونا\": \"dhona\",\n \"دھویا\": \"dhoya\",\n \"پہننا\": \"pehanna\",\n \"پہنا\": \"pehna\",\n \"اتارنا\": \"utarna\",\n \"اتارا\": \"utara\",\n \"اترو\": \"utro\",\n \"اترنا\": \"utarna\",\n \"بیچنا\": \"bechna\",\n \"بیچا\": \"becha\",\n \"خریدنا\": \"khareedna\",\n \"خریدا\": \"khareeda\",\n \"بھیجنا\": \"bhejna\",\n \"بھیجا\": \"bheja\",\n \"پہنچنا\": \"pohanchna\",\n \"پہنچا\": \"pohancha\",\n \"پہنچانا\": \"pohonchana\",\n \"نکلنا\": \"nikalna\",\n \"نکلا\": \"nikla\",\n \"نکالنا\": \"nikalna\",\n \"نکالا\": \"nikala\",\n \"گرنا\": \"girna\",\n \"گرا\": \"gira\",\n \"گرانا\": \"girana\",\n \"پکڑنا\": \"pakarna\",\n \"پکڑا\": \"pakra\",\n \"چھوڑنا\": \"chhorna\",\n \"چھوڑا\": \"chhora\",\n \"توڑنا\": \"torna\",\n \"توڑا\": \"tora\",\n \"ٹوٹنا\": \"tootna\",\n \"جوڑنا\": \"jorna\",\n \"جوڑا\": \"jora\",\n \"کاٹنا\": \"katna\",\n \"کاٹا\": \"kata\",\n \"ڈالنا\": \"daalna\",\n \"ڈالا\": \"dala\",\n \"ماننا\": \"manna\",\n \"مانا\": \"mana\",\n \"پہچاننا\": \"pehchanna\",\n \"پہچانا\": \"pehchana\",\n \"بلانا\": \"bulana\",\n \"بلایا\": \"bulaya\",\n \"پکارنا\": \"pukarna\",\n \"دکھانا\": \"dikhana\",\n \"دکھایا\": \"dikhaya\",\n \"سنانا\": \"sunana\",\n \"سنایا\": \"sunaya\",\n \"پھینکنا\": \"phenkna\",\n \"پھینکا\": \"phenka\",\n \"کھینچنا\": \"kheinchna\",\n \"کھینچا\": \"kheincha\",\n \"لیٹنا\": \"letna\",\n \"جاگنا\": \"jagna\",\n \"جگانا\": \"jagana\",\n \"کھلانا\": \"khilana\",\n \"پلانا\": \"pilana\",\n \"پلٹنا\": \"palatna\",\n \"لوٹنا\": \"lautna\",\n \"ٹوکنا\": \"tokna\",\n \"گزارنا\": \"guzarna\",\n \"گزرنا\": \"guzarna\",\n \"گزر\": \"guzar\",\n \"بیتنا\": \"beetna\",\n \"جھگڑنا\": \"jhagarna\",\n \"سہنا\": \"sehna\",\n \"کمانا\": \"kamana\",\n \"کمایا\": \"kamaya\",\n \"چھونا\": \"chhoona\",\n \"چکھنا\": \"chakhna\",\n \"سونگھنا\": \"soonghna\",\n \"گننا\": \"ginna\",\n \"تولنا\": \"tolna\",\n \"ناپنا\": \"naapna\",\n \"باندھنا\": \"bandhna\",\n \"باندھا\": \"bandha\",\n \"بھرنا\": \"bharna\",\n \"بھرا\": \"bhara\",\n \"ڈوبنا\": \"doobna\",\n \"ڈوبا\": \"dooba\",\n \"چمکنا\": \"chamakna\",\n \"چمکا\": \"chamka\",\n \"مہکنا\": \"mehakna\",\n \"گھومنا\": \"ghoomna\",\n \"پھرنا\": \"phirna\",\n \"چھیننا\": \"chheenna\",\n \"پھیلنا\": \"phailna\",\n \"پھیلانا\": \"phailana\",\n \"سمٹنا\": \"simatna\",\n \"والا\": \"wala\",\n \"والی\": \"wali\",\n \"والے\": \"walay\",\n \"شروع\": \"shuru\",\n \"ختم\": \"khatam\",\n \"بند\": \"band\",\n \"پیدا\": \"paida\",\n\n // ---- people and family ----\n \"آدمی\": \"aadmi\",\n \"عورت\": \"aurat\",\n \"لڑکا\": \"larka\",\n \"لڑکی\": \"larki\",\n \"لڑکے\": \"larke\",\n \"لڑکیاں\": \"larkiyan\",\n \"بچہ\": \"bacha\",\n \"بچی\": \"bachi\",\n \"بچے\": \"bache\",\n \"بچوں\": \"bachon\",\n \"ماں\": \"maan\",\n \"باپ\": \"baap\",\n \"والد\": \"walid\",\n \"والدہ\": \"walida\",\n \"والدین\": \"walidain\",\n \"امی\": \"ammi\",\n \"ابو\": \"abbu\",\n \"بھائی\": \"bhai\",\n \"بہن\": \"behan\",\n \"باجی\": \"baji\",\n \"آپی\": \"api\",\n \"بیٹا\": \"beta\",\n \"بیٹی\": \"beti\",\n \"بیٹے\": \"bete\",\n \"بیٹیاں\": \"betiyan\",\n \"پوتا\": \"pota\",\n \"پوتی\": \"poti\",\n \"نواسا\": \"nawasa\",\n \"نواسی\": \"nawasi\",\n \"دادا\": \"dada\",\n \"دادی\": \"dadi\",\n \"نانا\": \"nana\",\n \"نانی\": \"nani\",\n \"چچا\": \"chacha\",\n \"چچی\": \"chachi\",\n \"ماموں\": \"mamoon\",\n \"ممانی\": \"mami\",\n \"خالہ\": \"khala\",\n \"خالو\": \"khalu\",\n \"پھوپھی\": \"phupi\",\n \"پھوپھا\": \"phupha\",\n \"شوہر\": \"shauhar\",\n \"بیوی\": \"biwi\",\n \"دولہا\": \"dulha\",\n \"دلہن\": \"dulhan\",\n \"شادی\": \"shaadi\",\n \"نکاح\": \"nikah\",\n \"رشتہ\": \"rishta\",\n \"خاندان\": \"khandan\",\n \"مہمان\": \"mehman\",\n \"میزبان\": \"mezban\",\n \"دوست\": \"dost\",\n \"دشمن\": \"dushman\",\n \"پڑوسی\": \"parosi\",\n \"ہمسایہ\": \"humsaya\",\n \"ساتھی\": \"sathi\",\n \"بزرگ\": \"buzurg\",\n \"جوان\": \"jawan\",\n \"نوجوان\": \"naujawan\",\n \"بوڑھا\": \"boorha\",\n \"بوڑھی\": \"boorhi\",\n \"انسان\": \"insan\",\n \"لوگ\": \"log\",\n \"عوام\": \"awam\",\n \"شخص\": \"shakhs\",\n \"فرد\": \"fard\",\n\n // ---- professions & roles ----\n \"استاد\": \"ustad\",\n \"استانی\": \"ustani\",\n \"طالب\": \"talib\",\n \"شاگرد\": \"shagird\",\n \"ڈاکٹر\": \"doctor\",\n \"حکیم\": \"hakeem\",\n \"طبیب\": \"tabeeb\",\n \"نرس\": \"nurse\",\n \"سرجن\": \"surgeon\",\n \"وکیل\": \"wakeel\",\n \"جج\": \"judge\",\n \"منصف\": \"munsif\",\n \"کسان\": \"kisan\",\n \"زمیندار\": \"zameendar\",\n \"مزدور\": \"mazdoor\",\n \"کاریگر\": \"karigar\",\n \"درزی\": \"darzi\",\n \"موچی\": \"mochi\",\n \"دھوبی\": \"dhobi\",\n \"حجام\": \"hajam\",\n \"نائی\": \"nai\",\n \"باورچی\": \"bawarchi\",\n \"خانساماں\": \"khansama\",\n \"چوکیدار\": \"chowkidar\",\n \"گارڈ\": \"guard\",\n \"پولیس\": \"police\",\n \"سپاہی\": \"sipahi\",\n \"فوجی\": \"fauji\",\n \"افسر\": \"afsar\",\n \"مینیجر\": \"manager\",\n \"ڈائریکٹر\": \"director\",\n \"صدر\": \"sadar\",\n \"وزیر\": \"wazeer\",\n \"سفیر\": \"safeer\",\n \"تاجر\": \"tajir\",\n \"دکاندار\": \"dukandar\",\n \"ڈرائیور\": \"driver\",\n \"پائلٹ\": \"pilot\",\n \"انجینئر\": \"engineer\",\n \"سائنسدان\": \"sciencedan\",\n \"شاعر\": \"shair\",\n \"ادیب\": \"adeeb\",\n \"مصنف\": \"musannif\",\n \"صحافی\": \"sahafi\",\n \"فنکار\": \"fankar\",\n \"گلوکار\": \"gulokar\",\n \"اداکار\": \"adakar\",\n \"کھلاڑی\": \"khilari\",\n\n // ---- places & buildings ----\n \"گھر\": \"ghar\",\n \"مکان\": \"makan\",\n \"کمرہ\": \"kamra\",\n \"دروازہ\": \"darwaza\",\n \"کھڑکی\": \"khirki\",\n \"چھت\": \"chhat\",\n \"دیوار\": \"deewar\",\n \"فرش\": \"farsh\",\n \"صحن\": \"sehan\",\n \"خانہ\": \"khana\",\n \"مدرسہ\": \"madrasa\",\n \"سکول\": \"school\",\n \"کالج\": \"college\",\n \"یونیورسٹی\": \"university\",\n \"مکتب\": \"maktab\",\n \"جامعہ\": \"jamia\",\n \"لائبریری\": \"library\",\n \"ہسپتال\": \"hospital\",\n \"شفاخانہ\": \"shifakhana\",\n \"کلینک\": \"clinic\",\n \"دواخانہ\": \"dawakhana\",\n \"دکان\": \"dukan\",\n \"مارکیٹ\": \"market\",\n \"بازار\": \"bazaar\",\n \"مال\": \"mall\",\n \"پلازہ\": \"plaza\",\n \"ہوٹل\": \"hotel\",\n \"ریستوران\": \"restaurant\",\n \"ڈھابہ\": \"dhaba\",\n \"مسجد\": \"masjid\",\n \"مندر\": \"mandir\",\n \"گرجا\": \"girja\",\n \"مزار\": \"mazar\",\n \"درگاہ\": \"dargah\",\n \"قبرستان\": \"qabristan\",\n \"شہر\": \"shehar\",\n \"قصبہ\": \"qasba\",\n \"گاؤں\": \"gaon\",\n \"دیہات\": \"dehat\",\n \"ملک\": \"mulk\",\n \"وطن\": \"watan\",\n \"دنیا\": \"dunya\",\n \"جہاں\": \"jahan\",\n \"راستہ\": \"rasta\",\n \"سڑک\": \"sarak\",\n \"گلی\": \"gali\",\n \"کوچہ\": \"koocha\",\n \"محلہ\": \"mohalla\",\n \"چوک\": \"chowk\",\n \"شاہراہ\": \"shahrah\",\n \"پل\": \"pul\",\n \"باغ\": \"bagh\",\n \"پارک\": \"park\",\n \"میدان\": \"maidan\",\n \"اسٹیڈیم\": \"stadium\",\n \"دفتر\": \"daftar\",\n \"تھانہ\": \"thana\",\n \"چوکی\": \"chowki\",\n \"جیل\": \"jail\",\n \"قیدخانہ\": \"qaidkhana\",\n \"عدالت\": \"adalat\",\n \"کچہری\": \"kachehri\",\n \"اسٹیشن\": \"station\",\n \"ایئرپورٹ\": \"airport\",\n \"بندرگاہ\": \"bandargah\",\n \"کارخانہ\": \"karkhana\",\n \"فیکٹری\": \"factory\",\n\n // ---- English loanwords in everyday Urdu ----\n \"کمپیوٹر\": \"computer\",\n \"موبائل\": \"mobile\",\n \"فون\": \"phone\",\n \"انٹرنیٹ\": \"internet\",\n \"بس\": \"bus\",\n \"ٹرین\": \"train\",\n \"کار\": \"car\",\n \"سائیکل\": \"cycle\",\n \"موٹر\": \"motor\",\n \"ٹریفک\": \"traffic\",\n \"سگنل\": \"signal\",\n \"پیٹرول\": \"petrol\",\n \"ڈیزل\": \"diesel\",\n \"گیس\": \"gas\",\n \"بیٹری\": \"battery\",\n \"چارجر\": \"charger\",\n \"کیمرہ\": \"camera\",\n \"ریڈیو\": \"radio\",\n \"ٹیلیویژن\": \"television\",\n \"ٹیلیگرام\": \"telegram\",\n \"ویڈیو\": \"video\",\n \"آڈیو\": \"audio\",\n \"مائیک\": \"mic\",\n \"سپیکر\": \"speaker\",\n \"سکرین\": \"screen\",\n \"سافٹویئر\": \"software\",\n \"ہارڈویئر\": \"hardware\",\n \"ویب\": \"web\",\n \"ایپ\": \"app\",\n \"ایپلیکیشن\": \"application\",\n \"ایمیل\": \"email\",\n \"میسج\": \"message\",\n \"چیٹ\": \"chat\",\n \"آنلائن\": \"online\",\n \"آفلائن\": \"offline\",\n \"اکاؤنٹ\": \"account\",\n \"پاسورڈ\": \"password\",\n \"سیکیورٹی\": \"security\",\n \"سرور\": \"server\",\n \"نیٹورک\": \"network\",\n \"فائل\": \"file\",\n \"فولڈر\": \"folder\",\n \"لنک\": \"link\",\n \"پوسٹ\": \"post\",\n \"کمنٹ\": \"comment\",\n \"چینل\": \"channel\",\n \"گروپ\": \"group\",\n \"ڈاؤنلوڈ\": \"download\",\n \"اپلوڈ\": \"upload\",\n \"سرچ\": \"search\",\n \"کلک\": \"click\",\n \"ٹائپ\": \"type\",\n \"ٹیسٹ\": \"test\",\n \"نمبر\": \"number\",\n \"کلاس\": \"class\",\n \"ڈگری\": \"degree\",\n \"سسٹم\": \"system\",\n \"پروگرام\": \"program\",\n \"ٹیکنالوجی\": \"technology\",\n \"ڈیٹا\": \"data\",\n \"ٹکٹ\": \"ticket\",\n \"پاسپورٹ\": \"passport\",\n \"ویزا\": \"visa\",\n \"بینک\": \"bank\",\n \"چیک\": \"cheque\",\n \"کارڈ\": \"card\",\n \"ٹیکس\": \"tax\",\n \"بل\": \"bill\",\n \"وارڈ\": \"ward\",\n \"آپریشن\": \"operation\",\n \"ایمبولینس\": \"ambulance\",\n\n // ---- time, calendar, days, months, weather ----\n \"دن\": \"din\",\n \"رات\": \"raat\",\n \"صبح\": \"subah\",\n \"شام\": \"shaam\",\n \"سحر\": \"sehar\",\n \"دوپہر\": \"dopahar\",\n \"پہر\": \"pehar\",\n \"وقت\": \"waqt\",\n \"گھنٹہ\": \"ghanta\",\n \"منٹ\": \"minute\",\n \"سیکنڈ\": \"second\",\n \"لمحہ\": \"lamha\",\n \"ہفتہ\": \"hafta\",\n \"مہینہ\": \"maheena\",\n \"سال\": \"saal\",\n \"صدی\": \"sadi\",\n \"زمانہ\": \"zamana\",\n \"مدت\": \"muddat\",\n \"عمر\": \"umar\",\n \"آج\": \"aaj\",\n \"کل\": \"kal\",\n \"پرسوں\": \"parson\",\n \"ترسوں\": \"tarson\",\n \"ابھی\": \"abhi\",\n \"اب\": \"ab\",\n \"پھر\": \"phir\",\n \"تب\": \"tab\",\n \"جب\": \"jab\",\n \"ہمیشہ\": \"hamesha\",\n \"کبھی\": \"kabhi\",\n \"اکثر\": \"aksar\",\n \"روز\": \"roz\",\n \"روزانہ\": \"rozana\",\n \"ماہانہ\": \"mahana\",\n \"سالانہ\": \"salana\",\n \"پیر\": \"peer\",\n \"منگل\": \"mangal\",\n \"بدھ\": \"budh\",\n \"جمعرات\": \"jumeraat\",\n \"جمعہ\": \"jumma\",\n \"اتوار\": \"itwar\",\n \"جنوری\": \"january\",\n \"فروری\": \"february\",\n \"مارچ\": \"march\",\n \"اپریل\": \"april\",\n \"مئی\": \"may\",\n \"جون\": \"june\",\n \"جولائی\": \"july\",\n \"اگست\": \"august\",\n \"ستمبر\": \"september\",\n \"اکتوبر\": \"october\",\n \"نومبر\": \"november\",\n \"دسمبر\": \"december\",\n \"موسم\": \"mausam\",\n \"گرمی\": \"garmi\",\n \"سردی\": \"sardi\",\n \"بہار\": \"bahaar\",\n \"خزاں\": \"khazan\",\n \"برسات\": \"barsaat\",\n \"بارش\": \"barish\",\n \"دھوپ\": \"dhoop\",\n \"چھاؤں\": \"chhaon\",\n \"بادل\": \"badal\",\n \"برف\": \"baraf\",\n \"اولے\": \"olay\",\n \"کہر\": \"kohar\",\n \"دھند\": \"dhund\",\n \"آندھی\": \"aandhi\",\n \"طوفان\": \"toofan\",\n \"سیلاب\": \"sailab\",\n \"زلزلہ\": \"zalzala\",\n \"آسمان\": \"asman\",\n \"زمین\": \"zameen\",\n \"سورج\": \"sooraj\",\n \"چاند\": \"chand\",\n \"ستارہ\": \"sitara\",\n \"کہکشان\": \"kahkashan\",\n\n // ---- household objects, clothing, tools ----\n \"کتاب\": \"kitaab\",\n \"قلم\": \"qalam\",\n \"کاغذ\": \"kaghaz\",\n \"دوات\": \"dawat\",\n \"سیاہی\": \"siyahi\",\n \"پنسل\": \"pencil\",\n \"بستہ\": \"basta\",\n \"بیگ\": \"bag\",\n \"میز\": \"mez\",\n \"کرسی\": \"kursi\",\n \"الماری\": \"almari\",\n \"صوفہ\": \"sofa\",\n \"پلنگ\": \"palang\",\n \"بستر\": \"bistar\",\n \"گدا\": \"gadda\",\n \"چادر\": \"chadar\",\n \"تکیہ\": \"takiya\",\n \"کمبل\": \"kambal\",\n \"لحاف\": \"lihaf\",\n \"پردہ\": \"parda\",\n \"قالین\": \"qaleen\",\n \"چٹائی\": \"chatai\",\n \"پنکھا\": \"pankha\",\n \"چولہا\": \"choolha\",\n \"فریج\": \"fridge\",\n \"برتن\": \"bartan\",\n \"چمچ\": \"chamach\",\n \"کانٹا\": \"kanta\",\n \"چھری\": \"chhuri\",\n \"چاقو\": \"chaqoo\",\n \"پلیٹ\": \"plate\",\n \"پیالی\": \"pyali\",\n \"پیالہ\": \"pyala\",\n \"کپ\": \"cup\",\n \"گلاس\": \"glass\",\n \"جگ\": \"jug\",\n \"بوتل\": \"botal\",\n \"ڈبہ\": \"dabba\",\n \"بالٹی\": \"balti\",\n \"مگ\": \"mug\",\n \"جھاڑو\": \"jharoo\",\n \"صابن\": \"sabun\",\n \"تولیہ\": \"toliya\",\n \"آئینہ\": \"aaina\",\n \"شیشہ\": \"sheesha\",\n \"کنگھی\": \"kanghi\",\n \"سوئی\": \"sui\",\n \"دھاگہ\": \"dhaga\",\n \"قینچی\": \"qainchi\",\n \"تالا\": \"tala\",\n \"چابی\": \"chabi\",\n \"گھڑی\": \"ghari\",\n \"ٹوپی\": \"topi\",\n \"پگڑی\": \"pagri\",\n \"قمیض\": \"qameez\",\n \"شلوار\": \"shalwar\",\n \"پاجامہ\": \"pajama\",\n \"پینٹ\": \"pant\",\n \"شرٹ\": \"shirt\",\n \"کوٹ\": \"coat\",\n \"واسکوٹ\": \"waistcoat\",\n \"شال\": \"shawl\",\n \"دوپٹہ\": \"dupatta\",\n \"جراب\": \"jurab\",\n \"دستانے\": \"dastaney\",\n \"جوتا\": \"joota\",\n \"چپل\": \"chappal\",\n \"صندل\": \"sandal\",\n \"کپڑا\": \"kapra\",\n \"ریشم\": \"resham\",\n \"سوت\": \"soot\",\n \"اون\": \"oon\",\n\n // ---- food, spices, ingredients, kitchen ----\n \"پانی\": \"paani\",\n \"دودھ\": \"doodh\",\n \"دہی\": \"dahi\",\n \"مکھن\": \"makhan\",\n \"گھی\": \"ghee\",\n \"پنیر\": \"paneer\",\n \"ملائی\": \"malai\",\n \"چائے\": \"chai\",\n \"قہوہ\": \"qehwa\",\n \"کافی\": \"coffee\",\n \"شربت\": \"sharbat\",\n \"لسی\": \"lassi\",\n \"جوس\": \"juice\",\n \"روٹی\": \"roti\",\n \"نان\": \"naan\",\n \"پراٹھا\": \"paratha\",\n \"کلچہ\": \"kulcha\",\n \"چاول\": \"chawal\",\n \"بریانی\": \"biryani\",\n \"پلاؤ\": \"pulao\",\n \"سالن\": \"salan\",\n \"شوربہ\": \"shorba\",\n \"قورمہ\": \"qorma\",\n \"کڑاہی\": \"karahi\",\n \"نہاری\": \"nihari\",\n \"حلیم\": \"haleem\",\n \"کباب\": \"kabab\",\n \"تکہ\": \"tikka\",\n \"سموسہ\": \"samosa\",\n \"پکوڑا\": \"pakaura\",\n \"رول\": \"roll\",\n \"دال\": \"daal\",\n \"گوشت\": \"gosht\",\n \"قیمہ\": \"qeema\",\n \"مرغی\": \"murghi\",\n \"مچھلی\": \"machhli\",\n \"انڈا\": \"anda\",\n \"سبزی\": \"sabzi\",\n \"آٹا\": \"aata\",\n \"میدہ\": \"maida\",\n \"سوجی\": \"sooji\",\n \"بیسن\": \"besan\",\n \"تیل\": \"tel\",\n \"نمک\": \"namak\",\n \"چینی\": \"cheeni\",\n \"شکر\": \"shukr\",\n \"گڑ\": \"gur\",\n \"شہد\": \"shehad\",\n \"مرچ\": \"mirch\",\n \"ہلدی\": \"haldi\",\n \"دھنیا\": \"dhaniya\",\n \"زیرہ\": \"zeera\",\n \"لہسن\": \"lehsun\",\n \"ادرک\": \"adrak\",\n \"پیاز\": \"pyaz\",\n \"ٹماٹر\": \"tamatar\",\n \"آلو\": \"aloo\",\n \"گاجر\": \"gajar\",\n \"مولی\": \"mooli\",\n \"شلجم\": \"shaljam\",\n \"مٹر\": \"matar\",\n \"پالک\": \"palak\",\n \"میتھی\": \"methi\",\n \"گوبھی\": \"gobhi\",\n \"بینگن\": \"baingan\",\n \"بھنڈی\": \"bhindi\",\n \"کریلا\": \"karela\",\n \"کدو\": \"kaddu\",\n \"لوکی\": \"lauki\",\n \"ٹینڈا\": \"tinda\",\n \"کھیرا\": \"kheera\",\n \"پھل\": \"phal\",\n \"آم\": \"aam\",\n \"سیب\": \"saib\",\n \"کیلا\": \"kela\",\n \"انگور\": \"angoor\",\n \"انار\": \"anar\",\n \"امرود\": \"amrood\",\n \"مالٹا\": \"malta\",\n \"کینو\": \"kinnu\",\n \"لیمو\": \"leemo\",\n \"لیموں\": \"leemo\",\n \"تربوز\": \"tarbooz\",\n \"خربوزہ\": \"kharbooza\",\n \"آڑو\": \"aadoo\",\n \"خوبانی\": \"khubani\",\n \"ناشپاتی\": \"nashpati\",\n \"چیری\": \"cherry\",\n \"پپیتا\": \"papeeta\",\n \"لیچی\": \"lychee\",\n \"بادام\": \"badam\",\n \"پستہ\": \"pista\",\n \"اخروٹ\": \"akhrot\",\n \"کاجو\": \"kaju\",\n \"مونگفلی\": \"moongphali\",\n \"کشمش\": \"kishmish\",\n \"کھجور\": \"khajoor\",\n \"کھیر\": \"kheer\",\n \"حلوہ\": \"halwa\",\n \"زردہ\": \"zarda\",\n \"جامن\": \"jamun\",\n \"جلیبی\": \"jalebi\",\n \"برفی\": \"barfi\",\n \"رسگلہ\": \"rasgulla\",\n \"کلفی\": \"kulfi\",\n \"آئسکریم\": \"icecream\",\n \"کیک\": \"cake\",\n \"بسکٹ\": \"biscuit\",\n \"چاکلیٹ\": \"chocolate\",\n \"مٹھائی\": \"mithai\",\n \"سلاد\": \"salad\",\n \"رائتہ\": \"raita\",\n \"چٹنی\": \"chatni\",\n \"اچار\": \"achaar\",\n \"مربہ\": \"murabba\",\n\n // ---- anatomy & health ----\n \"دل\": \"dil\",\n \"دماغ\": \"dimagh\",\n \"جسم\": \"jism\",\n \"بدن\": \"badan\",\n \"جان\": \"jaan\",\n \"روح\": \"rooh\",\n \"سر\": \"sar\",\n \"کھوپڑی\": \"khopri\",\n \"پیشانی\": \"peshani\",\n \"ماتھا\": \"matha\",\n \"آنکھ\": \"aankh\",\n \"آنکھیں\": \"aankhein\",\n \"پلک\": \"palak\",\n \"ابرو\": \"abroo\",\n \"کان\": \"kaan\",\n \"ناک\": \"naak\",\n \"منہ\": \"munh\",\n \"ہونٹ\": \"hont\",\n \"دانت\": \"daant\",\n \"زبان\": \"zuban\",\n \"گلا\": \"gala\",\n \"گردن\": \"gardan\",\n \"کندھا\": \"kandha\",\n \"بازو\": \"bazu\",\n \"کہنی\": \"kohni\",\n \"کلائی\": \"kalai\",\n \"ہاتھ\": \"hath\",\n \"انگلی\": \"ungli\",\n \"انگلیاں\": \"ungliyan\",\n \"انگوٹھا\": \"angootha\",\n \"ناخن\": \"nakhun\",\n \"سینہ\": \"seena\",\n \"چھاتی\": \"chhati\",\n \"پیٹ\": \"pet\",\n \"کمر\": \"kamar\",\n \"پشت\": \"pusht\",\n \"ران\": \"raan\",\n \"گھٹنا\": \"ghutna\",\n \"ٹانگ\": \"taang\",\n \"ٹانگیں\": \"taangein\",\n \"پاؤں\": \"paon\",\n \"ایڑی\": \"eeri\",\n \"تالو\": \"talu\",\n \"ہڈی\": \"haddi\",\n \"خون\": \"khoon\",\n \"رگ\": \"rag\",\n \"پٹھا\": \"pattha\",\n \"جلد\": \"jild\",\n \"چمڑا\": \"chamra\",\n \"بال\": \"baal\",\n \"داڑھی\": \"darhi\",\n \"مونچھ\": \"moochh\",\n \"چہرہ\": \"chehra\",\n \"رخسار\": \"rukhsar\",\n \"گال\": \"gaal\",\n \"ٹھوڑی\": \"thori\",\n \"جگر\": \"jigar\",\n \"گردہ\": \"gurda\",\n \"پھیپھڑا\": \"phepra\",\n \"معدہ\": \"maida\",\n \"صحت\": \"sehat\",\n \"تندرستی\": \"tandurusti\",\n \"بیماری\": \"beemari\",\n \"مرض\": \"marz\",\n \"مریض\": \"mareez\",\n \"بخار\": \"bukhar\",\n \"درد\": \"dard\",\n \"تکلیف\": \"takleef\",\n \"کھانسی\": \"khansi\",\n \"نزلہ\": \"nazla\",\n \"زکام\": \"zukam\",\n \"الرجی\": \"allergy\",\n \"انفیکشن\": \"infection\",\n \"وائرس\": \"virus\",\n \"زخم\": \"zakhm\",\n \"چوٹ\": \"chot\",\n \"علاج\": \"ilaj\",\n \"دوا\": \"dawa\",\n \"ادویات\": \"adwiyat\",\n \"شفا\": \"shifa\",\n \"گولی\": \"goli\",\n \"ٹیکہ\": \"teeka\",\n \"مرہم\": \"marham\",\n \"پٹی\": \"patti\",\n\n // ---- feelings, morals, abstraction ----\n \"محبت\": \"mohabbat\",\n \"عشق\": \"ishq\",\n \"پیار\": \"pyaar\",\n \"الفت\": \"ulfat\",\n \"چاہت\": \"chahat\",\n \"نفرت\": \"nafrat\",\n \"حسد\": \"hasad\",\n \"کینہ\": \"keena\",\n \"بغض\": \"bughz\",\n \"خوشی\": \"khushi\",\n \"مسرت\": \"musarrat\",\n \"غم\": \"gham\",\n \"دکھ\": \"dukh\",\n \"رنج\": \"ranj\",\n \"الم\": \"alam\",\n \"افسوس\": \"afsos\",\n \"پچھتاوا\": \"pachtawa\",\n \"ندامت\": \"nadamat\",\n \"ڈر\": \"dar\",\n \"خوف\": \"khauf\",\n \"دہشت\": \"dehshat\",\n \"امید\": \"umeed\",\n \"آس\": \"aas\",\n \"یاس\": \"yaas\",\n \"مایوسی\": \"mayoosi\",\n \"یقین\": \"yaqeen\",\n \"اعتماد\": \"aitamad\",\n \"بھروسہ\": \"bharosa\",\n \"شک\": \"shak\",\n \"سچ\": \"sach\",\n \"جھوٹ\": \"jhoot\",\n \"انصاف\": \"insaf\",\n \"عدل\": \"adl\",\n \"ظلم\": \"zulm\",\n \"ستم\": \"sitam\",\n \"عزت\": \"izzat\",\n \"احترام\": \"ehtiram\",\n \"بےعزتی\": \"beizzati\",\n \"ذلت\": \"zillat\",\n \"رسوائی\": \"ruswai\",\n \"شکریہ\": \"shukriya\",\n \"صبر\": \"sabr\",\n \"احسان\": \"ehsan\",\n \"معاف\": \"maaf\",\n \"معافی\": \"maafi\",\n \"دعا\": \"dua\",\n \"بددعا\": \"baddua\",\n \"خواب\": \"khwab\",\n \"خیال\": \"khayal\",\n \"ارادہ\": \"irada\",\n \"خواہش\": \"khwahish\",\n \"تمنا\": \"tamanna\",\n \"آرزو\": \"aarzoo\",\n \"حسرت\": \"hasrat\",\n \"زندگی\": \"zindagi\",\n \"حیات\": \"hayat\",\n \"موت\": \"maut\",\n \"وفات\": \"wafat\",\n \"طاقت\": \"taqat\",\n \"قوت\": \"quwwat\",\n \"زور\": \"zor\",\n \"ہمت\": \"himmat\",\n \"حوصلہ\": \"hosla\",\n \"جذبہ\": \"jazba\",\n \"شوق\": \"shauq\",\n \"کمزوری\": \"kamzori\",\n \"ناتوانی\": \"natawani\",\n \"ضرورت\": \"zaroorat\",\n \"حاجت\": \"hajat\",\n \"مدد\": \"madad\",\n \"تعاون\": \"taawun\",\n \"کوشش\": \"koshish\",\n \"جدوجہد\": \"jaddojahad\",\n \"محنت\": \"mehnat\",\n \"مشقت\": \"mushaqqat\",\n \"کامیابی\": \"kamyabi\",\n \"فتح\": \"fateh\",\n \"ناکامی\": \"nakami\",\n \"شکست\": \"shikast\",\n \"ہار\": \"haar\",\n \"جیت\": \"jeet\",\n \"فیصلہ\": \"faisla\",\n \"رائے\": \"raye\",\n \"مشورہ\": \"mashwara\",\n \"غصہ\": \"ghussa\",\n \"طیش\": \"taish\",\n \"غرور\": \"ghuroor\",\n \"تکبر\": \"takabbur\",\n \"عاجزی\": \"aajzi\",\n \"انکساری\": \"inkisari\",\n \"سادگی\": \"sadgi\",\n \"صفائی\": \"safai\",\n \"پاکی\": \"paki\",\n \"شرم\": \"sharm\",\n \"حیا\": \"haya\",\n \"غیرت\": \"ghairat\",\n \"حمیت\": \"hameeyat\",\n \"اخلاق\": \"akhlaq\",\n \"شرافت\": \"sharafat\",\n \"دیانت\": \"diyanat\",\n \"امانت\": \"amanat\",\n \"خیانت\": \"khiyanat\",\n \"وفا\": \"wafa\",\n \"بےوفائی\": \"bewafai\",\n \"دوستی\": \"dosti\",\n \"دشمنی\": \"dushmani\",\n \"حیرت\": \"hairat\",\n \"تعجب\": \"taajjub\",\n \"راحت\": \"rahat\",\n \"سکون\": \"sakoon\",\n \"اطمینان\": \"itminan\",\n \"بےچینی\": \"bechaini\",\n \"اضطراب\": \"iztirab\",\n \"احساس\": \"ehsas\",\n \"شعور\": \"shaoor\",\n \"لاپرواہی\": \"laparwahi\",\n \"حقیقت\": \"haqeeqat\",\n \"راز\": \"raaz\",\n \"بھید\": \"bhed\",\n\n // ---- knowledge, education, language, arts ----\n \"علم\": \"ilm\",\n \"تعلیم\": \"taleem\",\n \"تربیت\": \"tarbiyat\",\n \"سبق\": \"sabaq\",\n \"درس\": \"dars\",\n \"امتحان\": \"imtihan\",\n \"آزمائش\": \"azmaish\",\n \"نتیجہ\": \"nateeja\",\n \"مسئلہ\": \"masla\",\n \"حل\": \"hal\",\n \"سوال\": \"sawal\",\n \"جواب\": \"jawab\",\n \"بحث\": \"behas\",\n \"مباحثہ\": \"mubahisa\",\n \"بات\": \"baat\",\n \"باتیں\": \"baatein\",\n \"گفتگو\": \"guftagu\",\n \"کلام\": \"kalam\",\n \"لفظ\": \"lafz\",\n \"الفاظ\": \"alfaz\",\n \"جملہ\": \"jumla\",\n \"فقرہ\": \"fiqra\",\n \"حرف\": \"harf\",\n \"حروف\": \"haroof\",\n \"معنی\": \"maani\",\n \"مطلب\": \"matlab\",\n \"نام\": \"naam\",\n \"پتہ\": \"pata\",\n \"خبر\": \"khabar\",\n \"اخبار\": \"akhbar\",\n \"رسالہ\": \"risala\",\n \"مجلہ\": \"majalla\",\n \"کہانی\": \"kahani\",\n \"قصہ\": \"qissa\",\n \"داستان\": \"dastan\",\n \"ناول\": \"novel\",\n \"افسانہ\": \"afsana\",\n \"مضمون\": \"mazmoon\",\n \"مقالہ\": \"maqala\",\n \"شعر\": \"sher\",\n \"اشعار\": \"ashaar\",\n \"غزل\": \"ghazal\",\n \"نظم\": \"nazm\",\n \"مرثیہ\": \"marsiya\",\n \"قصیدہ\": \"qaseeda\",\n \"ادب\": \"adab\",\n \"تاریخ\": \"tareekh\",\n \"جغرافیہ\": \"jughrafia\",\n \"ریاضی\": \"riyazi\",\n \"سائنس\": \"science\",\n \"فلسفہ\": \"falsafa\",\n \"منطق\": \"mantiq\",\n \"ثقافت\": \"saqafat\",\n \"تہذیب\": \"tehzeeb\",\n \"تمدن\": \"tamaddun\",\n \"رسم\": \"rasm\",\n \"رواج\": \"riwaj\",\n \"موسیقی\": \"moseeqi\",\n \"راگ\": \"raag\",\n \"ساز\": \"saaz\",\n \"تصویر\": \"tasweer\",\n \"نقشہ\": \"naqsha\",\n \"رنگ\": \"rang\",\n \"آواز\": \"awaz\",\n \"شور\": \"shor\",\n \"خاموشی\": \"khamoshi\",\n \"سکوت\": \"sakoot\",\n \"تحقیق\": \"tehqeeq\",\n \"تلاش\": \"talash\",\n \"کھوج\": \"khoj\",\n\n // ---- religion & spiritual ----\n \"نماز\": \"namaz\",\n \"صلوہ\": \"salat\",\n \"روزہ\": \"roza\",\n \"صوم\": \"saum\",\n \"زکوہ\": \"zakat\",\n \"حج\": \"hajj\",\n \"عمرہ\": \"umrah\",\n \"عید\": \"eid\",\n \"قربانی\": \"qurbani\",\n \"مذہب\": \"mazhab\",\n \"اسلام\": \"islam\",\n \"اللہ\": \"allah\",\n \"رب\": \"rabb\",\n \"خدا\": \"khuda\",\n \"رسول\": \"rasool\",\n \"نبی\": \"nabi\",\n \"پیغمبر\": \"paighambar\",\n \"صحابی\": \"sahabi\",\n \"صحابہ\": \"sahaba\",\n \"اہل\": \"ahl\",\n \"بیت\": \"bait\",\n \"قرآن\": \"quran\",\n \"حدیث\": \"hadees\",\n \"سنت\": \"sunnat\",\n \"شریعت\": \"shariat\",\n \"فقہ\": \"fiqh\",\n \"دین\": \"deen\",\n \"ایمان\": \"imaan\",\n \"عقیدہ\": \"aqeeda\",\n \"جنت\": \"jannat\",\n \"فردوس\": \"firdaus\",\n \"جہنم\": \"jahannum\",\n \"دوزخ\": \"dozakh\",\n \"فرشتہ\": \"farishta\",\n \"ملائکہ\": \"malaika\",\n \"شیطان\": \"shaitan\",\n \"ابلیس\": \"iblees\",\n \"جنات\": \"jinnat\",\n \"قیامت\": \"qayamat\",\n \"حشر\": \"hashr\",\n \"حساب\": \"hisaab\",\n \"میزان\": \"meezan\",\n \"صراط\": \"sirat\",\n \"عبادت\": \"ibadat\",\n \"بندگی\": \"bandagi\",\n \"سجدہ\": \"sajda\",\n \"رکوع\": \"rukoo\",\n \"تلاوت\": \"tilawat\",\n \"تسبیح\": \"tasbeeh\",\n \"ذکر\": \"zikr\",\n \"توبہ\": \"tauba\",\n \"استغفار\": \"istighfar\",\n \"ثواب\": \"sawab\",\n \"اجر\": \"ajar\",\n \"گناہ\": \"gunah\",\n \"معصیت\": \"masiyat\",\n \"عذاب\": \"azaab\",\n \"رحمت\": \"rehmat\",\n \"برکت\": \"barkat\",\n \"فضل\": \"fazal\",\n \"کرم\": \"karam\",\n \"نیکی\": \"naiki\",\n \"بدی\": \"badi\",\n \"تقوی\": \"taqwa\",\n \"پرہیزگاری\": \"parhezgari\",\n \"ولایت\": \"wilayat\",\n \"ولی\": \"wali\",\n \"صوفی\": \"sufi\",\n \"درویش\": \"darwesh\",\n \"فقیر\": \"faqeer\",\n\n // ---- news, politics, governance, law ----\n \"سیاست\": \"siyasat\",\n \"سیاسی\": \"siyasi\",\n \"الیکشن\": \"election\",\n \"انتخاب\": \"intikhab\",\n \"انتخابات\": \"intikhabat\",\n \"ووٹ\": \"vote\",\n \"امیدوار\": \"ummedwar\",\n \"پارٹی\": \"party\",\n \"جماعت\": \"jamaat\",\n \"اسمبلی\": \"assembly\",\n \"پارلیمنٹ\": \"parliament\",\n \"ایوان\": \"aiwan\",\n \"سینیٹ\": \"senate\",\n \"قانون\": \"qanoon\",\n \"دستور\": \"dastoor\",\n \"آئین\": \"aaeen\",\n \"جمہوریت\": \"jamhooriat\",\n \"آمریت\": \"aamriyat\",\n \"حکومت\": \"hukumat\",\n \"ریاست\": \"riyasat\",\n \"سلطنت\": \"saltanat\",\n \"حکمران\": \"hukmaran\",\n \"اپوزیشن\": \"opposition\",\n \"حزب\": \"hizb\",\n \"اختلاف\": \"ikhtilaf\",\n \"اتحاد\": \"ittehad\",\n \"تنظیم\": \"tanzeem\",\n \"ادارہ\": \"idara\",\n \"کمپنی\": \"company\",\n \"جرم\": \"jurm\",\n \"مجرم\": \"mujrim\",\n \"ملزم\": \"mulzim\",\n \"قیدی\": \"qaidi\",\n \"گواہ\": \"gawah\",\n \"شہادت\": \"shahadat\",\n \"ثبوت\": \"saboot\",\n \"سزا\": \"saza\",\n \"جرمانہ\": \"jurmana\",\n \"فوج\": \"fauj\",\n \"لشکر\": \"lashkar\",\n \"عساکر\": \"asakir\",\n \"جنگ\": \"jang\",\n \"معرکہ\": \"maraka\",\n \"لڑائی\": \"larai\",\n \"امن\": \"aman\",\n \"صلح\": \"sulah\",\n \"معاہدہ\": \"muahida\",\n \"پیمان\": \"paiman\",\n \"معیشت\": \"maeeshat\",\n \"اقتصادیات\": \"iqtisadiyat\",\n \"تجارت\": \"tijarat\",\n \"کاروبار\": \"karobar\",\n \"صنعت\": \"sanat\",\n \"حرفت\": \"hirfat\",\n \"بجٹ\": \"budget\",\n \"خسارہ\": \"khasara\",\n \"منافع\": \"munafa\",\n \"نقصان\": \"nuqsan\",\n \"ترقی\": \"taraqqi\",\n \"تنزل\": \"tanazzul\",\n \"منصوبہ\": \"mansooba\",\n \"پروجیکٹ\": \"project\",\n \"اعلان\": \"elaan\",\n \"اشتہار\": \"ishtihar\",\n \"رپورٹ\": \"report\",\n \"بیان\": \"bayan\",\n \"اجلاس\": \"ijlas\",\n \"کانفرنس\": \"conference\",\n \"دورہ\": \"dora\",\n \"ملاقات\": \"mulaqat\",\n \"مذاکرات\": \"muzakrat\",\n \"تقریب\": \"taqreeb\",\n \"جلسہ\": \"jalsa\",\n \"جلوس\": \"juloos\",\n \"ہڑتال\": \"hartal\",\n \"مظاہرہ\": \"muzahira\",\n \"احتجاج\": \"ehtejaj\",\n \"تقریر\": \"taqreer\",\n \"خطاب\": \"khitab\",\n \"پیغام\": \"paigham\",\n\n // ---- nature, environment, animals ----\n \"درخت\": \"darakht\",\n \"شجر\": \"shajar\",\n \"پودا\": \"pauda\",\n \"پودے\": \"pauday\",\n \"پتے\": \"pattay\",\n \"پھول\": \"phool\",\n \"کلی\": \"kali\",\n \"شاخ\": \"shaakh\",\n \"ٹہنی\": \"tahni\",\n \"جڑ\": \"jar\",\n \"تنا\": \"tana\",\n \"گھاس\": \"ghaas\",\n \"سبزہ\": \"sabza\",\n \"جنگل\": \"jungle\",\n \"بیابان\": \"bayaban\",\n \"صحرا\": \"sehra\",\n \"ریگستان\": \"registan\",\n \"پہاڑ\": \"pahar\",\n \"کوہ\": \"koh\",\n \"چوٹی\": \"choti\",\n \"وادی\": \"wadi\",\n \"درہ\": \"darra\",\n \"غار\": \"ghaar\",\n \"دریا\": \"darya\",\n \"نہر\": \"nehar\",\n \"ندی\": \"nadi\",\n \"نالہ\": \"nala\",\n \"سمندر\": \"samandar\",\n \"بحر\": \"behar\",\n \"ساحل\": \"sahil\",\n \"کنارہ\": \"kinara\",\n \"جزیرہ\": \"jazeera\",\n \"جھیل\": \"jheel\",\n \"تالاب\": \"talab\",\n \"حوض\": \"hauz\",\n \"کنواں\": \"kuan\",\n \"چشمہ\": \"chashma\",\n \"آبشار\": \"aabshar\",\n \"مٹی\": \"mitti\",\n \"ریت\": \"rait\",\n \"پتھر\": \"patthar\",\n \"چٹان\": \"chatan\",\n \"چاندی\": \"chandi\",\n \"تانبا\": \"tanba\",\n \"لوہا\": \"loha\",\n \"پیتل\": \"peetal\",\n \"کوئلہ\": \"koyla\",\n \"آگ\": \"aag\",\n \"شعلہ\": \"shola\",\n \"دھواں\": \"dhuwan\",\n \"راکھ\": \"raakh\",\n \"روشنی\": \"roshni\",\n \"نور\": \"noor\",\n \"اندھیرا\": \"andhera\",\n \"تاریکی\": \"tareeki\",\n \"سایہ\": \"saya\",\n \"کتا\": \"kutta\",\n \"کتیا\": \"kutiya\",\n \"بلی\": \"billi\",\n \"بلا\": \"billa\",\n \"گھوڑا\": \"ghora\",\n \"گھوڑی\": \"ghori\",\n \"گدھا\": \"gadha\",\n \"گدھی\": \"gadhi\",\n \"خچر\": \"khachhar\",\n \"گائے\": \"gaye\",\n \"بیل\": \"bail\",\n \"بچھڑا\": \"bachhra\",\n \"بھینس\": \"bhains\",\n \"بکری\": \"bakri\",\n \"بکرا\": \"bakra\",\n \"بھیڑ\": \"bheed\",\n \"دنبہ\": \"dumbah\",\n \"شیر\": \"sheer\",\n \"ببر\": \"babar\",\n \"چیتا\": \"cheeta\",\n \"تیندوا\": \"tendwa\",\n \"بھیڑیا\": \"bhediya\",\n \"لومڑی\": \"lomri\",\n \"ریچھ\": \"reech\",\n \"ہاتھی\": \"hathi\",\n \"ہتھنی\": \"hathni\",\n \"اونٹ\": \"oont\",\n \"سانڈنی\": \"sandni\",\n \"ہرن\": \"hiran\",\n \"سنگھا\": \"singha\",\n \"خرگوش\": \"khargosh\",\n \"بندر\": \"bandar\",\n \"چوہا\": \"chooha\",\n \"چوہیا\": \"chuhiya\",\n \"پرندہ\": \"parinda\",\n \"چرند\": \"charand\",\n \"پرند\": \"parand\",\n \"کوا\": \"kawa\",\n \"طوطا\": \"tota\",\n \"مینا\": \"maina\",\n \"چڑیا\": \"chiriya\",\n \"کبوتر\": \"kabootar\",\n \"فاختہ\": \"fakhta\",\n \"عقاب\": \"uqaab\",\n \"باز\": \"baaz\",\n \"شاہین\": \"shaheen\",\n \"چیل\": \"cheel\",\n \"گدھ\": \"gidh\",\n \"الو\": \"ulloo\",\n \"بگلا\": \"bagla\",\n \"بطخ\": \"battakh\",\n \"ہنس\": \"hans\",\n \"مور\": \"mor\",\n \"مرغ\": \"murgh\",\n \"مرغا\": \"murgha\",\n \"مرغابی\": \"murghabi\",\n \"کوئل\": \"koyal\",\n \"بلبل\": \"bulbul\",\n \"سانپ\": \"saanp\",\n \"ناگ\": \"naag\",\n \"چھپکلی\": \"chhipkali\",\n \"مگرمچھ\": \"magarmachh\",\n \"کچھوا\": \"kachhwa\",\n \"مینڈک\": \"maindak\",\n \"مچھر\": \"machhar\",\n \"مکھی\": \"makkhi\",\n \"مکڑی\": \"makri\",\n \"تتلی\": \"titli\",\n \"کیڑا\": \"keera\",\n \"کیڑے\": \"keeray\",\n \"پتنگا\": \"patanga\",\n \"چیونٹی\": \"cheenti\",\n \"بچھو\": \"bichhoo\",\n\n // ---- adjectives ----\n \"اچھا\": \"acha\",\n \"اچھی\": \"achi\",\n \"اچھے\": \"achay\",\n \"برا\": \"bura\",\n \"بری\": \"buri\",\n \"برے\": \"buray\",\n \"بڑا\": \"bara\",\n \"بڑی\": \"bari\",\n \"بڑے\": \"baray\",\n \"چھوٹا\": \"chhota\",\n \"چھوٹی\": \"chhoti\",\n \"چھوٹے\": \"chhotay\",\n \"نیا\": \"naya\",\n \"نئی\": \"nayi\",\n \"نئے\": \"naye\",\n \"پرانا\": \"purana\",\n \"پرانی\": \"purani\",\n \"پرانے\": \"puranay\",\n \"لمبا\": \"lamba\",\n \"لمبی\": \"lambi\",\n \"لمبے\": \"lambay\",\n \"موٹا\": \"mota\",\n \"موٹی\": \"moti\",\n \"موٹے\": \"motay\",\n \"پتلا\": \"patla\",\n \"پتلی\": \"patli\",\n \"پتلے\": \"patlay\",\n \"دبلا\": \"dubla\",\n \"تیز\": \"tez\",\n \"سست\": \"sust\",\n \"آہستہ\": \"ahista\",\n \"گرم\": \"garam\",\n \"ٹھنڈا\": \"thanda\",\n \"ٹھنڈی\": \"thandi\",\n \"ٹھنڈے\": \"thanday\",\n \"سرد\": \"sard\",\n \"خشک\": \"khushk\",\n \"گیلا\": \"geela\",\n \"گیلی\": \"geeli\",\n \"تر\": \"tarr\",\n \"میٹھا\": \"meetha\",\n \"میٹھی\": \"meethi\",\n \"میٹھے\": \"meethay\",\n \"کڑوا\": \"karwa\",\n \"کڑوی\": \"karwi\",\n \"کھٹا\": \"khatta\",\n \"کھٹی\": \"khatti\",\n \"نمکین\": \"namkeen\",\n \"پھیکا\": \"pheeka\",\n \"صاف\": \"saaf\",\n \"ستھرا\": \"suthra\",\n \"گندا\": \"ganda\",\n \"گندی\": \"gandi\",\n \"خالی\": \"khali\",\n \"بھری\": \"bhari\",\n \"بھرے\": \"bharay\",\n \"مشکل\": \"mushkil\",\n \"دشوار\": \"dushwar\",\n \"آسان\": \"aasan\",\n \"سہل\": \"sehal\",\n \"ضروری\": \"zaroori\",\n \"لازمی\": \"lazmi\",\n \"مکمل\": \"mukammal\",\n \"ادھورا\": \"adhoora\",\n \"تیار\": \"tayyar\",\n \"خوش\": \"khush\",\n \"ناراض\": \"naraz\",\n \"خفا\": \"khafa\",\n \"پریشان\": \"pareshan\",\n \"اداس\": \"udaas\",\n \"غمگین\": \"ghamgeen\",\n \"تھکا\": \"thaka\",\n \"تھکی\": \"thaki\",\n \"تھکے\": \"thakay\",\n \"بیمار\": \"beemar\",\n \"تندرست\": \"tandurust\",\n \"امیر\": \"ameer\",\n \"غریب\": \"ghareeb\",\n \"نادار\": \"nadar\",\n \"مفلس\": \"muflis\",\n \"مشہور\": \"mashhoor\",\n \"معروف\": \"maroof\",\n \"گمنام\": \"gumnam\",\n \"خوبصورت\": \"khoobsurat\",\n \"بدصورت\": \"badsurat\",\n \"قبیح\": \"qabeeh\",\n \"ذہین\": \"zaheen\",\n \"عقلمند\": \"aqlmand\",\n \"دانا\": \"dana\",\n \"ہوشیار\": \"hoshiyar\",\n \"چالاک\": \"chalak\",\n \"بےوقوف\": \"bewaqoof\",\n \"احمق\": \"ahmaq\",\n \"نادان\": \"nadan\",\n \"بہادر\": \"bahadur\",\n \"شجاع\": \"shuja\",\n \"دلیر\": \"daler\",\n \"بزدل\": \"buzdil\",\n \"ڈرپوک\": \"darpok\",\n \"محنتی\": \"mehnati\",\n \"سچا\": \"sacha\",\n \"سچی\": \"sachi\",\n \"سچے\": \"sachay\",\n \"جھوٹا\": \"jhoota\",\n \"جھوٹی\": \"jhooti\",\n \"جھوٹے\": \"jhootay\",\n \"ایماندار\": \"imandar\",\n \"دیانتدار\": \"diyanatdar\",\n \"بےایمان\": \"beiman\",\n \"پیارا\": \"pyara\",\n \"پیاری\": \"pyari\",\n \"پیارے\": \"pyaray\",\n \"عجیب\": \"ajeeb\",\n \"انوکھا\": \"anokha\",\n \"نرالا\": \"nirala\",\n \"خاص\": \"khaas\",\n \"مخصوص\": \"makhsoos\",\n \"عام\": \"aam\",\n \"سستا\": \"sasta\",\n \"سستی\": \"sasti\",\n \"مہنگا\": \"mehanga\",\n \"مہنگی\": \"mehangi\",\n \"بھاری\": \"bhari\",\n \"وزنی\": \"wazni\",\n \"ہلکا\": \"halka\",\n \"ہلکی\": \"halki\",\n \"سخت\": \"sakht\",\n \"نرم\": \"naram\",\n \"ملائم\": \"mulaim\",\n \"روشن\": \"roshan\",\n \"تاریک\": \"tareek\",\n \"گہرا\": \"gehra\",\n \"گہری\": \"gehri\",\n \"اونچا\": \"ooncha\",\n \"اونچی\": \"oonchi\",\n \"پست\": \"past\",\n \"چوڑا\": \"chaura\",\n \"چوڑی\": \"chauri\",\n \"تنگ\": \"tang\",\n \"مضبوط\": \"mazboot\",\n \"پائیدار\": \"paayedar\",\n \"کمزور\": \"kamzor\",\n \"نازک\": \"nazuk\",\n\n // ---- colours ----\n \"سفید\": \"safaid\",\n \"کالا\": \"kala\",\n \"کالی\": \"kali\",\n \"کالے\": \"kalay\",\n \"سیاہ\": \"siyah\",\n \"سرخ\": \"surkh\",\n \"لال\": \"laal\",\n \"نیلا\": \"neela\",\n \"نیلی\": \"neeli\",\n \"نیلے\": \"neelay\",\n \"ہرا\": \"hara\",\n \"ہری\": \"hari\",\n \"ہرے\": \"haray\",\n \"سبز\": \"sabz\",\n \"پیلا\": \"peela\",\n \"پیلی\": \"peeli\",\n \"پیلے\": \"peelay\",\n \"زرد\": \"zard\",\n \"بھورا\": \"bhura\",\n \"بھوری\": \"bhuri\",\n \"گلابی\": \"gulabi\",\n \"نارنجی\": \"naranji\",\n \"جامنی\": \"jamni\",\n \"بیگنی\": \"baingani\",\n \"سرمئی\": \"surmai\",\n \"سنہری\": \"sunehri\",\n \"روپہلی\": \"rupahli\",\n\n // ---- numbers & ordinals ----\n \"صفر\": \"sifar\",\n \"تین\": \"teen\",\n \"چار\": \"char\",\n \"پانچ\": \"panch\",\n \"چھ\": \"chhe\",\n \"سات\": \"saat\",\n \"آٹھ\": \"aath\",\n \"نو\": \"nau\",\n \"دس\": \"das\",\n \"گیارہ\": \"gyarah\",\n \"بارہ\": \"barah\",\n \"تیرہ\": \"terah\",\n \"چودہ\": \"chaudah\",\n \"پندرہ\": \"pandrah\",\n \"سولہ\": \"solah\",\n \"سترہ\": \"satrah\",\n \"اٹھارہ\": \"atharah\",\n \"انیس\": \"unnees\",\n \"بیس\": \"bees\",\n \"اکیس\": \"ikkees\",\n \"بائیس\": \"baees\",\n \"تیئیس\": \"taees\",\n \"چوبیس\": \"chaubees\",\n \"پچیس\": \"pachees\",\n \"چھبیس\": \"chhabees\",\n \"ستائیس\": \"sataees\",\n \"اٹائیس\": \"athaees\",\n \"انتیس\": \"untees\",\n \"تیس\": \"tees\",\n \"چالیس\": \"chalees\",\n \"پچاس\": \"pachas\",\n \"ساٹھ\": \"saath\",\n \"ستر\": \"sattar\",\n \"اسی\": \"assi\",\n \"نوے\": \"nabbay\",\n \"سو\": \"so\",\n \"ہزار\": \"hazar\",\n \"لاکھ\": \"lakh\",\n \"کروڑ\": \"karor\",\n \"ارب\": \"arab\",\n \"پہلا\": \"pehla\",\n \"پہلی\": \"pehli\",\n \"دوسرا\": \"dosra\",\n \"دوسری\": \"dosri\",\n \"دوسرے\": \"dosray\",\n \"تیسرا\": \"teesra\",\n \"تیسری\": \"teesri\",\n \"تیسرے\": \"teesray\",\n \"چوتھا\": \"chautha\",\n \"چوتھی\": \"chauthi\",\n \"چوتھے\": \"chauthay\",\n \"پانچواں\": \"panchwan\",\n \"پانچویں\": \"panchwein\",\n \"چھٹا\": \"chhatta\",\n \"چھٹی\": \"chhatti\",\n \"ساتواں\": \"saatwan\",\n \"ساتویں\": \"saatwein\",\n \"آٹھواں\": \"aathwan\",\n \"آٹھویں\": \"aathwein\",\n \"نواں\": \"nawwan\",\n \"نویں\": \"nawein\",\n \"دسواں\": \"daswan\",\n \"دسویں\": \"daswein\",\n \"آخری\": \"aakhri\",\n \"اول\": \"awwal\",\n \"دوم\": \"dom\",\n \"سوم\": \"som\",\n\n // ---- greetings, discourse markers, interjections ----\n \"سلام\": \"salam\",\n \"خداحافظ\": \"khudahafiz\",\n \"حافظ\": \"hafiz\",\n \"مہربانی\": \"meherbani\",\n \"مبارک\": \"mubarak\",\n \"مبارکباد\": \"mubarakbaad\",\n \"خوشامد\": \"khushamad\",\n \"خوشامدید\": \"khushamdeed\",\n \"اہلاً\": \"ahlan\",\n \"وسہلاً\": \"wasahlan\",\n \"ہاں\": \"haan\",\n \"جی\": \"ji\",\n \"ٹھیک\": \"theek\",\n \"درست\": \"durust\",\n \"صحیح\": \"sahi\",\n \"غلط\": \"ghalat\",\n \"بالکل\": \"bilkul\",\n \"ضرور\": \"zaroor\",\n \"شاید\": \"shayad\",\n \"کاش\": \"kaash\",\n \"واہ\": \"waah\",\n \"شاباش\": \"shabash\",\n \"آفرین\": \"aafreen\",\n \"مرحبا\": \"marhaba\",\n \"سبحان\": \"subhan\",\n \"الحمد\": \"alhamd\",\n \"ماشاء\": \"masha\",\n \"انشاء\": \"insha\",\n \"جلدی\": \"jaldi\",\n \"شتابی\": \"shitabi\",\n \"دیر\": \"der\",\n \"تاخیر\": \"takheer\",\n \"آرام\": \"aaram\",\n \"تھوڑا\": \"thora\",\n \"تھوڑی\": \"thori\",\n \"تھوڑے\": \"thoray\",\n \"زیادہ\": \"ziyada\",\n \"بہت\": \"bohat\",\n \"کم\": \"kam\",\n \"صرف\": \"sirf\",\n \"محض\": \"mahez\",\n \"فقط\": \"faqat\",\n \"واقعی\": \"waqai\",\n \"مچ\": \"mach\",\n\n // ---- cities, regions, countries ----\n \"پاکستان\": \"pakistan\",\n \"کراچی\": \"karachi\",\n \"لاہور\": \"lahore\",\n \"آباد\": \"abad\",\n \"راولپنڈی\": \"rawalpindi\",\n \"پشاور\": \"peshawar\",\n \"کوئٹہ\": \"quetta\",\n \"ملتان\": \"multan\",\n \"فیصل\": \"faisal\",\n \"سیالکوٹ\": \"sialkot\",\n \"گوجرانوالہ\": \"gujranwala\",\n \"حیدرآباد\": \"hyderabad\",\n \"بہاولپور\": \"bahawalpur\",\n \"سرگودھا\": \"sargodha\",\n \"سکھر\": \"sukkur\",\n \"لاڑکانہ\": \"larkana\",\n \"شیخوپورہ\": \"sheikhupura\",\n \"جھنگ\": \"jhang\",\n \"گجرات\": \"gujrat\",\n \"مردان\": \"mardan\",\n \"قصور\": \"kasur\",\n \"صوابی\": \"swabi\",\n \"ایبٹ\": \"abbott\",\n \"گلگت\": \"gilgit\",\n \"بلتستان\": \"baltistan\",\n \"مظفرآباد\": \"muzaffarabad\",\n \"گوادر\": \"gwadar\",\n \"سکردو\": \"skardu\",\n \"سوات\": \"swat\",\n \"چترال\": \"chitral\",\n \"پنجاب\": \"punjab\",\n \"سندھ\": \"sindh\",\n \"بلوچستان\": \"balochistan\",\n \"خیبر\": \"khyber\",\n \"پختونخوا\": \"pakhtunkhwa\",\n \"کشمیر\": \"kashmir\",\n \"بھارت\": \"bharat\",\n \"ہندوستان\": \"hindustan\",\n \"چین\": \"cheen\",\n \"افغانستان\": \"afghanistan\",\n \"ایران\": \"iran\",\n \"سعودی\": \"saudi\",\n \"عرب\": \"arab\",\n \"امارات\": \"imarat\",\n \"دبئی\": \"dubai\",\n \"قطر\": \"qatar\",\n \"کویت\": \"kuwait\",\n \"بحرین\": \"bahrain\",\n \"عمان\": \"oman\",\n \"عراق\": \"iraq\",\n \"فلسطین\": \"palestine\",\n \"اردن\": \"urdan\",\n \"مصر\": \"misr\",\n \"ترکی\": \"turkey\",\n \"برطانیہ\": \"bartania\",\n \"لندن\": \"london\",\n \"امریکہ\": \"amreeka\",\n \"واشنگٹن\": \"washington\",\n \"نیویارک\": \"newyork\",\n \"کینیڈا\": \"canada\",\n \"جرمنی\": \"germany\",\n \"فرانس\": \"france\",\n \"پیرس\": \"paris\",\n \"اٹلی\": \"italy\",\n \"روس\": \"roos\",\n \"ماسکو\": \"moscow\",\n \"جاپان\": \"japan\",\n \"ٹوکیو\": \"tokyo\",\n \"آسٹریلیا\": \"australia\",\n \"بیجنگ\": \"beijing\",\n \"دہلی\": \"delhi\",\n \"قاہرہ\": \"cairo\",\n \"مکہ\": \"makkah\",\n \"مدینہ\": \"madina\",\n \"مقدس\": \"muqaddas\",\n\n // ---- names that appear constantly in Urdu content ----\n \"محمد\": \"muhammad\",\n \"احمد\": \"ahmed\",\n \"علی\": \"ali\",\n \"خان\": \"khan\",\n \"زید\": \"zaid\",\n \"حسن\": \"hasan\",\n \"حسین\": \"hussain\",\n \"عثمان\": \"usman\",\n \"ابوبکر\": \"abubakar\",\n \"بلال\": \"bilal\",\n \"اسلم\": \"aslam\",\n \"حمزہ\": \"hamza\",\n \"سعد\": \"saad\",\n \"خالد\": \"khalid\",\n \"طارق\": \"tariq\",\n \"ولید\": \"waleed\",\n \"شاہ\": \"shah\",\n \"چوہدری\": \"chaudhary\",\n \"شیخ\": \"sheikh\",\n \"سید\": \"syed\",\n \"قریشی\": \"qureshi\",\n \"بٹ\": \"butt\",\n \"مغل\": \"mughal\",\n \"انصاری\": \"ansari\",\n \"فاروق\": \"farooq\",\n \"سلمان\": \"salman\",\n \"عمران\": \"imran\",\n \"نوید\": \"naveed\",\n \"کامران\": \"kamran\",\n \"ارسلان\": \"arslan\",\n \"عرفان\": \"irfan\",\n \"رضوان\": \"rizwan\",\n \"عدنان\": \"adnan\",\n \"فیضان\": \"faizan\",\n \"شہزاد\": \"shehzad\",\n \"وقار\": \"waqar\",\n \"بابر\": \"babar\",\n \"رضا\": \"raza\",\n \"طاہر\": \"tahir\",\n \"ناصر\": \"nasir\",\n \"زبیر\": \"zubair\",\n \"سہیل\": \"sohail\",\n \"ندیم\": \"nadeem\",\n \"وسیم\": \"waseem\",\n \"نعیم\": \"naeem\",\n \"سلیم\": \"saleem\",\n \"جمیل\": \"jameel\",\n \"راشد\": \"rashid\",\n \"ساجد\": \"sajid\",\n \"ماجد\": \"majid\",\n \"عابد\": \"abid\",\n \"زاہد\": \"zahid\",\n \"شاہد\": \"shahid\",\n \"زین\": \"zain\",\n \"حارث\": \"haris\",\n \"ریان\": \"rayyan\",\n \"قاسم\": \"qasim\",\n \"طیب\": \"tayyab\",\n \"ابراہیم\": \"ibrahim\",\n \"اسماعیل\": \"ismail\",\n \"اسحاق\": \"ishaq\",\n \"یعقوب\": \"yaqoob\",\n \"یوسف\": \"yousuf\",\n \"موسی\": \"musa\",\n \"عیسی\": \"eesa\",\n \"داؤد\": \"dawood\",\n \"سلیمان\": \"sulaiman\",\n \"یونس\": \"younus\",\n \"ایوب\": \"ayub\",\n \"ہارون\": \"haroon\",\n \"یحیی\": \"yahya\",\n \"فاطمہ\": \"fatima\",\n \"عائشہ\": \"ayesha\",\n \"مریم\": \"maryam\",\n \"زینب\": \"zainab\",\n \"خدیجہ\": \"khadija\",\n \"حفصہ\": \"hafsa\",\n \"سارہ\": \"sara\",\n \"ہدی\": \"huda\",\n \"ثنا\": \"sana\",\n \"حنا\": \"hina\",\n \"اقرا\": \"iqra\",\n \"سدرہ\": \"sidra\",\n \"اقصی\": \"aqsa\",\n \"فرح\": \"farah\",\n \"ندا\": \"nida\",\n \"صبا\": \"saba\",\n \"مہوش\": \"mehwish\",\n \"انعم\": \"anam\",\n \"ارم\": \"iram\",\n \"بشری\": \"bushra\",\n \"سمیرا\": \"sumaira\",\n \"نازیہ\": \"nazia\",\n \"شازیہ\": \"shazia\",\n \"روبینہ\": \"rubina\",\n \"نسرین\": \"nasreen\",\n \"یاسمین\": \"yasmeen\",\n \"ثمینہ\": \"samina\",\n \"پروین\": \"parveen\",\n \"شبانہ\": \"shabana\",\n \"فرزانہ\": \"farzana\",\n \"طاہرہ\": \"tahira\",\n \"عصمت\": \"ismat\",\n \"نصرت\": \"nusrat\",\n\n // ---- classical, poetic and literary vocabulary ----\n \"گلستاں\": \"gulistan\",\n \"گلشن\": \"gulshan\",\n \"بہاراں\": \"baharan\",\n \"پروانہ\": \"parwana\",\n \"شمع\": \"shama\",\n \"ساقی\": \"saqi\",\n \"میخانہ\": \"maikhana\",\n \"جام\": \"jaam\",\n \"صراحی\": \"surahi\",\n \"رند\": \"rind\",\n \"محتسب\": \"muhtasib\",\n \"قاصد\": \"qasid\",\n \"پیامبر\": \"payambar\",\n \"رقیب\": \"raqeeb\",\n \"حبیب\": \"habeeb\",\n \"محبوب\": \"mahboob\",\n \"معشوق\": \"mashooq\",\n \"صنم\": \"sanam\",\n \"سنگدل\": \"sangdil\",\n \"بیدرد\": \"bedard\",\n \"غمگسار\": \"ghamgusar\",\n \"مسیحا\": \"maseeha\",\n \"ناصح\": \"nasih\",\n \"واعظ\": \"waiz\",\n \"تشنہ\": \"tishna\",\n \"گیسو\": \"gesu\",\n \"زلف\": \"zulf\",\n \"دیدار\": \"deedar\",\n \"جلوہ\": \"jalwa\",\n \"حجاب\": \"hijab\",\n \"نقاب\": \"niqab\",\n \"سوز\": \"soz\",\n \"آہنگ\": \"aahang\",\n \"نغمہ\": \"naghma\",\n \"ترانہ\": \"tarana\",\n \"داستاں\": \"dastan\",\n \"حور\": \"hoor\",\n \"پری\": \"pari\",\n \"دیو\": \"deo\",\n \"جادو\": \"jadoo\",\n \"طلسم\": \"tilism\",\n \"افسون\": \"afsoon\",\n \"سحرانگیز\": \"sehrangeez\",\n \"فسوں\": \"fusoon\",\n \"جنوں\": \"junoon\",\n \"سودا\": \"sauda\",\n \"وحشت\": \"wahshat\",\n \"ارمان\": \"arman\",\n \"ذوق\": \"zauq\",\n \"وجد\": \"wajd\",\n \"مستی\": \"masti\",\n \"کیف\": \"kaif\",\n \"خمار\": \"khumar\",\n \"نشہ\": \"nasha\",\n \"بےخودی\": \"bekhudi\",\n\n // ---- commerce, finance and modern technology ----\n \"خریداری\": \"khareedari\",\n \"فروخت\": \"farokht\",\n \"سرمایہ\": \"sarmaya\",\n \"قرضہ\": \"qarza\",\n \"بینکاری\": \"bainkari\",\n \"قسط\": \"qist\",\n \"ادائیگی\": \"adaigi\",\n \"آمدنی\": \"aamdani\",\n \"خرچہ\": \"kharcha\",\n \"بچت\": \"bachat\",\n \"محصول\": \"mahsool\",\n \"مالیت\": \"maliyat\",\n \"کتابت\": \"kitabat\",\n \"منڈی\": \"mandi\",\n \"نیلامی\": \"neelami\",\n \"بولی\": \"boli\",\n \"شراکت\": \"sharakat\",\n \"حصص\": \"hisas\",\n \"اسٹاک\": \"stock\",\n \"دولت\": \"daulat\",\n \"ثروت\": \"sarwat\",\n \"غربت\": \"ghurbat\",\n \"افلاس\": \"iflas\",\n \"پروفائل\": \"profile\",\n \"سیٹنگز\": \"settings\",\n \"نوٹیفکیشن\": \"notification\",\n \"سائٹ\": \"site\",\n \"پورٹل\": \"portal\",\n\n // ---- administration, law, governance and politics ----\n \"عدلیہ\": \"adliya\",\n \"مقننہ\": \"muqannana\",\n \"انتظامیہ\": \"intizamia\",\n \"حکمرانی\": \"hukmrani\",\n \"جمہوریہ\": \"jamhooria\",\n \"صدارت\": \"sadarat\",\n \"وزارت\": \"wazarat\",\n \"سفارت\": \"safarat\",\n \"قونصل\": \"consul\",\n \"سفارتخانہ\": \"safaratkhana\",\n \"آئینی\": \"aaeeni\",\n \"دستوری\": \"dastoori\",\n \"فوجداری\": \"faujdari\",\n \"دیوانی\": \"deewani\",\n \"مقدمہ\": \"muqaddama\",\n \"سماعت\": \"samaat\",\n \"درخواست\": \"darkhwast\",\n \"اپیل\": \"appeal\",\n \"ضمانت\": \"zamanat\",\n \"بریت\": \"bariyat\",\n \"عمرقید\": \"umrqaid\",\n \"پھانسی\": \"phansi\",\n \"وکالت\": \"wukalat\",\n \"حقوق\": \"huqooq\",\n \"فرائض\": \"faraiz\",\n \"شہری\": \"shahri\",\n \"شہریت\": \"shahriyat\",\n \"شناخت\": \"shanakht\",\n \"نادرا\": \"nadra\",\n \"مجلس\": \"majlis\",\n \"شوری\": \"shoora\",\n \"حلیف\": \"haleef\",\n \"مخالف\": \"mukhalif\",\n \"بغاوت\": \"baghawat\",\n\n // ---- geography, nature and terrain ----\n \"خطہ\": \"khitta\",\n \"صوبہ\": \"sooba\",\n \"ضلع\": \"zila\",\n \"تحصیل\": \"tehsil\",\n \"یونین\": \"union\",\n \"کونسل\": \"council\",\n \"قریہ\": \"qarya\",\n \"بستی\": \"basti\",\n \"شہرستان\": \"shehristan\",\n \"نخلستان\": \"nakhalistan\",\n \"کوہسار\": \"kohsar\",\n \"کہسار\": \"kuhsar\",\n \"گھاٹی\": \"ghati\",\n \"وادیاں\": \"wadiyan\",\n \"کھائی\": \"khaai\",\n \"خلیج\": \"khaleej\",\n \"راس\": \"raas\",\n\n // ---- verbs and verbal inflections ----\n \"مانتے\": \"mante\",\n \"مانتی\": \"manti\",\n \"مانو\": \"mano\",\n \"ٹھہرنا\": \"theharna\",\n \"ٹھہرا\": \"thehra\",\n \"ٹھہرو\": \"thehro\",\n \"ٹھہرتے\": \"thehrte\",\n \"سمجھاؤ\": \"samjhao\",\n \"پہنچاؤ\": \"pohonchao\",\n \"لٹانا\": \"lutana\",\n \"لٹایا\": \"lutaya\",\n \"لوٹا\": \"loota\",\n \"پکارا\": \"pukara\",\n \"پکارو\": \"pukaro\",\n \"جھکنا\": \"jhukna\",\n \"جھکا\": \"jhuka\",\n \"جھکاؤ\": \"jhukao\",\n \"جھکانا\": \"jhukana\",\n \"تھامنا\": \"thamna\",\n \"تھاما\": \"thama\",\n \"تھامو\": \"thamo\",\n \"سنوارنا\": \"sanwarna\",\n \"سنوارا\": \"sanwara\",\n \"نکھارنا\": \"nikharna\",\n \"نکھارا\": \"nikhara\",\n \"سنبھالنا\": \"sambhalna\",\n \"سنبھالا\": \"sambhala\",\n \"سنبھالو\": \"sambhalo\",\n \"پچھتانا\": \"pachtana\",\n \"پچھتایا\": \"pachtaya\",\n \"گھبرانا\": \"ghabrana\",\n \"گھبرایا\": \"ghabraya\",\n \"مسکرانا\": \"muskurana\",\n \"مسکرایا\": \"muskuraya\",\n \"مسکراہٹ\": \"muskurahat\",\n \"جھنجھلانا\": \"jhanjhlana\",\n \"تلملانا\": \"tilmilana\",\n \"بلبلانا\": \"bilbilana\",\n \"کھلکھلانا\": \"khilkhilana\",\n \"کھٹکھٹانا\": \"khatkhatana\",\n \"جھلملانا\": \"jhilmilana\",\n \"چمچماتا\": \"chamchamata\",\n \"لہرانا\": \"lehrana\",\n \"لہرایا\": \"lehraya\",\n \"لہر\": \"lehar\",\n};\n\n/**\n * Extra Roman spellings that map back to Urdu, for the reverse direction only.\n *\n * Roman Urdu has no standard orthography, so the same word arrives spelled many\n * ways. These are the variants common enough to be worth hard-coding, plus\n * disambiguations where two Urdu words share one Roman form.\n */\nexport const ROMAN_VARIANTS: Record<string, string> = {\n hay: \"ہے\",\n he: \"ہے\",\n hei: \"ہے\",\n hein: \"ہیں\",\n hn: \"ہیں\",\n hain: \"ہیں\",\n hun: \"ہوں\",\n hoon: \"ہوں\",\n ap: \"آپ\",\n aap: \"آپ\",\n aapko: \"آپکو\",\n aapka: \"آپکا\",\n aapki: \"آپکی\",\n aapke: \"آپکے\",\n kaise: \"کیسے\",\n kese: \"کیسے\",\n kaisey: \"کیسے\",\n kaisa: \"کیسا\",\n kaisi: \"کیسی\",\n nam: \"نام\",\n naam: \"نام\",\n mai: \"میں\",\n main: \"میں\",\n me: \"میں\",\n mein: \"میں\",\n mujhe: \"مجھے\",\n mujhey: \"مجھے\",\n mjhe: \"مجھے\",\n mjhy: \"مجھے\",\n mj: \"مجھے\",\n humein: \"ہمیں\",\n hume: \"ہمیں\",\n hmein: \"ہمیں\",\n hmain: \"ہمیں\",\n tumhein: \"تمہیں\",\n tumhe: \"تمہیں\",\n tumhey: \"تمہیں\",\n tmhein: \"تمہیں\",\n tmhe: \"تمہیں\",\n unhein: \"انہیں\",\n unhe: \"انہیں\",\n unhey: \"انہیں\",\n inhein: \"انہیں\",\n inhe: \"انہیں\",\n usey: \"اسے\",\n usay: \"اسے\",\n use: \"اسے\",\n isay: \"اسے\",\n ise: \"اسے\",\n jisay: \"جسے\",\n jise: \"جسے\",\n kisay: \"کسے\",\n kise: \"کسے\",\n kyu: \"کیوں\",\n kyn: \"کیوں\",\n kyo: \"کیوں\",\n kyun: \"کیوں\",\n kyoon: \"کیوں\",\n kaha: \"کہاں\",\n kahan: \"کہاں\",\n khn: \"کہاں\",\n kidhar: \"کدھر\",\n idhar: \"ادھر\",\n jidhar: \"جدھر\",\n kab: \"کب\",\n kya: \"کیا\",\n kia: \"کیا\",\n kiya: \"کیا\",\n kuch: \"کچھ\",\n kuchh: \"کچھ\",\n kch: \"کچھ\",\n bhi: \"بھی\",\n b: \"بھی\",\n nahin: \"نہیں\",\n nahi: \"نہیں\",\n nai: \"نہیں\",\n nhi: \"نہیں\",\n nahe: \"نہیں\",\n nhn: \"نہیں\",\n bahut: \"بہت\",\n bhot: \"بہت\",\n bohot: \"بہت\",\n bohat: \"بہت\",\n bht: \"بہت\",\n achha: \"اچھا\",\n acha: \"اچھا\",\n accha: \"اچھا\",\n achi: \"اچھی\",\n achhi: \"اچھی\",\n ache: \"اچھے\",\n achay: \"اچھے\",\n shukria: \"شکریہ\",\n shukriya: \"شکریہ\",\n thx: \"شکریہ\",\n thanks: \"شکریہ\",\n plz: \"مہربانی\",\n please: \"مہربانی\",\n salaam: \"سلام\",\n salam: \"سلام\",\n mohabat: \"محبت\",\n muhabbat: \"محبت\",\n mohabbat: \"محبت\",\n pyar: \"پیار\",\n pyaar: \"پیار\",\n zindagi: \"زندگی\",\n zindgi: \"زندگی\",\n dost: \"دوست\",\n dst: \"دوست\",\n khush: \"خوش\",\n khushi: \"خوش\",\n theak: \"ٹھیک\",\n thik: \"ٹھیک\",\n theek: \"ٹھیک\",\n bhai: \"بھائی\",\n bhaiya: \"بھائی\",\n behen: \"بہن\",\n behan: \"بہن\",\n baji: \"باجی\",\n api: \"آپی\",\n ammi: \"امی\",\n ami: \"امی\",\n abbu: \"ابو\",\n abu: \"ابو\",\n paisay: \"پیسے\",\n paise: \"پیسے\",\n paisa: \"پیسہ\",\n kaam: \"کام\",\n kam: \"کم\",\n ghar: \"گھر\",\n ghr: \"گھر\",\n pehle: \"پہلے\",\n pehlay: \"پہلے\",\n pehly: \"پہلے\",\n baad: \"بعد\",\n bad: \"بعد\",\n lekin: \"لیکن\",\n lkn: \"لیکن\",\n magar: \"مگر\",\n mgr: \"مگر\",\n waqt: \"وقت\",\n wqt: \"وقت\",\n zroor: \"ضرور\",\n zaroor: \"ضرور\",\n zarur: \"ضرور\",\n zroori: \"ضروری\",\n zaroori: \"ضروری\",\n chahiye: \"چاہیے\",\n chahye: \"چاہیے\",\n chaheye: \"چاہیے\",\n khuda: \"خدا\",\n allah: \"اللہ\",\n hafiz: \"حافظ\",\n haafiz: \"حافظ\",\n khudahafiz: \"خداحافظ\",\n // aam is both آم (mango) and عام (common); the fruit is the likelier query.\n aam: \"آم\",\n hawa: \"ہوا\",\n // sona is both سونا (to sleep) and سونا (gold) — same spelling, no conflict.\n ho: \"ہو\",\n hoga: \"ہوگا\",\n hogi: \"ہوگی\",\n honge: \"ہوںگے\",\n karna: \"کرنا\",\n krna: \"کرنا\",\n karo: \"کرو\",\n kro: \"کرو\",\n dekhna: \"دیکھنا\",\n dekho: \"دیکھو\",\n sunna: \"سننا\",\n suno: \"سنو\",\n samajh: \"سمجھ\",\n smjh: \"سمجھ\",\n laikin: \"لیکن\",\n shukr: \"شکر\",\n sabr: \"صبر\",\n dil: \"دل\",\n kitab: \"کتاب\",\n kitaab: \"کتاب\",\n school: \"سکول\",\n college: \"کالج\",\n hospital: \"ہسپتال\",\n pal: \"پل\",\n daur: \"دور\",\n kurta: \"کرتا\",\n haseen: \"حسین\",\n malik: \"ملک\",\n kidhr: \"کدھر\",\n idhr: \"ادھر\",\n jdhr: \"جدھر\",\n thek: \"ٹھیک\",\n thk: \"ٹھیک\",\n sahi: \"صحیح\",\n galat: \"غلط\",\n ghalat: \"غلط\",\n sb: \"سب\",\n hmsha: \"ہمیشہ\",\n kbhi: \"کبھی\",\n aksar: \"اکثر\",\n behtareen: \"بہترین\",\n zabardast: \"زبردست\",\n shandar: \"شاندار\",\n khoob: \"خوب\",\n khub: \"خوب\",\n sharam: \"شرم\",\n haya: \"حیا\",\n ghairat: \"غیرت\",\n himmat: \"ہمت\",\n hosla: \"حوصلہ\",\n mashaallah: \"ماشاءاللہ\",\n inshaallah: \"انشاءاللہ\",\n mashallah: \"ماشاءاللہ\",\n inshallah: \"انشاءاللہ\",\n alhamdulillah: \"الحمدللہ\",\n jazakallah: \"جزاکاللہ\",\n // ---- additional Roman variants for common words ----\n // verbs\n hona: \"ہونا\",\n hua: \"ہوا\",\n hui: \"ہوئی\",\n hue: \"ہوئے\",\n jana: \"جانا\",\n jata: \"جاتا\",\n jati: \"جاتی\",\n gaya: \"گیا\",\n gayi: \"گئی\",\n aana: \"آنا\",\n aati: \"آتی\",\n aaya: \"آیا\",\n aayi: \"آئی\",\n dena: \"دینا\",\n deta: \"دیتا\",\n deti: \"دیتی\",\n diya: \"دیا\",\n lena: \"لینا\",\n leta: \"لیتا\",\n leti: \"لیتی\",\n liya: \"لیا\",\n kehna: \"کہنا\",\n kehta: \"کہتا\",\n kehti: \"کہتی\",\n dekhta: \"دیکھتا\",\n dekhti: \"دیکھتی\",\n dekha: \"دیکھا\",\n bolna: \"بولنا\",\n bolta: \"بولتا\",\n boli: \"بولی\",\n bola: \"بولا\",\n padhna: \"پڑھنا\",\n padhta: \"پڑھتا\",\n padhti: \"پڑھتی\",\n padha: \"پڑھا\",\n likhna: \"لکھنا\",\n likhta: \"لکھتا\",\n likhti: \"لکھتی\",\n likha: \"لکھا\",\n samajhna: \"سمجھنا\",\n samjha: \"سمجھا\",\n chahna: \"چاہنا\",\n chahta: \"چاہتا\",\n chahti: \"چاہتی\",\n sakna: \"سکنا\",\n sakta: \"سکتا\",\n sakti: \"سکتی\",\n rehna: \"رہنا\",\n rehta: \"رہتا\",\n rehti: \"رہتی\",\n raha: \"رہا\",\n rahi: \"رہی\",\n banna: \"بننا\",\n bana: \"بنا\",\n banana: \"بنانا\",\n banaya: \"بنایا\",\n milna: \"ملنا\",\n milta: \"ملتا\",\n milti: \"ملتی\",\n mila: \"ملا\",\n mili: \"ملی\",\n khata: \"کھاتا\",\n khati: \"کھاتی\",\n khaya: \"کھایا\",\n peena: \"پینا\",\n peeta: \"پیتا\",\n piya: \"پیا\",\n sota: \"سوتا\",\n soti: \"سوتی\",\n soya: \"سویا\",\n uthna: \"اٹھنا\",\n utha: \"اٹھا\",\n baithna: \"بیٹھنا\",\n baitha: \"بیٹھا\",\n chalta: \"چلتا\",\n chalti: \"چلتی\",\n chala: \"چلا\",\n rakhna: \"رکھنا\",\n rakha: \"رکھا\",\n maangna: \"مانگنا\",\n manga: \"مانگا\",\n puchna: \"پوچھنا\",\n poocha: \"پوچھا\",\n batana: \"بتانا\",\n bataya: \"بتایا\",\n kholna: \"کھولنا\",\n khola: \"کھولا\",\n marna: \"مرنا\",\n mara: \"مرا\",\n jeetna: \"جیتنا\",\n jeeta: \"جیتا\",\n haarna: \"ہارنا\",\n haara: \"ہارا\",\n badalna: \"بدلنا\",\n badla: \"بدلا\",\n rukna: \"رکنا\",\n rokna: \"روکنا\",\n roka: \"روکا\",\n khelna: \"کھیلنا\",\n khela: \"کھیلا\",\n hansna: \"ہنسنا\",\n hansa: \"ہنسا\",\n rona: \"رونا\",\n roya: \"رویا\",\n darna: \"ڈرنا\",\n dara: \"ڈرا\",\n bhoolna: \"بھولنا\",\n bhoola: \"بھولا\",\n seekhna: \"سیکھنا\",\n seekha: \"سیکھا\",\n sikhana: \"سکھانا\",\n sikhaya: \"سکھایا\",\n dhona: \"دھونا\",\n dhoya: \"دھویا\",\n pehanna: \"پہننا\",\n pehna: \"پہنا\",\n bechna: \"بیچنا\",\n becha: \"بیچا\",\n khareedna: \"خریدنا\",\n khareeda: \"خریدا\",\n bhejna: \"بھیجنا\",\n bheja: \"بھیجا\",\n nikalna: \"نکلنا\",\n nikla: \"نکلا\",\n girna: \"گرنا\",\n gira: \"گرا\",\n pakarna: \"پکڑنا\",\n pakra: \"پکڑا\",\n chhorna: \"چھوڑنا\",\n chhora: \"چھوڑا\",\n torna: \"توڑنا\",\n tora: \"توڑا\",\n katna: \"کاٹنا\",\n kata: \"کاٹا\",\n daalna: \"ڈالنا\",\n dala: \"ڈالا\",\n manna: \"ماننا\",\n mana: \"مانا\",\n bulana: \"بلانا\",\n bulaya: \"بلایا\",\n dikhana: \"دکھانا\",\n dikhaya: \"دکھایا\",\n phenkna: \"پھینکنا\",\n phenka: \"پھینکا\",\n letna: \"لیٹنا\",\n jagna: \"جاگنا\",\n lautna: \"لوٹنا\",\n guzarna: \"گزارنا\",\n kamana: \"کمانا\",\n kamaya: \"کمایا\",\n ginna: \"گننا\",\n bandhna: \"باندھنا\",\n bandha: \"باندھا\",\n bharna: \"بھرنا\",\n bhara: \"بھرا\",\n doobna: \"ڈوبنا\",\n chamakna: \"چمکنا\",\n ghoomna: \"گھومنا\",\n phirna: \"پھرنا\",\n phailna: \"پھیلنا\",\n // nouns\n insaan: \"انسان\",\n larka: \"لڑکا\",\n larki: \"لڑکی\",\n bacha: \"بچہ\",\n bachi: \"بچی\",\n maan: \"ماں\",\n baap: \"باپ\",\n beta: \"بیٹا\",\n beti: \"بیٹی\",\n dushman: \"دشمن\",\n makaan: \"مکان\",\n kamra: \"کمرہ\",\n darwaza: \"دروازہ\",\n khirki: \"کھڑکی\",\n chhat: \"چھت\",\n deewar: \"دیوار\",\n farsh: \"فرش\",\n qalam: \"قلم\",\n kaghaz: \"کاغذ\",\n mez: \"میز\",\n kursi: \"کرسی\",\n almari: \"الماری\",\n palang: \"پلنگ\",\n bistar: \"بستر\",\n parda: \"پردہ\",\n qaleen: \"قالین\",\n bartan: \"برتن\",\n chamach: \"چمچ\",\n plate: \"پلیٹ\",\n pyali: \"پیالی\",\n cup: \"کپ\",\n glass: \"گلاس\",\n botal: \"بوتل\",\n dabba: \"ڈبہ\",\n jharoo: \"جھاڑو\",\n sabun: \"صابن\",\n aaina: \"آئینہ\",\n sheesha: \"شیشہ\",\n kanghi: \"کنگھی\",\n sui: \"سوئی\",\n qainchi: \"قینچی\",\n tala: \"تالا\",\n chabi: \"چابی\",\n ghari: \"گھڑی\",\n topi: \"ٹوپی\",\n pagri: \"پگڑی\",\n qameez: \"قمیض\",\n shalwar: \"شلوار\",\n pajama: \"پاجامہ\",\n pant: \"پینٹ\",\n shirt: \"شرٹ\",\n coat: \"کوٹ\",\n shawl: \"شال\",\n dupatta: \"دوپٹہ\",\n joota: \"جوتا\",\n chappal: \"چپل\",\n sandal: \"صندل\",\n kapra: \"کپڑا\",\n doodh: \"دودھ\",\n dahi: \"دہی\",\n ghee: \"گھی\",\n chai: \"چائے\",\n qehwa: \"قہوہ\",\n coffee: \"کافی\",\n lassi: \"لسی\",\n juice: \"جوس\",\n roti: \"روٹی\",\n naan: \"نان\",\n paratha: \"پراٹھا\",\n chawal: \"چاول\",\n biryani: \"بریانی\",\n pulao: \"پلاؤ\",\n salan: \"سالن\",\n qorma: \"قورمہ\",\n nihari: \"نہاری\",\n haleem: \"حلیم\",\n kabab: \"کباب\",\n tikka: \"تکہ\",\n samosa: \"سموسہ\",\n daal: \"دال\",\n gosht: \"گوشت\",\n qeema: \"قیمہ\",\n murghi: \"مرغی\",\n machhli: \"مچھلی\",\n anda: \"انڈا\",\n sabzi: \"سبزی\",\n maida: \"میدہ\",\n namak: \"نمک\",\n cheeni: \"چینی\",\n mirch: \"مرچ\",\n haldi: \"ہلدی\",\n dhaniya: \"دھنیا\",\n zeera: \"زیرہ\",\n lehsun: \"لہسن\",\n adrak: \"ادرک\",\n pyaz: \"پیاز\",\n tamatar: \"ٹماٹر\",\n aloo: \"آلو\",\n gajar: \"گاجر\",\n matar: \"مٹر\",\n palak: \"پالک\",\n gobhi: \"گوبھی\",\n bhindi: \"بھنڈی\",\n karela: \"کریلا\",\n kaddu: \"کدو\",\n kheera: \"کھیرا\",\n phal: \"پھل\",\n saib: \"سیب\",\n kela: \"کیلا\",\n angoor: \"انگور\",\n anar: \"انار\",\n amrood: \"امرود\",\n tarbooz: \"تربوز\",\n badam: \"بادام\",\n pista: \"پستہ\",\n kaju: \"کاجو\",\n kheer: \"کھیر\",\n halwa: \"حلوہ\",\n zarda: \"زردہ\",\n jalebi: \"جلیبی\",\n kulfi: \"کلفی\",\n cake: \"کیک\",\n chocolate: \"چاکلیٹ\",\n mithai: \"مٹھائی\",\n salad: \"سلاد\",\n raita: \"رائتہ\",\n chatni: \"چٹنی\",\n achaar: \"اچار\",\n dimagh: \"دماغ\",\n jism: \"جسم\",\n sar: \"سر\",\n aankh: \"آنکھ\",\n aankhein: \"آنکھیں\",\n kaan: \"کان\",\n naak: \"ناک\",\n munh: \"منہ\",\n daant: \"دانت\",\n zuban: \"زبان\",\n gala: \"گلا\",\n gardan: \"گردن\",\n kandha: \"کندھا\",\n bazu: \"بازو\",\n hath: \"ہاتھ\",\n ungli: \"انگلی\",\n seena: \"سینہ\",\n pet: \"پیٹ\",\n kamar: \"کمر\",\n taang: \"ٹانگ\",\n paon: \"پاؤں\",\n haddi: \"ہڈی\",\n khoon: \"خون\",\n jild: \"جلد\",\n baal: \"بال\",\n chehra: \"چہرہ\",\n sehat: \"صحت\",\n beemari: \"بیماری\",\n dard: \"درد\",\n ilaj: \"علاج\",\n dawa: \"دوا\",\n goli: \"گولی\",\n ishq: \"عشق\",\n nafrat: \"نفرت\",\n gham: \"غم\",\n dukh: \"دکھ\",\n ummeed: \"امید\",\n yaqeen: \"یقین\",\n sach: \"سچ\",\n jhoot: \"جھوٹ\",\n insaf: \"انصاف\",\n zulm: \"ظلم\",\n izzat: \"عزت\",\n dua: \"دعا\",\n khwab: \"خواب\",\n khayal: \"خیال\",\n maut: \"موت\",\n taqat: \"طقت\",\n koshish: \"کوشش\",\n kamyabi: \"کامیابی\",\n nakami: \"ناکامی\",\n faisla: \"فیصلہ\",\n ghussa: \"غصہ\",\n akhlaq: \"اخلاق\",\n wafa: \"وفا\",\n dosti: \"دوستی\",\n sakoon: \"سکون\",\n ilm: \"علم\",\n taleem: \"تعلیم\",\n sabaq: \"سبق\",\n imtihan: \"امتحان\",\n masla: \"مسئلہ\",\n sawal: \"سوال\",\n jawab: \"جواب\",\n lafz: \"لفظ\",\n jumla: \"جملہ\",\n maani: \"معنی\",\n matlab: \"مطلب\",\n khabar: \"خبر\",\n akhbar: \"اخبار\",\n kahani: \"کہانی\",\n qissa: \"قصہ\",\n dastan: \"داستان\",\n novel: \"ناول\",\n mazmoon: \"مضمون\",\n ghazal: \"غزل\",\n nazm: \"نظم\",\n adab: \"ادب\",\n tareekh: \"تاریخ\",\n science: \"سائنس\",\n falsafa: \"فلسفہ\",\n saqafat: \"ثقافت\",\n tehzeeb: \"تہذیب\",\n moseeqi: \"موسیقی\",\n tasweer: \"تصویر\",\n rang: \"رنگ\",\n awaz: \"آواز\",\n khamoshi: \"خاموشی\",\n namaz: \"نماز\",\n roza: \"روزہ\",\n hajj: \"حج\",\n eid: \"عید\",\n qurbani: \"قربانی\",\n mazhab: \"مذہب\",\n rasool: \"رسول\",\n nabi: \"نبی\",\n quran: \"قرآن\",\n hadees: \"حدیث\",\n deen: \"دین\",\n imaan: \"ایمان\",\n jannat: \"جنت\",\n dozakh: \"دوزخ\",\n farishta: \"فرشتہ\",\n qayamat: \"قیامت\",\n ibadat: \"عبادت\",\n gunah: \"گناہ\",\n rehmat: \"رحمت\",\n barkat: \"برکت\",\n naiki: \"نیکی\",\n siyasat: \"سیاست\",\n election: \"الیکشن\",\n intikhab: \"انتخاب\",\n vote: \"ووٹ\",\n party: \"پارٹی\",\n jamaat: \"جماعت\",\n qanoon: \"قانون\",\n dastoor: \"دستور\",\n hukumat: \"حکومت\",\n jurm: \"جرم\",\n mujrim: \"مجرم\",\n saza: \"سزا\",\n fauj: \"فوج\",\n jang: \"جنگ\",\n larai: \"لڑائی\",\n aman: \"امن\",\n sulah: \"صلح\",\n tijarat: \"تجارت\",\n karobar: \"کاروبار\",\n sanat: \"صنعت\",\n taraqqi: \"ترقی\",\n report: \"رپورٹ\",\n conference: \"کانفرنس\",\n taqreer: \"تقریر\",\n aasman: \"آسمان\",\n zameen: \"زمین\",\n sooraj: \"سورج\",\n sitara: \"ستارہ\",\n pahaar: \"پہاڑ\",\n nadi: \"ندی\",\n darya: \"دریا\",\n samundar: \"سمندر\",\n jungle: \"جنگل\",\n bagh: \"باغ\",\n phool: \"پھول\",\n darakht: \"درخت\",\n pattay: \"پتّے\",\n machli: \"مچھلی\",\n parinday: \"پرندے\",\n kutta: \"کتا\",\n billi: \"بلی\",\n ghora: \"گھوڑا\",\n gaay: \"گائے\",\n bhains: \"بھیس\",\n bakra: \"بکرا\",\n mendha: \"میڈھا\",\n khargosh: \"خرگوش\",\n saanp: \"سانپ\",\n cheel: \"چیل\",\n kabootar: \"کبوتر\",\n tota: \"توتا\",\n ullu: \"الو\",\n chuha: \"چوہا\"\n};\n","/**\n * Transliteration between Urdu script and Roman Urdu.\n *\n * Read this before shipping it anywhere user-visible:\n *\n * Urdu script omits short vowels, so the mapping is genuinely ambiguous —\n * کتب is `kitab` or `kutub` depending on context, and no rule table can decide\n * which. The reverse direction is worse, because Roman Urdu has no standard\n * orthography (hai / hay / he / hei all occur in the wild).\n *\n * This module therefore works in two layers: a dictionary of common words, then\n * a rule fallback. Expect roughly 70% word accuracy on ordinary prose from the\n * rule layer, and treat every function here as `@experimental`. Anything better\n * needs a real lexicon plus a statistical model, which is planned for a later\n * release and deliberately not faked here.\n */\nimport { removeDiacritics, normalizeUrdu } from \"./normalize.js\";\nimport { splitWords } from \"./stats.js\";\nimport { URDU_LETTERS } from \"./chars.js\";\nimport { ROMAN_VARIANTS, WORD_DICTIONARY } from \"./dictionary.js\";\n\n\n/** Consonant + ھ (do-chashmi heh) forms one aspirated sound, so it is matched first. */\nconst DIGRAPHS: Record<string, string> = {\n \"بھ\": \"bh\",\n \"پھ\": \"ph\",\n \"تھ\": \"th\",\n \"ٹھ\": \"th\",\n \"جھ\": \"jh\",\n \"چھ\": \"chh\",\n \"دھ\": \"dh\",\n \"ڈھ\": \"dh\",\n \"ڑھ\": \"rh\",\n \"کھ\": \"kh\",\n \"گھ\": \"gh\",\n \"لھ\": \"lh\",\n \"مھ\": \"mh\",\n \"نھ\": \"nh\",\n \"رھ\": \"rh\",\n};\n\n// Default per-letter roman values and vowel flags come from the shared letter\n// inventory in chars.ts (URDU_LETTERS), so the rule fallback can never disagree\n// with collation or normalization about what counts as an Urdu letter.\nconst LETTERS: Record<string, string> = {};\nconst VOWEL_LETTERS = new Set<string>();\nfor (const { ch, roman, vowel } of URDU_LETTERS) {\n LETTERS[ch] = roman;\n if (vowel) VOWEL_LETTERS.add(ch);\n}\n\nfunction romanizeWord(word: string): string {\n const dictionary = WORD_DICTIONARY[word];\n if (dictionary) return dictionary;\n\n const chars = [...word];\n const pieces: Array<{ text: string; vowel: boolean }> = [];\n\n for (let i = 0; i < chars.length; i++) {\n const last = i === chars.length - 1;\n const pair = chars[i]! + (chars[i + 1] ?? \"\");\n const digraph = DIGRAPHS[pair];\n if (digraph) {\n pieces.push({ text: digraph, vowel: false });\n i++;\n continue;\n }\n\n const ch = chars[i]!;\n\n if (i === 0 && ch === \"ا\") {\n // Word-initial alef is a vowel carrier: اسلام -> islam, not aislam.\n const next = chars[1];\n if (next === \"و\") {\n pieces.push({ text: \"o\", vowel: true });\n i++;\n continue;\n }\n if (next === \"ی\") {\n pieces.push({ text: \"i\", vowel: true });\n i++;\n continue;\n }\n pieces.push({ text: \"a\", vowel: true });\n continue;\n }\n\n // Word-initially و and ی are consonants, not the vowels they spell elsewhere:\n // والا -> wala, یار -> yaar.\n if (i === 0 && ch === \"و\") {\n pieces.push({ text: \"w\", vowel: false });\n continue;\n }\n if (i === 0 && ch === \"ی\") {\n pieces.push({ text: \"y\", vowel: false });\n continue;\n }\n\n // Word-final ہ is the -a ending, not an audible h: کمرہ -> kamra, حصہ -> hasa.\n if (last && ch === \"ہ\" && pieces.length > 0) {\n pieces.push({ text: \"a\", vowel: true });\n continue;\n }\n\n // Final یں is the plural/oblique ending: سڑکیں -> sarkein, not sarkin.\n if (ch === \"ی\" && chars[i + 1] === \"ں\" && i + 1 === chars.length - 1) {\n pieces.push({ text: \"ein\", vowel: true });\n i++;\n continue;\n }\n\n // ی is \"i\" at the end of a word (لڑکی -> larki) but \"e\" inside one\n // (کھیل -> khel, تیز -> tez).\n if (ch === \"ی\" && !last) {\n pieces.push({ text: \"e\", vowel: true });\n continue;\n }\n\n pieces.push({ text: LETTERS[ch] ?? ch, vowel: VOWEL_LETTERS.has(ch) });\n }\n\n // Urdu does not write short vowels, so a word starting with two consonants comes\n // out unpronounceable (رہنے -> \"rhne\"). One schwa after the first consonant fixes\n // the common case without cascading guesses through the rest of the word.\n if (pieces.length > 2 && !pieces[0]!.vowel && !pieces[1]!.vowel) {\n pieces.splice(1, 0, { text: \"a\", vowel: true });\n }\n\n const out = pieces.map((p) => p.text).join(\"\");\n return out;\n}\n\n/**\n * Urdu script -> Roman Urdu.\n *\n * @experimental Rule + dictionary based; see the module note on accuracy.\n * @example\n * romanize(\"آپ کیسے ہیں\") // \"aap kaisay hain\"\n */\nexport function romanize(input: string, options: { capitalize?: boolean } = {}): string {\n if (!input) return \"\";\n const clean = removeDiacritics(normalizeUrdu(input));\n const roman = clean\n .split(/(\\s+)/u)\n .map((chunk) => (/^\\s+$/u.test(chunk) ? chunk : romanizeWord(chunk)))\n .join(\"\");\n if (!options.capitalize) return roman;\n return roman.charAt(0).toUpperCase() + roman.slice(1);\n}\n\n/** Roman spellings seen in the wild, mapped to their Urdu word. */\nconst ROMAN_DICTIONARY: Record<string, string> = {};\nfor (const [urduWord, roman] of Object.entries(WORD_DICTIONARY)) {\n ROMAN_DICTIONARY[roman] = urduWord;\n}\nObject.assign(ROMAN_DICTIONARY, ROMAN_VARIANTS);\n\nconst ROMAN_RULES: Array<[RegExp, string]> = [\n [/^kh/u, \"کھ\"],\n [/^gh/u, \"گھ\"],\n [/^chh/u, \"چھ\"],\n [/^ch/u, \"چ\"],\n [/^sh/u, \"ش\"],\n [/^th/u, \"تھ\"],\n [/^ph/u, \"پھ\"],\n [/^bh/u, \"بھ\"],\n [/^aa/u, \"آ\"],\n [/^oo/u, \"و\"],\n [/^ee/u, \"ی\"],\n [/^ai/u, \"ی\"],\n [/^b/u, \"ب\"],\n [/^p/u, \"پ\"],\n [/^t/u, \"ت\"],\n [/^j/u, \"ج\"],\n [/^d/u, \"د\"],\n [/^r/u, \"ر\"],\n [/^z/u, \"ز\"],\n [/^s/u, \"س\"],\n [/^f/u, \"ف\"],\n [/^q/u, \"ق\"],\n [/^k/u, \"ک\"],\n [/^g/u, \"گ\"],\n [/^l/u, \"ل\"],\n [/^m/u, \"م\"],\n [/^n/u, \"ن\"],\n [/^v|^w/u, \"و\"],\n [/^h/u, \"ہ\"],\n [/^y/u, \"ی\"],\n [/^a/u, \"ا\"],\n [/^e/u, \"ی\"],\n [/^i/u, \"ی\"],\n [/^o/u, \"و\"],\n [/^u/u, \"و\"],\n];\n\nfunction romanWordToUrdu(word: string): string {\n const lower = word.toLowerCase();\n const dictionary = ROMAN_DICTIONARY[lower];\n if (dictionary) return dictionary;\n\n let rest = lower;\n let out = \"\";\n let position = 0;\n while (rest.length > 0) {\n let matched = false;\n for (const [pattern, replacement] of ROMAN_RULES) {\n const hit = pattern.exec(rest);\n if (!hit) continue;\n // Short vowels are not written inside a word — only word-initially.\n const isShortVowel = /^[aeiou]$/u.test(hit[0]!);\n const skip = isShortVowel && position > 0 && rest.length > 1;\n if (!skip) out += replacement;\n rest = rest.slice(hit[0]!.length);\n position++;\n matched = true;\n break;\n }\n if (!matched) {\n out += rest[0]!;\n rest = rest.slice(1);\n position++;\n }\n }\n return out;\n}\n\n/**\n * Roman Urdu -> Urdu script.\n *\n * @experimental Substantially less accurate than {@link romanize}: Roman Urdu has\n * no standard spelling, so anything outside the dictionary is a guess.\n * @example\n * romanToUrdu(\"mera naam zaid hai\") // \"میرا نام زید ہے\"\n */\nexport function romanToUrdu(input: string): string {\n if (!input) return \"\";\n return input\n .split(/(\\s+)/u)\n .map((chunk) => (/^\\s+$/u.test(chunk) ? chunk : romanWordToUrdu(chunk)))\n .join(\"\");\n}\n\nexport interface SlugOptions {\n /** Word separator. Default `\"-\"`. */\n separator?: string;\n /** Cap the slug length, cutting at a word boundary. */\n maxLength?: number;\n /**\n * Keep Urdu characters instead of transliterating. Produces a percent-encoded\n * but human-readable URL, and avoids the accuracy problem entirely. Default `false`.\n */\n preserveUrdu?: boolean;\n}\n\n/**\n * URL slug from an Urdu title.\n *\n * @experimental in transliterating mode, for the reasons in the module note.\n * Pass `preserveUrdu: true` for a lossless slug.\n *\n * @example\n * urduSlug(\"میرا پہلا مضمون\") // \"mera-pehla-mazmoon\"\n * urduSlug(\"میرا پہلا مضمون\", { preserveUrdu: true }) // \"میرا-پہلا-مضمون\"\n */\nexport function urduSlug(input: string, options: SlugOptions = {}): string {\n const { separator = \"-\", maxLength, preserveUrdu = false } = options;\n if (!input) return \"\";\n\n const words = splitWords(removeDiacritics(normalizeUrdu(input)));\n const parts = preserveUrdu ? words : words.map(romanizeWord);\n\n // Built by joining cleaned tokens rather than by regex, so a caller-supplied\n // separator never has to be escaped into a pattern.\n const allowed = preserveUrdu ? /[^\\p{L}\\p{N}]+/gu : /[^a-z0-9]+/gu;\n let slug = parts\n .map((part) => part.toLowerCase().replace(allowed, \" \").trim())\n .flatMap((part) => part.split(/\\s+/u))\n .filter((part) => part.length > 0)\n .join(separator);\n\n if (maxLength && slug.length > maxLength) {\n slug = slug.slice(0, maxLength);\n const lastSeparator = slug.lastIndexOf(separator);\n if (lastSeparator > 0) slug = slug.slice(0, lastSeparator);\n }\n return slug;\n}\n","import { toEnglishDigits, toUrduDigits } from \"./numbers.js\";\n\n/**\n * Gregorian month names in Urdu (standard literary transliterations).\n * Index 0 corresponds to January (جنوری).\n */\nexport const URDU_MONTHS_GREGORIAN = [\n \"جنوری\",\n \"فروری\",\n \"مارچ\",\n \"اپریل\",\n \"مئی\",\n \"جون\",\n \"جولائی\",\n \"اگست\",\n \"ستمبر\",\n \"اکتوبر\",\n \"نومبر\",\n \"دسمبر\",\n] as const;\n\n/**\n * Islamic (Hijri) month names in Urdu.\n * Index 0 corresponds to Muharram (محرم).\n */\nexport const URDU_MONTHS_HIJRI = [\n \"محرم\",\n \"صفر\",\n \"ربیع الاول\",\n \"ربیع الثانی\",\n \"جمادی الاول\",\n \"جمادی الثانی\",\n \"رجب\",\n \"شعبان\",\n \"رمضان المبارک\",\n \"شوال\",\n \"ذی القعدہ\",\n \"ذی الحجہ\",\n] as const;\n\n/**\n * Days of the week in Urdu.\n * Index 0 corresponds to Sunday (اتوار).\n */\nexport const URDU_WEEKDAYS = [\n \"اتوار\",\n \"پیر\",\n \"منگل\",\n \"بدھ\",\n \"جمعرات\",\n \"جمعہ\",\n \"ہفتہ\",\n] as const;\n\nexport interface FormatUrduDateOptions {\n /**\n * Digit style to use for numeric tokens (e.g. YYYY, MM, DD, HH, mm, ss).\n * @default \"urdu\"\n */\n digits?: \"urdu\" | \"english\";\n /**\n * Calendar month naming scheme to use for `MMMM` and `MMM`.\n * @default \"gregorian\"\n */\n calendar?: \"gregorian\" | \"hijri\";\n}\n\nexport interface TimeAgoOptions {\n /**\n * Digit style to use for counts (e.g. \"۵ منٹ پہلے\" vs \"5 منٹ پہلے\").\n * @default \"urdu\"\n */\n digits?: \"urdu\" | \"english\";\n /**\n * Whether to include the relative suffix/prefix (\"پہلے\" or \"بعد\").\n * When `false`, returns only the duration string (e.g. \"۵ منٹ\", \"ایک گھنٹہ\").\n * @default true\n */\n addSuffix?: boolean;\n}\n\nfunction parseDateInput(input: Date | string | number): Date | null {\n if (input instanceof Date) {\n return isNaN(input.getTime()) ? null : input;\n }\n const date = new Date(input);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Returns the Urdu name for a given month index (0 to 11).\n *\n * @param monthIndex - 0 for January / Muharram, 11 for December / Dhul Hijjah.\n * @param calendar - \"gregorian\" or \"hijri\". Default is \"gregorian\".\n */\nexport function getUrduMonthName(\n monthIndex: number,\n calendar: \"gregorian\" | \"hijri\" = \"gregorian\"\n): string {\n const normalizedIndex = Math.floor(monthIndex) % 12;\n const idx = normalizedIndex < 0 ? normalizedIndex + 12 : normalizedIndex;\n return calendar === \"hijri\" ? URDU_MONTHS_HIJRI[idx]! : URDU_MONTHS_GREGORIAN[idx]!;\n}\n\n/**\n * Returns the Urdu name for a day of the week (0 = Sunday, 6 = Saturday).\n */\nexport function getUrduWeekdayName(dayIndex: number): string {\n const normalizedIndex = Math.floor(dayIndex) % 7;\n const idx = normalizedIndex < 0 ? normalizedIndex + 7 : normalizedIndex;\n return URDU_WEEKDAYS[idx]!;\n}\n\n/**\n * Formats a Date object or timestamp into an Urdu formatted date string.\n *\n * Supported formatting tokens:\n * - `YYYY`: Full year (e.g. \"۲۰۲۶\")\n * - `YY`: Two-digit year (e.g. \"۲۶\")\n * - `MMMM`: Full Urdu month name (e.g. \"اگست\")\n * - `MMM`: Full Urdu month name (e.g. \"اگست\")\n * - `MM`: 2-digit month with leading zero (e.g. \"۰۸\")\n * - `M`: 1-digit month (e.g. \"۸\")\n * - `DD`: 2-digit day of month with leading zero (e.g. \"۰۵\")\n * - `D`: 1-digit day of month (e.g. \"۵\")\n * - `dddd`: Full day of the week (e.g. \"ہفتہ\", \"جمعہ\")\n * - `ddd`: Short day of the week (same in Urdu)\n * - `HH`: 24-hour hour with leading zero (00-23)\n * - `H`: 24-hour hour (0-23)\n * - `hh`: 12-hour hour with leading zero (01-12)\n * - `h`: 12-hour hour (1-12)\n * - `mm`: Minute with leading zero (00-59)\n * - `m`: Minute (0-59)\n * - `ss`: Second with leading zero (00-59)\n * - `s`: Second (0-59)\n * - `A`: Day period indicator in Urdu (\"صبح\", \"دوپہر\", \"شام\", \"رات\")\n * - `a`: Concise period indicator (\"صبح\", \"شام\")\n *\n * @example\n * formatUrduDate(new Date(2026, 7, 22), \"DD MMMM YYYY\")\n * // \"۲۲ اگست ۲۰۲۶\"\n *\n * formatUrduDate(new Date(2026, 7, 22, 14, 30), \"dddd، D MMMM YYYY، hh:mm A\")\n * // \"ہفتہ، ۲۲ اگست ۲۰۲۶، ۰۲:۳۰ دوپہر\"\n */\nexport function formatUrduDate(\n date: Date | string | number,\n pattern: string = \"DD MMMM YYYY\",\n options: FormatUrduDateOptions = {}\n): string {\n const d = parseDateInput(date);\n if (!d) return \"\";\n\n const digits = options.digits ?? \"urdu\";\n const calendar = options.calendar ?? \"gregorian\";\n\n const year = d.getFullYear();\n const month = d.getMonth();\n const dayOfMonth = d.getDate();\n const dayOfWeek = d.getDay();\n const hours24 = d.getHours();\n const hours12 = hours24 % 12 || 12;\n const minutes = d.getMinutes();\n const seconds = d.getSeconds();\n\n const pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);\n\n // Day period calculation\n let periodDetailed: string;\n let periodSimple: string;\n if (hours24 >= 4 && hours24 < 12) {\n periodDetailed = \"صبح\";\n periodSimple = \"صبح\";\n } else if (hours24 >= 12 && hours24 < 16) {\n periodDetailed = \"دوپہر\";\n periodSimple = \"شام\";\n } else if (hours24 >= 16 && hours24 < 20) {\n periodDetailed = \"شام\";\n periodSimple = \"شام\";\n } else {\n periodDetailed = \"رات\";\n periodSimple = \"رات\";\n }\n\n const tokenValues: Record<string, string> = {\n YYYY: `${year}`,\n YY: `${year}`.slice(-2),\n MMMM: getUrduMonthName(month, calendar),\n MMM: getUrduMonthName(month, calendar),\n MM: pad(month + 1),\n M: `${month + 1}`,\n DD: pad(dayOfMonth),\n D: `${dayOfMonth}`,\n dddd: getUrduWeekdayName(dayOfWeek),\n ddd: getUrduWeekdayName(dayOfWeek),\n HH: pad(hours24),\n H: `${hours24}`,\n hh: pad(hours12),\n h: `${hours12}`,\n mm: pad(minutes),\n m: `${minutes}`,\n ss: pad(seconds),\n s: `${seconds}`,\n A: periodDetailed,\n a: periodSimple,\n };\n\n // Replace tokens by matching largest token keys first\n const regex = /YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|A|a/g;\n\n const result = pattern.replace(regex, (match) => {\n const val = tokenValues[match];\n if (val === undefined) return match;\n if (digits === \"urdu\" && /^\\d+$/.test(val)) {\n return toUrduDigits(val);\n }\n return val;\n });\n\n return result;\n}\n\n/**\n * Returns a human-friendly relative time string in Urdu.\n *\n * @example\n * timeAgoUrdu(Date.now() - 30 * 1000) // \"ابھی\"\n * timeAgoUrdu(Date.now() - 5 * 60 * 1000) // \"۵ منٹ پہلے\"\n * timeAgoUrdu(Date.now() - 3 * 3600 * 1000) // \"۳ گھنٹے پہلے\"\n * timeAgoUrdu(Date.now() - 86400 * 1000) // \"کل\"\n * timeAgoUrdu(Date.now() + 5 * 60 * 1000) // \"۵ منٹ بعد\"\n */\nexport function timeAgoUrdu(\n date: Date | string | number,\n relativeTo: Date | string | number = new Date(),\n options: TimeAgoOptions = {}\n): string {\n const d = parseDateInput(date);\n const now = parseDateInput(relativeTo);\n if (!d || !now) return \"\";\n\n const digits = options.digits ?? \"urdu\";\n const addSuffix = options.addSuffix ?? true;\n\n const formatNum = (num: number): string => {\n const s = `${num}`;\n return digits === \"urdu\" ? toUrduDigits(s) : s;\n };\n\n const diffMs = now.getTime() - d.getTime();\n const isPast = diffMs >= 0;\n const absDiffSeconds = Math.round(Math.abs(diffMs) / 1000);\n\n // Less than 45 seconds\n if (absDiffSeconds < 45) {\n return isPast ? \"ابھی\" : \"چند لمحے بعد\";\n }\n\n // Minutes (45s to 45m)\n const minutes = Math.round(absDiffSeconds / 60);\n if (minutes <= 45) {\n if (minutes === 1) {\n if (!addSuffix) return \"ایک منٹ\";\n return isPast ? \"ایک منٹ پہلے\" : \"ایک منٹ بعد\";\n }\n const count = formatNum(minutes);\n if (!addSuffix) return `${count} منٹ`;\n return isPast ? `${count} منٹ پہلے` : `${count} منٹ بعد`;\n }\n\n // Hours (45m to 22 hours)\n const hours = Math.round(minutes / 60);\n if (hours <= 22) {\n if (hours === 1) {\n if (!addSuffix) return \"ایک گھنٹہ\";\n return isPast ? \"ایک گھنٹہ پہلے\" : \"ایک گھنٹہ بعد\";\n }\n const count = formatNum(hours);\n if (!addSuffix) return `${count} گھنٹے`;\n return isPast ? `${count} گھنٹے پہلے` : `${count} گھنٹے بعد`;\n }\n\n // Days (22 hours to 6 days)\n const days = Math.round(hours / 24);\n if (days === 1) {\n return isPast ? \"کل\" : \"کل\";\n }\n if (days === 2) {\n return isPast ? \"پرسوں\" : \"پرسوں\";\n }\n if (days <= 6) {\n const count = formatNum(days);\n if (!addSuffix) return `${count} دن`;\n return isPast ? `${count} دن پہلے` : `${count} دن بعد`;\n }\n\n // Weeks (7 days to 28 days)\n const weeks = Math.round(days / 7);\n if (days <= 28) {\n if (weeks === 1) {\n if (!addSuffix) return \"ایک ہفتہ\";\n return isPast ? \"ایک ہفتہ پہلے\" : \"ایک ہفتہ بعد\";\n }\n const count = formatNum(weeks);\n if (!addSuffix) return `${count} ہفتے`;\n return isPast ? `${count} ہفتے پہلے` : `${count} ہفتے بعد`;\n }\n\n // Months (29 days to 320 days)\n const months = Math.round(days / 30.44);\n if (days <= 320) {\n if (months <= 1) {\n if (!addSuffix) return \"ایک ماہ\";\n return isPast ? \"ایک ماہ پہلے\" : \"ایک ماہ بعد\";\n }\n const count = formatNum(months);\n if (!addSuffix) return `${count} ماہ`;\n return isPast ? `${count} ماہ پہلے` : `${count} ماہ بعد`;\n }\n\n // Years (> 320 days)\n const years = Math.round(days / 365.25);\n if (years <= 1) {\n if (!addSuffix) return \"ایک سال\";\n return isPast ? \"ایک سال پہلے\" : \"ایک سال بعد\";\n }\n const count = formatNum(years);\n if (!addSuffix) return `${count} سال`;\n return isPast ? `${count} سال پہلے` : `${count} سال بعد`;\n}\n\nconst ENGLISH_MONTH_NAMES = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n] as const;\n\nconst ENGLISH_WEEKDAY_NAMES = [\n \"sunday\",\n \"monday\",\n \"tuesday\",\n \"wednesday\",\n \"thursday\",\n \"friday\",\n \"saturday\",\n] as const;\n\n/**\n * Recognised month spellings -> month index. Only Gregorian names are\n * accepted: Hijri names include صفر, which is also the Urdu word for zero and\n * would make a bare `صفر` genuinely ambiguous.\n */\nconst MONTH_LOOKUP: Record<string, number> = (() => {\n // Prototype-free: a token like \"constructor\" must look up as undefined, not\n // as an inherited Object.prototype member.\n const lookup: Record<string, number> = Object.create(null) as Record<string, number>;\n URDU_MONTHS_GREGORIAN.forEach((name, index) => {\n lookup[name] = index;\n });\n ENGLISH_MONTH_NAMES.forEach((name, index) => {\n lookup[name] = index;\n lookup[name.slice(0, 3)] = index;\n });\n return lookup;\n})();\n\n/** Weekday names are recognised only so they can be skipped, never used. */\nconst WEEKDAY_TOKENS = new Set<string>();\nfor (const name of URDU_WEEKDAYS) WEEKDAY_TOKENS.add(name);\nfor (const name of ENGLISH_WEEKDAY_NAMES) {\n WEEKDAY_TOKENS.add(name);\n WEEKDAY_TOKENS.add(name.slice(0, 3));\n}\n\n/**\n * The day-period words `formatUrduDate` emits, and the 12-hour window each one\n * covers, so parsing can invert formatting exactly.\n *\n * `رات` is the awkward one: it spans 20:00-03:59, which `hh` renders as 08-11\n * and 12, 1, 2, 3 respectively. Both halves therefore have to be resolved back.\n */\nconst URDU_PERIODS: Record<string, \"morning\" | \"afternoon\" | \"evening\" | \"night\"> = Object.assign(\n Object.create(null) as Record<string, \"morning\" | \"afternoon\" | \"evening\" | \"night\">,\n {\n صبح: \"morning\",\n دوپہر: \"afternoon\",\n شام: \"evening\",\n رات: \"night\",\n },\n);\n\ntype PeriodHint = \"am\" | \"pm\" | \"morning\" | \"afternoon\" | \"evening\" | \"night\";\n\n/** Resolve a 12-hour clock reading plus its period word to a 24-hour hour. */\nfunction resolveHour(hour: number, period: PeriodHint | undefined): number {\n switch (period) {\n case \"am\":\n case \"morning\":\n return hour === 12 ? 0 : hour;\n case \"pm\":\n case \"afternoon\":\n case \"evening\":\n return hour < 12 ? hour + 12 : hour;\n case \"night\":\n if (hour === 12) return 0;\n // 20:00-23:59 formats as hh 08-11 with رات; 00:00-03:59 as 12, 1, 2, 3.\n return hour >= 8 && hour <= 11 ? hour + 12 : hour;\n default:\n return hour;\n }\n}\n\n/** Build a Date from wall-clock components, rejecting overflowed dates. */\nfunction buildLocalDate(\n year: number,\n month: number,\n day: number,\n hour: number,\n minute: number,\n second: number,\n): Date | null {\n if (!Number.isInteger(year) || year < 100) return null;\n if (!Number.isInteger(month) || month < 0 || month > 11) return null;\n if (!Number.isInteger(day) || day < 1 || day > 31) return null;\n if (!Number.isInteger(hour) || hour < 0 || hour > 23) return null;\n if (!Number.isInteger(minute) || minute < 0 || minute > 59) return null;\n if (!Number.isInteger(second) || second < 0 || second > 59) return null;\n\n const date = new Date(year, month, day, hour, minute, second);\n // A rolled-over date (31 فروری) must not silently become March.\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== day ||\n date.getHours() !== hour\n ) {\n return null;\n }\n return date;\n}\n\n/** Expand a two-digit year the way date libraries conventionally do. */\nfunction expandYear(year: number): number {\n if (year >= 100) return year;\n return year < 70 ? 2000 + year : 1900 + year;\n}\n\nconst INVISIBLE_CHARS_RE = /[\\u200B-\\u200F\\u202A-\\u202E\\u2066-\\u2069\\uFEFF]/gu;\n\n/** Numeric date form, day-first (Pakistani convention) or ISO with a 4-digit lead. */\nfunction parseNumericDate(input: string): Date | null {\n const iso = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[T ](\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/u.exec(input);\n if (iso) {\n return buildLocalDate(\n Number(iso[1]),\n Number(iso[2]) - 1,\n Number(iso[3]),\n iso[4] === undefined ? 0 : Number(iso[4]),\n iso[5] === undefined ? 0 : Number(iso[5]),\n iso[6] === undefined ? 0 : Number(iso[6]),\n );\n }\n\n const dayFirst = /^(\\d{1,2})[/\\-.](\\d{1,2})[/\\-.](\\d{2,4})(?:[ ,T]+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/u.exec(input);\n if (dayFirst) {\n return buildLocalDate(\n expandYear(Number(dayFirst[3])),\n Number(dayFirst[2]) - 1,\n Number(dayFirst[1]),\n dayFirst[4] === undefined ? 0 : Number(dayFirst[4]),\n dayFirst[5] === undefined ? 0 : Number(dayFirst[5]),\n dayFirst[6] === undefined ? 0 : Number(dayFirst[6]),\n );\n }\n\n return null;\n}\n\nexport interface ParseUrduDateOptions {\n /**\n * Year assumed when the input carries no year, e.g. `۲۲ اگست`.\n * @default the current year\n */\n defaultYear?: number;\n}\n\n/**\n * Parse a date written with Urdu or English month names, Urdu or ASCII digits,\n * into a `Date`. This is the inverse of {@link formatUrduDate}, so anything\n * that function can produce parses back to the same wall-clock moment:\n *\n * ```ts\n * const d = new Date(2026, 7, 22, 14, 30);\n * const text = formatUrduDate(d, \"dddd، D MMMM YYYY، hh:mm A\"); // \"ہفتہ، ۲۲ اگست ۲۰۲۶، ۰۲:۳۰ دوپہر\"\n * parseUrduDate(text)?.getHours(); // 14\n * ```\n *\n * Accepted input:\n * - `۲۲ اگست ۲۰۲۶`, `22 August 2026`, `Aug 22, 2026` (Urdu or English month name)\n * - `۲۲/۰۸/۲۰۲۶` — day-first, matching Pakistani convention\n * - `2026-08-22` and `2026-08-22T14:30` — ISO, `` `T` `` form, no timezone offset\n * - an optional preceding weekday name (ignored) and an optional time with\n * `صبح دوپہر شام رات` or `am`/`pm`, e.g. `۰۲:۳۰ دوپہر`\n *\n * Deliberately rejected, returning `null`: absolute instants carrying a `Z` or\n * numeric offset (this function never does timezone conversion — it builds the\n * wall-clock time in the runtime's own zone, exactly as `formatUrduDate`\n * reads it), Hijri month names, and dates that do not exist (`۳۱ فروری`).\n * A two-digit year expands as `00-69` -> `20xx` and `70-99` -> `19xx`.\n *\n * @example\n * parseUrduDate(\"۲۲ اگست ۲۰۲۶\") // Date(2026, 7, 22)\n * parseUrduDate(\"۵ جنوری ۲۰۲۶، ۰۹:۱۵ صبح\")?.getHours() // 9\n * parseUrduDate(\"5 جنوری\") // Date(currentYear, 0, 5)\n * parseUrduDate(\"۳۱ فروری ۲۰۲۶\") // null\n */\nexport function parseUrduDate(input: string, options: ParseUrduDateOptions = {}): Date | null {\n if (!input) return null;\n\n const normalized = toEnglishDigits(input)\n .replace(INVISIBLE_CHARS_RE, \"\")\n .replace(/[،۔]/gu, \" \")\n .replace(/\\s+/gu, \" \")\n .trim();\n if (normalized === \"\") return null;\n\n const numeric = parseNumericDate(normalized);\n if (numeric) return numeric;\n\n let month: number | null = null;\n let hour: number | null = null;\n let minute = 0;\n let second = 0;\n let period: PeriodHint | undefined;\n const numbers: number[] = [];\n\n for (const rawToken of normalized.split(\" \")) {\n // Strip punctuation hugging a token (\"۲۰۲۶،\" is already spaced out, but\n // \"2026.\" and \"(۲۰۲۶)\" are not).\n const token = rawToken.replace(/^[^\\p{L}\\p{N}]+/u, \"\").replace(/[^\\p{L}\\p{N}]+$/u, \"\");\n if (token === \"\") continue;\n\n const urduPeriod = URDU_PERIODS[token];\n if (urduPeriod) {\n period = urduPeriod;\n continue;\n }\n\n const lower = token.toLowerCase();\n if (lower === \"am\" || lower === \"pm\") {\n period = lower;\n continue;\n }\n\n if (WEEKDAY_TOKENS.has(token) || WEEKDAY_TOKENS.has(lower)) continue;\n\n const time = /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/u.exec(token);\n if (time) {\n hour = Number(time[1]);\n minute = Number(time[2]);\n second = time[3] === undefined ? 0 : Number(time[3]);\n continue;\n }\n\n const monthIndex = MONTH_LOOKUP[token] ?? MONTH_LOOKUP[lower];\n if (monthIndex !== undefined) {\n month = monthIndex;\n continue;\n }\n\n if (/^\\d+$/u.test(token)) numbers.push(Number(token));\n // Anything else (\"بتاریخ\", stray words) is ignored rather than fatal, so a\n // decorated date string still parses.\n }\n\n if (month === null || numbers.length === 0) return null;\n\n let day: number;\n let year: number;\n if (numbers.length === 1) {\n const only = numbers[0]!;\n if (only > 31) {\n // \"جنوری ۲۰۲۶\" — month precision, resolved to the first of the month.\n day = 1;\n year = only;\n } else {\n day = only;\n year = options.defaultYear ?? new Date().getFullYear();\n }\n } else {\n const first = numbers[0]!;\n const last = numbers[numbers.length - 1]!;\n // Day-first, but tolerate a year that leads (\"۲۰۲۶ اگست ۲۲\").\n if (first > 31 && last <= 31) {\n day = last;\n year = first;\n } else {\n day = first;\n year = last;\n }\n }\n\n return buildLocalDate(\n expandYear(year),\n month,\n day,\n hour === null ? 0 : resolveHour(hour, period),\n minute,\n second,\n );\n}\n","import { normalizeUrdu, removeDiacritics } from \"./normalize.js\";\n\n/**\n * Canonical Urdu prefixes (سابقے) ordered by descending length.\n */\nexport const URDU_PREFIXES = [\n \"غیر\",\n \"خود\",\n \"اہل\",\n \"بے\",\n \"نا\",\n \"لا\",\n \"بد\",\n \"کم\",\n \"ان\",\n \"ہم\",\n \"با\",\n \"پُر\",\n] as const;\n\n/**\n * Canonical Urdu suffixes (لاحقے) ordered by descending length.\n */\nexport const URDU_SUFFIXES = [\n // Compound / multi-syllable suffixes\n \"یںگے\",\n \"ینگے\",\n \"ےگا\",\n \"ےگی\",\n \"ینگی\",\n \"داری\",\n \"گاری\",\n \"کاری\",\n \"سازی\",\n \"بازی\",\n \"مندی\",\n \"ترین\",\n \"ستان\",\n \"خانہ\",\n \"نامہ\",\n \"جات\",\n \"گان\",\n // Adjectival / nominal / agentive suffixes\n \"دار\",\n \"گار\",\n \"کار\",\n \"ساز\",\n \"باز\",\n \"مند\",\n \"ناک\",\n \"وار\",\n \"دان\",\n \"زار\",\n \"یت\",\n \"پن\",\n \"ائی\",\n \"تر\",\n // Plural & verbal inflections\n \"یاں\",\n \"ئیں\",\n \"ؤں\",\n \"یوں\",\n \"وں\",\n \"یں\",\n \"ات\",\n \"ہا\",\n \"ین\",\n \"تیں\",\n \"تا\",\n \"تی\",\n \"تے\",\n \"نا\",\n] as const;\n\n/**\n * Irreducible base words that must not have prefixes or suffixes stripped falsely.\n * Exported so the PHP port can consume the identical list via tables.json.\n */\nexport const PROTECTED_WORDS = new Set<string>([\n \"ہم\",\n \"نا\",\n \"لا\",\n \"بے\",\n \"یا\",\n \"تو\",\n \"پر\",\n \"سے\",\n \"کو\",\n \"کا\",\n \"کی\",\n \"کے\",\n \"میں\",\n \"نے\",\n \"ہے\",\n \"ہیں\",\n \"ہو\",\n \"تھا\",\n \"تھی\",\n \"تھے\",\n \"تھیں\",\n \"باغ\",\n \"نام\",\n \"سفر\",\n \"ہوا\",\n \"دل\",\n \"سر\",\n \"لب\",\n \"دست\",\n \"کار\",\n \"بار\",\n \"بال\",\n \"بان\",\n \"شام\",\n \"کام\",\n \"دام\",\n \"جام\",\n \"عام\",\n \"رام\",\n \"گام\",\n \"تار\",\n \"یار\",\n \"مار\",\n \"نار\",\n \"دار\",\n \"ہار\",\n \"زار\",\n \"غار\",\n \"رات\",\n \"بات\",\n \"مات\",\n \"ذات\",\n \"ہاتھ\",\n \"ساتھ\",\n \"دین\",\n \"تین\",\n \"چین\",\n \"بین\",\n \"زمین\",\n \"انسان\",\n \"احسان\",\n \"ایمان\",\n \"اسلام\",\n \"اعلان\",\n \"امکان\",\n \"ارمان\",\n \"افغان\",\n \"ایران\",\n \"عمران\",\n \"عثمان\",\n \"سلمان\",\n \"عرفان\",\n \"قرآن\",\n \"طوفان\",\n \"پہچان\",\n \"دکان\",\n \"مکان\",\n \"اسمان\",\n \"آسمان\",\n \"مہمان\",\n \"نقصان\",\n]);\n\nexport interface StemmerOptions {\n /**\n * Whether to strip canonical Urdu prefixes (e.g. بے-, نا-, غیر-, لا-).\n * @default true\n */\n stripPrefixes?: boolean;\n\n /**\n * Whether to strip canonical Urdu suffixes (e.g. -وں, -یں, -یاں, -دار, -تے).\n * @default true\n */\n stripSuffixes?: boolean;\n\n /**\n * Minimum character length of the remaining root word.\n * Prevents over-stemming of short roots.\n * @default 2\n */\n minStemLength?: number;\n\n /**\n * Custom list of prefixes to strip in addition to or in place of defaults.\n */\n customPrefixes?: string[];\n\n /**\n * Custom list of suffixes to strip in addition to or in place of defaults.\n */\n customSuffixes?: string[];\n\n /**\n * Map of exact exception words to their canonical stems.\n */\n exceptions?: Record<string, string>;\n}\n\nexport interface AffixBreakdown {\n /** The stripped prefix, if any */\n prefix?: string;\n /** The stemmed base root */\n stem: string;\n /** The stripped suffix, if any */\n suffix?: string;\n}\n\n/**\n * Strips a suffix from an Urdu word while applying morphological restoration rules:\n * - `لڑکیاں` -> `لڑکی` (restoring final `ی` after `-یاں`)\n * - `لڑکیوں` -> `لڑکی` (restoring final `ی` after `-یوں`)\n * - `دعائیں` -> `دعا` (restoring base before `-ئیں`)\n * - `دعاؤں` -> `دعا` (restoring base before `-ؤں`)\n * - `خوشبوئیں` -> `خوشبو` (restoring `و` before `-ئیں`)\n * - `خوشبوؤں` -> `خوشبو` (restoring `و` before `-ؤں`)\n */\nfunction applySuffixStripping(\n word: string,\n suffixes: readonly string[],\n minLen: number\n): { stem: string; suffix?: string } {\n if (word.length <= minLen) return { stem: word };\n\n // Special morphological restorations:\n // 1. Plurals ending in -یاں (e.g. لڑکیاں -> لڑکی, کہانیاں -> کہانی, تبدیلیاں -> تبدیلی)\n if (word.endsWith(\"یاں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: `${base}ی`, suffix: \"یاں\" };\n }\n\n // 2. Plurals ending in -یوں (e.g. لڑکیوں -> لڑکی, گاڑیوں -> گاڑی, صدیوں -> صدی)\n if (word.endsWith(\"یوں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: `${base}ی`, suffix: \"یوں\" };\n }\n\n // 3. Plurals ending in -ئیں (3 chars: ئ + ی + ں) -> e.g. دعائیں -> دعا, ہوائیں -> ہوا, خوشبوئیں -> خوشبو\n if (word.endsWith(\"ئیں\") && word.length - 3 >= minLen) {\n const base = word.slice(0, -3);\n return { stem: base, suffix: \"ئیں\" };\n }\n\n // 4. Plurals ending in -ؤں (2 chars: ؤ + ں) -> e.g. دعاؤں -> دعا, ہواؤں -> ہوا, خوشبوؤں -> خوشبو\n if (word.endsWith(\"ؤں\") && word.length - 2 >= minLen) {\n const base = word.slice(0, -2);\n return { stem: base, suffix: \"ؤں\" };\n }\n\n for (const suf of suffixes) {\n if (word.endsWith(suf)) {\n const remainder = word.slice(0, -suf.length).replace(/[\\s\\u200C\\u200D]+$/, \"\");\n if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {\n return { stem: remainder, suffix: suf };\n }\n }\n }\n\n return { stem: word };\n}\n\n/**\n * Strips a prefix from an Urdu word with protected length and root checks.\n */\nfunction applyPrefixStripping(\n word: string,\n prefixes: readonly string[],\n minLen: number\n): { stem: string; prefix?: string } {\n if (word.length <= minLen) return { stem: word };\n\n for (const pref of prefixes) {\n if (word.startsWith(pref)) {\n const remainder = word.slice(pref.length).replace(/^[\\s\\u200C\\u200D]+/, \"\");\n if (remainder.length >= minLen && !PROTECTED_WORDS.has(word)) {\n return { stem: remainder, prefix: pref };\n }\n }\n }\n\n return { stem: word };\n}\n\n/**\n * Analyzes an Urdu word and extracts its prefix, stem, and suffix.\n *\n * @example\n * getAffixes(\"بےوقوف\")\n * // { prefix: \"بے\", stem: \"وقوف\" }\n *\n * getAffixes(\"کتابیں\")\n * // { stem: \"کتاب\", suffix: \"یں\" }\n *\n * getAffixes(\"غیرملکیوں\")\n * // { prefix: \"غیر\", stem: \"ملکی\", suffix: \"یوں\" }\n *\n * getAffixes(\"نااہلی\")\n * // { prefix: \"نا\", stem: \"اہلی\" }\n */\nexport function getAffixes(\n input: string,\n options: StemmerOptions = {}\n): AffixBreakdown {\n if (!input || typeof input !== \"string\") {\n return { stem: \"\" };\n }\n\n const clean = removeDiacritics(normalizeUrdu(input.trim()));\n if (!clean) return { stem: \"\" };\n\n if (options.exceptions && options.exceptions[clean]) {\n return { stem: options.exceptions[clean]! };\n }\n\n if (PROTECTED_WORDS.has(clean)) {\n return { stem: clean };\n }\n\n const minLen = options.minStemLength ?? 2;\n const doSuffixes = options.stripSuffixes ?? true;\n const doPrefixes = options.stripPrefixes ?? true;\n\n const suffixes = options.customSuffixes ?? URDU_SUFFIXES;\n const prefixes = options.customPrefixes ?? URDU_PREFIXES;\n\n let current = clean;\n let detectedSuffix: string | undefined;\n let detectedPrefix: string | undefined;\n\n // 1. Suffix stripping\n if (doSuffixes) {\n const sRes = applySuffixStripping(current, suffixes, minLen);\n current = sRes.stem;\n detectedSuffix = sRes.suffix;\n }\n\n // 2. Prefix stripping\n if (doPrefixes) {\n const pRes = applyPrefixStripping(current, prefixes, minLen);\n current = pRes.stem;\n detectedPrefix = pRes.prefix;\n }\n\n return {\n prefix: detectedPrefix,\n stem: current,\n suffix: detectedSuffix,\n };\n}\n\n/**\n * Reduces an Urdu word to its morphological root/stem by stripping common prefixes,\n * plurals, tense inflections, and adjectival/nominal suffixes.\n *\n * @example\n * stemUrdu(\"کتابیں\") // \"کتاب\"\n * stemUrdu(\"لڑکیاں\") // \"لڑکی\"\n * stemUrdu(\"دعاؤں\") // \"دعا\"\n * stemUrdu(\"بےوقوف\") // \"وقوف\"\n * stemUrdu(\"نااہل\") // \"اہل\"\n * stemUrdu(\"خوبصورت ترین\") // \"خوبصورت\"\n */\nexport function stemUrdu(word: string, options: StemmerOptions = {}): string {\n return getAffixes(word, options).stem;\n}\n\n/**\n * Stems all words within a block of Urdu text while preserving punctuation,\n * whitespaces, and document formatting.\n *\n * Ideal for search engine indexing, TF-IDF scoring, and AI/LLM embeddings preprocessing.\n *\n * @example\n * stemUrduText(\"طلباء کتابیں پڑھتے ہیں اور کہانیاں سنتے ہیں۔\")\n * // \"طلباء کتاب پڑھ ہیں اور کہانی سن ہیں۔\"\n */\nexport function stemUrduText(text: string, options: StemmerOptions = {}): string {\n if (!text || typeof text !== \"string\") return \"\";\n\n // Split on word boundaries while keeping delimiters intact\n const tokens = text.split(/([\\s\\p{P}\\p{S}]+)/u);\n\n return tokens\n .map((token) => {\n // If token contains Urdu letters, stem it; otherwise leave as is\n if (/[\\u0600-\\u06FF\\u0750-\\u077F\\uFB50-\\uFDFF\\uFE70-\\uFEFF]/.test(token)) {\n return stemUrdu(token, options);\n }\n return token;\n })\n .join(\"\");\n}\n","/**\n * Urdu name transliteration for Pakistani names.\n *\n * Handles common first names, family names, honorifics, and name prefixes.\n * Designed for forms, shipping labels, databases, and any context where\n * Urdu names need to appear in English (and vice versa).\n *\n * Uses a dictionary of ~300 common Pakistani names for accuracy, with\n * rule-based fallback for unknown names.\n */\nimport { removeDiacritics, normalizeUrdu } from \"./normalize.js\";\n\n// ============================================================================\n// NAME DICTIONARIES\n// ============================================================================\n\n/** Common Urdu first names mapped to their standard English spellings. */\nexport const URDU_FIRST_NAMES: Record<string, string> = {\n // Male names\n \"محمد\": \"Muhammad\",\n \"احمد\": \"Ahmed\",\n \"علی\": \"Ali\",\n \"عمر\": \"Umar\",\n \"عثمان\": \"Usman\",\n \"ابوبکر\": \"Abubakar\",\n \"یوسف\": \"Yusuf\",\n \"یعقوب\": \"Yaquob\",\n \"اسماعیل\": \"Ismail\",\n \"ابراہیم\": \"Ibrahim\",\n \"اسحاق\": \"Ishaq\",\n \"حسین\": \"Hussain\",\n \"حسن\": \"Hasan\",\n \"زید\": \"Zaid\",\n \"حمزہ\": \"Hamza\",\n \"سلمان\": \"Salman\",\n \"فرحان\": \"Farhan\",\n \"ادنان\": \"Adnan\",\n \"بلال\": \"Bilal\",\n \"طارق\": \"Tariq\",\n \"جاوید\": \"Javed\",\n \"عرفان\": \"Irfan\",\n \"کاشف\": \"Kashif\",\n \"ندیم\": \"Nadeem\",\n \"یاسر\": \"Yasir\",\n \"رضوان\": \"Rizwan\",\n \"فیصل\": \"Faisal\",\n \"خالد\": \"Khalid\",\n \"راشد\": \"Rashid\",\n \"شاہد\": \"Shahid\",\n \"سعید\": \"Saeed\",\n \"نعیم\": \"Naeem\",\n \"وسیم\": \"Waseem\",\n \"رفیق\": \"Rafiq\",\n \"جمیل\": \"Jamil\",\n \"زبیر\": \"Zubair\",\n \"طاہر\": \"Tahir\",\n \"عارف\": \"Arif\",\n \"نعمان\": \"Noman\",\n \"ثاقب\": \"Saqib\",\n \"عدیل\": \"Adeel\",\n \"عمران\": \"Imran\",\n \"فواد\": \"Fawad\",\n \"آصف\": \"Asif\",\n \"شعیب\": \"Shoaib\",\n \"زاہد\": \"Zahid\",\n \"عامر\": \"Amer\",\n \"مجید\": \"Majid\",\n \"سرفراز\": \"Sarfraz\",\n \"حمید\": \"Hamid\",\n \"نظیر\": \"Nazir\",\n \"قیصر\": \"Qaiser\",\n \"لطیف\": \"Latif\",\n \"تنویر\": \"Tanveer\",\n \"سلیمان\": \"Suleman\",\n \"افتخار\": \"Iftikhar\",\n \"شبیر\": \"Shabbir\",\n \"ساجد\": \"Sajid\",\n \"منصور\": \"Mansoor\",\n \"سلطان\": \"Sultan\",\n \"نصیر\": \"Nasir\",\n \"حبیب\": \"Habib\",\n \"مقصود\": \"Maqsood\",\n \"مسعود\": \"Masood\",\n \"سہیل\": \"Sohail\",\n \"اشرف\": \"Ashraf\",\n \"مبارک\": \"Mubarak\",\n \"فہد\": \"Fahad\",\n \"اظہر\": \"Azhar\",\n \"وکیل\": \"Wakeel\",\n \"رؤف\": \"Rauf\",\n \"دانیال\": \"Daniyal\",\n \"ذیشان\": \"Zeeshan\",\n \"مصطفی\": \"Mustafa\",\n\n // Female names\n \"فاطمہ\": \"Fatima\",\n \"عائشہ\": \"Ayesha\",\n \"خدیجہ\": \"Khadija\",\n \"حسنا\": \"Husna\",\n \"زینب\": \"Zainab\",\n \"آمنہ\": \"Amina\",\n \"سارا\": \"Sara\",\n \"ادیہ\": \"Adia\",\n \"نور\": \"Noor\",\n \"حرا\": \"Hira\",\n \"اقصی\": \"Aqsa\",\n \"ماہم\": \"Maham\",\n \"ایمان\": \"Iman\",\n \"لائبہ\": \"Laiba\",\n \"ہانیہ\": \"Hania\",\n \"رمشہ\": \"Rimsha\",\n \"میمونہ\": \"Memoona\",\n \"ثنا\": \"Sana\",\n \"حنا\": \"Hina\",\n \"اقرا\": \"Iqra\",\n \"فیزا\": \"Fiza\",\n \"فضہ\": \"Fizza\",\n \"سدرہ\": \"Sidra\",\n \"ردا\": \"Rida\",\n \"ندا\": \"Nida\",\n \"مومینہ\": \"Momina\",\n \"ثوبیہ\": \"Sobia\",\n \"نائلہ\": \"Naila\",\n \"بشری\": \"Bushra\",\n \"رخسانہ\": \"Rukhsana\",\n \"شازیہ\": \"Shazia\",\n \"ناہید\": \"Naheed\",\n \"پروین\": \"Parveen\",\n \"فرزانہ\": \"Farzana\",\n \"نازیہ\": \"Nazia\",\n \"صبیحہ\": \"Sabiha\",\n \"رباب\": \"Rubab\",\n \"صائمہ\": \"Saima\",\n \"مہرین\": \"Mehreen\",\n \"عنبرین\": \"Ambreen\",\n \"کائنات\": \"Kainat\",\n \"طاہرہ\": \"Tahira\",\n \"سمیعہ\": \"Samia\",\n \"سامیہ\": \"Samiya\",\n \"سلمی\": \"Salma\",\n \"روزینہ\": \"Rozina\",\n \"مریم\": \"Maryam\",\n \"رابعہ\": \"Rabia\",\n \"تسلیم\": \"Tasleem\",\n \"اسماء\": \"Asma\",\n \"ارم\": \"Iram\",\n \"ناز\": \"Naaz\",\n \"فرح\": \"Farah\",\n \"نادیہ\": \"Nadia\",\n \"سیما\": \"Seema\",\n \"ہما\": \"Huma\",\n \"نزہت\": \"Nuzhat\",\n \"عظمی\": \"Uzma\",\n \"کرن\": \"Kiran\",\n \"سمیرا\": \"Sumaira\",\n \"فرخندہ\": \"Farkhanda\",\n \"تسنیم\": \"Tasneem\",\n \"زبیدہ\": \"Zubaida\",\n \"جویریہ\": \"Javeria\",\n \"مہوش\": \"Mehwish\",\n \"عالیہ\": \"Alia\",\n};\n\n/** Common Urdu family/last names mapped to their standard English spellings. */\nexport const URDU_FAMILY_NAMES: Record<string, string> = {\n \"خان\": \"Khan\",\n \"شاہ\": \"Shah\",\n \"چوہدری\": \"Chaudhry\",\n \"ملک\": \"Malik\",\n \"شیخ\": \"Sheikh\",\n \"قریشی\": \"Qureshi\",\n \"سید\": \"Syed\",\n \"نیازی\": \"Niazi\",\n \"جدون\": \"Jadoon\",\n \"سواتی\": \"Swati\",\n \"کھٹک\": \"Khattak\",\n \"یوسفزئی\": \"Yusufzai\",\n \"کھوسہ\": \"Khosa\",\n \"تالپور\": \"Talpur\",\n \"جونیجو\": \"Junejo\",\n \"بھٹی\": \"Bhatti\",\n \"راجپوت\": \"Rajput\",\n \"سومرو\": \"Soomro\",\n \"دہار\": \"Dahar\",\n \"گیلانی\": \"Gillani\",\n \"ٹواناس\": \"Tiwanas\",\n \"ٹوانہ\": \"Tiwana\",\n \"دولتانی\": \"Doltani\",\n \"دالتانی\": \"Daltani\",\n \"گورچانی\": \"Gurchani\",\n \"رند\": \"Rind\",\n \"بگٹی\": \"Bugti\",\n \"مری\": \"Marri\",\n \"بزینجو\": \"Bizenjo\",\n \"مینگل\": \"Mengal\",\n \"زرداری\": \"Zardari\",\n \"بھٹو\": \"Bhutto\",\n \"شریف\": \"Sharif\",\n};\n\n/** Honorific titles used in Urdu names. */\nexport const HONORIFICS: Record<string, string> = {\n \"جناب\": \"Janab\",\n \"صاحب\": \"Sahib\",\n \"استاد\": \"Ustad\",\n \"حکیم\": \"Hakim\",\n \"ڈاکٹر\": \"Dr.\",\n \"پروفیسر\": \"Prof.\",\n \"انجینئر\": \"Eng.\",\n \"ایڈووکیٹ\": \"Adv.\",\n \"ریٹائرڈ\": \"Retd.\",\n \"شہید\": \"Shaheed\",\n};\n\n/** Name prefixes that are kept in both languages. */\nexport const NAME_PREFIXES: Record<string, string> = {\n \"سید\": \"Syed\",\n \"شیخ\": \"Sheikh\",\n \"چوہدری\": \"Chowdhury\",\n \"ملک\": \"Malik\",\n \"میاں\": \"Mian\",\n \"خان\": \"Khan\",\n \"بیگم\": \"Begum\",\n \"صاحب\": \"Sahib\",\n};\n\n/**\n * English → Urdu lookup derived from the forward name tables above.\n *\n * Built rather than hand-maintained so the two directions can never drift: a\n * canonical English spelling maps back to exactly the Urdu word it came from.\n * Alternate spellings that are not forward-table values are pinned separately.\n */\nconst ENGLISH_TO_URDU = new Map<string, string>();\nfor (const table of [HONORIFICS, URDU_FIRST_NAMES, URDU_FAMILY_NAMES, NAME_PREFIXES]) {\n for (const [urduWord, englishWord] of Object.entries(table)) {\n ENGLISH_TO_URDU.set(englishWord.toLowerCase(), urduWord);\n }\n}\n\n/**\n * Alternate English spellings of names already in the forward tables\n * (e.g. `Omar` for عمر, canonically spelled `Umar` in English).\n * Exported so the PHP port can consume the identical list via tables.json.\n */\nexport const ENGLISH_NAME_ALIASES: Record<string, string> = {\n hassan: \"حسن\", // vs. canonical Hasan\n omar: \"عمر\", // vs. canonical Umar\n omer: \"عمر\", // vs. canonical Umar\n yaqoob: \"یعقوب\", // vs. canonical Yaquob\n jameel: \"جمیل\", // vs. canonical Jamil\n majeed: \"مجید\", // vs. canonical Majid\n amna: \"آمنہ\", // vs. canonical Amina\n gilani: \"گیلانی\", // vs. canonical Gillani\n sahab: \"صاحب\", // vs. canonical Sahib\n doctor: \"ڈاکٹر\", // vs. canonical Dr.\n professor: \"پروفیسر\", // vs. canonical Prof.\n engineer: \"انجینئر\", // vs. canonical Eng.\n advocate: \"ایڈووکیٹ\", // vs. canonical Adv.\n retd: \"ریٹائرڈ\", // vs. canonical Retd.\n};\n\n// ============================================================================\n// NAME TRANSLITERATION RULES\n// ============================================================================\n\n/**\n * Transliterate a single Urdu name to English.\n * Handles names with optional honorifics and prefixes.\n */\nfunction transliterateSingleName(urduName: string): string {\n const normalized = removeDiacritics(normalizeUrdu(urduName));\n const words = normalized.split(/\\s+/).filter((w) => w.length > 0);\n\n const result: string[] = [];\n\n for (const word of words) {\n // Check if it's an honorific\n const honorific = HONORIFICS[word];\n if (honorific) {\n result.push(honorific);\n continue;\n }\n\n // Check if it's a known first name\n const firstName = URDU_FIRST_NAMES[word];\n if (firstName) {\n result.push(firstName);\n continue;\n }\n\n // Check if it's a known family name\n const familyName = URDU_FAMILY_NAMES[word];\n if (familyName) {\n result.push(familyName);\n continue;\n }\n\n // Check if it's a known prefix\n const prefix = NAME_PREFIXES[word];\n if (prefix) {\n result.push(prefix);\n continue;\n }\n\n // Rule-based fallback for unknown names\n result.push(transliterateNameWord(word));\n }\n\n return result.join(\" \");\n}\n\n/**\n * Rule-based transliteration for individual name words.\n */\nfunction transliterateNameWord(word: string): string {\n if (!word) return \"\";\n\n // Common Urdu letter patterns in names\n const consonants: Record<string, string> = {\n \"ب\": \"b\",\n \"پ\": \"p\",\n \"ت\": \"t\",\n \"ٹ\": \"t\",\n \"ج\": \"j\",\n \"چ\": \"ch\",\n \"ح\": \"h\",\n \"خ\": \"kh\",\n \"د\": \"d\",\n \"ڈ\": \"d\",\n \"ر\": \"r\",\n \"ڑ\": \"r\",\n \"ز\": \"z\",\n \"س\": \"s\",\n \"ش\": \"sh\",\n \"ص\": \"s\",\n \"ض\": \"z\",\n \"ط\": \"t\",\n \"ظ\": \"z\",\n \"ع\": \"a\",\n \"غ\": \"gh\",\n \"ف\": \"f\",\n \"ق\": \"q\",\n \"ک\": \"k\",\n \"گ\": \"g\",\n \"ل\": \"l\",\n \"م\": \"m\",\n \"ن\": \"n\",\n \"و\": \"w\",\n \"ہ\": \"h\",\n \"ھ\": \"h\",\n \"ی\": \"y\",\n };\n\n let result = \"\";\n const chars = [...word];\n\n for (let i = 0; i < chars.length; i++) {\n const ch = chars[i]!;\n const next = chars[i + 1];\n\n // Handle digraphs (consonant + ھ)\n if (next === \"ھ\" && consonants[ch]) {\n const base = consonants[ch];\n result += base + \"h\";\n i++; // Skip the ھ\n continue;\n }\n\n // Handle special cases\n if (ch === \"آ\") {\n result += \"Aa\";\n continue;\n }\n if (ch === \"ا\" && i === 0) {\n result += \"A\";\n continue;\n }\n if (ch === \"ا\") {\n result += \"a\";\n continue;\n }\n if (ch === \"ی\" && i === chars.length - 1) {\n result += \"i\";\n continue;\n }\n if (ch === \"ی\" && next === \"ں\") {\n result += \"ain\";\n i++; // Skip the ں\n continue;\n }\n if (ch === \"و\" && i === 0) {\n result += \"W\";\n continue;\n }\n if (ch === \"و\") {\n result += \"o\";\n continue;\n }\n\n // Regular consonant\n if (consonants[ch]) {\n result += consonants[ch];\n continue;\n }\n\n // Unknown character - keep as is\n result += ch;\n }\n\n // Capitalize first letter\n return result.charAt(0).toUpperCase() + result.slice(1);\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\nexport interface NameTransliterationOptions {\n /** Preserve the original case of the English name. Default: true (capitalized). */\n preserveCase?: boolean;\n /** Include honorifics in the output. Default: true. */\n includeHonorifics?: boolean;\n}\n\n/**\n * Transliterate an Urdu name to English.\n *\n * @example\n * transliterateNameToEnglish(\"محمد علی\") // \"Muhammad Ali\"\n * transliterateNameToEnglish(\"جناب خان صاحب\") // \"Janab Khan Sahib\"\n */\nexport function transliterateNameToEnglish(\n urduName: string,\n options: NameTransliterationOptions = {},\n): string {\n if (!urduName) return \"\";\n\n const { preserveCase = true, includeHonorifics = true } = options;\n\n const result = transliterateSingleName(urduName);\n\n if (!includeHonorifics) {\n // Remove honorifics from result\n return result\n .split(/\\s+/)\n .filter((word) => !Object.values(HONORIFICS).includes(word))\n .join(\" \");\n }\n\n return preserveCase ? result : result.toLowerCase();\n}\n\n/**\n * Transliterate an English name to Urdu script.\n *\n * @example\n * transliterateNameToUrdu(\"Muhammad Ali\") // \"محمد علی\"\n * transliterateNameToUrdu(\"Janab Khan Sahib\") // \"جناب خان صاحب\"\n */\nexport function transliterateNameToUrdu(englishName: string): string {\n if (!englishName) return \"\";\n\n const words = englishName.split(/\\s+/).filter((w) => w.length > 0);\n // Every canonical English spelling resolves through the derived dictionary, so\n // a word only falls through when it is an alternate spelling or an unknown name.\n return words.map((word) => reverseTransliterateName(word)).join(\" \");\n}\n\n/**\n * Reverse name lookup: the derived English → Urdu dictionary first, then the\n * pinned alternate spellings, then the word unchanged. Reverse transliteration\n * is deliberately not rule-based — Roman Urdu carries too little information to\n * guess reliably.\n */\nfunction reverseTransliterateName(englishName: string): string {\n const lower = englishName.toLowerCase();\n return ENGLISH_TO_URDU.get(lower) ?? ENGLISH_NAME_ALIASES[lower] ?? englishName;\n}\n\n/**\n * Extract name parts from a full Urdu name.\n *\n * @example\n * extractNameParts(\"جناب محمد علی خان صاحب\")\n * // { honorific: \"جناب\", firstName: \"محمد علی\", familyName: \"خان\", suffix: \"صاحب\" }\n */\nexport function extractNameParts(fullName: string): {\n honorific?: string;\n firstName: string;\n familyName?: string;\n suffix?: string;\n} {\n const normalized = removeDiacritics(normalizeUrdu(fullName));\n const words = normalized.split(/\\s+/).filter((w) => w.length > 0);\n\n const honorifics = Object.keys(HONORIFICS);\n const suffixes = [\"sahib\", \"sahab\", \"بیگم\", \"begum\"];\n\n let honorific: string | undefined;\n let suffix: string | undefined;\n const nameWords: string[] = [];\n\n for (const word of words) {\n // Check honorifics first (includes صاحب)\n if (honorifics.includes(word)) {\n // Only set honorific if not already set (first honorific wins)\n if (!honorific) {\n honorific = word;\n } else {\n // Second honorific becomes suffix\n suffix = word;\n }\n } else if (suffixes.includes(word)) {\n suffix = word;\n } else {\n nameWords.push(word);\n }\n }\n\n // Assume last word is family name if there are multiple words\n const familyName =\n nameWords.length > 1 ? nameWords[nameWords.length - 1] : undefined;\n const firstName =\n nameWords.length > 1\n ? nameWords.slice(0, -1).join(\" \")\n : nameWords[0] || \"\";\n\n return { honorific, firstName, familyName, suffix };\n}\n"]}
|