chromium/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview Provides phonetic disambiguation functionality across multiple
 * languages for ChromeVox.
 */
import {TestImportManager} from '/common/testing/test_import_manager.js';

import {PhoneticDictionaries} from '../phonetic_dictionaries.js';
import {JaPhoneticData} from '../third_party/tamachiyomi/ja_phonetic_data.js';

export class PhoneticData {
  /**
   * Returns the phonetic disambiguation for |char| in |locale|.
   * Returns empty string if disambiguation can't be found.
   * @param {string} char
   * @param {string} locale
   * @return {string}
   */
  static forCharacter(char, locale) {
    if (!char || !locale) {
      throw Error('PhoneticData api requires non-empty arguments.');
    }

    if (locale === 'ja') {
      return JaPhoneticData.forCharacter(char);
    }

    char = char.toLowerCase();
    locale = locale.toLowerCase();
    let map = null;
    // Try a lookup using |locale|, but use only the language component if the
    // lookup fails, e.g. "en-us" -> "en" or "zh-hant-hk" -> "zh".
    map = PhoneticDictionaries.phoneticMap_[locale] ||
        PhoneticDictionaries.phoneticMap_[locale.split('-')[0]];

    if (!map) {
      return '';
    }

    return map[char] || '';
  }

  /**
   * @param {string} text
   * @param {string} locale
   * @return {string}
   */
  static forText(text, locale) {
    if (locale === 'ja') {
      // Japanese phonetic readings require specialized logic.
      return JaPhoneticData.forText(text);
    }

    const result = [];
    const chars = [...text];
    for (const char of chars) {
      const phoneticText = PhoneticData.forCharacter(char, locale);
      result.push(char + ': ' + phoneticText);
    }
    return result.join(', ');
  }
}

TestImportManager.exportForTesting(PhoneticData, JaPhoneticData);