UNPKG

armenian-transliteration

Version:
1 lines 42.8 kB
{"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"]}