urdu-text-utils 0.1.1 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chars.ts","../src/normalize.ts","../src/numbers.ts","../src/detect.ts","../src/stats.ts","../src/collate.ts","../src/search.ts","../src/dictionary.ts","../src/transliterate.ts"],"names":[],"mappings":"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","file":"index.cjs","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\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","import {\n ARABIC_INDIC_DIGITS,\n ASCII_DIGITS,\n DIACRITICS_RE,\n INVISIBLE_RE,\n TATWEEL_RE,\n URDU_DIGITS,\n ZWNJ_RE,\n} from \"./chars.js\";\nimport type { DigitStyle } from \"./numbers.js\";\n\n/**\n * Arabic-script characters that Urdu writes with a different codepoint.\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 */\nconst URDU_YEH = \"ی\"; // ی farsi yeh\nconst URDU_KEHEH = \"ک\"; // ک keheh\nconst URDU_HEH_GOAL = \"ہ\"; // ہ heh goal\nconst ALEF = \"ا\"; // ا\nconst WAW = \"و\"; // و\n\nconst LETTER_MAP: Record<string, string> = {\n // yeh family -> ی. Note ے (U+06D2 bari ye) is a distinct letter and is preserved.\n \"ي\": URDU_YEH, // ي arabic yeh\n \"ى\": URDU_YEH, // ى alef maksura\n \"ۍ\": URDU_YEH, // ۍ yeh with tail\n \"ې\": URDU_YEH, // ې pashto e\n \"ؠ\": URDU_YEH, // ؠ kashmiri yeh\n // kaf family -> ک\n \"ك\": URDU_KEHEH, // ك arabic kaf\n \"ڪ\": URDU_KEHEH, // ڪ swash kaf\n // heh family -> ہ. ھ (U+06BE do-chashmi heh) is a distinct letter and is preserved.\n \"ه\": URDU_HEH_GOAL, // ه arabic heh\n \"ۀ\": URDU_HEH_GOAL, // ۀ heh with yeh above\n \"ة\": URDU_HEH_GOAL, // ة teh marbuta\n \"ۃ\": URDU_HEH_GOAL, // ۃ teh marbuta goal\n \"ە\": URDU_HEH_GOAL, // ە ae\n // alef family -> ا. آ (U+0622 alef madda) is a real Urdu letter and is preserved.\n \"أ\": ALEF, // أ alef with hamza above\n \"إ\": ALEF, // إ alef with hamza below\n \"ٱ\": ALEF, // ٱ alef wasla\n \"ٲ\": ALEF, // ٲ alef with wavy hamza above\n \"ٳ\": ALEF, // ٳ alef with wavy hamza below\n // waw family -> و. ؤ (U+0624) is preserved: it carries hamza meaningfully in Urdu.\n \"ۋ\": WAW, // ۋ ve\n \"ۆ\": WAW, // ۆ oe\n \"ۇ\": WAW, // ۇ u\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\n/** Sentences, split on ۔ ؟ ! . and ellipsis. */\nexport function countSentences(input: string): number {\n return splitSentences(input).length;\n}\n\nexport function splitSentences(input: string): string[] {\n if (!input) return [];\n return input\n .split(SENTENCE_SPLIT_RE)\n .map((s) => s.trim())\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 { foldUrdu } from \"./normalize.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 is spelled out.\n *\n * Variant letters (ؤ, ئ, ۂ) are given the weight of their base letter plus a\n * tiebreaker, so `پاؤں` sorts next to `پاوں` rather than at the end of the list.\n */\nconst ALPHABET = [\n \"ا\",\n \"آ\",\n \"ب\",\n \"پ\",\n \"ت\",\n \"ٹ\",\n \"ث\",\n \"ج\",\n \"چ\",\n \"ح\",\n \"خ\",\n \"د\",\n \"ڈ\",\n \"ذ\",\n \"ر\",\n \"ڑ\",\n \"ز\",\n \"ژ\",\n \"س\",\n \"ش\",\n \"ص\",\n \"ض\",\n \"ط\",\n \"ظ\",\n \"ع\",\n \"غ\",\n \"ف\",\n \"ق\",\n \"ک\",\n \"گ\",\n \"ل\",\n \"م\",\n \"ن\",\n \"ں\",\n \"و\",\n \"ہ\",\n \"ھ\",\n \"ء\",\n \"ی\",\n \"ے\",\n];\n\n/** Letters that share a primary weight with a base letter, plus their secondary weight. */\nconst VARIANTS: Record<string, [base: string, secondary: number]> = {\n \"ؤ\": [\"و\", 1], // ؤ waw with hamza\n \"ئ\": [\"ی\", 1], // ئ yeh with hamza\n \"ۂ\": [\"ہ\", 1], // ۂ heh goal with hamza\n \"ۓ\": [\"ے\", 1], // ۓ bari ye with hamza\n};\n\nconst WEIGHTS = new Map<string, [number, number]>();\nALPHABET.forEach((ch, index) => WEIGHTS.set(ch, [(index + 1) * 10, 0]));\nfor (const [ch, [base, secondary]] of Object.entries(VARIANTS)) {\n const baseWeight = WEIGHTS.get(base);\n if (baseWeight) WEIGHTS.set(ch, [baseWeight[0], secondary]);\n}\n\n/** Non-alphabet characters sort after every Urdu letter, ordered by codepoint. */\nconst NON_LETTER_BASE = (ALPHABET.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`.\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 \"تمہارا\": \"tumhara\",\n \"تمہاری\": \"tumhari\",\n \"آپکا\": \"aapka\",\n \"آپکی\": \"aapki\",\n \"اس\": \"is\",\n \"ان\": \"un\",\n \"اپنا\": \"apna\",\n \"اپنی\": \"apni\",\n \"خود\": \"khud\",\n \"کون\": \"kaun\",\n \"کیا\": \"kya\",\n \"کہاں\": \"kahan\",\n \"کب\": \"kab\",\n \"کیوں\": \"kyun\",\n \"کیسے\": \"kaisay\",\n \"کیسا\": \"kaisa\",\n \"کتنا\": \"kitna\",\n \"کتنی\": \"kitni\",\n \"جو\": \"jo\",\n \"جس\": \"jis\",\n \"سب\": \"sab\",\n \"کوئی\": \"koi\",\n \"کچھ\": \"kuch\",\n \"ہر\": \"har\",\n\n // ---- function words ----\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\n // ---- place and direction ----\n \"یہاں\": \"yahan\",\n \"وہاں\": \"wahan\",\n \"سامنے\": \"samnay\",\n \"پیچھے\": \"peechay\",\n \"آگے\": \"agay\",\n \"اوپر\": \"oopar\",\n \"نیچے\": \"neechay\",\n \"اندر\": \"andar\",\n \"باہر\": \"bahar\",\n \"پاس\": \"paas\",\n \"دور\": \"door\",\n \"قریب\": \"qareeb\",\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 \"ہونا\": \"hona\",\n \"ہوا\": \"hua\",\n \"ہوئی\": \"hui\",\n \"ہوئے\": \"hue\",\n\n // ---- common verbs ----\n \"کرنا\": \"karna\",\n \"کرتا\": \"karta\",\n \"کرتی\": \"karti\",\n \"کرتے\": \"karte\",\n \"کریں\": \"karain\",\n \"کرو\": \"karo\",\n \"کر\": \"kar\",\n \"جانا\": \"jana\",\n \"جاتا\": \"jata\",\n \"جاتی\": \"jati\",\n \"جاتے\": \"jate\",\n \"جائے\": \"jaye\",\n \"جاؤ\": \"jao\",\n \"گیا\": \"gaya\",\n \"گئی\": \"gayi\",\n \"گئے\": \"gaye\",\n \"آنا\": \"aana\",\n \"آتا\": \"aata\",\n \"آتی\": \"aati\",\n \"آیا\": \"aaya\",\n \"آئی\": \"aayi\",\n \"دینا\": \"dena\",\n \"دیا\": \"diya\",\n \"دے\": \"de\",\n \"دو\": \"do\",\n \"لینا\": \"lena\",\n \"لیا\": \"liya\",\n \"لے\": \"le\",\n \"کہنا\": \"kehna\",\n \"کہا\": \"kaha\",\n \"کہتا\": \"kehta\",\n \"کہتے\": \"kehte\",\n \"دیکھنا\": \"dekhna\",\n \"دیکھا\": \"dekha\",\n \"دیکھو\": \"dekho\",\n \"دیکھتا\": \"dekhta\",\n \"سننا\": \"sunna\",\n \"سنا\": \"suna\",\n \"سنو\": \"suno\",\n \"بولنا\": \"bolna\",\n \"بولا\": \"bola\",\n \"پڑھنا\": \"parhna\",\n \"پڑھا\": \"parha\",\n \"پڑھتا\": \"parhta\",\n \"لکھنا\": \"likhna\",\n \"لکھا\": \"likha\",\n \"سمجھنا\": \"samajhna\",\n \"سمجھا\": \"samjha\",\n \"سمجھ\": \"samajh\",\n \"جاننا\": \"janna\",\n \"جانتا\": \"janta\",\n \"جانتے\": \"jante\",\n \"معلوم\": \"maloom\",\n \"چاہنا\": \"chahna\",\n \"چاہتا\": \"chahta\",\n \"چاہیے\": \"chahiye\",\n \"سکنا\": \"sakna\",\n \"سکتا\": \"sakta\",\n \"سکتی\": \"sakti\",\n \"سکتے\": \"sakte\",\n \"رہنا\": \"rehna\",\n \"رہا\": \"raha\",\n \"رہی\": \"rahi\",\n \"رہے\": \"rahe\",\n \"رہتا\": \"rehta\",\n \"بننا\": \"banna\",\n \"بنانا\": \"banana\",\n \"بنایا\": \"banaya\",\n \"بنا\": \"bana\",\n \"ملنا\": \"milna\",\n \"ملا\": \"mila\",\n \"ملتا\": \"milta\",\n \"ملی\": \"mili\",\n \"کھانا\": \"khana\",\n \"کھایا\": \"khaya\",\n \"پینا\": \"peena\",\n \"پیا\": \"piya\",\n \"سونا\": \"sona\",\n \"اٹھنا\": \"uthna\",\n \"بیٹھنا\": \"baithna\",\n \"بیٹھو\": \"baitho\",\n \"چلنا\": \"chalna\",\n \"چلا\": \"chala\",\n \"چلو\": \"chalo\",\n \"دوڑنا\": \"daurna\",\n \"بھاگنا\": \"bhagna\",\n \"لانا\": \"lana\",\n \"لایا\": \"laya\",\n \"رکھنا\": \"rakhna\",\n \"رکھا\": \"rakha\",\n \"مانگنا\": \"mangna\",\n \"پوچھنا\": \"poochna\",\n \"پوچھا\": \"poocha\",\n \"بتانا\": \"batana\",\n \"بتایا\": \"bataya\",\n \"بتاؤ\": \"batao\",\n \"کھولنا\": \"kholna\",\n \"کھلا\": \"khula\",\n \"مرنا\": \"marna\",\n \"جینا\": \"jeena\",\n // Oblique infinitives, extremely common before postpositions (کرنے کے لیے).\n \"کرنے\": \"karne\",\n \"جانے\": \"jane\",\n \"ہونے\": \"hone\",\n \"دینے\": \"dene\",\n \"لینے\": \"lene\",\n \"کہنے\": \"kehne\",\n \"رہنے\": \"rehne\",\n \"دیکھنے\": \"dekhne\",\n \"پڑھنے\": \"parhne\",\n \"لکھنے\": \"likhne\",\n \"والا\": \"wala\",\n \"والی\": \"wali\",\n \"والے\": \"walay\",\n \"حصہ\": \"hissa\",\n \"شروع\": \"shuru\",\n \"ختم\": \"khatam\",\n \"بند\": \"band\",\n \"پیدا\": \"paida\",\n\n // ---- people and society ----\n \"آدمی\": \"aadmi\",\n \"عورت\": \"aurat\",\n \"لڑکا\": \"larka\",\n \"لڑکی\": \"larki\",\n \"بچہ\": \"bacha\",\n \"بچی\": \"bachi\",\n \"بچے\": \"bache\",\n \"ماں\": \"maan\",\n \"باپ\": \"baap\",\n \"والد\": \"walid\",\n \"والدہ\": \"walida\",\n \"بھائی\": \"bhai\",\n \"بہن\": \"behan\",\n \"بیٹا\": \"beta\",\n \"بیٹی\": \"beti\",\n \"شادی\": \"shaadi\",\n \"بیوی\": \"biwi\",\n \"شوہر\": \"shauhar\",\n \"دوست\": \"dost\",\n \"دشمن\": \"dushman\",\n \"استاد\": \"ustad\",\n \"ڈاکٹر\": \"doctor\",\n \"وکیل\": \"wakeel\",\n \"کسان\": \"kisan\",\n \"مزدور\": \"mazdoor\",\n \"سپاہی\": \"sipahi\",\n \"فوج\": \"fauj\",\n \"صدر\": \"sadar\",\n \"وزیر\": \"wazeer\",\n \"حکومت\": \"hukumat\",\n \"عوام\": \"awam\",\n \"لوگ\": \"log\",\n \"انسان\": \"insan\",\n \"مریض\": \"mareez\",\n\n // ---- places ----\n \"گھر\": \"ghar\",\n \"کمرہ\": \"kamra\",\n \"دروازہ\": \"darwaza\",\n \"کھڑکی\": \"khirki\",\n \"چھت\": \"chhat\",\n \"دیوار\": \"deewar\",\n \"مدرسہ\": \"madrasa\",\n \"ہسپتال\": \"hospital\",\n \"دکان\": \"dukan\",\n \"بازار\": \"bazaar\",\n \"مسجد\": \"masjid\",\n \"شہر\": \"shehar\",\n \"گاؤں\": \"gaon\",\n \"ملک\": \"mulk\",\n \"دنیا\": \"dunya\",\n \"راستہ\": \"rasta\",\n \"سڑک\": \"sarak\",\n \"پل\": \"pul\",\n \"باغ\": \"bagh\",\n \"میدان\": \"maidan\",\n \"دفتر\": \"daftar\",\n \"پاکستان\": \"pakistan\",\n\n // ---- English loanwords in everyday Urdu ----\n // These matter most in the reverse direction: the rule engine reads \"school\"\n // as s-ch-ool and produces سچول, so the pairing has to be explicit.\n \"سکول\": \"school\",\n \"کالج\": \"college\",\n \"یونیورسٹی\": \"university\",\n \"کمپیوٹر\": \"computer\",\n \"موبائل\": \"mobile\",\n \"فون\": \"phone\",\n \"انٹرنیٹ\": \"internet\",\n \"مارکیٹ\": \"market\",\n \"اسٹیشن\": \"station\",\n \"بس\": \"bus\",\n \"ٹرین\": \"train\",\n \"سائیکل\": \"cycle\",\n \"ہوٹل\": \"hotel\",\n \"انجینئر\": \"engineer\",\n \"پولیس\": \"police\",\n\n // ---- time and weather ----\n \"دن\": \"din\",\n \"رات\": \"raat\",\n \"صبح\": \"subah\",\n \"شام\": \"shaam\",\n \"دوپہر\": \"dopahar\",\n \"وقت\": \"waqt\",\n \"گھنٹہ\": \"ghanta\",\n \"ہفتہ\": \"hafta\",\n \"مہینہ\": \"maheena\",\n \"سال\": \"saal\",\n \"آج\": \"aaj\",\n \"کل\": \"kal\",\n \"پرسوں\": \"parson\",\n \"ابھی\": \"abhi\",\n \"اب\": \"ab\",\n \"پھر\": \"phir\",\n \"تب\": \"tab\",\n \"جب\": \"jab\",\n \"موسم\": \"mausam\",\n \"گرمی\": \"garmi\",\n \"سردی\": \"sardi\",\n \"بارش\": \"barish\",\n // ہوا is both \"hua\" (happened) and \"hawa\" (wind/air). The auxiliary is far more\n // frequent in prose, so it wins the forward direction; see ROMAN_VARIANTS for\n // the reverse mapping of \"hawa\".\n \"دھوپ\": \"dhoop\",\n \"بادل\": \"badal\",\n \"برف\": \"baraf\",\n \"آسمان\": \"asman\",\n \"زمین\": \"zameen\",\n \"سورج\": \"sooraj\",\n \"چاند\": \"chand\",\n \"ستارہ\": \"sitara\",\n\n // ---- objects, food, transport ----\n \"کتاب\": \"kitaab\",\n \"قلم\": \"qalam\",\n \"کاغذ\": \"kaghaz\",\n \"میز\": \"mez\",\n \"کرسی\": \"kursi\",\n \"پانی\": \"paani\",\n \"دودھ\": \"doodh\",\n \"چائے\": \"chai\",\n \"روٹی\": \"roti\",\n \"چاول\": \"chawal\",\n \"گوشت\": \"gosht\",\n \"سبزی\": \"sabzi\",\n \"پھل\": \"phal\",\n \"آم\": \"aam\",\n \"سیب\": \"saib\",\n \"کیلا\": \"kela\",\n \"انگور\": \"angoor\",\n \"نمک\": \"namak\",\n \"چینی\": \"cheeni\",\n \"تیل\": \"tel\",\n \"انڈا\": \"anda\",\n \"مچھلی\": \"machhli\",\n \"مرغی\": \"murghi\",\n \"گاڑی\": \"gaari\",\n \"جہاز\": \"jahaz\",\n \"پیسہ\": \"paisa\",\n \"روپیہ\": \"rupya\",\n \"نوکری\": \"naukri\",\n \"کام\": \"kaam\",\n \"کاروبار\": \"karobar\",\n \"قیمت\": \"qeemat\",\n \"تحفہ\": \"tohfa\",\n \"کپڑا\": \"kapra\",\n \"جوتا\": \"joota\",\n \"ٹوپی\": \"topi\",\n \"چابی\": \"chabi\",\n \"گھڑی\": \"ghari\",\n \"بستر\": \"bistar\",\n \"صابن\": \"sabun\",\n\n // ---- feeling and abstraction ----\n \"محبت\": \"mohabbat\",\n \"پیار\": \"pyaar\",\n \"خوشی\": \"khushi\",\n \"غم\": \"gham\",\n \"دکھ\": \"dukh\",\n \"ڈر\": \"dar\",\n \"خوف\": \"khauf\",\n \"امید\": \"umeed\",\n \"یقین\": \"yaqeen\",\n \"سچ\": \"sach\",\n \"جھوٹ\": \"jhoot\",\n \"انصاف\": \"insaf\",\n \"ظلم\": \"zulm\",\n \"عزت\": \"izzat\",\n \"شکریہ\": \"shukriya\",\n \"معاف\": \"maaf\",\n \"معافی\": \"maafi\",\n \"دعا\": \"dua\",\n \"خواب\": \"khwab\",\n \"زندگی\": \"zindagi\",\n \"موت\": \"maut\",\n \"صحت\": \"sehat\",\n \"بیماری\": \"beemari\",\n \"دوا\": \"dawa\",\n \"طاقت\": \"taqat\",\n \"کمزوری\": \"kamzori\",\n \"ضرورت\": \"zaroorat\",\n \"مدد\": \"madad\",\n \"کوشش\": \"koshish\",\n \"کامیابی\": \"kamyabi\",\n \"ناکامی\": \"nakami\",\n \"فیصلہ\": \"faisla\",\n \"رائے\": \"raye\",\n \"خیال\": \"khayal\",\n \"سوچ\": \"soch\",\n\n // ---- knowledge, language, culture ----\n \"علم\": \"ilm\",\n \"تعلیم\": \"taleem\",\n \"سبق\": \"sabaq\",\n \"امتحان\": \"imtihan\",\n \"نتیجہ\": \"nateeja\",\n \"مسئلہ\": \"masla\",\n \"حل\": \"hal\",\n \"سوال\": \"sawal\",\n \"جواب\": \"jawab\",\n \"بات\": \"baat\",\n \"باتیں\": \"baatein\",\n \"زبان\": \"zuban\",\n \"لفظ\": \"lafz\",\n \"نام\": \"naam\",\n \"خبر\": \"khabar\",\n \"کہانی\": \"kahani\",\n \"مضمون\": \"mazmoon\",\n \"شعر\": \"sher\",\n \"غزل\": \"ghazal\",\n \"ادب\": \"adab\",\n \"تاریخ\": \"tareekh\",\n \"ثقافت\": \"saqafat\",\n \"موسیقی\": \"moseeqi\",\n \"تصویر\": \"tasweer\",\n \"رنگ\": \"rang\",\n \"آواز\": \"awaz\",\n\n // ---- religion ----\n \"نماز\": \"namaz\",\n \"روزہ\": \"roza\",\n \"عید\": \"eid\",\n \"مذہب\": \"mazhab\",\n \"اسلام\": \"islam\",\n \"اللہ\": \"allah\",\n \"رسول\": \"rasool\",\n \"نبی\": \"nabi\",\n \"قرآن\": \"quran\",\n \"دین\": \"deen\",\n \"ایمان\": \"imaan\",\n \"جنت\": \"jannat\",\n\n // ---- body ----\n \"دل\": \"dil\",\n \"دماغ\": \"dimagh\",\n \"جسم\": \"jism\",\n \"ہاتھ\": \"hath\",\n \"پاؤں\": \"paon\",\n \"سر\": \"sar\",\n \"آنکھ\": \"aankh\",\n \"آنکھیں\": \"aankhein\",\n \"کان\": \"kaan\",\n \"ناک\": \"naak\",\n \"منہ\": \"munh\",\n \"دانت\": \"daant\",\n \"بال\": \"baal\",\n \"چہرہ\": \"chehra\",\n\n // ---- adjectives ----\n \"اچھا\": \"acha\",\n \"اچھی\": \"achi\",\n \"برا\": \"bura\",\n \"بری\": \"buri\",\n \"بڑا\": \"bara\",\n \"بڑی\": \"bari\",\n \"چھوٹا\": \"chhota\",\n \"چھوٹی\": \"chhoti\",\n \"نیا\": \"naya\",\n \"نئی\": \"nayi\",\n \"پرانا\": \"purana\",\n \"لمبا\": \"lamba\",\n \"موٹا\": \"mota\",\n \"پتلا\": \"patla\",\n \"تیز\": \"tez\",\n \"آہستہ\": \"ahista\",\n \"گرم\": \"garam\",\n \"ٹھنڈا\": \"thanda\",\n \"میٹھا\": \"meetha\",\n \"کڑوا\": \"karwa\",\n \"صاف\": \"saaf\",\n \"گندا\": \"ganda\",\n \"خالی\": \"khali\",\n \"بھرا\": \"bhara\",\n \"مشکل\": \"mushkil\",\n \"آسان\": \"aasan\",\n \"ضروری\": \"zaroori\",\n \"مکمل\": \"mukammal\",\n \"تیار\": \"tayyar\",\n \"خوش\": \"khush\",\n \"ناراض\": \"naraz\",\n \"پریشان\": \"pareshan\",\n \"تھکا\": \"thaka\",\n \"بیمار\": \"beemar\",\n \"امیر\": \"ameer\",\n \"غریب\": \"ghareeb\",\n \"مشہور\": \"mashhoor\",\n \"خوبصورت\": \"khoobsurat\",\n \"ذہین\": \"zaheen\",\n \"بہادر\": \"bahadur\",\n \"سست\": \"sust\",\n \"محنتی\": \"mehnati\",\n \"سچا\": \"sacha\",\n \"جھوٹا\": \"jhoota\",\n \"پیارا\": \"pyara\",\n \"عجیب\": \"ajeeb\",\n \"خاص\": \"khaas\",\n \"عام\": \"aam\",\n\n // ---- numbers and ordinals ----\n \"ایک\": \"aik\",\n \"تین\": \"teen\",\n \"چار\": \"char\",\n \"پانچ\": \"panch\",\n \"چھ\": \"chhe\",\n \"سات\": \"saat\",\n \"آٹھ\": \"aath\",\n \"نو\": \"nau\",\n \"دس\": \"das\",\n \"گیارہ\": \"gyarah\",\n \"بارہ\": \"barah\",\n \"بیس\": \"bees\",\n \"پچاس\": \"pachas\",\n \"سو\": \"so\",\n \"ہزار\": \"hazar\",\n \"لاکھ\": \"lakh\",\n \"کروڑ\": \"karor\",\n \"پہلا\": \"pehla\",\n \"دوسرا\": \"dosra\",\n \"تیسرا\": \"teesra\",\n \"آخری\": \"aakhri\",\n\n // ---- greetings and discourse markers ----\n \"سلام\": \"salam\",\n \"خدا\": \"khuda\",\n \"حافظ\": \"hafiz\",\n \"مہربانی\": \"meherbani\",\n \"مبارک\": \"mubarak\",\n \"ہاں\": \"haan\",\n \"جی\": \"ji\",\n \"ٹھیک\": \"theek\",\n \"بالکل\": \"bilkul\",\n \"ضرور\": \"zaroor\",\n \"شاید\": \"shayad\",\n \"اکثر\": \"aksar\",\n \"کبھی\": \"kabhi\",\n \"ہمیشہ\": \"hamesha\",\n \"جلدی\": \"jaldi\",\n \"دیر\": \"der\",\n \"آرام\": \"aaram\",\n \"تھوڑا\": \"thora\",\n \"زیادہ\": \"ziyada\",\n \"کم\": \"kam\",\n \"بہت\": \"bohat\",\n \"صرف\": \"sirf\",\n \"واقعی\": \"waqai\",\n\n // ---- names that appear constantly in Urdu content ----\n \"محمد\": \"muhammad\",\n \"احمد\": \"ahmed\",\n \"علی\": \"ali\",\n \"خان\": \"khan\",\n \"زید\": \"zaid\",\n \"حسن\": \"hasan\",\n \"حسین\": \"hussain\",\n \"فاطمہ\": \"fatima\",\n \"عائشہ\": \"ayesha\",\n \"عمر\": \"umar\",\n \"بلال\": \"bilal\",\n \"اسلم\": \"aslam\",\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 hun: \"ہوں\",\n ap: \"آپ\",\n aapko: \"آپکو\",\n kaise: \"کیسے\",\n kese: \"کیسے\",\n kaisey: \"کیسے\",\n nam: \"نام\",\n mai: \"میں\",\n main: \"میں\",\n me: \"میں\",\n nahin: \"نہیں\",\n nai: \"نہیں\",\n kia: \"کیا\",\n kiya: \"کیا\",\n bahut: \"بہت\",\n bhot: \"بہت\",\n bohot: \"بہت\",\n achha: \"اچھا\",\n achi: \"اچھی\",\n shukria: \"شکریہ\",\n salaam: \"سلام\",\n mohabat: \"محبت\",\n muhabbat: \"محبت\",\n pyar: \"پیار\",\n zindagi: \"زندگی\",\n dost: \"دوست\",\n khush: \"خوش\",\n theak: \"ٹھیک\",\n thik: \"ٹھیک\",\n bhai: \"بھائی\",\n behen: \"بہن\",\n ammi: \"امی\",\n abbu: \"ابو\",\n paisay: \"پیسے\",\n kaam: \"کام\",\n ghar: \"گھر\",\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};\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 { 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\nconst LETTERS: Record<string, string> = {\n \"ا\": \"a\",\n \"آ\": \"aa\",\n \"ب\": \"b\",\n \"پ\": \"p\",\n \"ت\": \"t\",\n \"ٹ\": \"t\",\n \"ث\": \"s\",\n \"ج\": \"j\",\n \"چ\": \"ch\",\n \"ح\": \"h\",\n \"خ\": \"kh\",\n \"د\": \"d\",\n \"ڈ\": \"d\",\n \"ذ\": \"z\",\n \"ر\": \"r\",\n \"ڑ\": \"r\",\n \"ز\": \"z\",\n \"ژ\": \"zh\",\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 \"ں\": \"n\",\n \"و\": \"o\",\n \"ہ\": \"h\",\n \"ھ\": \"h\",\n \"ء\": \"\",\n \"ی\": \"i\",\n \"ئ\": \"i\",\n \"ے\": \"e\",\n \"ۓ\": \"e\",\n \"ؤ\": \"o\",\n \"ۂ\": \"h\",\n};\n\n/** Letters that carry a vowel in the output, used to decide where a schwa is needed. */\nconst VOWEL_LETTERS = new Set([\"ا\", \"آ\", \"و\", \"ی\", \"ے\", \"ؤ\", \"ئ\", \"ۓ\", \"ۂ\", \"ع\"]);\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 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"]}
1
+ {"version":3,"sources":["../src/chars.ts","../src/normalize.ts","../src/numbers.ts","../src/detect.ts","../src/stats.ts","../src/collate.ts","../src/search.ts","../src/dictionary.ts","../src/transliterate.ts"],"names":[],"mappings":"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","file":"index.cjs","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\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","import {\n ARABIC_INDIC_DIGITS,\n ASCII_DIGITS,\n DIACRITICS_RE,\n INVISIBLE_RE,\n TATWEEL_RE,\n URDU_DIGITS,\n ZWNJ_RE,\n} from \"./chars.js\";\nimport type { DigitStyle } from \"./numbers.js\";\n\n/**\n * Arabic-script characters that Urdu writes with a different codepoint.\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 */\nconst URDU_YEH = \"ی\"; // ی farsi yeh\nconst URDU_KEHEH = \"ک\"; // ک keheh\nconst URDU_HEH_GOAL = \"ہ\"; // ہ heh goal\nconst ALEF = \"ا\"; // ا\nconst WAW = \"و\"; // و\n\nconst LETTER_MAP: Record<string, string> = {\n // yeh family -> ی. Note ے (U+06D2 bari ye) is a distinct letter and is preserved.\n \"ي\": URDU_YEH, // ي arabic yeh\n \"ى\": URDU_YEH, // ى alef maksura\n \"ۍ\": URDU_YEH, // ۍ yeh with tail\n \"ې\": URDU_YEH, // ې pashto e\n \"ؠ\": URDU_YEH, // ؠ kashmiri yeh\n // kaf family -> ک\n \"ك\": URDU_KEHEH, // ك arabic kaf\n \"ڪ\": URDU_KEHEH, // ڪ swash kaf\n // heh family -> ہ. ھ (U+06BE do-chashmi heh) is a distinct letter and is preserved.\n \"ه\": URDU_HEH_GOAL, // ه arabic heh\n \"ۀ\": URDU_HEH_GOAL, // ۀ heh with yeh above\n \"ة\": URDU_HEH_GOAL, // ة teh marbuta\n \"ۃ\": URDU_HEH_GOAL, // ۃ teh marbuta goal\n \"ە\": URDU_HEH_GOAL, // ە ae\n // alef family -> ا. آ (U+0622 alef madda) is a real Urdu letter and is preserved.\n \"أ\": ALEF, // أ alef with hamza above\n \"إ\": ALEF, // إ alef with hamza below\n \"ٱ\": ALEF, // ٱ alef wasla\n \"ٲ\": ALEF, // ٲ alef with wavy hamza above\n \"ٳ\": ALEF, // ٳ alef with wavy hamza below\n // waw family -> و. ؤ (U+0624) is preserved: it carries hamza meaningfully in Urdu.\n \"ۋ\": WAW, // ۋ ve\n \"ۆ\": WAW, // ۆ oe\n \"ۇ\": WAW, // ۇ u\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\n/** Sentences, split on ۔ ؟ ! . and ellipsis. */\nexport function countSentences(input: string): number {\n return splitSentences(input).length;\n}\n\nexport function splitSentences(input: string): string[] {\n if (!input) return [];\n return input\n .split(SENTENCE_SPLIT_RE)\n .map((s) => s.trim())\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 { foldUrdu } from \"./normalize.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 is spelled out.\n *\n * Variant letters (ؤ, ئ, ۂ) are given the weight of their base letter plus a\n * tiebreaker, so `پاؤں` sorts next to `پاوں` rather than at the end of the list.\n */\nconst ALPHABET = [\n \"ا\",\n \"آ\",\n \"ب\",\n \"پ\",\n \"ت\",\n \"ٹ\",\n \"ث\",\n \"ج\",\n \"چ\",\n \"ح\",\n \"خ\",\n \"د\",\n \"ڈ\",\n \"ذ\",\n \"ر\",\n \"ڑ\",\n \"ز\",\n \"ژ\",\n \"س\",\n \"ش\",\n \"ص\",\n \"ض\",\n \"ط\",\n \"ظ\",\n \"ع\",\n \"غ\",\n \"ف\",\n \"ق\",\n \"ک\",\n \"گ\",\n \"ل\",\n \"م\",\n \"ن\",\n \"ں\",\n \"و\",\n \"ہ\",\n \"ھ\",\n \"ء\",\n \"ی\",\n \"ے\",\n];\n\n/** Letters that share a primary weight with a base letter, plus their secondary weight. */\nconst VARIANTS: Record<string, [base: string, secondary: number]> = {\n \"ؤ\": [\"و\", 1], // ؤ waw with hamza\n \"ئ\": [\"ی\", 1], // ئ yeh with hamza\n \"ۂ\": [\"ہ\", 1], // ۂ heh goal with hamza\n \"ۓ\": [\"ے\", 1], // ۓ bari ye with hamza\n};\n\nconst WEIGHTS = new Map<string, [number, number]>();\nALPHABET.forEach((ch, index) => WEIGHTS.set(ch, [(index + 1) * 10, 0]));\nfor (const [ch, [base, secondary]] of Object.entries(VARIANTS)) {\n const baseWeight = WEIGHTS.get(base);\n if (baseWeight) WEIGHTS.set(ch, [baseWeight[0], secondary]);\n}\n\n/** Non-alphabet characters sort after every Urdu letter, ordered by codepoint. */\nconst NON_LETTER_BASE = (ALPHABET.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`.\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 \"تمہارا\": \"tumhara\",\n \"تمہاری\": \"tumhari\",\n \"آپکا\": \"aapka\",\n \"آپکی\": \"aapki\",\n \"اس\": \"is\",\n \"ان\": \"un\",\n \"اپنا\": \"apna\",\n \"اپنی\": \"apni\",\n \"خود\": \"khud\",\n \"کون\": \"kaun\",\n \"کیا\": \"kya\",\n \"کہاں\": \"kahan\",\n \"کب\": \"kab\",\n \"کیوں\": \"kyun\",\n \"کیسے\": \"kaisay\",\n \"کیسا\": \"kaisa\",\n \"کتنا\": \"kitna\",\n \"کتنی\": \"kitni\",\n \"جو\": \"jo\",\n \"جس\": \"jis\",\n \"سب\": \"sab\",\n \"کوئی\": \"koi\",\n \"کچھ\": \"kuch\",\n \"ہر\": \"har\",\n\n // ---- function words ----\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\n // ---- place and direction ----\n \"یہاں\": \"yahan\",\n \"وہاں\": \"wahan\",\n \"سامنے\": \"samnay\",\n \"پیچھے\": \"peechay\",\n \"آگے\": \"agay\",\n \"اوپر\": \"oopar\",\n \"نیچے\": \"neechay\",\n \"اندر\": \"andar\",\n \"باہر\": \"bahar\",\n \"پاس\": \"paas\",\n \"دور\": \"door\",\n \"قریب\": \"qareeb\",\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 \"ہونا\": \"hona\",\n \"ہوا\": \"hua\",\n \"ہوئی\": \"hui\",\n \"ہوئے\": \"hue\",\n\n // ---- common verbs ----\n \"کرنا\": \"karna\",\n \"کرتا\": \"karta\",\n \"کرتی\": \"karti\",\n \"کرتے\": \"karte\",\n \"کریں\": \"karain\",\n \"کرو\": \"karo\",\n \"کر\": \"kar\",\n \"جانا\": \"jana\",\n \"جاتا\": \"jata\",\n \"جاتی\": \"jati\",\n \"جاتے\": \"jate\",\n \"جائے\": \"jaye\",\n \"جاؤ\": \"jao\",\n \"گیا\": \"gaya\",\n \"گئی\": \"gayi\",\n \"گئے\": \"gaye\",\n \"آنا\": \"aana\",\n \"آتا\": \"aata\",\n \"آتی\": \"aati\",\n \"آیا\": \"aaya\",\n \"آئی\": \"aayi\",\n \"دینا\": \"dena\",\n \"دیا\": \"diya\",\n \"دے\": \"de\",\n \"دو\": \"do\",\n \"لینا\": \"lena\",\n \"لیا\": \"liya\",\n \"لے\": \"le\",\n \"کہنا\": \"kehna\",\n \"کہا\": \"kaha\",\n \"کہتا\": \"kehta\",\n \"کہتے\": \"kehte\",\n \"دیکھنا\": \"dekhna\",\n \"دیکھا\": \"dekha\",\n \"دیکھو\": \"dekho\",\n \"دیکھتا\": \"dekhta\",\n \"سننا\": \"sunna\",\n \"سنا\": \"suna\",\n \"سنو\": \"suno\",\n \"بولنا\": \"bolna\",\n \"بولا\": \"bola\",\n \"پڑھنا\": \"parhna\",\n \"پڑھا\": \"parha\",\n \"پڑھتا\": \"parhta\",\n \"لکھنا\": \"likhna\",\n \"لکھا\": \"likha\",\n \"سمجھنا\": \"samajhna\",\n \"سمجھا\": \"samjha\",\n \"سمجھ\": \"samajh\",\n \"جاننا\": \"janna\",\n \"جانتا\": \"janta\",\n \"جانتے\": \"jante\",\n \"معلوم\": \"maloom\",\n \"چاہنا\": \"chahna\",\n \"چاہتا\": \"chahta\",\n \"چاہیے\": \"chahiye\",\n \"سکنا\": \"sakna\",\n \"سکتا\": \"sakta\",\n \"سکتی\": \"sakti\",\n \"سکتے\": \"sakte\",\n \"رہنا\": \"rehna\",\n \"رہا\": \"raha\",\n \"رہی\": \"rahi\",\n \"رہے\": \"rahe\",\n \"رہتا\": \"rehta\",\n \"بننا\": \"banna\",\n \"بنانا\": \"banana\",\n \"بنایا\": \"banaya\",\n \"بنا\": \"bana\",\n \"ملنا\": \"milna\",\n \"ملا\": \"mila\",\n \"ملتا\": \"milta\",\n \"ملی\": \"mili\",\n \"کھانا\": \"khana\",\n \"کھایا\": \"khaya\",\n \"پینا\": \"peena\",\n \"پیا\": \"piya\",\n \"سونا\": \"sona\",\n \"اٹھنا\": \"uthna\",\n \"بیٹھنا\": \"baithna\",\n \"بیٹھو\": \"baitho\",\n \"چلنا\": \"chalna\",\n \"چلا\": \"chala\",\n \"چلو\": \"chalo\",\n \"دوڑنا\": \"daurna\",\n \"بھاگنا\": \"bhagna\",\n \"لانا\": \"lana\",\n \"لایا\": \"laya\",\n \"رکھنا\": \"rakhna\",\n \"رکھا\": \"rakha\",\n \"مانگنا\": \"mangna\",\n \"پوچھنا\": \"poochna\",\n \"پوچھا\": \"poocha\",\n \"بتانا\": \"batana\",\n \"بتایا\": \"bataya\",\n \"بتاؤ\": \"batao\",\n \"کھولنا\": \"kholna\",\n \"کھلا\": \"khula\",\n \"مرنا\": \"marna\",\n \"جینا\": \"jeena\",\n // Oblique infinitives, extremely common before postpositions (کرنے کے لیے).\n \"کرنے\": \"karne\",\n \"جانے\": \"jane\",\n \"ہونے\": \"hone\",\n \"دینے\": \"dene\",\n \"لینے\": \"lene\",\n \"کہنے\": \"kehne\",\n \"رہنے\": \"rehne\",\n \"دیکھنے\": \"dekhne\",\n \"پڑھنے\": \"parhne\",\n \"لکھنے\": \"likhne\",\n \"والا\": \"wala\",\n \"والی\": \"wali\",\n \"والے\": \"walay\",\n \"حصہ\": \"hissa\",\n \"شروع\": \"shuru\",\n \"ختم\": \"khatam\",\n \"بند\": \"band\",\n \"پیدا\": \"paida\",\n\n // ---- people and society ----\n \"آدمی\": \"aadmi\",\n \"عورت\": \"aurat\",\n \"لڑکا\": \"larka\",\n \"لڑکی\": \"larki\",\n \"بچہ\": \"bacha\",\n \"بچی\": \"bachi\",\n \"بچے\": \"bache\",\n \"ماں\": \"maan\",\n \"باپ\": \"baap\",\n \"والد\": \"walid\",\n \"والدہ\": \"walida\",\n \"بھائی\": \"bhai\",\n \"بہن\": \"behan\",\n \"بیٹا\": \"beta\",\n \"بیٹی\": \"beti\",\n \"شادی\": \"shaadi\",\n \"بیوی\": \"biwi\",\n \"شوہر\": \"shauhar\",\n \"دوست\": \"dost\",\n \"دشمن\": \"dushman\",\n \"استاد\": \"ustad\",\n \"ڈاکٹر\": \"doctor\",\n \"وکیل\": \"wakeel\",\n \"کسان\": \"kisan\",\n \"مزدور\": \"mazdoor\",\n \"سپاہی\": \"sipahi\",\n \"فوج\": \"fauj\",\n \"صدر\": \"sadar\",\n \"وزیر\": \"wazeer\",\n \"حکومت\": \"hukumat\",\n \"عوام\": \"awam\",\n \"لوگ\": \"log\",\n \"انسان\": \"insan\",\n \"مریض\": \"mareez\",\n\n // ---- places ----\n \"گھر\": \"ghar\",\n \"کمرہ\": \"kamra\",\n \"دروازہ\": \"darwaza\",\n \"کھڑکی\": \"khirki\",\n \"چھت\": \"chhat\",\n \"دیوار\": \"deewar\",\n \"مدرسہ\": \"madrasa\",\n \"ہسپتال\": \"hospital\",\n \"دکان\": \"dukan\",\n \"بازار\": \"bazaar\",\n \"مسجد\": \"masjid\",\n \"شہر\": \"shehar\",\n \"گاؤں\": \"gaon\",\n \"ملک\": \"mulk\",\n \"دنیا\": \"dunya\",\n \"راستہ\": \"rasta\",\n \"سڑک\": \"sarak\",\n \"پل\": \"pul\",\n \"باغ\": \"bagh\",\n \"میدان\": \"maidan\",\n \"دفتر\": \"daftar\",\n \"پاکستان\": \"pakistan\",\n\n // ---- English loanwords in everyday Urdu ----\n // These matter most in the reverse direction: the rule engine reads \"school\"\n // as s-ch-ool and produces سچول, so the pairing has to be explicit.\n \"سکول\": \"school\",\n \"کالج\": \"college\",\n \"یونیورسٹی\": \"university\",\n \"کمپیوٹر\": \"computer\",\n \"موبائل\": \"mobile\",\n \"فون\": \"phone\",\n \"انٹرنیٹ\": \"internet\",\n \"مارکیٹ\": \"market\",\n \"اسٹیشن\": \"station\",\n \"بس\": \"bus\",\n \"ٹرین\": \"train\",\n \"سائیکل\": \"cycle\",\n \"ہوٹل\": \"hotel\",\n \"انجینئر\": \"engineer\",\n \"پولیس\": \"police\",\n\n // ---- time and weather ----\n \"دن\": \"din\",\n \"رات\": \"raat\",\n \"صبح\": \"subah\",\n \"شام\": \"shaam\",\n \"دوپہر\": \"dopahar\",\n \"وقت\": \"waqt\",\n \"گھنٹہ\": \"ghanta\",\n \"ہفتہ\": \"hafta\",\n \"مہینہ\": \"maheena\",\n \"سال\": \"saal\",\n \"آج\": \"aaj\",\n \"کل\": \"kal\",\n \"پرسوں\": \"parson\",\n \"ابھی\": \"abhi\",\n \"اب\": \"ab\",\n \"پھر\": \"phir\",\n \"تب\": \"tab\",\n \"جب\": \"jab\",\n \"موسم\": \"mausam\",\n \"گرمی\": \"garmi\",\n \"سردی\": \"sardi\",\n \"بارش\": \"barish\",\n // ہوا is both \"hua\" (happened) and \"hawa\" (wind/air). The auxiliary is far more\n // frequent in prose, so it wins the forward direction; see ROMAN_VARIANTS for\n // the reverse mapping of \"hawa\".\n \"دھوپ\": \"dhoop\",\n \"بادل\": \"badal\",\n \"برف\": \"baraf\",\n \"آسمان\": \"asman\",\n \"زمین\": \"zameen\",\n \"سورج\": \"sooraj\",\n \"چاند\": \"chand\",\n \"ستارہ\": \"sitara\",\n\n // ---- objects, food, transport ----\n \"کتاب\": \"kitaab\",\n \"قلم\": \"qalam\",\n \"کاغذ\": \"kaghaz\",\n \"میز\": \"mez\",\n \"کرسی\": \"kursi\",\n \"پانی\": \"paani\",\n \"دودھ\": \"doodh\",\n \"چائے\": \"chai\",\n \"روٹی\": \"roti\",\n \"چاول\": \"chawal\",\n \"گوشت\": \"gosht\",\n \"سبزی\": \"sabzi\",\n \"پھل\": \"phal\",\n \"آم\": \"aam\",\n \"سیب\": \"saib\",\n \"کیلا\": \"kela\",\n \"انگور\": \"angoor\",\n \"نمک\": \"namak\",\n \"چینی\": \"cheeni\",\n \"تیل\": \"tel\",\n \"انڈا\": \"anda\",\n \"مچھلی\": \"machhli\",\n \"مرغی\": \"murghi\",\n \"گاڑی\": \"gaari\",\n \"جہاز\": \"jahaz\",\n \"پیسہ\": \"paisa\",\n \"روپیہ\": \"rupya\",\n \"نوکری\": \"naukri\",\n \"کام\": \"kaam\",\n \"کاروبار\": \"karobar\",\n \"قیمت\": \"qeemat\",\n \"تحفہ\": \"tohfa\",\n \"کپڑا\": \"kapra\",\n \"جوتا\": \"joota\",\n \"ٹوپی\": \"topi\",\n \"چابی\": \"chabi\",\n \"گھڑی\": \"ghari\",\n \"بستر\": \"bistar\",\n \"صابن\": \"sabun\",\n\n // ---- feeling and abstraction ----\n \"محبت\": \"mohabbat\",\n \"پیار\": \"pyaar\",\n \"خوشی\": \"khushi\",\n \"غم\": \"gham\",\n \"دکھ\": \"dukh\",\n \"ڈر\": \"dar\",\n \"خوف\": \"khauf\",\n \"امید\": \"umeed\",\n \"یقین\": \"yaqeen\",\n \"سچ\": \"sach\",\n \"جھوٹ\": \"jhoot\",\n \"انصاف\": \"insaf\",\n \"ظلم\": \"zulm\",\n \"عزت\": \"izzat\",\n \"شکریہ\": \"shukriya\",\n \"معاف\": \"maaf\",\n \"معافی\": \"maafi\",\n \"دعا\": \"dua\",\n \"خواب\": \"khwab\",\n \"زندگی\": \"zindagi\",\n \"موت\": \"maut\",\n \"صحت\": \"sehat\",\n \"بیماری\": \"beemari\",\n \"دوا\": \"dawa\",\n \"طاقت\": \"taqat\",\n \"کمزوری\": \"kamzori\",\n \"ضرورت\": \"zaroorat\",\n \"مدد\": \"madad\",\n \"کوشش\": \"koshish\",\n \"کامیابی\": \"kamyabi\",\n \"ناکامی\": \"nakami\",\n \"فیصلہ\": \"faisla\",\n \"رائے\": \"raye\",\n \"خیال\": \"khayal\",\n \"سوچ\": \"soch\",\n\n // ---- knowledge, language, culture ----\n \"علم\": \"ilm\",\n \"تعلیم\": \"taleem\",\n \"سبق\": \"sabaq\",\n \"امتحان\": \"imtihan\",\n \"نتیجہ\": \"nateeja\",\n \"مسئلہ\": \"masla\",\n \"حل\": \"hal\",\n \"سوال\": \"sawal\",\n \"جواب\": \"jawab\",\n \"بات\": \"baat\",\n \"باتیں\": \"baatein\",\n \"زبان\": \"zuban\",\n \"لفظ\": \"lafz\",\n \"نام\": \"naam\",\n \"خبر\": \"khabar\",\n \"کہانی\": \"kahani\",\n \"مضمون\": \"mazmoon\",\n \"شعر\": \"sher\",\n \"غزل\": \"ghazal\",\n \"ادب\": \"adab\",\n \"تاریخ\": \"tareekh\",\n \"ثقافت\": \"saqafat\",\n \"موسیقی\": \"moseeqi\",\n \"تصویر\": \"tasweer\",\n \"رنگ\": \"rang\",\n \"آواز\": \"awaz\",\n\n // ---- religion ----\n \"نماز\": \"namaz\",\n \"روزہ\": \"roza\",\n \"عید\": \"eid\",\n \"مذہب\": \"mazhab\",\n \"اسلام\": \"islam\",\n \"اللہ\": \"allah\",\n \"رسول\": \"rasool\",\n \"نبی\": \"nabi\",\n \"قرآن\": \"quran\",\n \"دین\": \"deen\",\n \"ایمان\": \"imaan\",\n \"جنت\": \"jannat\",\n\n // ---- body ----\n \"دل\": \"dil\",\n \"دماغ\": \"dimagh\",\n \"جسم\": \"jism\",\n \"ہاتھ\": \"hath\",\n \"پاؤں\": \"paon\",\n \"سر\": \"sar\",\n \"آنکھ\": \"aankh\",\n \"آنکھیں\": \"aankhein\",\n \"کان\": \"kaan\",\n \"ناک\": \"naak\",\n \"منہ\": \"munh\",\n \"دانت\": \"daant\",\n \"بال\": \"baal\",\n \"چہرہ\": \"chehra\",\n\n // ---- adjectives ----\n \"اچھا\": \"acha\",\n \"اچھی\": \"achi\",\n \"برا\": \"bura\",\n \"بری\": \"buri\",\n \"بڑا\": \"bara\",\n \"بڑی\": \"bari\",\n \"چھوٹا\": \"chhota\",\n \"چھوٹی\": \"chhoti\",\n \"نیا\": \"naya\",\n \"نئی\": \"nayi\",\n \"پرانا\": \"purana\",\n \"لمبا\": \"lamba\",\n \"موٹا\": \"mota\",\n \"پتلا\": \"patla\",\n \"تیز\": \"tez\",\n \"آہستہ\": \"ahista\",\n \"گرم\": \"garam\",\n \"ٹھنڈا\": \"thanda\",\n \"میٹھا\": \"meetha\",\n \"کڑوا\": \"karwa\",\n \"صاف\": \"saaf\",\n \"گندا\": \"ganda\",\n \"خالی\": \"khali\",\n \"بھرا\": \"bhara\",\n \"مشکل\": \"mushkil\",\n \"آسان\": \"aasan\",\n \"ضروری\": \"zaroori\",\n \"مکمل\": \"mukammal\",\n \"تیار\": \"tayyar\",\n \"خوش\": \"khush\",\n \"ناراض\": \"naraz\",\n \"پریشان\": \"pareshan\",\n \"تھکا\": \"thaka\",\n \"بیمار\": \"beemar\",\n \"امیر\": \"ameer\",\n \"غریب\": \"ghareeb\",\n \"مشہور\": \"mashhoor\",\n \"خوبصورت\": \"khoobsurat\",\n \"ذہین\": \"zaheen\",\n \"بہادر\": \"bahadur\",\n \"سست\": \"sust\",\n \"محنتی\": \"mehnati\",\n \"سچا\": \"sacha\",\n \"جھوٹا\": \"jhoota\",\n \"پیارا\": \"pyara\",\n \"عجیب\": \"ajeeb\",\n \"خاص\": \"khaas\",\n \"عام\": \"aam\",\n\n // ---- numbers and ordinals ----\n \"ایک\": \"aik\",\n \"تین\": \"teen\",\n \"چار\": \"char\",\n \"پانچ\": \"panch\",\n \"چھ\": \"chhe\",\n \"سات\": \"saat\",\n \"آٹھ\": \"aath\",\n \"نو\": \"nau\",\n \"دس\": \"das\",\n \"گیارہ\": \"gyarah\",\n \"بارہ\": \"barah\",\n \"بیس\": \"bees\",\n \"پچاس\": \"pachas\",\n \"سو\": \"so\",\n \"ہزار\": \"hazar\",\n \"لاکھ\": \"lakh\",\n \"کروڑ\": \"karor\",\n \"پہلا\": \"pehla\",\n \"دوسرا\": \"dosra\",\n \"تیسرا\": \"teesra\",\n \"آخری\": \"aakhri\",\n\n // ---- greetings and discourse markers ----\n \"سلام\": \"salam\",\n \"خدا\": \"khuda\",\n \"حافظ\": \"hafiz\",\n \"مہربانی\": \"meherbani\",\n \"مبارک\": \"mubarak\",\n \"ہاں\": \"haan\",\n \"جی\": \"ji\",\n \"ٹھیک\": \"theek\",\n \"بالکل\": \"bilkul\",\n \"ضرور\": \"zaroor\",\n \"شاید\": \"shayad\",\n \"اکثر\": \"aksar\",\n \"کبھی\": \"kabhi\",\n \"ہمیشہ\": \"hamesha\",\n \"جلدی\": \"jaldi\",\n \"دیر\": \"der\",\n \"آرام\": \"aaram\",\n \"تھوڑا\": \"thora\",\n \"زیادہ\": \"ziyada\",\n \"کم\": \"kam\",\n \"بہت\": \"bohat\",\n \"صرف\": \"sirf\",\n \"واقعی\": \"waqai\",\n\n // ---- more verbs ----\n \"کھیلنا\": \"khelna\",\n \"کھیلتا\": \"khelta\",\n \"ہنسنا\": \"hansna\",\n \"رونا\": \"rona\",\n \"ڈرنا\": \"darna\",\n \"بھولنا\": \"bhoolna\",\n \"یاد\": \"yaad\",\n \"سیکھنا\": \"seekhna\",\n \"سکھانا\": \"sikhana\",\n \"پکانا\": \"pakana\",\n \"دھونا\": \"dhona\",\n \"پہننا\": \"pehanna\",\n \"اتارنا\": \"utarna\",\n \"بیچنا\": \"bechna\",\n \"خریدنا\": \"khareedna\",\n \"بھیجنا\": \"bhejna\",\n \"پہنچنا\": \"pohanchna\",\n \"نکلنا\": \"nikalna\",\n \"گرنا\": \"girna\",\n \"اٹھانا\": \"uthana\",\n \"پکڑنا\": \"pakarna\",\n \"چھوڑنا\": \"chhorna\",\n \"توڑنا\": \"torna\",\n \"جوڑنا\": \"jorna\",\n \"کاٹنا\": \"katna\",\n // مارنا (to hit) and مرنا (to die) differ by one letter; keeping the long vowel\n // in \"maarna\" stops them collapsing into one reverse-direction target.\n \"مارنا\": \"maarna\",\n \"بچانا\": \"bachana\",\n \"جلانا\": \"jalana\",\n \"ناچنا\": \"nachna\",\n \"گانا\": \"gana\",\n \"لڑنا\": \"larna\",\n \"جیتنا\": \"jeetna\",\n \"ہارنا\": \"haarna\",\n \"چھپانا\": \"chhupana\",\n \"ڈھونڈنا\": \"dhoondna\",\n \"ملانا\": \"milana\",\n \"بدلنا\": \"badalna\",\n \"رکنا\": \"rukna\",\n \"اڑنا\": \"urna\",\n \"تیرنا\": \"tairna\",\n\n // ---- adverbs and conjunctions ----\n \"فوراً\": \"fauran\",\n \"دوبارہ\": \"dobara\",\n \"یقیناً\": \"yaqeenan\",\n \"تقریباً\": \"taqreeban\",\n \"البتہ\": \"albatta\",\n \"چونکہ\": \"chunkeh\",\n \"کیونکہ\": \"kyunkeh\",\n \"تاکہ\": \"taakeh\",\n \"ورنہ\": \"warna\",\n \"بلکہ\": \"balkeh\",\n \"حالانکہ\": \"halankeh\",\n \"مثلاً\": \"maslan\",\n \"بعض\": \"baaz\",\n \"تمام\": \"tamam\",\n \"پورا\": \"poora\",\n \"آدھا\": \"aadha\",\n \"دونوں\": \"donon\",\n \"تینوں\": \"teenon\",\n \"سارا\": \"sara\",\n \"باقی\": \"baqi\",\n\n // ---- news and public life, the densest vocabulary in Urdu media ----\n \"سیاست\": \"siyasat\",\n \"الیکشن\": \"election\",\n \"ووٹ\": \"vote\",\n \"پارٹی\": \"party\",\n \"اسمبلی\": \"assembly\",\n \"عدالت\": \"adalat\",\n \"قانون\": \"qanoon\",\n \"جرم\": \"jurm\",\n \"فوجی\": \"fauji\",\n \"جنگ\": \"jang\",\n \"امن\": \"aman\",\n \"معاہدہ\": \"muahida\",\n \"معیشت\": \"maeeshat\",\n \"تجارت\": \"tijarat\",\n \"بجٹ\": \"budget\",\n \"ترقی\": \"taraqqi\",\n \"منصوبہ\": \"mansooba\",\n \"اعلان\": \"elaan\",\n \"رپورٹ\": \"report\",\n \"بیان\": \"bayan\",\n \"اجلاس\": \"ijlas\",\n \"دورہ\": \"dora\",\n \"ملاقات\": \"mulaqat\",\n \"تقریب\": \"taqreeb\",\n \"تقریر\": \"taqreer\",\n\n // ---- technology ----\n \"ڈیٹا\": \"data\",\n \"ایپ\": \"app\",\n \"پروگرام\": \"program\",\n \"سسٹم\": \"system\",\n \"صارف\": \"sarif\",\n \"فائل\": \"file\",\n \"ٹیکنالوجی\": \"technology\",\n\n // ---- education ----\n \"جماعت\": \"jamaat\",\n \"کلاس\": \"class\",\n \"پرچہ\": \"parcha\",\n \"نمبر\": \"number\",\n \"ڈگری\": \"degree\",\n \"لائبریری\": \"library\",\n \"تحقیق\": \"tehqeeq\",\n \"مقالہ\": \"maqala\",\n\n // ---- health ----\n \"بخار\": \"bukhar\",\n \"درد\": \"dard\",\n \"زخم\": \"zakhm\",\n \"علاج\": \"ilaj\",\n \"خون\": \"khoon\",\n \"ہڈی\": \"haddi\",\n \"پیٹ\": \"pet\",\n \"گلا\": \"gala\",\n\n // ---- colours ----\n \"سفید\": \"safaid\",\n \"کالا\": \"kala\",\n \"سرخ\": \"surkh\",\n \"نیلا\": \"neela\",\n \"ہرا\": \"hara\",\n \"پیلا\": \"peela\",\n \"بھورا\": \"bhura\",\n \"گلابی\": \"gulabi\",\n \"سنہری\": \"sunehri\",\n\n // ---- animals ----\n \"کتا\": \"kutta\",\n \"بلی\": \"billi\",\n \"گھوڑا\": \"ghora\",\n \"گائے\": \"gaye\",\n \"بکری\": \"bakri\",\n \"بھینس\": \"bhains\",\n \"شیر\": \"sheer\",\n \"ہاتھی\": \"hathi\",\n \"اونٹ\": \"oont\",\n \"بندر\": \"bandar\",\n \"چوہا\": \"chooha\",\n \"پرندہ\": \"parinda\",\n \"کوا\": \"kawa\",\n \"طوطا\": \"tota\",\n \"سانپ\": \"saanp\",\n\n // ---- extended family ----\n \"چچا\": \"chacha\",\n \"ماموں\": \"mamoon\",\n \"خالہ\": \"khala\",\n \"پھوپھی\": \"phupi\",\n \"دادا\": \"dada\",\n \"دادی\": \"dadi\",\n \"نانا\": \"nana\",\n \"نانی\": \"nani\",\n \"رشتہ\": \"rishta\",\n \"خاندان\": \"khandan\",\n \"مہمان\": \"mehman\",\n\n // ---- food ----\n \"کھیر\": \"kheer\",\n \"حلوہ\": \"halwa\",\n \"بریانی\": \"biryani\",\n \"کباب\": \"kabab\",\n \"سالن\": \"salan\",\n \"دال\": \"daal\",\n \"آٹا\": \"aata\",\n \"مکھن\": \"makhan\",\n \"دہی\": \"dahi\",\n \"شہد\": \"shehad\",\n \"مرچ\": \"mirch\",\n \"ہلدی\": \"haldi\",\n \"لہسن\": \"lehsun\",\n \"پیاز\": \"pyaz\",\n \"ٹماٹر\": \"tamatar\",\n \"آلو\": \"aloo\",\n \"گاجر\": \"gajar\",\n \"تربوز\": \"tarbooz\",\n \"انار\": \"anar\",\n \"کھجور\": \"khajoor\",\n \"بادام\": \"badam\",\n\n // ---- places on the map ----\n \"کراچی\": \"karachi\",\n \"لاہور\": \"lahore\",\n \"پشاور\": \"peshawar\",\n \"کوئٹہ\": \"quetta\",\n \"ملتان\": \"multan\",\n \"راولپنڈی\": \"rawalpindi\",\n \"سیالکوٹ\": \"sialkot\",\n \"بھارت\": \"bharat\",\n \"ہندوستان\": \"hindustan\",\n \"چین\": \"cheen\",\n \"امریکہ\": \"amreeka\",\n \"برطانیہ\": \"bartania\",\n \"ایران\": \"iran\",\n \"افغانستان\": \"afghanistan\",\n \"کشمیر\": \"kashmir\",\n \"پنجاب\": \"punjab\",\n \"سندھ\": \"sindh\",\n \"بلوچستان\": \"balochistan\",\n\n // ---- names that appear constantly in Urdu content ----\n \"محمد\": \"muhammad\",\n \"احمد\": \"ahmed\",\n \"علی\": \"ali\",\n \"خان\": \"khan\",\n \"زید\": \"zaid\",\n \"حسن\": \"hasan\",\n \"حسین\": \"hussain\",\n \"فاطمہ\": \"fatima\",\n \"عائشہ\": \"ayesha\",\n \"عمر\": \"umar\",\n \"بلال\": \"bilal\",\n \"اسلم\": \"aslam\",\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 hun: \"ہوں\",\n ap: \"آپ\",\n aapko: \"آپکو\",\n kaise: \"کیسے\",\n kese: \"کیسے\",\n kaisey: \"کیسے\",\n nam: \"نام\",\n mai: \"میں\",\n main: \"میں\",\n me: \"میں\",\n nahin: \"نہیں\",\n nai: \"نہیں\",\n kia: \"کیا\",\n kiya: \"کیا\",\n bahut: \"بہت\",\n bhot: \"بہت\",\n bohot: \"بہت\",\n achha: \"اچھا\",\n achi: \"اچھی\",\n shukria: \"شکریہ\",\n salaam: \"سلام\",\n mohabat: \"محبت\",\n muhabbat: \"محبت\",\n pyar: \"پیار\",\n zindagi: \"زندگی\",\n dost: \"دوست\",\n khush: \"خوش\",\n theak: \"ٹھیک\",\n thik: \"ٹھیک\",\n bhai: \"بھائی\",\n behen: \"بہن\",\n ammi: \"امی\",\n abbu: \"ابو\",\n paisay: \"پیسے\",\n kaam: \"کام\",\n ghar: \"گھر\",\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};\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 { 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\nconst LETTERS: Record<string, string> = {\n \"ا\": \"a\",\n \"آ\": \"aa\",\n \"ب\": \"b\",\n \"پ\": \"p\",\n \"ت\": \"t\",\n \"ٹ\": \"t\",\n \"ث\": \"s\",\n \"ج\": \"j\",\n \"چ\": \"ch\",\n \"ح\": \"h\",\n \"خ\": \"kh\",\n \"د\": \"d\",\n \"ڈ\": \"d\",\n \"ذ\": \"z\",\n \"ر\": \"r\",\n \"ڑ\": \"r\",\n \"ز\": \"z\",\n \"ژ\": \"zh\",\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 \"ں\": \"n\",\n \"و\": \"o\",\n \"ہ\": \"h\",\n \"ھ\": \"h\",\n \"ء\": \"\",\n \"ی\": \"i\",\n \"ئ\": \"i\",\n \"ے\": \"e\",\n \"ۓ\": \"e\",\n \"ؤ\": \"o\",\n \"ۂ\": \"h\",\n};\n\n/** Letters that carry a vowel in the output, used to decide where a schwa is needed. */\nconst VOWEL_LETTERS = new Set([\"ا\", \"آ\", \"و\", \"ی\", \"ے\", \"ؤ\", \"ئ\", \"ۓ\", \"ۂ\", \"ع\"]);\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"]}