From dcafca2eed0fd8fc74515e87db5eb037b8993a15 Mon Sep 17 00:00:00 2001 From: Enkidu93 Date: Tue, 21 Jan 2025 16:48:43 -0500 Subject: [PATCH] Add versification table implementation --- .../FileParatextProjectSettingsParser.cs | 2 + .../Corpora/FileVersificationTable.cs | 26 ++++++++ .../ParatextProjectSettingsParserBase.cs | 17 +----- .../Corpora/VersificationTableBase.cs | 61 +++++++++++++++++++ .../ZipParatextProjectSettingsParser.cs | 2 + .../Corpora/ZipVersificationTable.cs | 30 +++++++++ 6 files changed, 122 insertions(+), 16 deletions(-) create mode 100644 src/SIL.Machine/Corpora/FileVersificationTable.cs create mode 100644 src/SIL.Machine/Corpora/VersificationTableBase.cs create mode 100644 src/SIL.Machine/Corpora/ZipVersificationTable.cs diff --git a/src/SIL.Machine/Corpora/FileParatextProjectSettingsParser.cs b/src/SIL.Machine/Corpora/FileParatextProjectSettingsParser.cs index d5331ec33..21495e08b 100644 --- a/src/SIL.Machine/Corpora/FileParatextProjectSettingsParser.cs +++ b/src/SIL.Machine/Corpora/FileParatextProjectSettingsParser.cs @@ -1,5 +1,6 @@ using System.IO; using System.Linq; +using SIL.Scripture; namespace SIL.Machine.Corpora { @@ -10,6 +11,7 @@ public class FileParatextProjectSettingsParser : ParatextProjectSettingsParserBa public FileParatextProjectSettingsParser(string projectDir) { _projectDir = projectDir; + Versification.Table.Implementation = new FileVersificationTable(projectDir); } protected override UsfmStylesheet CreateStylesheet(string fileName) diff --git a/src/SIL.Machine/Corpora/FileVersificationTable.cs b/src/SIL.Machine/Corpora/FileVersificationTable.cs new file mode 100644 index 000000000..6245f306b --- /dev/null +++ b/src/SIL.Machine/Corpora/FileVersificationTable.cs @@ -0,0 +1,26 @@ +using System.IO; + +namespace SIL.Machine.Corpora +{ + public class FileVersificationTable : VersificationTableBase + { + private readonly string _projectDir; + + public FileVersificationTable(string projectDir) + { + _projectDir = projectDir; + } + + protected override string ProjectName => Path.GetFileName(_projectDir); + + protected override bool FileExists(string fileName) + { + return File.Exists(Path.Combine(_projectDir, fileName)); + } + + protected override Stream OpenFile(string fileName) + { + return File.OpenRead(Path.Combine(_projectDir, fileName)); + } + } +} diff --git a/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs b/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs index 99dad1472..77ce8c22c 100644 --- a/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs +++ b/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs @@ -40,22 +40,7 @@ public ParatextProjectSettings Parse() { var guid = (string)settingsDoc.Root.Element("Guid"); string versName = ((ScrVersType)scrVersType).ToString() + "-" + guid; - if (Versification.Table.Implementation.Exists(versName)) - { - versification = new ScrVers(versName); - } - else - { - using (var reader = new StreamReader(Open("custom.vrs"))) - { - versification = Versification.Table.Implementation.Load( - reader, - "custom.vrs", - versification, - versName - ); - } - } + versification = new ScrVers(versName); } var stylesheetFileName = (string)settingsDoc.Root.Element("StyleSheet") ?? "usfm.sty"; diff --git a/src/SIL.Machine/Corpora/VersificationTableBase.cs b/src/SIL.Machine/Corpora/VersificationTableBase.cs new file mode 100644 index 000000000..cc4c09f1b --- /dev/null +++ b/src/SIL.Machine/Corpora/VersificationTableBase.cs @@ -0,0 +1,61 @@ +using System; +using System.IO; +using SIL.Scripture; + +namespace SIL.Machine.Corpora +{ + public abstract class VersificationTableBase : Versification.Table + { + protected abstract string ProjectName { get; } + + protected override Versification Get(string versName) + { + if (!Exists(versName)) + { + LoadVersification(ref versName); + } + + return base.Get(versName); + } + + public override bool VersificationFileExists(string versName) + { + string[] parts = versName.Split(new[] { '-' }, 2); + if (parts.Length == 1) + return base.VersificationFileExists(versName); // Not a custom versification + return FileExists("custom.vrs"); + } + + private void LoadVersification(ref string versName) + { + string[] parts = versName.Split(new[] { '-' }, 2); + if (parts.Length > 1) + { + bool isValidVersType = Enum.TryParse(parts[0], out ScrVersType versType); + if (!isValidVersType || versType == ScrVersType.Unknown) + versType = ScrVersType.English; + + ScrVers baseVers = new ScrVers(versType); + if (!FileExists("custom.vrs")) + { + versName = parts[0]; + } + else + { + using (Stream stream = OpenFile("custom.vrs")) + { + Load( + new StreamReader(stream), + ProjectName != null ? Path.Combine(ProjectName, "custom.vrs") : null, + baseVers, + versName + ); + } + } + } + } + + protected abstract bool FileExists(string fileName); + protected abstract Stream OpenFile(string fileName); + } +} diff --git a/src/SIL.Machine/Corpora/ZipParatextProjectSettingsParser.cs b/src/SIL.Machine/Corpora/ZipParatextProjectSettingsParser.cs index bb2d6c1a5..36f4e9d9d 100644 --- a/src/SIL.Machine/Corpora/ZipParatextProjectSettingsParser.cs +++ b/src/SIL.Machine/Corpora/ZipParatextProjectSettingsParser.cs @@ -1,6 +1,7 @@ using System.IO; using System.IO.Compression; using System.Linq; +using SIL.Scripture; namespace SIL.Machine.Corpora { @@ -11,6 +12,7 @@ public class ZipParatextProjectSettingsParser : ZipParatextProjectSettingsParser public ZipParatextProjectSettingsParser(ZipArchive archive) { _archive = archive; + Versification.Table.Implementation = new ZipVersificationTable(archive); } protected override bool Exists(string fileName) diff --git a/src/SIL.Machine/Corpora/ZipVersificationTable.cs b/src/SIL.Machine/Corpora/ZipVersificationTable.cs new file mode 100644 index 000000000..d6a5351cb --- /dev/null +++ b/src/SIL.Machine/Corpora/ZipVersificationTable.cs @@ -0,0 +1,30 @@ +using System.IO; +using System.IO.Compression; + +namespace SIL.Machine.Corpora +{ + public class ZipVersificationTable : VersificationTableBase + { + private readonly ZipArchive _archive; + + public ZipVersificationTable(ZipArchive archive) + { + _archive = archive; + } + + protected override string ProjectName => null; + + protected override bool FileExists(string fileName) + { + return _archive.GetEntry(fileName) != null; + } + + protected override Stream OpenFile(string fileName) + { + ZipArchiveEntry entry = _archive.GetEntry(fileName); + if (entry == null) + return null; + return entry.Open(); + } + } +}