diff --git a/src/Machine/src/Serval.Machine.Shared/Serval.Machine.Shared.csproj b/src/Machine/src/Serval.Machine.Shared/Serval.Machine.Shared.csproj index db0adca3..bbe2160b 100644 --- a/src/Machine/src/Serval.Machine.Shared/Serval.Machine.Shared.csproj +++ b/src/Machine/src/Serval.Machine.Shared/Serval.Machine.Shared.csproj @@ -38,9 +38,9 @@ - - - + + + diff --git a/src/Serval/src/Serval.Shared/Serval.Shared.csproj b/src/Serval/src/Serval.Shared/Serval.Shared.csproj index ce7e2f04..e2dd6053 100644 --- a/src/Serval/src/Serval.Shared/Serval.Shared.csproj +++ b/src/Serval/src/Serval.Shared/Serval.Shared.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/Serval/src/Serval.Translation/Services/PretranslationService.cs b/src/Serval/src/Serval.Translation/Services/PretranslationService.cs index e75892b9..72a2c65e 100644 --- a/src/Serval/src/Serval.Translation/Services/PretranslationService.cs +++ b/src/Serval/src/Serval.Translation/Services/PretranslationService.cs @@ -139,12 +139,20 @@ PretranslationUsfmMarkerBehavior StyleBehavior .Select(p => ( ScriptureRefs: (IReadOnlyList) - p.Refs.Select(r => ScriptureRef.Parse(r, targetSettings.Versification)).ToArray(), + p.Refs.Select(r => + { + bool parsed = ScriptureRef.TryParse(r, targetSettings.Versification, out ScriptureRef sr); + return new { Parsed = parsed, ScriptureRef = sr }; + }) + .Where(r => r.Parsed) + .Select(r => r.ScriptureRef) + .ToArray(), p, paragraphMarkerBehavior, styleMarkerBehavior ) ) + .Where(p => p.ScriptureRefs.Any()) .OrderBy(p => p.ScriptureRefs[0]); List updateBlockHandlers = []; diff --git a/src/Serval/test/Serval.Translation.Tests/Services/PretranslationServiceTests.cs b/src/Serval/test/Serval.Translation.Tests/Services/PretranslationServiceTests.cs index d71862c3..a84804f3 100644 --- a/src/Serval/test/Serval.Translation.Tests/Services/PretranslationServiceTests.cs +++ b/src/Serval/test/Serval.Translation.Tests/Services/PretranslationServiceTests.cs @@ -362,6 +362,69 @@ public async Task GetUsfmAsync_DenormalizeQuotationMarks() Assert.That(Regex.Matches(usfm, @"\\rem"), Has.Count.EqualTo(2)); } + [Test] + public void GetUsfmAsync_BadPretranslationVerseRef() + { + using TestEnvironment env = new(); + + env.Pretranslations.Replace( + new() + { + Id = "pt1", + EngineRef = "engine1", + ModelRevision = 1, + CorpusRef = "corpus1", + TextId = "MAT", + Refs = ["MAT 1:"], + Translation = "Chapter 1, verse 1. \"Translated new paragraph\"", + SourceTokens = ["SRC", "-", "Chapter", "one", ",", "verse", "one", ".", "new", "paragraph"], + TranslationTokens = + [ + "Chapter", + "1", + ",", + "verse", + "1", + ".", + "\"", + "Translated", + "new", + "paragraph", + "\"" + ], + Alignment = + [ + new() { SourceIndex = 2, TargetIndex = 0 }, + new() { SourceIndex = 3, TargetIndex = 1 }, + new() { SourceIndex = 4, TargetIndex = 2 }, + new() { SourceIndex = 5, TargetIndex = 3 }, + new() { SourceIndex = 6, TargetIndex = 4 }, + new() { SourceIndex = 7, TargetIndex = 5 }, + new() { SourceIndex = 8, TargetIndex = 7 }, + new() { SourceIndex = 8, TargetIndex = 8 }, + new() { SourceIndex = 9, TargetIndex = 9 }, + ] + } + ); + + // Should not crash when parsing "MAT 1:" + Assert.DoesNotThrowAsync(async () => + { + string usfm = await env.Service.GetUsfmAsync( + engineId: "engine1", + modelRevision: 1, + corpusId: "corpus1", + textId: "MAT", + textOrigin: PretranslationUsfmTextOrigin.OnlyPretranslated, + template: PretranslationUsfmTemplate.Source, + paragraphMarkerBehavior: PretranslationUsfmMarkerBehavior.Preserve, + embedBehavior: PretranslationUsfmMarkerBehavior.Preserve, + styleMarkerBehavior: PretranslationUsfmMarkerBehavior.Strip, + quoteNormalizationBehavior: PretranslationNormalizationBehavior.Normalized + ); + }); + } + private class TestEnvironment : IDisposable { public TestEnvironment() diff --git a/src/ServiceToolkit/src/SIL.ServiceToolkit/SIL.ServiceToolkit.csproj b/src/ServiceToolkit/src/SIL.ServiceToolkit/SIL.ServiceToolkit.csproj index c59e38c4..5b94d3d0 100644 --- a/src/ServiceToolkit/src/SIL.ServiceToolkit/SIL.ServiceToolkit.csproj +++ b/src/ServiceToolkit/src/SIL.ServiceToolkit/SIL.ServiceToolkit.csproj @@ -18,7 +18,7 @@ - +