{"version":3,"sources":["../src/converter.ts","../src/ordinal.ts"],"sourcesContent":["export const names: { [key: number]: string } = {\n  0: \"ნული\",\n  1: \"ერთი\",\n  2: \"ორი\",\n  3: \"სამი\",\n  4: \"ოთხი\",\n  5: \"ხუთი\",\n  6: \"ექვსი\",\n  7: \"შვიდი\",\n  8: \"რვა\",\n  9: \"ცხრა\",\n  10: \"ათი\",\n  11: \"თერთმეტი\",\n  12: \"თორმეტი\",\n  13: \"ცამეტი\",\n  14: \"თოთხმეტი\",\n  15: \"თხუთმეტი\",\n  16: \"თექვსმეტი\",\n  17: \"ჩვიდმეტი\",\n  18: \"თრვამეტი\",\n  19: \"ცხრამეტი\",\n  20: \"ოც\",\n  40: \"ორმოც\",\n  60: \"სამოც\",\n  80: \"ოთხმოც\",\n  100: \"ას\",\n  200: \"ორას\",\n  300: \"სამას\",\n  400: \"ოთხას\",\n  500: \"ხუთას\",\n  600: \"ექვსას\",\n  700: \"შვიდას\",\n  800: \"რვაას\",\n  900: \"ცხრაას\",\n};\n\nexport const magnitudes: { [key: string]: [number, number] } = {\n  ათას: [1000, 1000000],\n  მილიონ: [1000000, 1000000000],\n  მილიარდ: [1000000000, 1000000000000],\n  ტრილიონ: [1000000000000, 1000000000000000],\n  კვადრილიონ: [1000000000000000, Number.MAX_SAFE_INTEGER + 1],\n};\n\nconst fractionalNames: { [key: number]: string } = {\n  1: \"მეათედი\",\n  2: \"მეასედი\",\n  3: \"მეათასედი\",\n  4: \"მეათიათასედი\",\n  5: \"მეასიათასედი\",\n  6: \"მემილიონედი\",\n  7: \"მეათიმილიონედი\",\n  8: \"მეასიმილიონედი\",\n  9: \"მემილიარდედი\",\n  10: \"მეათიმილიარდედი\",\n  11: \"მეასიმილიარდედი\",\n  12: \"მეტრილიონედი\",\n  13: \"მეათიტრილიონედი\",\n  14: \"მეასიტრილიონედი\",\n  15: \"მეკვადრილიონედი\",\n  16: \"მეათიკვადრილიონედი\",\n};\n\nexport type Input = string | number;\nexport type Options = {\n  leadingOne?: boolean;\n  decimalPointSeparator?: string;\n};\n\nconst defaultOptions: Options = {\n  leadingOne: true,\n  decimalPointSeparator: \"\",\n};\n\nexport function numberToText(input: Input, options?: Options): string {\n  options = options || {};\n  options = { ...defaultOptions, ...options };\n  // console.log(input, options);\n  if (typeof input === \"string\") {\n    input = +input;\n  }\n  if (isNaN(input)) {\n    throw new Error(\"Invalid input\");\n  }\n  if (input < 0) {\n    return \"მინუს \" + numberToText(-input, options);\n  }\n  if (!Number.isInteger(input)) {\n    const [whole, fractional] = input.toString().split(\".\");\n    return (\n      `${_generateText(+whole, options)} მთელი${options.decimalPointSeparator} ` +\n      `${_generateText(+fractional, options)} ${getFractionalName(fractional)}`\n    );\n  }\n  return _generateText(input, options);\n}\n\nfunction _generateText(input: number, opts: Options): string {\n  if (input < 20) {\n    return names[input];\n  }\n  if (input < 100) {\n    if (input % 20 === 0) {\n      return names[input] + \"ი\";\n    }\n    return names[20 * Math.floor(input / 20)] + \"და\" + _generateText(input % 20, opts);\n  }\n  if (input < 1_000) {\n    if (input % 100 === 0) {\n      return names[input] + \"ი\";\n    }\n    return names[100 * Math.floor(input / 100)] + \" \" + _generateText(input % 100, opts);\n  }\n\n  for (const [name, [base, magnitude]] of Object.entries(magnitudes)) {\n    if (input < magnitude) {\n      const remainder = input % base;\n      const quotient = Math.floor(input / base);\n      let prefix = \"\";\n      if (quotient > 1 || opts.leadingOne) {\n        prefix = _generateText(quotient, opts) + \" \";\n      }\n      if (remainder === 0) {\n        return `${prefix}${name}ი`;\n      }\n      return `${prefix}${name} ` + _generateText(remainder, opts);\n    }\n  }\n  return input.toString();\n}\n\nexport function getFractionalName(input: string): string {\n  const len = input.length;\n  return fractionalNames[len] || \"\";\n}\n\n// todo: add ordinal support\n","import { magnitudes, names, numberToText } from \"./converter\";\n\nconst ordinal_magnitudes = [\n  [100, 1_000],\n  [1_000, 1_000_000],\n  [1_000_000, 1_000_000_000],\n  [1_000_000_000, 1_000_000_000_000],\n  [1_000_000_000_000, 1_000_000_000_000_000],\n];\n\nexport function numberToOrdinalText(input: number): string {\n  if (input === 1) {\n    return \"პირველი\";\n  }\n  return _generateText(input);\n}\n\nfunction _generateText(input: number, withPrefix = true): string {\n  const name = names[input];\n  if (input < 20) {\n    return withPrefix ? `მე${name.substring(0, name.length - 1)}ე` : name;\n  }\n  if (input < 100) {\n    if (input % 20 === 0) {\n      return withPrefix ? `მე${name}ე` : `${name}ი`;\n    }\n    return names[20 * Math.floor(input / 20)] + \"და\" + _generateText(input % 20);\n  }\n  if (input < 1_000) {\n    if (input % 100 === 0) {\n      return withPrefix ? `მე${name}ე` : `${name}ი`;\n    }\n    return names[100 * Math.floor(input / 100)] + \" \" + _generateText(input % 100);\n  }\n\n  for (const [name, [base, magnitude]] of Object.entries(magnitudes)) {\n    if (input < magnitude) {\n      const remainder = input % base;\n      const quotient = Math.floor(input / base);\n      let prefix = \"\";\n      if (quotient > 1) {\n        prefix = numberToText(quotient, { leadingOne: false });\n      }\n      if (remainder === 0) {\n        prefix = prefix.replace(/ /g, \"\");\n        return `მე${prefix}${name}ე`;\n      } else if (prefix) {\n        prefix += \" \";\n      }\n      return `${prefix}${name} ` + _generateText(remainder);\n    }\n  }\n  return input.toString();\n}\n\nexport function numberToOrdinal(input: number): string {\n  if (input === 1) {\n    return `1-ელი`;\n  }\n  if (input < 100) {\n    return input < 20 || input % 20 === 0 ? `მე-${input}` : `${input}-ე`;\n  }\n  for (const [base, magnitude] of ordinal_magnitudes) {\n    if (input < magnitude) {\n      return input % base === 0 ? `მე-${input}` : `${input}-ე`;\n    }\n  }\n  return `${input}-ე`;\n}\n"],"mappings":"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","names":["_generateText","name"]}