OriginalLanguageInfo.fromXmlElement constructor

OriginalLanguageInfo.fromXmlElement(
  1. XmlElement data, {
  2. required String word,
  3. required WordType wordType,
})

Implementation

factory OriginalLanguageInfo.fromXmlElement(
  XmlElement data, {
  required String word,
  required WordType wordType,
}) {
  var originalLanguage =
      data.getElement(ApiXmlElement.originalLanguage.name)!.innerText.trim();
  final languageType =
      data.getElement(ApiXmlElement.languageType.name)!.innerText.trim();

  // Remove repeated hanja characters if the korean word doesn't have repeated
  //  characters. This is because when a hanja has multiple meanings for this
  //  word, the hanja will appear multiple times in the data from the API.
  if (word.length != originalLanguage.length &&
      {"한자", "한자어"}.contains(languageType)) {
    final hasRepeatedHanjaCharacters = originalLanguage.characters.any(
      (ch) => originalLanguage.characters.where((e) => e == ch).length > 1,
    );
    if (hasRepeatedHanjaCharacters) {
      if (wordType == WordType.hybrid) {
        final hasRepeatedKoreanCharacters = word.characters
            .any((ch) => word.characters.where((e) => e == ch).length > 1);
        if (!hasRepeatedKoreanCharacters) {
          for (var i = 0; i < originalLanguage.length; i++) {
            final ch = originalLanguage[i];
            for (var j = i + 1; j < originalLanguage.length; j++) {
              if (ch == originalLanguage[j]) {
                originalLanguage = originalLanguage.substring(0, j) +
                    (j + 1 < originalLanguage.length
                        ? originalLanguage.substring(j + 1)
                        : "");
              }
            }
          }
        }
      } else {
        // Check character by character to be more precise.
        for (var i = 1; i < originalLanguage.length; i++) {
          final ch = originalLanguage[i - 1];
          final didWordEnd = word.length <= i;
          if (ch == originalLanguage[i] &&
              (didWordEnd || word[i - 1] != word[i])) {
            originalLanguage = originalLanguage.substring(0, i) +
                (i + 1 < originalLanguage.length
                    ? originalLanguage.substring(i + 1)
                    : "");
          }
        }
      }
    }
  }
  return OriginalLanguageInfo(
    originalLanguage: originalLanguage,
    languageType: languageType,
  );
}