CreateTree
This commit is contained in:
		| @ -971,7 +971,7 @@ public partial class DlibDotNet | |||||||
|         string file; |         string file; | ||||||
|         List<(long PersonKey, string File)> collection = new(); |         List<(long PersonKey, string File)> collection = new(); | ||||||
|         List<LocationContainer<MetadataExtractor.Directory>> results = new(); |         List<LocationContainer<MetadataExtractor.Directory>> results = new(); | ||||||
|         collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers)); |         collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_Faces.FileNameExtension, _PersonContainers)); | ||||||
|         collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory)); |         collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory)); | ||||||
|         for (int i = 0; i < collection.Count; i++) |         for (int i = 0; i < collection.Count; i++) | ||||||
|         { |         { | ||||||
| @ -1043,6 +1043,66 @@ public partial class DlibDotNet | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void CreateTree(PersonContainer[] personContainers, long ticks, string a2PeopleContentDirectory, Dictionary<long, List<int>> personKeyToIds) | ||||||
|  |     { | ||||||
|  |         string by; | ||||||
|  |         string directory; | ||||||
|  |         string[] matches; | ||||||
|  |         string[] segments; | ||||||
|  |         const int zero = 0; | ||||||
|  |         string[] pGedFiles; | ||||||
|  |         string personKeyFormatted; | ||||||
|  |         List<long> distinct = new(); | ||||||
|  |         PersonBirthday personBirthday; | ||||||
|  |         string rootDirectory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-Tree"); | ||||||
|  |         List<string> lines = new() | ||||||
|  |         { | ||||||
|  |             "0 HEAD", | ||||||
|  |             "1 SOUR DlibDotNet", | ||||||
|  |             $"1 FILE {ticks}", | ||||||
|  |             $"1 DATE {new DateTime(ticks):dd MMM yyyy}", | ||||||
|  |             "1 DEST ANSTFILE", | ||||||
|  |             "1 GEDC", | ||||||
|  |             "2 VERS 5.5.1", | ||||||
|  |             "2 FORM LINEAGE-LINKED", | ||||||
|  |             "1 SUBM @1980-01-17_00@", | ||||||
|  |             "2 NAME Mike Phares Jr", | ||||||
|  |             "1 SUBN", | ||||||
|  |         }; | ||||||
|  |         foreach (PersonContainer personContainer in personContainers) | ||||||
|  |         { | ||||||
|  |             if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || !personContainer.Birthdays.Any()) | ||||||
|  |                 continue; | ||||||
|  |             if (personContainer.DisplayDirectoryName == _Configuration.MappingDefaultName || personContainer.Person.Name.Alias.Value == "Z") | ||||||
|  |                 continue; | ||||||
|  |             if (distinct.Contains(personContainer.Key.Value)) | ||||||
|  |                 continue; | ||||||
|  |             distinct.Add(personContainer.Key.Value); | ||||||
|  |             if (!personKeyToIds.ContainsKey(personContainer.Key.Value)) | ||||||
|  |                 continue; | ||||||
|  |             personBirthday = personContainer.Birthdays[zero]; | ||||||
|  |             personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); | ||||||
|  |             by = Shared.Models.Stateless.Methods.IPersonBirthday.IsCounterPersonBirthday(personBirthday) ? _Configuration.PropertyConfiguration.ResultAllInOne : "People"; | ||||||
|  |             matches = (from l in personContainer.DisplayDirectoryAllFiles where !string.IsNullOrEmpty(personKeyFormatted) && l.Contains(personKeyFormatted) select l).ToArray(); | ||||||
|  |             if (!matches.Any()) | ||||||
|  |                 continue; | ||||||
|  |             pGedFiles = (from l in matches where l.EndsWith(".pged") select l).ToArray(); | ||||||
|  |             if (!pGedFiles.Any()) | ||||||
|  |                 continue; | ||||||
|  |             lines.AddRange(File.ReadAllLines(pGedFiles[0])); | ||||||
|  |             segments = personContainer.DisplayDirectoryName.Split(_Configuration.PersonCharacters.ToArray()); | ||||||
|  |             if (segments.Length < 2) | ||||||
|  |                 directory = Path.Combine(rootDirectory, $"000 {personKeyFormatted} {personContainer.DisplayDirectoryName}"); | ||||||
|  |             else | ||||||
|  |                 directory = Path.Combine(rootDirectory, $"{segments[1].PadLeft(3, '0')} {personKeyFormatted} {personContainer.DisplayDirectoryName}"); | ||||||
|  |             if (Directory.Exists(directory)) | ||||||
|  |                 continue; | ||||||
|  |             _ = Directory.CreateDirectory(directory); | ||||||
|  |         } | ||||||
|  |         lines.Add("0 TRLR"); | ||||||
|  |         File.WriteAllLines(Path.Combine(a2PeopleContentDirectory, $"{ticks}.ged"), lines); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private void Search(long ticks, string argZero, string propertyRoot) |     private void Search(long ticks, string argZero, string propertyRoot) | ||||||
|     { |     { | ||||||
|         int t; |         int t; | ||||||
| @ -1099,8 +1159,10 @@ public partial class DlibDotNet | |||||||
|             propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory); |             propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FileNameExtension, _Configuration.Reverse, aResultsFullGroupDirectory); | ||||||
|         } |         } | ||||||
|         containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers); |         containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers); | ||||||
|         MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, ticks, _PersonContainers, a2PeopleSingletonDirectory, eDistanceContentDirectory); |         MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _PersonContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory); | ||||||
|         personKeyToIds = mapLogic.GetPersonKeyToIds(); |         personKeyToIds = mapLogic.GetPersonKeyToIds(); | ||||||
|  |         if (a2PeopleContentDirectory is not null) | ||||||
|  |             CreateTree(_PersonContainers, ticks, a2PeopleContentDirectory, personKeyToIds); | ||||||
|         fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory); |         fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory); | ||||||
|         Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); |         Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); | ||||||
|         FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers, mapLogic); |         FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, eDistanceContentDirectory, fileNameToCollection, idToLocationContainers, mapLogic); | ||||||
| @ -1113,8 +1175,6 @@ public partial class DlibDotNet | |||||||
|         int totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection); |         int totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection); | ||||||
|         string json = System.Text.Json.JsonSerializer.Serialize(mappingCollection); |         string json = System.Text.Json.JsonSerializer.Serialize(mappingCollection); | ||||||
|         File.WriteAllText(Path.Combine(eDistanceContentDirectory, $"{ticks}.json"), json); |         File.WriteAllText(Path.Combine(eDistanceContentDirectory, $"{ticks}.json"), json); | ||||||
|         if (a2PeopleContentDirectory is not null && false) |  | ||||||
|             mapLogic.CreateTree(ticks, a2PeopleContentDirectory); |  | ||||||
|         foreach (string outputResolution in _Configuration.OutputResolutions) |         foreach (string outputResolution in _Configuration.OutputResolutions) | ||||||
|         { |         { | ||||||
|             if (_PropertyRootExistedBefore || container is not null) |             if (_PropertyRootExistedBefore || container is not null) | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic | |||||||
|     private readonly string _EDistanceContentTicksDirectory; |     private readonly string _EDistanceContentTicksDirectory; | ||||||
|     private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration; |     private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration; | ||||||
|  |  | ||||||
|     public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, long ticks, PersonContainer[] personContainers, string a2PeopleSingletonDirectory, string eDistanceContentDirectory) |     public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, PersonContainer[] personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory) | ||||||
|     { |     { | ||||||
|         _Ticks = ticks; |         _Ticks = ticks; | ||||||
|         _Configuration = configuration; |         _Configuration = configuration; | ||||||
| @ -102,37 +102,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void CreateTree(long ticks, string a2PeopleContentDirectory) |  | ||||||
|     { |  | ||||||
|         if (_Configuration is null) |  | ||||||
|             throw new NullReferenceException(nameof(_Configuration)); |  | ||||||
|         string by; |  | ||||||
|         string directory; |  | ||||||
|         string[] segments; |  | ||||||
|         const int zero = 0; |  | ||||||
|         string personKeyFormatted; |  | ||||||
|         PersonBirthday personBirthday; |  | ||||||
|         string rootDirectory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-Tree"); |  | ||||||
|         foreach (KeyValuePair<long, PersonContainer> personKeyToPersonContainer in _PersonKeyToPersonContainer) |  | ||||||
|         { |  | ||||||
|             if (personKeyToPersonContainer.Value.Key is null || personKeyToPersonContainer.Value.Birthdays is null || !personKeyToPersonContainer.Value.Birthdays.Any()) |  | ||||||
|                 continue; |  | ||||||
|             if (personKeyToPersonContainer.Value.DisplayDirectoryName == _Configuration.MappingDefaultName) |  | ||||||
|                 continue; |  | ||||||
|             personBirthday = personKeyToPersonContainer.Value.Birthdays[zero]; |  | ||||||
|             personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); |  | ||||||
|             by = IPersonBirthday.IsCounterPersonBirthday(personBirthday) ? _PropertyConfiguration.ResultAllInOne : "People"; |  | ||||||
|             segments = personKeyToPersonContainer.Value.DisplayDirectoryName.Split(_Configuration.PersonCharacters.ToArray()); |  | ||||||
|             if (segments.Length < 2) |  | ||||||
|                 directory = Path.Combine(rootDirectory, $"000 {personKeyFormatted} {personKeyToPersonContainer.Value.DisplayDirectoryName}"); |  | ||||||
|             else |  | ||||||
|                 directory = Path.Combine(rootDirectory, $"{segments[1].PadLeft(3, '0')} {personKeyFormatted} {personKeyToPersonContainer.Value.DisplayDirectoryName}"); |  | ||||||
|             if (Directory.Exists(directory)) |  | ||||||
|                 continue; |  | ||||||
|             _ = Directory.CreateDirectory(directory); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Dictionary<long, List<int>> GetPersonKeyToIds() |     public Dictionary<long, List<int>> GetPersonKeyToIds() | ||||||
|     { |     { | ||||||
|         Dictionary<long, List<int>> results = new(); |         Dictionary<long, List<int>> results = new(); | ||||||
|  | |||||||
| @ -172,7 +172,7 @@ internal abstract class MapLogic | |||||||
|                         } |                         } | ||||||
|                         foreach (string file in files) |                         foreach (string file in files) | ||||||
|                         { |                         { | ||||||
|                             if (file.EndsWith(".lnk") || file.EndsWith(".json")) |                             if (file.EndsWith(".lnk")) | ||||||
|                                 continue; |                                 continue; | ||||||
|                             (id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file); |                             (id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file); | ||||||
|                             if (id is null || normalizedRectangle is null) |                             if (id is null || normalizedRectangle is null) | ||||||
| @ -281,7 +281,7 @@ internal abstract class MapLogic | |||||||
|     { |     { | ||||||
|         PersonBirthday? personBirthday; |         PersonBirthday? personBirthday; | ||||||
|         PersonContainer[] distinctPersonContainers; |         PersonContainer[] distinctPersonContainers; | ||||||
|         List<(long, PersonContainer)> collection = GetDistinctCollection(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer); |         (long, PersonContainer)[] collection = GetDistinctCollection(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer); | ||||||
|         foreach ((long personKey, PersonContainer personContainer) in collection) |         foreach ((long personKey, PersonContainer personContainer) in collection) | ||||||
|             personKeyToPersonContainer.Add(personKey, personContainer); |             personKeyToPersonContainer.Add(personKey, personContainer); | ||||||
|         Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenNormalizedRectangleToPersonContainerCollection = new(); |         Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenNormalizedRectangleToPersonContainerCollection = new(); | ||||||
| @ -325,11 +325,12 @@ internal abstract class MapLogic | |||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static List<(long, PersonContainer)> GetDistinctCollection(Configuration configuration, IEnumerable<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer) |     private static (long, PersonContainer)[] GetDistinctCollection(Configuration configuration, IEnumerable<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer) | ||||||
|     { |     { | ||||||
|         List<(long, PersonContainer)> results = new(); |         (long, PersonContainer)[] results; | ||||||
|         const int zero = 0; |         const int zero = 0; | ||||||
|         string newestPersonKeyFormatted; |         string newestPersonKeyFormatted; | ||||||
|  |         List<(long PersonKey, PersonContainer PersonContainer)> collection = new(); | ||||||
|         foreach (PersonContainer personContainer in personContainers) |         foreach (PersonContainer personContainer in personContainers) | ||||||
|         { |         { | ||||||
|             if (personContainer.Key is null) |             if (personContainer.Key is null) | ||||||
| @ -345,8 +346,9 @@ internal abstract class MapLogic | |||||||
|         { |         { | ||||||
|             if (keyValuePair.Value.Count != 1 && (from l in keyValuePair.Value select l.DisplayDirectoryName).Distinct().Count() != 1) |             if (keyValuePair.Value.Count != 1 && (from l in keyValuePair.Value select l.DisplayDirectoryName).Distinct().Count() != 1) | ||||||
|                 throw new NotSupportedException(keyValuePair.Value[zero].DisplayDirectoryName); |                 throw new NotSupportedException(keyValuePair.Value[zero].DisplayDirectoryName); | ||||||
|             results.Add(new(keyValuePair.Key, keyValuePair.Value[zero])); |             collection.Add(new(keyValuePair.Key, keyValuePair.Value[zero])); | ||||||
|         } |         } | ||||||
|  |         results = (from l in collection orderby l.PersonKey descending select (l.PersonKey, l.PersonContainer)).ToArray(); | ||||||
|         return results; |         return results; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -694,7 +696,7 @@ internal abstract class MapLogic | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal static List<(long, string)> GetDisplayDirectoryAllFiles(PersonContainer[] personContainers) |     internal static List<(long, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, PersonContainer[] personContainers) | ||||||
|     { |     { | ||||||
|         List<(long, string)> results = new(); |         List<(long, string)> results = new(); | ||||||
|         List<string> distinct = new(); |         List<string> distinct = new(); | ||||||
| @ -704,7 +706,7 @@ internal abstract class MapLogic | |||||||
|                 continue; |                 continue; | ||||||
|             foreach (string displayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles) |             foreach (string displayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles) | ||||||
|             { |             { | ||||||
|                 if (displayDirectoryAllFile.EndsWith(".json")) |                 if (!displayDirectoryAllFile.EndsWith(fileNameExtension)) | ||||||
|                     continue; |                     continue; | ||||||
|                 if (distinct.Contains(displayDirectoryAllFile)) |                 if (distinct.Contains(displayDirectoryAllFile)) | ||||||
|                     continue; |                     continue; | ||||||
|  | |||||||
| @ -8,10 +8,10 @@ public interface IMapLogic | |||||||
|     static Dictionary<int, List<long>> GetIdToPersonKeys(Dictionary<long, List<int>> personKeyToIds) => |     static Dictionary<int, List<long>> GetIdToPersonKeys(Dictionary<long, List<int>> personKeyToIds) => | ||||||
|         MapLogic.GetIdToPersonKeys(personKeyToIds); |         MapLogic.GetIdToPersonKeys(personKeyToIds); | ||||||
|  |  | ||||||
|     List<(long, string)> TestStatic_GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => |     List<(long, string)> TestStatic_GetDisplayDirectoryAllFiles(string fileNameExtension, Shared.Models.PersonContainer[] personContainers) => | ||||||
|         GetDisplayDirectoryAllFiles(personContainers); |         GetDisplayDirectoryAllFiles(fileNameExtension, personContainers); | ||||||
|     static List<(long, string)> GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => |     static List<(long, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, Shared.Models.PersonContainer[] personContainers) => | ||||||
|         MapLogic.GetDisplayDirectoryAllFiles(personContainers); |         MapLogic.GetDisplayDirectoryAllFiles(fileNameExtension, personContainers); | ||||||
|  |  | ||||||
|     Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(List<Shared.Models.Face> distinctFilteredFaces) => |     Shared.Models.Mapping[] TestStatic_GetSelectedMappingCollection(List<Shared.Models.Face> distinctFilteredFaces) => | ||||||
|         GetSelectedMappingCollection(distinctFilteredFaces); |         GetSelectedMappingCollection(distinctFilteredFaces); | ||||||
|  | |||||||
| @ -13,11 +13,11 @@ public interface IPerson | |||||||
|     Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => |     Models.Person TestStatic_GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => | ||||||
|         GetPerson(personCharacters, personDisplayDirectoryName, personKey, personBirthday); |         GetPerson(personCharacters, personDisplayDirectoryName, personKey, personBirthday); | ||||||
|     static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => |     static Models.Person GetPerson(char[] personCharacters, string personDisplayDirectoryName, long personKey, Models.PersonBirthday personBirthday) => | ||||||
|         Person.GetPerson(personKey, personBirthday, personDisplayDirectoryName.Split(personCharacters)); |         Person.GetPerson(Array.Empty<string>(), null, personKey, personBirthday, personDisplayDirectoryName.Split(personCharacters)); | ||||||
|  |  | ||||||
|     Models.Person TestStatic_GetPerson(long personKey, string[] segments) => |     Models.Person TestStatic_GetPerson(string[] personDisplayDirectoryAllFiles, string personKeyFormatted, long personKey, string[] segments) => | ||||||
|         GetPerson(personKey, segments); |         GetPerson(personDisplayDirectoryAllFiles, personKeyFormatted, personKey, segments); | ||||||
|     static Models.Person GetPerson(long personKey, string[] segments) => |     static Models.Person GetPerson(string[] personDisplayDirectoryAllFiles, string personKeyFormatted, long personKey, string[] segments) => | ||||||
|         Person.GetPerson(personKey, IPersonBirthday.GetPersonBirthday(personKey), segments); |         Person.GetPerson(personDisplayDirectoryAllFiles, personKeyFormatted, personKey, IPersonBirthday.GetPersonBirthday(personKey), segments); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,3 +1,5 @@ | |||||||
|  | using System.Text; | ||||||
|  |  | ||||||
| namespace View_by_Distance.Shared.Models.Stateless.Methods; | namespace View_by_Distance.Shared.Models.Stateless.Methods; | ||||||
|  |  | ||||||
| internal abstract class Person | internal abstract class Person | ||||||
| @ -15,7 +17,42 @@ internal abstract class Person | |||||||
|         return new(personBirthday, personKeyFormatted); |         return new(personBirthday, personKeyFormatted); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal static Models.Person GetPerson(long personKey, Models.PersonBirthday personBirthday, string[] segments) |     private static void WriteGedFile(string? personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName name, string[] matches) | ||||||
|  |     { | ||||||
|  |         string[] pGedFiles = (from l in matches where l.EndsWith(".pged") select l).ToArray(); | ||||||
|  |         if (!pGedFiles.Any()) | ||||||
|  |         { | ||||||
|  |             StringBuilder stringBuilder = new(); | ||||||
|  |             _ = stringBuilder.Append("0 @I").Append(personKeyFormatted).AppendLine("@ INDI"); | ||||||
|  |             _ = stringBuilder.Append("1 NAME ").Append(name.First.Value).Append(" /").Append(name.Last.Value).AppendLine("/"); | ||||||
|  |             if (!string.IsNullOrEmpty(name.First.Value)) | ||||||
|  |                 _ = stringBuilder.Append("2 GIVN ").AppendLine(name.First.Value); | ||||||
|  |             if (!string.IsNullOrEmpty(name.Last.Value)) | ||||||
|  |                 _ = stringBuilder.Append("2 SURN ").AppendLine(name.Last.Value); | ||||||
|  |             if (!string.IsNullOrEmpty(name.Alias.Value)) | ||||||
|  |             { | ||||||
|  |                 _ = stringBuilder.Append("2 NICK ").AppendLine(name.Alias.Value); | ||||||
|  |                 if (name.Alias.Value.Contains(" Jr")) | ||||||
|  |                     _ = stringBuilder.Append("2 NSFX ").AppendLine("Jr"); | ||||||
|  |                 else if (name.Alias.Value.Contains(" Sr")) | ||||||
|  |                     _ = stringBuilder.Append("2 NSFX ").AppendLine("Sr"); | ||||||
|  |             } | ||||||
|  |             _ = stringBuilder.AppendLine("1 SEX U"); | ||||||
|  |             if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday)) | ||||||
|  |             { | ||||||
|  |                 _ = stringBuilder.AppendLine("1 BIRT"); | ||||||
|  |                 _ = stringBuilder.Append("2 DATE ").AppendLine(personBirthday.Value.ToString("dd MMM yyyy")); | ||||||
|  |             } | ||||||
|  |             string? directory = Path.GetDirectoryName(matches[0]); | ||||||
|  |             if (directory is null) | ||||||
|  |                 throw new Exception(); | ||||||
|  |             if (!Directory.Exists(directory)) | ||||||
|  |                 _ = Directory.CreateDirectory(directory); | ||||||
|  |             File.WriteAllText(Path.Combine(directory, $"{personKeyFormatted}.pged"), stringBuilder.ToString()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     internal static Models.Person GetPerson(string[] personDisplayDirectoryAllFiles, string? personKeyFormatted, long personKey, Models.PersonBirthday personBirthday, string[] segments) | ||||||
|     { |     { | ||||||
|         Models.Person result; |         Models.Person result; | ||||||
|         const int zero = 0; |         const int zero = 0; | ||||||
| @ -26,6 +63,9 @@ internal abstract class Person | |||||||
|         List<Models.PersonComment> comments = new(); |         List<Models.PersonComment> comments = new(); | ||||||
|         List<Models.PersonAddress> addresses = new(); |         List<Models.PersonAddress> addresses = new(); | ||||||
|         Models.PersonName name = PersonName.Create(segments[zero]); |         Models.PersonName name = PersonName.Create(segments[zero]); | ||||||
|  |         string[] matches = (from l in personDisplayDirectoryAllFiles where !string.IsNullOrEmpty(personKeyFormatted) && l.Contains(personKeyFormatted) select l).ToArray(); | ||||||
|  |         if (matches.Any()) | ||||||
|  |             WriteGedFile(personKeyFormatted, personBirthday, name, matches); | ||||||
|         result = new(id, personBirthday, name, comments, urls, numbers, emails, addresses); |         result = new(id, personBirthday, name, comments, urls, numbers, emails, addresses); | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ internal abstract class PersonBirthday | |||||||
|     internal static bool IsCounterPersonBirthday(Models.PersonBirthday personBirthday) |     internal static bool IsCounterPersonBirthday(Models.PersonBirthday personBirthday) | ||||||
|     { |     { | ||||||
|         bool result; |         bool result; | ||||||
|         if (personBirthday.Value.Year < 1826) |         if (personBirthday.Value.Year < 1809) | ||||||
|             result = true; |             result = true; | ||||||
|         else |         else | ||||||
|             result = false; |             result = false; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ internal abstract class PersonContainer | |||||||
|             if (personDisplayDirectoryAllFile.EndsWith(".lnk")) |             if (personDisplayDirectoryAllFile.EndsWith(".lnk")) | ||||||
|                 continue; |                 continue; | ||||||
|             (id, normalizedRectangle) = IMapping.GetConverted(facesFileNameExtension, personDisplayDirectoryAllFile); |             (id, normalizedRectangle) = IMapping.GetConverted(facesFileNameExtension, personDisplayDirectoryAllFile); | ||||||
|             if (id is not null && normalizedRectangle is not null && !personDisplayDirectoryAllFile.EndsWith(".json")) |             if (id is not null && normalizedRectangle is not null) | ||||||
|                 continue; |                 continue; | ||||||
|             checkDirectory = Path.GetDirectoryName(personDisplayDirectoryAllFile); |             checkDirectory = Path.GetDirectoryName(personDisplayDirectoryAllFile); | ||||||
|             if (string.IsNullOrEmpty(checkDirectory)) |             if (string.IsNullOrEmpty(checkDirectory)) | ||||||
| @ -55,7 +55,7 @@ internal abstract class PersonContainer | |||||||
|                     continue; |                     continue; | ||||||
|                 personKey = orderedPersonBirthdays[zero].Value.Ticks; |                 personKey = orderedPersonBirthdays[zero].Value.Ticks; | ||||||
|             } |             } | ||||||
|             person = IPerson.GetPerson(personKey, segments); |             person = IPerson.GetPerson(personDisplayDirectoryAllFiles, personKeyFormatted, personKey, segments); | ||||||
|             personContainer = new(approximateYears, @char, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey); |             personContainer = new(approximateYears, @char, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey); | ||||||
|             results.Add(new(personKey, personContainer)); |             results.Add(new(personKey, personContainer)); | ||||||
|         } |         } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user