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 @@
-
+