{"version":3,"sources":["../src/index.ts","../src/common/utils.ts","../src/common/constants.ts","../src/latin/constants.ts","../src/latin/transformations.ts","../src/latin/utils.ts","../src/latin/rules.ts","../src/latin/index.ts","../src/russian/constants.ts","../src/russian/transformations.ts","../src/russian/utils.ts","../src/russian/rules.ts","../src/russian/index.ts"],"sourcesContent":["import { transliterateArmenianTextToEng } from \"./latin\";\nimport { transliterateArmenianTextToRus } from \"./russian\";\n\nexport function transliterate(\n  text: string,\n  language: \"en\" | \"ru\" = \"en\"\n): string {\n  switch (language) {\n    case \"en\":\n      return transliterateArmenianTextToEng(text);\n    case \"ru\":\n      return transliterateArmenianTextToRus(text);\n  }\n}\n","import { WordCasing } from \"./types\";\n\n/**\n * Determines if a character is uppercase by comparing its\n * uppercase and lowercase forms.\n */\nexport function isCharUppercase(ch: string): boolean {\n  return ch.toUpperCase() === ch && ch.toLowerCase() !== ch;\n}\n\n/**\n * Splits text into tokens using a given regular expression,\n * while preserving the delimiters in the result array.\n * Example: splits spaces, punctuation, etc., but keeps them.\n */\nexport function splitTextPreservingDelimiters(\n  text: string,\n  regex: RegExp\n): string[] {\n  return text.split(regex);\n}\n\n/**\n * Applies a specific casing pattern (UPPER, LOWER, MIXED) to text.\n */\nexport function applyCasingPattern(text: string, pattern: WordCasing): string {\n  switch (pattern) {\n    case WordCasing.UPPER:\n      return text.toUpperCase();\n\n    case WordCasing.LOWER:\n      return text.toLowerCase();\n\n    case WordCasing.MIXED: {\n      // Mixed = first character uppercase, rest lowercase\n      const [firstChar, ...rest] = text;\n      return firstChar\n        ? firstChar.toUpperCase() + rest.join(\"\").toLowerCase()\n        : text;\n    }\n\n    default:\n      return text;\n  }\n}\n\n/**\n * Determine the casing pattern of a word that may contain Armenian characters.\n *\n * Rules:\n * - If there's at least one uppercase Armenian char and no lowercase Armenian chars => UPPER\n * - If there's at least one lowercase Armenian char and no uppercase Armenian chars => LOWER\n * - If there's a mix => MIXED\n * - If no Armenian letters are found => default to LOWER\n */\nexport function determineCasingPattern(\n  word: string,\n  isCharInScript: (ch: string) => boolean,\n  isCharUpper: (ch: string) => boolean\n): WordCasing {\n  let hasUpper = false;\n  let hasLower = false;\n\n  for (const ch of word) {\n    if (isCharInScript(ch)) {\n      if (isCharUpper(ch)) {\n        hasUpper = true;\n      } else {\n        hasLower = true;\n      }\n\n      // Early return if we already have both uppercase and lowercase\n      if (hasUpper && hasLower) {\n        return WordCasing.MIXED;\n      }\n    }\n  }\n\n  // Return the appropriate casing pattern based on flags.\n  if (hasUpper && !hasLower) return WordCasing.UPPER;\n  if (hasLower && !hasUpper) return WordCasing.LOWER;\n\n  // If no Armenian letters are found, default to LOWER.\n  return WordCasing.LOWER;\n}\n","/**\n * Mapping between Armenian punctuation characters and their English equivalents.\n * Added two extra guillemets: « and ».\n */\nexport const ARM_PUNCTUATION_MAP: Record<string, string> = {\n  ՙ: \"'\",\n  \"՚\": \"'\",\n  \"՛\": \"'\",\n  \"՜\": \"!\",\n  \"՝\": \",\",\n  \"՞\": \"?\",\n  \"՟\": \".\",\n  \"։\": \".\",\n  \"֊\": \"-\",\n  \"«\": '\"',\n  \"»\": '\"',\n};\n\n/**\n * Regular expression that matches Armenian letters (including the ligature `և`).\n */\nexport const ARMENIAN_LETTER_REGEX = /[\\u0530-\\u058Fև]/u;\n\n/**\n * Regex to split text into tokens while preserving delimiters that are not Armenian letters.\n * Example: splits spaces, punctuation, and other symbols but keeps them in the output array.\n */\nexport const ARM_SPLIT_REGEX = /(\\s+|[^ա-ֆԱ-Ֆև՝՛։,.\\-0-9«»]+)/u;\n\n/**\n * Set of Armenian vowels, both uppercase and lowercase.\n */\nexport const ARM_VOWELS = new Set([\n  \"ա\",\n  \"Ա\",\n  \"ե\",\n  \"Ե\",\n  \"է\",\n  \"Է\",\n  \"ի\",\n  \"Ի\",\n  \"ո\",\n  \"Ո\",\n  \"օ\",\n  \"Օ\",\n  \"ը\",\n  \"Ը\",\n]);\n\n/**\n * List of special Armenian ligatures from the Alphabetic Presentation Forms block (U+FB13..U+FB17).\n * Each object maps the ligature character to its two-letter expansion.\n */\nexport const ARMENIAN_LIGATURES = [\n  { ligature: \"ﬓ\", expansion: \"մն\" }, // U+FB13\n  { ligature: \"ﬔ\", expansion: \"մե\" }, // U+FB14\n  { ligature: \"ﬕ\", expansion: \"մի\" }, // U+FB15\n  { ligature: \"ﬖ\", expansion: \"վն\" }, // U+FB16\n  { ligature: \"ﬗ\", expansion: \"մխ\" }, // U+FB17\n] as const;\n","/**\n * Mapping between individual Armenian characters and their Latin equivalents.\n */\nexport const ARM_TO_LAT_MAP: Record<string, string> = {\n  ա: \"a\",\n  Ա: \"a\",\n  բ: \"b\",\n  Բ: \"b\",\n  գ: \"g\",\n  Գ: \"g\",\n  դ: \"d\",\n  Դ: \"d\",\n  ե: \"e\",\n  Ե: \"e\",\n  զ: \"z\",\n  Զ: \"z\",\n  է: \"e\",\n  Է: \"e\",\n  ը: \"ə\",\n  Ը: \"ə\",\n  թ: \"t\",\n  Թ: \"t\",\n  ժ: \"zh\",\n  Ժ: \"zh\",\n  ի: \"i\",\n  Ի: \"i\",\n  լ: \"l\",\n  Լ: \"l\",\n  խ: \"kh\",\n  Խ: \"kh\",\n  ծ: \"ts\",\n  Ծ: \"ts\",\n  կ: \"k\",\n  Կ: \"k\",\n  հ: \"h\",\n  Հ: \"h\",\n  ձ: \"dz\",\n  Ձ: \"dz\",\n  ղ: \"gh\",\n  Ղ: \"gh\",\n  ճ: \"ch\",\n  Ճ: \"ch\",\n  մ: \"m\",\n  Մ: \"m\",\n  յ: \"y\",\n  Յ: \"y\",\n  ն: \"n\",\n  Ն: \"n\",\n  շ: \"sh\",\n  Շ: \"sh\",\n  ո: \"o\",\n  Ո: \"o\",\n  չ: \"ch\",\n  Չ: \"ch\",\n  պ: \"p\",\n  Պ: \"p\",\n  ջ: \"j\",\n  Ջ: \"j\",\n  ռ: \"r\",\n  Ռ: \"r\",\n  ս: \"s\",\n  Ս: \"s\",\n  վ: \"v\",\n  Վ: \"v\",\n  տ: \"t\",\n  Տ: \"t\",\n  ր: \"r\",\n  Ր: \"r\",\n  ց: \"ts\",\n  Ց: \"ts\",\n  ւ: \"u\",\n  Ւ: \"u\",\n  փ: \"p\",\n  Փ: \"p\",\n  ք: \"k\",\n  Ք: \"k\",\n  օ: \"o\",\n  Օ: \"o\",\n  ֆ: \"f\",\n  Ֆ: \"f\",\n};\n\n/**\n * Temporary symbols for multi-character sequences like \"ու\" and \"և\".\n * We convert them temporarily to symbols that are not otherwise used in Armenian\n * so that they are processed as single \"characters\" when we map them to Latin.\n */\nexport const TEMP_SYMBOLS_MAP: {\n  forward: Record<string, string>;\n  backward: Record<string, string>;\n} = {\n  forward: {\n    // Map these sequences to temporary symbols for later processing.\n    ու: \"\\u2042\",\n    Ու: \"\\u2042\",\n    ՈՒ: \"\\u2042\",\n    և: \"\\u00A4\",\n    եւ: \"\\u00A4\",\n    Եւ: \"\\u00A4\",\n  },\n  backward: {\n    // Once we see these temporary symbols, map them to their Latin equivalents.\n    \"\\u2042\": \"u\",\n    \"\\u00A4\": \"ev\",\n  },\n};\n","import { ARM_TO_LAT_MAP, TEMP_SYMBOLS_MAP } from \"./constants\";\n\n/**\n * Maps a single Armenian character (or temporary symbol) to its Latin equivalent.\n */\nexport function mapArmenianCharToLatin(ch: string): string {\n  const { backward } = TEMP_SYMBOLS_MAP;\n\n  return backward[ch] ?? ARM_TO_LAT_MAP[ch] ?? ch;\n}\n","import { ARM_VOWELS } from \"../common\";\nimport { TEMP_SYMBOLS_MAP } from \"./constants\";\n\n/**\n * Checks if a character (or a temporary symbol) should be treated as a vowel in Armenian.\n */\nexport function isArmenianVowel(ch: string): boolean {\n  const { backward } = TEMP_SYMBOLS_MAP;\n\n  // If it's a temporary symbol, map it back to see if it starts with a vowel.\n  if (ch in backward) {\n    return true;\n  }\n\n  return ARM_VOWELS.has(ch);\n}\n","import { FirstCharRule } from \"../common\";\nimport { mapArmenianCharToLatin } from \"./transformations\";\nimport { isArmenianVowel } from \"./utils\";\n\n/**\n * List of rules that apply specifically to the first character (and possibly the second)\n * in an Armenian word for special transliteration cases.\n */\nexport const FIRST_CHAR_RULES: FirstCharRule[] = [\n  {\n    name: \"YeRule\",\n    // Trigger only if the first character is uppercase Ե\n    match: (firstChar) => firstChar === \"Ե\",\n    transliteration: (_, secondChar) => {\n      const secondCharLat = secondChar\n        ? mapArmenianCharToLatin(secondChar)\n        : \"\";\n      return `Ye${secondCharLat}`;\n    },\n  },\n  {\n    name: \"VoRule\",\n    // Trigger if the first character is Ո or ո\n    match: (firstChar) => firstChar === \"Ո\" || firstChar === \"ո\",\n    transliteration: (_, secondChar) => {\n      // Check if the second char is a vowel or v/V to decide if we do \"o\" vs \"vo\".\n      const isNextCharVowelOrV =\n        secondChar !== undefined &&\n        (isArmenianVowel(secondChar) ||\n          secondChar === \"վ\" ||\n          secondChar === \"Վ\");\n\n      const secondCharLat = secondChar\n        ? mapArmenianCharToLatin(secondChar)\n        : \"\";\n      const firstCharLat = isNextCharVowelOrV ? \"o\" : \"vo\";\n      return `${firstCharLat}${secondCharLat}`;\n    },\n  },\n  {\n    name: \"YevRule\",\n    // Trigger if the word starts with \"\\u00A4\" (which corresponds to \"և\" and variations)\n    match: (first) => first === \"\\u00A4\",\n    transliteration: (_, secondChar) => {\n      const secondCharLat = secondChar\n        ? mapArmenianCharToLatin(secondChar)\n        : \"\";\n      // \"\\u00A4\" -> \"ev\", but if it's the first character in a word, it's \"yev\"\n      return `yev${secondCharLat}`;\n    },\n  },\n];\n","/******************************************************************************\n * This module contains functions and constants to transliterate Armenian text\n * into the Latin alphabet, while preserving specific rules and casing patterns.\n *\n * Steps Overview:\n *   1) Normalize the Armenian word (expand ligatures, replace certain sequences).\n *   2) Apply special rules to the first characters.\n *   3) Reapply original casing based on the Armenian source word.\n *   4) Transform entire text by splitting and processing tokens, replacing\n *      punctuation, etc.\n ******************************************************************************/\n\nimport {\n  applyCasingPattern,\n  ARM_PUNCTUATION_MAP,\n  ARM_SPLIT_REGEX,\n  ARMENIAN_LETTER_REGEX,\n  ARMENIAN_LIGATURES,\n  determineCasingPattern,\n  isCharUppercase,\n  splitTextPreservingDelimiters,\n} from \"../common\";\n\nimport { TEMP_SYMBOLS_MAP } from \"./constants\";\nimport { FIRST_CHAR_RULES } from \"./rules\";\nimport { mapArmenianCharToLatin } from \"./transformations\";\n\n/**\n * Represents a tuple containing the first and (optional) second character.\n */\ntype FirstChars = [string, string | undefined];\n\n///////////////////////////////////////////////////////////////////////////////\n// 1) Normalizing Armenian Words\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Normalizes an Armenian word by:\n * 1) Expanding special ligatures (e.g. ﬓ, ﬔ, ﬕ, ﬖ, ﬗ).\n * 2) Replacing multi-character sequences (e.g. \"ու\", \"և\") with temporary symbols.\n *\n * @param {string} word - The original Armenian word.\n * @returns {string} - The normalized word.\n */\nfunction normalizeArmenianWord(word: string): string {\n  let result = word;\n\n  // 1. Expand special ligatures\n  ARMENIAN_LIGATURES.forEach(({ ligature, expansion }) => {\n    const regex = new RegExp(ligature, \"g\");\n    result = result.replace(regex, expansion);\n  });\n\n  // 2. Replace multi-character sequences with temporary symbols\n  const { forward } = TEMP_SYMBOLS_MAP;\n  for (const [armSequence, tempSymbol] of Object.entries(forward)) {\n    const sequenceRegex = new RegExp(armSequence, \"g\");\n    result = result.replace(sequenceRegex, tempSymbol);\n  }\n\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 2) Applying Special Rules to the First Characters\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Applies predefined rules to the first (and optionally second) character.\n * If none of the rules match, the characters are transliterated normally.\n *\n * @param {[string, string | undefined]} firstChars - A tuple of the first and second characters.\n * @returns {string} - The transliterated output for the first (and optional second) character.\n */\nfunction applyFirstCharRules([firstChar, secondChar]: FirstChars): string {\n  for (const { match, transliteration } of FIRST_CHAR_RULES) {\n    if (match(firstChar, secondChar)) {\n      return transliteration(firstChar, secondChar);\n    }\n  }\n\n  // Default: map both characters if no rule applies\n  const latinFirstChar = mapArmenianCharToLatin(firstChar);\n  const latinSecondChar = secondChar ? mapArmenianCharToLatin(secondChar) : \"\";\n  return `${latinFirstChar}${latinSecondChar}`;\n}\n\n/**\n * Transliterates an Armenian word without considering its original casing.\n * This includes applying special rules for the initial characters.\n *\n * @param {string} word - The normalized Armenian word.\n * @returns {string} - The transliterated string (ignoring original casing).\n */\nfunction transliterateArmenianWordRaw(word: string): string {\n  const chars = Array.from(word);\n  if (chars.length === 0) {\n    return \"\";\n  }\n\n  const [firstChar, secondChar, ...restChars] = chars;\n\n  // Safety check in case the first character is somehow missing\n  if (!firstChar) {\n    throw new Error(\n      \"Unexpected empty first character in transliterateArmenianWordRaw\"\n    );\n  }\n\n  // Apply special rules to the first (and possibly second) character\n  let result = applyFirstCharRules([firstChar, secondChar]);\n\n  // Transliterate the remaining characters\n  if (secondChar !== undefined) {\n    for (const char of restChars) {\n      result += mapArmenianCharToLatin(char);\n    }\n  }\n\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 3) Reapplying Original Casing\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Determines the original casing pattern of the Armenian word and\n * applies it to the raw Latin transliteration.\n *\n * @param {string} originalWord - The original Armenian word (used for casing).\n * @param {string} rawLatinWord - The transliteration ignoring casing.\n * @returns {string} - The transliterated word with the original casing pattern applied.\n */\nfunction applyOriginalCasingPattern(\n  originalWord: string,\n  rawLatinWord: string\n): string {\n  // Determine casing pattern by examining Armenian letters only\n  const pattern = determineCasingPattern(\n    originalWord,\n    (ch) => ARMENIAN_LETTER_REGEX.test(ch),\n    (ch) => isCharUppercase(ch)\n  );\n\n  // Apply that pattern to the transliterated string\n  return applyCasingPattern(rawLatinWord, pattern);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 4) Transliterate a Single Word (Combining All Steps)\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Transliterates a single Armenian word, preserving its original casing.\n *\n * @param {string} word - The original Armenian word.\n * @returns {string} - The transliterated word with the original casing preserved.\n */\nfunction transliterateArmenianWord(word: string): string {\n  // 1. Normalize (expand ligatures, handle multi-character sequences)\n  const normalizedWord = normalizeArmenianWord(word);\n\n  // 2. Transliterate ignoring casing\n  const rawLatin = transliterateArmenianWordRaw(normalizedWord);\n\n  // 3. Reapply the original casing pattern\n  return applyOriginalCasingPattern(word, rawLatin);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 5) Replacing Armenian Punctuation\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Replaces all Armenian punctuation marks with their English counterparts.\n *\n * @param {string} text - The text containing potential Armenian punctuation marks.\n * @returns {string} - The text where Armenian punctuation is replaced with English equivalents.\n */\nfunction replaceArmenianPunctuation(text: string): string {\n  let result = text;\n  for (const [armMark, latinMark] of Object.entries(ARM_PUNCTUATION_MAP)) {\n    result = result.split(armMark).join(latinMark);\n  }\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 6) Transliterate Complex Text (Main Entry Point)\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Transliterates arbitrary text containing both Armenian and non-Armenian characters\n * (including punctuation) into Latin.\n *\n * Process:\n *   1) Split the text into tokens (words, punctuation, etc.), preserving delimiters.\n *   2) Replace Armenian punctuation in each token.\n *   3) For any token containing Armenian letters, split it by whitespace,\n *      transliterate each piece, and rejoin.\n *   4) Reconstruct the final string from the processed tokens.\n *\n * @param {string} text - The input string (can contain Armenian, Latin, punctuation, etc.).\n * @returns {string} - The transliterated string.\n */\nexport function transliterateArmenianTextToEng(text: string): string {\n  // 1) Split into tokens while preserving delimiters\n  const tokens = splitTextPreservingDelimiters(text, ARM_SPLIT_REGEX);\n\n  // 2) Process each token\n  const processedTokens = tokens.map((token) => {\n    // First, replace Armenian punctuation with English equivalents\n    const tokenWithoutPunctuation = replaceArmenianPunctuation(token);\n\n    // If the token contains Armenian letters, split by whitespace and transliterate\n    if (ARMENIAN_LETTER_REGEX.test(tokenWithoutPunctuation)) {\n      const subWords = tokenWithoutPunctuation.split(/\\s+/);\n      const transliteratedSubWords = subWords.map(transliterateArmenianWord);\n      return transliteratedSubWords.join(\" \");\n    }\n\n    // If there are no Armenian letters, return the token unchanged\n    return tokenWithoutPunctuation;\n  });\n\n  // 3) Join all processed tokens back into a final string\n  return processedTokens.join(\"\");\n}\n","/**\n * Mapping between individual Armenian characters and their Russian equivalents.\n */\nexport const ARM_TO_RUS_MAP: Record<string, string> = {\n  ա: \"а\",\n  Ա: \"А\",\n  բ: \"б\",\n  Բ: \"Б\",\n  գ: \"г\",\n  Գ: \"Г\",\n  դ: \"д\",\n  Դ: \"Д\",\n  ե: \"е\",\n  Ե: \"Е\",\n  զ: \"з\",\n  Զ: \"З\",\n  է: \"э\",\n  Է: \"Э\",\n  ը: \"ы\",\n  Ը: \"Ы\",\n  թ: \"т\",\n  Թ: \"Т\",\n  ժ: \"ж\",\n  Ժ: \"Ж\",\n  ի: \"и\",\n  Ի: \"И\",\n  լ: \"л\",\n  Լ: \"Л\",\n  խ: \"х\",\n  Խ: \"Х\",\n  ծ: \"ц\",\n  Ծ: \"Ц\",\n  կ: \"к\",\n  Կ: \"К\",\n  հ: \"х\",\n  Հ: \"Х\",\n  ձ: \"дз\",\n  Ձ: \"Дз\",\n  ղ: \"г\",\n  Ղ: \"Г\",\n  ճ: \"ч\",\n  Ճ: \"Ч\",\n  մ: \"м\",\n  Մ: \"М\",\n  յ: \"й\",\n  Յ: \"Й\",\n  ն: \"н\",\n  Ն: \"Н\",\n  շ: \"ш\",\n  Շ: \"Ш\",\n  ո: \"о\",\n  Ո: \"О\",\n  չ: \"ч\",\n  Չ: \"Ч\",\n  պ: \"п\",\n  Պ: \"П\",\n  ջ: \"ж\",\n  Ջ: \"Ж\",\n  ռ: \"р\",\n  Ռ: \"Р\",\n  ս: \"с\",\n  Ս: \"С\",\n  վ: \"в\",\n  Վ: \"В\",\n  տ: \"т\",\n  Տ: \"Т\",\n  ր: \"р\",\n  Ր: \"Р\",\n  ց: \"ц\",\n  Ց: \"Ц\",\n  ւ: \"у\",\n  Ւ: \"У\",\n  փ: \"п\",\n  Փ: \"П\",\n  ք: \"к\",\n  Ք: \"К\",\n  օ: \"о\",\n  Օ: \"О\",\n  ֆ: \"ф\",\n  Ֆ: \"Ф\",\n};\n\n/**\n * Temporary symbols for multi-character sequences like \"ու\" and \"և\".\n * We convert them temporarily to symbols that are not otherwise used in Armenian\n * so that they are processed as single \"characters\" when we map them to Russian.\n */\nexport const TEMP_SYMBOLS_MAP: {\n  forward: Record<string, string>;\n  backward: Record<string, string>;\n} = {\n  forward: {\n    // Map these sequences to temporary (most unicode rare) symbols for later processing.\n    // ORDER MATTERS! We need to process longer sequences first.\n\n    յու: \"\\u2117\", // \"յու\" -> \"ю\" -> \"ю\"\n    Յու: \"\\u2117\", // \"Յու\" -> \"Ю\" -> \"ю\"\n    ՅՈՒ: \"\\u2117\", // \"ՅՈՒ\" -> \"Ю\" -> \"ю\"\n\n    յա: \"\\u203D\", // \"յա\" -> \"я\" -> \"я\"\n    Յա: \"\\u203D\", // \"Յա\" -> \"Я\" -> \"я\"\n    ՅԱ: \"\\u203D\", // \"ՅԱ\" -> \"Я\" -> \"я\"\n\n    ու: \"\\u2042\", // \"ու\" -> \"у\" -> \"у\"\n    Ու: \"\\u2042\", // \"Ու\" -> \"у\" -> \"у\"\n    ՈՒ: \"\\u2042\", // \"ՈՒ\" -> \"У\" -> \"у\"\n\n    և: \"\\u00A4\", // \"և\" -> \"եվ\" -> \"ев\"\n    եւ: \"\\u00A4\", // \"եւ\" -> \"ев\" -> \"ев\"\n    Եւ: \"\\u00A4\", // \"Եւ\" -> \"Ев\" -> \"ев\"\n  },\n  backward: {\n    \"\\u2042\": \"у\",\n    \"\\u00A4\": \"ев\",\n    \"\\u203D\": \"я\",\n    \"\\u2117\": \"ю\",\n  },\n};\n","import { ARM_TO_RUS_MAP, TEMP_SYMBOLS_MAP } from \"./constants\";\n\n/**\n * Maps a single Armenian character (or temporary symbol) to its Russian equivalent.\n */\nexport function mapArmenianCharToRussian(ch: string): string {\n  const { backward } = TEMP_SYMBOLS_MAP;\n  return backward[ch] ?? ARM_TO_RUS_MAP[ch] ?? ch;\n}\n","import { ARM_VOWELS } from \"../common\";\nimport { TEMP_SYMBOLS_MAP } from \"./constants\";\n\n/**\n * Checks if a character (or a temporary symbol) should be treated as a vowel in Armenian.\n */\nexport function isArmenianVowel(ch: string): boolean {\n  const { backward } = TEMP_SYMBOLS_MAP;\n\n  // If it's a temporary symbol, map it back to see if it starts with a vowel.\n  if (ch in backward) {\n    return true;\n  }\n\n  return ARM_VOWELS.has(ch);\n}\n","import { FirstCharRule } from \"../common\";\nimport { mapArmenianCharToRussian } from \"./transformations\";\nimport { isArmenianVowel } from \"./utils\";\n\n/**\n * List of rules that apply specifically to the first character (and possibly the second)\n * in an Armenian word for special transliteration cases.\n */\nexport const FIRST_CHAR_RULES: FirstCharRule[] = [\n  {\n    name: \"YeRule\",\n    // Trigger only if the first character is uppercase Ե\n    match: (firstChar) => firstChar === \"Ե\",\n    transliteration: (_, secondChar) => {\n      const secondCharRus = secondChar\n        ? mapArmenianCharToRussian(secondChar)\n        : \"\";\n      return `Е${secondCharRus}`;\n    },\n  },\n  {\n    name: \"VoRule\",\n    // Trigger if the first character is Ո or ո\n    match: (firstChar) => firstChar === \"Ո\" || firstChar === \"ո\",\n    transliteration: (_, secondChar) => {\n      // Check if the second char is a vowel or v/V to decide if we do \"o\" vs \"vo\".\n      const isNextCharVowelOrV =\n        secondChar !== undefined &&\n        (isArmenianVowel(secondChar) ||\n          secondChar === \"վ\" ||\n          secondChar === \"Վ\");\n\n      const secondCharRus = secondChar\n        ? mapArmenianCharToRussian(secondChar)\n        : \"\";\n      const firstCharRus = isNextCharVowelOrV ? \"о\" : \"во\";\n      return `${firstCharRus}${secondCharRus}`;\n    },\n  },\n  {\n    name: \"YevRule\",\n    // Trigger if the word starts with \"֎\" (which corresponds to \"և\" and variations)\n    match: (first) => first === \"\\u00A4\",\n    transliteration: (_, secondChar) => {\n      const secondCharRus = secondChar\n        ? mapArmenianCharToRussian(secondChar)\n        : \"\";\n      return `ев${secondCharRus}`;\n    },\n  },\n];\n","/******************************************************************************\n * This module contains functions and constants to transliterate Armenian text\n * into the Russian alphabet, while preserving specific rules and casing patterns.\n *\n * Steps Overview:\n *   1) Normalize the Armenian word (expand ligatures, replace certain sequences).\n *   2) Apply special rules to the first characters.\n *   3) Reapply original casing based on the Armenian source word.\n *   4) Transform entire text by splitting and processing tokens, replacing\n *      punctuation, etc.\n ******************************************************************************/\n\nimport {\n  applyCasingPattern,\n  ARM_PUNCTUATION_MAP,\n  ARM_SPLIT_REGEX,\n  ARMENIAN_LETTER_REGEX,\n  ARMENIAN_LIGATURES,\n  determineCasingPattern,\n  isCharUppercase,\n  splitTextPreservingDelimiters,\n} from \"../common\";\n\nimport { TEMP_SYMBOLS_MAP } from \"./constants\";\nimport { FIRST_CHAR_RULES } from \"./rules\";\nimport { mapArmenianCharToRussian } from \"./transformations\";\n\n/**\n * Represents a tuple containing the first and (optional) second character.\n */\ntype FirstChars = [string, string | undefined];\n\n///////////////////////////////////////////////////////////////////////////////\n// 1) Normalizing Armenian Words\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Normalizes an Armenian word by:\n * 1) Expanding special ligatures (e.g. ﬓ, ﬔ, ﬕ, ﬖ, ﬗ).\n * 2) Replacing multi-character sequences (e.g. \"ու\", \"և\") with temporary symbols.\n *\n * @param {string} word - The original Armenian word.\n * @returns {string} - The normalized word.\n */\nfunction normalizeArmenianWord(word: string): string {\n  let result = word;\n\n  // 1. Expand special ligatures\n  ARMENIAN_LIGATURES.forEach(({ ligature, expansion }) => {\n    const regex = new RegExp(ligature, \"g\");\n    result = result.replace(regex, expansion);\n  });\n\n  // 2. Replace multi-character sequences with temporary symbols\n  const { forward } = TEMP_SYMBOLS_MAP;\n  for (const [armSequence, tempSymbol] of Object.entries(forward)) {\n    const sequenceRegex = new RegExp(armSequence, \"g\");\n    result = result.replace(sequenceRegex, tempSymbol);\n  }\n\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 2) Applying Special Rules to the First Characters\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Applies predefined rules to the first (and optionally second) character.\n * If none of the rules match, the characters are transliterated normally.\n *\n * @param {[string, string | undefined]} firstChars - A tuple of the first and second characters.\n * @returns {string} - The transliterated output for the first (and optional second) character.\n */\nfunction applyFirstCharRules([firstChar, secondChar]: FirstChars): string {\n  for (const { match, transliteration } of FIRST_CHAR_RULES) {\n    if (match(firstChar, secondChar)) {\n      return transliteration(firstChar, secondChar);\n    }\n  }\n\n  // Default: map both characters if no rule applies\n  const russianFirstChar = mapArmenianCharToRussian(firstChar);\n  const russianSecondChar = secondChar\n    ? mapArmenianCharToRussian(secondChar)\n    : \"\";\n  return `${russianFirstChar}${russianSecondChar}`;\n}\n\n/**\n * Transliterates an Armenian word without considering its original casing.\n * This includes applying special rules for the initial characters.\n *\n * @param {string} word - The normalized Armenian word.\n * @returns {string} - The transliterated string (ignoring original casing).\n */\nfunction transliterateArmenianWordRaw(word: string): string {\n  const chars = Array.from(word);\n  if (chars.length === 0) {\n    return \"\";\n  }\n\n  const [firstChar, secondChar, ...restChars] = chars;\n\n  // Safety check in case the first character is somehow missing\n  if (!firstChar) {\n    throw new Error(\n      \"Unexpected empty first character in transliterateArmenianWordRaw\"\n    );\n  }\n\n  // Apply special rules to the first (and possibly second) character\n  let result = applyFirstCharRules([firstChar, secondChar]);\n\n  // Transliterate the remaining characters\n  if (secondChar !== undefined) {\n    for (const char of restChars) {\n      result += mapArmenianCharToRussian(char);\n    }\n  }\n\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 3) Reapplying Original Casing\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Determines the original casing pattern of the Armenian word and\n * applies it to the raw Russian transliteration.\n *\n * @param {string} originalWord - The original Armenian word (used for casing).\n * @param {string} rawRussianWord - The transliteration ignoring casing.\n * @returns {string} - The transliterated word with the original casing pattern applied.\n */\nfunction applyOriginalCasingPattern(\n  originalWord: string,\n  rawRussianWord: string\n): string {\n  // Determine casing pattern by examining Armenian letters only\n  const pattern = determineCasingPattern(\n    originalWord,\n    (ch) => ARMENIAN_LETTER_REGEX.test(ch),\n    (ch) => isCharUppercase(ch)\n  );\n\n  // Apply that pattern to the transliterated string\n  return applyCasingPattern(rawRussianWord, pattern);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 4) Transliterate a Single Word (Combining All Steps)\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Transliterates a single Armenian word, preserving its original casing.\n *\n * @param {string} word - The original Armenian word.\n * @returns {string} - The transliterated word with the original casing preserved.\n */\nfunction transliterateArmenianWord(word: string): string {\n  // 1. Normalize (expand ligatures, handle multi-character sequences)\n  const normalizedWord = normalizeArmenianWord(word);\n\n  // 2. Transliterate ignoring casing\n  const rawRussian = transliterateArmenianWordRaw(normalizedWord);\n\n  // 3. Reapply the original casing pattern\n  return applyOriginalCasingPattern(word, rawRussian);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 5) Replacing Armenian Punctuation\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Replaces all Armenian punctuation marks with their Russian counterparts.\n *\n * @param {string} text - The text containing potential Armenian punctuation marks.\n * @returns {string} - The text where Armenian punctuation is replaced with Russian equivalents.\n */\nfunction replaceArmenianPunctuation(text: string): string {\n  let result = text;\n  for (const [armMark, russianMark] of Object.entries(ARM_PUNCTUATION_MAP)) {\n    result = result.split(armMark).join(russianMark);\n  }\n  return result;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// 6) Transliterate Complex Text (Main Entry Point)\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Transliterates arbitrary text containing both Armenian and non-Armenian characters\n * (including punctuation) into Russian.\n *\n * Process:\n *   1) Split the text into tokens (words, punctuation, etc.), preserving delimiters.\n *   2) Replace Armenian punctuation in each token.\n *   3) For any token containing Armenian letters, split it by whitespace,\n *      transliterate each piece, and rejoin.\n *   4) Reconstruct the final string from the processed tokens.\n *\n * @param {string} text - The input string (can contain Armenian, Russian, punctuation, etc.).\n * @returns {string} - The transliterated string.\n */\nexport function transliterateArmenianTextToRus(text: string): string {\n  // 1) Split into tokens while preserving delimiters\n  const tokens = splitTextPreservingDelimiters(text, ARM_SPLIT_REGEX);\n\n  // 2) Process each token\n  const processedTokens = tokens.map((token) => {\n    // First, replace Armenian punctuation with Russian equivalents\n    const tokenWithoutPunctuation = replaceArmenianPunctuation(token);\n\n    // If the token contains Armenian letters, split by whitespace and transliterate\n    if (ARMENIAN_LETTER_REGEX.test(tokenWithoutPunctuation)) {\n      const subWords = tokenWithoutPunctuation.split(/\\s+/);\n      const transliteratedSubWords = subWords.map(transliterateArmenianWord);\n      return transliteratedSubWords.join(\" \");\n    }\n\n    // If there are no Armenian letters, return the token unchanged\n    return tokenWithoutPunctuation;\n  });\n\n  // 3) Join all processed tokens back into a final string\n  return processedTokens.join(\"\");\n}\n"],"mappings":"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","names":["index_exports","__export","transliterate","__toCommonJS","isCharUppercase","ch","splitTextPreservingDelimiters","text","regex","applyCasingPattern","pattern","firstChar","rest","determineCasingPattern","word","isCharInScript","isCharUpper","hasUpper","hasLower","ARM_PUNCTUATION_MAP","ARMENIAN_LETTER_REGEX","ARM_SPLIT_REGEX","ARM_VOWELS","ARMENIAN_LIGATURES","ARM_TO_LAT_MAP","TEMP_SYMBOLS_MAP","mapArmenianCharToLatin","ch","backward","TEMP_SYMBOLS_MAP","ARM_TO_LAT_MAP","isArmenianVowel","ch","backward","TEMP_SYMBOLS_MAP","ARM_VOWELS","FIRST_CHAR_RULES","firstChar","_","secondChar","mapArmenianCharToLatin","isNextCharVowelOrV","isArmenianVowel","secondCharLat","first","normalizeArmenianWord","word","result","ARMENIAN_LIGATURES","ligature","expansion","regex","forward","TEMP_SYMBOLS_MAP","armSequence","tempSymbol","sequenceRegex","applyFirstCharRules","firstChar","secondChar","match","transliteration","FIRST_CHAR_RULES","latinFirstChar","mapArmenianCharToLatin","latinSecondChar","transliterateArmenianWordRaw","chars","restChars","char","applyOriginalCasingPattern","originalWord","rawLatinWord","pattern","determineCasingPattern","ch","ARMENIAN_LETTER_REGEX","isCharUppercase","applyCasingPattern","transliterateArmenianWord","normalizedWord","rawLatin","replaceArmenianPunctuation","text","armMark","latinMark","ARM_PUNCTUATION_MAP","transliterateArmenianTextToEng","splitTextPreservingDelimiters","ARM_SPLIT_REGEX","token","tokenWithoutPunctuation","ARM_TO_RUS_MAP","TEMP_SYMBOLS_MAP","mapArmenianCharToRussian","ch","backward","TEMP_SYMBOLS_MAP","ARM_TO_RUS_MAP","isArmenianVowel","ch","backward","TEMP_SYMBOLS_MAP","ARM_VOWELS","FIRST_CHAR_RULES","firstChar","_","secondChar","mapArmenianCharToRussian","isNextCharVowelOrV","isArmenianVowel","secondCharRus","first","normalizeArmenianWord","word","result","ARMENIAN_LIGATURES","ligature","expansion","regex","forward","TEMP_SYMBOLS_MAP","armSequence","tempSymbol","sequenceRegex","applyFirstCharRules","firstChar","secondChar","match","transliteration","FIRST_CHAR_RULES","russianFirstChar","mapArmenianCharToRussian","russianSecondChar","transliterateArmenianWordRaw","chars","restChars","char","applyOriginalCasingPattern","originalWord","rawRussianWord","pattern","determineCasingPattern","ch","ARMENIAN_LETTER_REGEX","isCharUppercase","applyCasingPattern","transliterateArmenianWord","normalizedWord","rawRussian","replaceArmenianPunctuation","text","armMark","russianMark","ARM_PUNCTUATION_MAP","transliterateArmenianTextToRus","splitTextPreservingDelimiters","ARM_SPLIT_REGEX","token","tokenWithoutPunctuation","transliterate","text","language","transliterateArmenianTextToEng","transliterateArmenianTextToRus"]}