ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/akkadian/application/phonetics/ipa.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { transcriptionToIpaMap } from 'akkadian/domain/transcription/transcription'

export interface IpaProps {
  isStressed?: boolean
  isAffricative?: boolean
  isPharyngealized?: boolean
}

function getIpaMap(isAffricative: boolean, isPharyngealized: boolean) {
  let IpaMap = transcriptionToIpaMap.basic
  if (isAffricative) {
    IpaMap = {
      ...IpaMap,
      ...transcriptionToIpaMap.affricative,
    }
  }
  if (isPharyngealized) {
    IpaMap = {
      ...IpaMap,
      ...transcriptionToIpaMap.pharyngealized,
    }
  }
  if (isAffricative && isPharyngealized) {
    IpaMap = {
      ...IpaMap,
      ...transcriptionToIpaMap['pharyngealized-affricative'],
    }
  }
  return IpaMap
}

export function transcriptionToIpa(
  transcription: string,
  options: IpaProps = {
    isStressed: false,
    isAffricative: false,
    isPharyngealized: false,
  }
): string {
  const map = getIpaMap(
    options.isAffricative ?? false,
    options.isPharyngealized ?? false
  )
  const ipa = Object.entries(map).reduce(
    (prev, entry) => prev.replace(...entry),
    transcription
  )
  return options.isStressed ? `ˈ${ipa}` : ipa
}