diff --git a/HaWeb/Models/CollectedItem.cs b/HaWeb/Models/CollectedItem.cs index 1dc04fa..4d43101 100644 --- a/HaWeb/Models/CollectedItem.cs +++ b/HaWeb/Models/CollectedItem.cs @@ -11,6 +11,7 @@ public class CollectedItem : ISearchable { public IDictionary? Fields { get; private set; } public XElement ELement { get; private set; } public IXMLCollection Collection { get; private set; } + public IDictionary? Items { get; set; } public CollectedItem( string index, diff --git a/HaWeb/Models/ItemsCollection.cs b/HaWeb/Models/ItemsCollection.cs index c64ad14..45256fd 100644 --- a/HaWeb/Models/ItemsCollection.cs +++ b/HaWeb/Models/ItemsCollection.cs @@ -39,4 +39,12 @@ public class ItemsCollection { if (Collection.SortingsGeneration != null && this.Items.Any()) this.Sortings = Collection.SortingsGeneration(this.Items.Values.ToList()); } + + public CollectedItem? this[string v] { + get { + if (Items != null && Items.ContainsKey(v)) + return Items[v]; + return null; + } + } } diff --git a/HaWeb/Settings/XMLCollections/BacklinkCollection.cs b/HaWeb/Settings/XMLCollections/BacklinkCollection.cs index bc7d34a..2f7d28b 100644 --- a/HaWeb/Settings/XMLCollections/BacklinkCollection.cs +++ b/HaWeb/Settings/XMLCollections/BacklinkCollection.cs @@ -5,10 +5,10 @@ using System.Xml.Linq; public class BackLinkCollection : HaWeb.XMLParser.IXMLCollection { private static readonly Random _random = new Random(); public string Key { get; } = "backlinks"; - public string[] xPath { get; } = new string[] { "/opus/data/marginalien/marginal/link", "/opus/marginalien/marginal/link" }; + public string[] xPath { get; } = new string[] { "/opus/data/marginalien/marginal/link", "/opus/marginalien/marginal/link" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = null; + public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; public Func, IDictionary>?>? SortingsGeneration { get; } = null; public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; public bool Searchable { get; } = true; @@ -33,8 +33,8 @@ public class BackLinkCollection : HaWeb.XMLParser.IXMLCollection { else res.Add("ref", refere!); res.Add("index", index); res.Add("letter", letter); - if(page != null) res.Add("page", page); - if(line != null) res.Add("line", line); + if (page != null) res.Add("page", page); + if (line != null) res.Add("line", line); return res; } diff --git a/HaWeb/Settings/XMLCollections/CommentCollections.cs b/HaWeb/Settings/XMLCollections/CommentCollections.cs index 4505033..25a7666 100644 --- a/HaWeb/Settings/XMLCollections/CommentCollections.cs +++ b/HaWeb/Settings/XMLCollections/CommentCollections.cs @@ -3,16 +3,8 @@ namespace HaWeb.Settings.XMLCollections; using HaWeb.Models; using System.Xml.Linq; -public class BibleCommentCollection : HaWeb.XMLParser.IXMLCollection { - public string Key { get; } = "bible-comments"; - public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='bibel']/kommentar", "/opus/kommentare/kommcat[@value='bibel']/kommentar" }; - public Func GenerateKey { get; } = GetKey; - public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; - public Func, IDictionary>?>? SortingsGeneration { get; } = null; - public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; - public bool Searchable { get; } = false; +public static class CommentCollectionHelpers { public static Func GetKey { get; } = (elem) => { var index = elem.Attribute("id"); if (index != null && !String.IsNullOrWhiteSpace(index.Value)) @@ -42,119 +34,74 @@ public class BibleCommentCollection : HaWeb.XMLParser.IXMLCollection { } } +public class BibleCommentCollection : HaWeb.XMLParser.IXMLCollection { + public string Key { get; } = "bible-comments"; + public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='bibel']/kommentar", "/opus/kommentare/kommcat[@value='bibel']/kommentar" }; + public Func GenerateKey { get; } = CommentCollectionHelpers.GetKey; + public Func?>? GenerateDataFields { get; } = CommentCollectionHelpers.GetDataFields; + public Func, IDictionary>?>? GroupingsGeneration { get; } = CommentCollectionHelpers.GetLookups; + public Func, IDictionary>?>? SortingsGeneration { get; } = null; + public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; + public bool Searchable { get; } = false; +} + public class EditionCommentCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "edition-comments"; - public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='editionen']/kommentar", "/opus/kommentare/kommcat[@value='editionen']/kommentar" }; - public Func GenerateKey { get; } = GetKey; - public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; + public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='editionen']/kommentar", "/opus/kommentare/kommcat[@value='editionen']/kommentar" }; + public Func GenerateKey { get; } = CommentCollectionHelpers.GetKey; + public Func?>? GenerateDataFields { get; } = CommentCollectionHelpers.GetDataFields; + public Func, IDictionary>?>? GroupingsGeneration { get; } = CommentCollectionHelpers.GetLookups; public Func, IDictionary>?>? SortingsGeneration { get; } = null; public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; public bool Searchable { get; } = true; - - public static Func GetKey { get; } = (elem) => { - var index = elem.Attribute("id"); - if (index != null && !String.IsNullOrWhiteSpace(index.Value)) - return index.Value; - else return null; - }; - - public static IDictionary? GetDataFields(XElement element) { - var res = new Dictionary(); - var lemma = element.Descendants("lemma"); - if (!lemma.Any() || String.IsNullOrWhiteSpace(lemma.First().Value)) return null; - res.Add("lemma", lemma.First().Value); - return res; - } - - public static IDictionary>? GetLookups(IEnumerable items) { - var res = new Dictionary>(); - var lemmas = items.Where(x => !String.IsNullOrWhiteSpace(x.Index)); - if (lemmas != null && lemmas.Any()) - res.Add("lemma", lemmas.ToLookup(x => x.Index.Substring(0, 1).ToUpper())); - // If we use lemmas - // var lemmas = items.Where(x => x.Fields != null && x.Fields.ContainsKey("lemma")); - // if (lemmas != null && lemmas.Any()) - // res.Add("lemma", lemmas.ToLookup(x => x.Fields["lemma"][0].First().ToString())); - if (!res.Any()) return null; - return res; - } } public class RegisterCommentCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "register-comments"; - public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='neuzeit']/kommentar", "/opus/kommentare/kommcat[@value='neuzeit']/kommentar" }; - public Func GenerateKey { get; } = GetKey; - public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; + public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='neuzeit']/kommentar", "/opus/kommentare/kommcat[@value='neuzeit']/kommentar" }; + public Func GenerateKey { get; } = CommentCollectionHelpers.GetKey; + public Func?>? GenerateDataFields { get; } = CommentCollectionHelpers.GetDataFields; + public Func, IDictionary>?>? GroupingsGeneration { get; } = CommentCollectionHelpers.GetLookups; public Func, IDictionary>?>? SortingsGeneration { get; } = null; - public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; + public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = new XMLParser.IXMLCollection[] { new SubCommentCollection() }; public bool Searchable { get; } = true; - - public static Func GetKey { get; } = (elem) => { - var index = elem.Attribute("id"); - if (index != null && !String.IsNullOrWhiteSpace(index.Value)) - return index.Value; - else return null; - }; - - public static IDictionary? GetDataFields(XElement element) { - var res = new Dictionary(); - var lemma = element.Descendants("lemma"); - if (!lemma.Any() || String.IsNullOrWhiteSpace(lemma.First().Value)) return null; - res.Add("lemma", lemma.First().Value); - return res; - } - - public static IDictionary>? GetLookups(IEnumerable items) { - var res = new Dictionary>(); - var lemmas = items.Where(x => !String.IsNullOrWhiteSpace(x.Index)); - if (lemmas != null && lemmas.Any()) - res.Add("lemma", lemmas.ToLookup(x => x.Index.Substring(0, 1).ToUpper())); - // If we use lemmas - // var lemmas = items.Where(x => x.Fields != null && x.Fields.ContainsKey("lemma")); - // if (lemmas != null && lemmas.Any()) - // res.Add("lemma", lemmas.ToLookup(x => x.Fields["lemma"][0].First().ToString())); - if (!res.Any()) return null; - return res; - } } public class ForschungCommentCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "forschung-comments"; - public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='forschung']/kommentar", "/opus/kommentare/kommcat[@value='forschung']/kommentar" }; - public Func GenerateKey { get; } = GetKey; - public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; + public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat[@value='forschung']/kommentar", "/opus/kommentare/kommcat[@value='forschung']/kommentar" }; + public Func GenerateKey { get; } = CommentCollectionHelpers.GetKey; + public Func?>? GenerateDataFields { get; } = CommentCollectionHelpers.GetDataFields; + public Func, IDictionary>?>? GroupingsGeneration { get; } = CommentCollectionHelpers.GetLookups; public Func, IDictionary>?>? SortingsGeneration { get; } = null; public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; public bool Searchable { get; } = true; +} - public static Func GetKey { get; } = (elem) => { - var index = elem.Attribute("id"); - if (index != null && !String.IsNullOrWhiteSpace(index.Value)) - return index.Value; - else return null; - }; + +public class SubCommentCollection : HaWeb.XMLParser.IXMLCollection { + public string Key { get; } = "subcomments"; + public string[] xPath { get; } = new string[] { "/opus/data/kommentare/kommcat/kommentar/subsection", "/opus/kommentare/kommcat/kommentar/subsection" }; + public Func GenerateKey { get; } = CommentCollectionHelpers.GetKey; + public Func?>? GenerateDataFields { get; } = GetDataFields; + public Func, IDictionary>?>? GroupingsGeneration { get; } = CommentCollectionHelpers.GetLookups; + public Func, IDictionary>?>? SortingsGeneration { get; } = null; + public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; + public bool Searchable { get; } = true; public static IDictionary? GetDataFields(XElement element) { var res = new Dictionary(); var lemma = element.Descendants("lemma"); if (!lemma.Any() || String.IsNullOrWhiteSpace(lemma.First().Value)) return null; res.Add("lemma", lemma.First().Value); - return res; - } - - public static IDictionary>? GetLookups(IEnumerable items) { - var res = new Dictionary>(); - var lemmas = items.Where(x => !String.IsNullOrWhiteSpace(x.Index)); - if (lemmas != null && lemmas.Any()) - res.Add("lemma", lemmas.ToLookup(x => x.Index.Substring(0, 1).ToUpper())); - // If we use lemmas - // var lemmas = items.Where(x => x.Fields != null && x.Fields.ContainsKey("lemma")); - // if (lemmas != null && lemmas.Any()) - // res.Add("lemma", lemmas.ToLookup(x => x.Fields["lemma"][0].First().ToString())); - if (!res.Any()) return null; + var comment = element.Ancestors("kommcat").First(); + var type = (string?)comment.Attribute("value"); + if (String.IsNullOrWhiteSpace(type)) return null; + res.Add("type", type); + var parent = element.Ancestors("kommentar").First(); + var parentid = (string?)parent.Attribute("id"); + if (String.IsNullOrWhiteSpace(parentid)) return null; + res.Add("parent", parentid); return res; } } \ No newline at end of file diff --git a/HaWeb/Settings/XMLCollections/EditCollection.cs b/HaWeb/Settings/XMLCollections/EditCollection.cs index 81f80ae..305f410 100644 --- a/HaWeb/Settings/XMLCollections/EditCollection.cs +++ b/HaWeb/Settings/XMLCollections/EditCollection.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; public class EditCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "edits"; - public string[] xPath { get; } = new string[] { "/opus/edits/editreason", "/opus/data/edits/editreason" }; + public string[] xPath { get; } = new string[] { "/opus/edits/editreason", "/opus/data/edits/editreason" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; diff --git a/HaWeb/Settings/XMLCollections/LetterCollection.cs b/HaWeb/Settings/XMLCollections/LetterCollection.cs index 1c39a26..322dbdf 100644 --- a/HaWeb/Settings/XMLCollections/LetterCollection.cs +++ b/HaWeb/Settings/XMLCollections/LetterCollection.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; public class LetterCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "letters"; - public string[] xPath { get; } = new string[] { "/opus/data/document/letterText", "/opus/document/letterText" }; + public string[] xPath { get; } = new string[] { "/opus/data/document/letterText", "/opus/document/letterText" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; diff --git a/HaWeb/Settings/XMLCollections/MarginalCollection.cs b/HaWeb/Settings/XMLCollections/MarginalCollection.cs index e5f7bc3..a57f06f 100644 --- a/HaWeb/Settings/XMLCollections/MarginalCollection.cs +++ b/HaWeb/Settings/XMLCollections/MarginalCollection.cs @@ -4,10 +4,10 @@ using System.Xml.Linq; public class MarginalCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "marginals"; - public string[] xPath { get; } = new string[] { "/opus/data/marginalien/marginal", "/opus/marginalien/marginal" }; + public string[] xPath { get; } = new string[] { "/opus/data/marginalien/marginal", "/opus/marginalien/marginal" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = GetDataFields; - public Func, IDictionary>?>? GroupingsGeneration { get; } = null; + public Func, IDictionary>?>? GroupingsGeneration { get; } = GetLookups; public Func, IDictionary>?>? SortingsGeneration { get; } = null; public HaWeb.XMLParser.IXMLCollection[]? SubCollections { get; } = null; public bool Searchable { get; } = true; diff --git a/HaWeb/Settings/XMLCollections/MetaCollection.cs b/HaWeb/Settings/XMLCollections/MetaCollection.cs index 49c8ba3..3b57535 100644 --- a/HaWeb/Settings/XMLCollections/MetaCollection.cs +++ b/HaWeb/Settings/XMLCollections/MetaCollection.cs @@ -4,7 +4,7 @@ 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 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; @@ -18,4 +18,17 @@ public class MetaCollection : HaWeb.XMLParser.IXMLCollection { return index.Value; return null; }; + + public static IDictionary? GetDataFields(XElement element) { + var res = new Dictionary(); + // TODO + return res; + } + + public static IDictionary>? GetLookups(IEnumerable items) { + var res = new Dictionary>(); + // TODO + + return res; + } } \ No newline at end of file diff --git a/HaWeb/Settings/XMLCollections/ReferenceCollections.cs b/HaWeb/Settings/XMLCollections/ReferenceCollections.cs index f94be4c..e03ea86 100644 --- a/HaWeb/Settings/XMLCollections/ReferenceCollections.cs +++ b/HaWeb/Settings/XMLCollections/ReferenceCollections.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; public class HandPersonCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "handpersons"; - public string[] xPath { get; } = new string[] { "/opus/data/definitions/handDefs/handDef", "/opus/definitions/handDefs/handDef" }; + public string[] xPath { get; } = new string[] { "/opus/data/definitions/handDefs/handDef", "/opus/definitions/handDefs/handDef" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; @@ -22,7 +22,7 @@ public class HandPersonCollection : HaWeb.XMLParser.IXMLCollection { public class PersonCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "persons"; - public string[] xPath { get; } = new string[] { "/opus/data/definitions/personDefs/personDef", "/opus/definitions/personDefs/personDef" }; + public string[] xPath { get; } = new string[] { "/opus/data/definitions/personDefs/personDef", "/opus/definitions/personDefs/personDef" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; @@ -40,7 +40,7 @@ public class PersonCollection : HaWeb.XMLParser.IXMLCollection { public class LocationCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "locations"; - public string[] xPath { get; } = new string[] { "/opus/data/definitions/locationDefs/locationDef", "/opus/definitions/locationDefs/locationDef" }; + public string[] xPath { get; } = new string[] { "/opus/data/definitions/locationDefs/locationDef", "/opus/definitions/locationDefs/locationDef" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; diff --git a/HaWeb/Settings/XMLCollections/TraditionCollection.cs b/HaWeb/Settings/XMLCollections/TraditionCollection.cs index 6886e72..2089be3 100644 --- a/HaWeb/Settings/XMLCollections/TraditionCollection.cs +++ b/HaWeb/Settings/XMLCollections/TraditionCollection.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; public class TraditionCollection : HaWeb.XMLParser.IXMLCollection { public string Key { get; } = "traditions"; - public string[] xPath { get; } = new string[] { "/opus/data/traditions/letterTradition", "/opus/traditions/letterTradition" }; + public string[] xPath { get; } = new string[] { "/opus/data/traditions/letterTradition", "/opus/traditions/letterTradition" }; public Func GenerateKey { get; } = GetKey; public Func?>? GenerateDataFields { get; } = null; public Func, IDictionary>?>? GroupingsGeneration { get; } = null; diff --git a/HaWeb/XMLParser/IXMLCollection.cs b/HaWeb/XMLParser/IXMLCollection.cs index 6fbd4da..4c2aea0 100644 --- a/HaWeb/XMLParser/IXMLCollection.cs +++ b/HaWeb/XMLParser/IXMLCollection.cs @@ -19,6 +19,10 @@ public interface IXMLCollection { abstract Func?>? GenerateDataFields { get; } abstract Func, IDictionary>?>? GroupingsGeneration { get; } abstract Func, IDictionary>?>? SortingsGeneration { get; } + // TODO Not implemented yet abstract IXMLCollection[]? SubCollections { get; } abstract bool Searchable { get; } + + // Override with false if collection should not be read in and available globally (useful for SubCollections) + bool IsGlobal() => true; } \ No newline at end of file diff --git a/HaWeb/XMLParser/XMLService.cs b/HaWeb/XMLParser/XMLService.cs index 3623db5..8c8d764 100644 --- a/HaWeb/XMLParser/XMLService.cs +++ b/HaWeb/XMLParser/XMLService.cs @@ -32,7 +32,7 @@ public class XMLService : IXMLService { collectiontypes.ForEach( x => { if (this._Collections == null) this._Collections = new Dictionary(); var instance = (IXMLCollection)Activator.CreateInstance(x)!; - if (instance != null) this._Collections.Add(instance.Key, instance); + if (instance != null && instance.IsGlobal()) this._Collections.Add(instance.Key, instance); }); if (_Roots == null || !_Roots.Any())