namespace HaWeb.Settings.XMLCollections; using HaWeb.Models; using System.Xml.Linq; public class MetaCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "metas"; public string[] xPath { get; } = new string[] { "/opus/descriptions/letterDesc", "/opus/data/descriptions/letterDesc" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; public Func, IDictionary>?>? SortingsGeneration { get; } = null; public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; public bool Searchable { get; } = false; public static Func GetKey { get; } = (elem) => { var index = elem.Attribute("letter"); if (index != null && !String.IsNullOrWhiteSpace(index.Value)) return index.Value; return null; }; public static IDictionary? GetDataFields(XElement element) { var res = new Dictionary(); var sort = element.Descendants("sort"); if (sort == null || !sort.Any()) return null; var date = (string?)sort.First().Attribute("value"); var order = (string?)sort.First().Attribute("order"); if (String.IsNullOrWhiteSpace(date) || !DateTime.TryParse(date, out var dt)) return null; res.Add("day", dt.Day.ToString()); res.Add("month", dt.Month.ToString()); res.Add("year", dt.Year.ToString()); if (!String.IsNullOrWhiteSpace(order)) res.Add("order", order); else res.Add("order", "0"); return res; } public static IDictionary>? GetLookups(IEnumerable items) { var res = new Dictionary>(); var years = items.Where(x => x["year"] != null); if (years == null || !years.Any()) return null; res.Add("year", years.ToLookup(x => x["year"])!); return res; } }