///<summary> /// Constructor. ///</summary> ///<param name="idsInFile"></param> ///<param name="replaceIdsInFile"></param> ///<param name="writingSystemRepository"></param> public static void FindOrphans( IEnumerable<string> idsInFile, IdReplacementStrategy replaceIdsInFile, IWritingSystemRepository writingSystemRepository ) { var originalIds = new List<string>(idsInFile); var updatedIds = new List<string>(idsInFile); foreach (var wsId in originalIds) { // Check if it's in the repo if (writingSystemRepository.Contains(wsId)) { continue; } string newId = wsId; if (writingSystemRepository.WritingSystemIdHasChanged(wsId)) { newId = writingSystemRepository.WritingSystemIdHasChangedTo(wsId); } else { // It's an orphan // Check for the writing system repository compatibility mode if (writingSystemRepository.CompatibilityMode == WritingSystemCompatibility.Flex7V0Compatible) { if (!wsId.StartsWith("x-")) { // Clean it var rfcTagCleaner = new Rfc5646TagCleaner(wsId); rfcTagCleaner.Clean(); newId = rfcTagCleaner.GetCompleteTag(); } } else { // Clean it var rfcTagCleaner = new Rfc5646TagCleaner(wsId); rfcTagCleaner.Clean(); newId = rfcTagCleaner.GetCompleteTag(); } } var conformantWritingSystem = WritingSystemDefinition.Parse(newId); // If it changed, then change if (conformantWritingSystem.Bcp47Tag != wsId) { conformantWritingSystem = WritingSystemDefinition.CreateCopyWithUniqueId(conformantWritingSystem, updatedIds); replaceIdsInFile(wsId, conformantWritingSystem.Bcp47Tag); updatedIds.Remove(wsId); updatedIds.Add(conformantWritingSystem.Bcp47Tag); } // Check if it's in the repo if (writingSystemRepository.Contains(conformantWritingSystem.Bcp47Tag)) { continue; } // It's not in the repo so set it writingSystemRepository.Set(conformantWritingSystem); } writingSystemRepository.Save(); }
public void CompleteTagConstructor_QaaWithXDashBeforeValidLanguageName_NoChange() { var cleaner = new Rfc5646TagCleaner("qaa-x-th"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-th")); Assert.That(cleaner.Language, Is.EqualTo("qaa")); Assert.That(cleaner.PrivateUse, Is.EqualTo("th")); }
public void CompleteTagConstructor_InvalidLanguageNameWithScript_QaaAdded() { var cleaner = new Rfc5646TagCleaner("wee-Latn"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-Latn-x-wee")); // Also when initially "Latn" is properly in the Script field. cleaner = new Rfc5646TagCleaner("wee", "Latn", "", "", ""); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-Latn-x-wee")); }
public void CompleteTagConstructor_TagContainsOnlyPrivateUseWithAdditionalXDash_RedundantXDashRemoved() { var cleaner = new Rfc5646TagCleaner("x-some-x-whatever"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-some-whatever")); }
public void Language_XDashBeforeString_AddsQaa() { var cleaner = new Rfc5646TagCleaner("x-blah"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-blah")); }
public void CompleteTagConstructor_XDashBeforeValidLanguageNameInVariant_NoChange() { var cleaner = new Rfc5646TagCleaner("", "", "", "x-de", ""); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("x-de")); }
void VerifyRfcCleaner(Rfc5646TagCleaner cleaner, string language, string script, string region, string variant, string completeTag) { Assert.That(cleaner.Language, Is.EqualTo(language)); Assert.That(cleaner.Script, Is.EqualTo(script)); Assert.That(cleaner.Region, Is.EqualTo(region)); Assert.That(cleaner.Variant, Is.EqualTo(variant)); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo(completeTag)); }
public void CompleteTagConstructor_LanguageNameWithAudio_GetZxxxAdded() { var cleaner = new Rfc5646TagCleaner("aaa-x-audio"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("aaa-Zxxx-x-audio")); }
public void CompleteTagConstructor_HasLanguageNameAndOtherName_OtherNameMovedToPrivateUse() { var cleaner = new Rfc5646TagCleaner("abc-123"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("abc-x-123")); }
public void CompleteTagConstructor_HasInvalidLanguageName_MovedToPrivateUse() { var cleaner = new Rfc5646TagCleaner("234"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-x-234")); }
public void CompleteTagConstructor_ValidRfctagWithLegacyIso3CodeAndPrivateUse_MigratesToRfc2LetterCodeAndPrivateUse() { var cleaner = new Rfc5646TagCleaner("eng-bogus"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("en-x-bogus")); }
public void CompleteTagConstructor_ValidRfctagWithPrivateUseElements_NoChange() { var cleaner = new Rfc5646TagCleaner("qaa-Zxxx-x-Zxxx-AUDIO"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-Zxxx-x-Zxxx-AUDIO")); // Except, it should have moved things from Language, where the constructor puts them, to the appropriate places. Assert.That(cleaner.Language, Is.EqualTo("qaa")); Assert.That(cleaner.Script, Is.EqualTo("Zxxx")); Assert.That(cleaner.PrivateUse, Is.EqualTo("Zxxx-AUDIO")); }
public void CompleteTagConstructor_PrivateUseWithAudioAndDuplicateX_MakesAudioTag() { var cleaner = new Rfc5646TagCleaner("x-en-Zxxx-x-audio"); cleaner.Clean(); Assert.That(cleaner.GetCompleteTag(), Is.EqualTo("qaa-Zxxx-x-en-Zxxx-audio")); }
// There's some confusion between the Palaso migrator and our version 19 migrator about whether an old language // tag should have multiple X's if it has more than one private-use component. Since such X's are not // significant, ignore them. private bool TryGetNewTag(string oldTag, out string newTag) { var key = RemoveMultipleX(oldTag.ToLowerInvariant()); if (m_tagMap.TryGetValue(key, out newTag)) return !newTag.Equals(oldTag, StringComparison.OrdinalIgnoreCase); var cleaner = new Rfc5646TagCleaner(oldTag); cleaner.Clean(); // FieldWorks needs to handle this special case. if (cleaner.Language.ToLowerInvariant() == "cmn") { var region = cleaner.Region; if (string.IsNullOrEmpty(region)) region = "CN"; cleaner = new Rfc5646TagCleaner("zh", cleaner.Script, region, cleaner.Variant, cleaner.PrivateUse); } newTag = cleaner.GetCompleteTag(); while (m_tagMap.Values.Contains(newTag, StringComparer.OrdinalIgnoreCase)) { // We can't use this tag because it would conflict with what we are mapping something else to. cleaner = new Rfc5646TagCleaner(cleaner.Language, cleaner.Script, cleaner.Region, cleaner.Variant, GetNextDuplPart(cleaner.PrivateUse)); newTag = cleaner.GetCompleteTag(); } m_tagMap[key] = newTag; return !newTag.Equals(oldTag, StringComparison.OrdinalIgnoreCase); }