diff --git a/HaWeb/Controllers/BriefeContoller.cs b/HaWeb/Controllers/BriefeContoller.cs index 3107d9d..4aa8efe 100644 --- a/HaWeb/Controllers/BriefeContoller.cs +++ b/HaWeb/Controllers/BriefeContoller.cs @@ -54,9 +54,13 @@ public class Briefecontroller : Controller // Model creation var model = new BriefeViewModel(this.id, index, generateMetaViewModel(meta)); - if (nextmeta != null) model.Next = generateMetaViewModel(nextmeta); - if (prevmeta != null) model.Prev = generateMetaViewModel(prevmeta); - + if (nextmeta != null) model.Next = (generateMetaViewModel(nextmeta), url + nextmeta.Autopsic); + if (prevmeta != null) model.Prev = (generateMetaViewModel(prevmeta), url + prevmeta.Autopsic); + if (hands != null && hands.Any()) model.ParsedHands = HaWeb.HTMLHelpers.BriefeHelpers.CreateHands(_lib, hands); + if (editreasons != null && editreasons.Any()) model.ParsedEdits = HaWeb.HTMLHelpers.BriefeHelpers.CreateEdits(_lib, _readerService, editreasons); + if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) model.ParsedTradition = HaWeb.HTMLHelpers.BriefeHelpers.CreateTraditions(_lib, _readerService, marginals, tradition); + if (text != null && !String.IsNullOrWhiteSpace(text.Element)) + (model.ParsedLineCount, model.ParsedText, model.ParsedMarginals) = HaWeb.HTMLHelpers.BriefeHelpers.CreateLetter(_lib, _readerService, meta, text, marginals); // Return return View(model); @@ -72,7 +76,8 @@ public class Briefecontroller : Controller { var senders = meta.Senders.Select(x => _lib.Persons[x].Name) ?? new List(); var recivers = meta.Receivers.Select(x => _lib.Persons[x].Name) ?? new List(); - return new BriefeMetaViewModel(meta) { + return new BriefeMetaViewModel(meta) + { ParsedSenders = HTMLHelpers.StringHelpers.GetEnumerationString(senders), ParsedReceivers = HTMLHelpers.StringHelpers.GetEnumerationString(recivers) }; diff --git a/HaWeb/HTMLHelpers/BriefeHelper.cs b/HaWeb/HTMLHelpers/BriefeHelper.cs deleted file mode 100644 index 1896d45..0000000 --- a/HaWeb/HTMLHelpers/BriefeHelper.cs +++ /dev/null @@ -1,420 +0,0 @@ -namespace HaWeb.HTMLHelpers; -using HaDocument.Interfaces; -using HaXMLReader.Interfaces; -using HaXMLReader.EvArgs; -using HaDocument.Models; -using System.Text; -using System.Collections.Immutable; -using System.Linq; -using System.Xml.Linq; - -// Type aliasses for incredible long types -using TagFuncList = List<(Func, Action)>; -using TextFuncList = List<(Func, Action)>; -using WhitespaceFuncList = List<(Func, Action)>; - -public class BriefeHelper -{ - // Input - private protected ILibrary Lib; - private protected IReaderService ReaderService; - private protected Meta Meta; - - private protected Letter? Letter; - private protected Tradition? Tradition; - private protected ImmutableList? Hands; - private protected ImmutableList? EditReasons; - private protected ImmutableList? Marginals; - - // State - private protected string currline = "-1"; - private protected string currpage = ""; - private protected string oldpage = ""; - private protected int commid = 1; - private protected bool active_firstedit = true; - private protected bool active_trad = false; - private protected bool active_skipwhitespace = true; - private protected bool active_del = false; - private protected List handstrings = new List(); - - // Parsing-Combinations - private protected StringBuilder sb_lettertext = new StringBuilder(); // Hauptext - private protected StringBuilder sb_linecount = new StringBuilder(); // Linke Spalte (Zeilenzählung) - private protected StringBuilder sb_marginals = new StringBuilder(); // Rechte Spalte (Kommentare) - private protected StringBuilder sb_tradition = new StringBuilder(); // Überlieferung - private protected StringBuilder sb_trad_zhtext = new StringBuilder(); // Überlieferung, ZHText - private protected StringBuilder sb_trad_left = new StringBuilder(); // Überlieferung ZHText linke Spalte (zeilenzählung) - private protected StringBuilder sb_trad_right = new StringBuilder(); // Überlieferung ZHText rechte Spalte (Kommentare) - private protected StringBuilder sb_edits = new StringBuilder(); // Edits - - private protected IReader? rd_lettertext; - private protected IReader? rd_tradition; - - // Parsing Rules - // General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons) - private static readonly TagFuncList OTag_Funcs = new TagFuncList() { - ( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "align center")) ), - ( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "align right")) ), - ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "added")) ), - ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "sal")) ), - ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "aq")) ), - ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "super")) ), - ( ( x, _) => x.Name == "del", (sb, tag, bh) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "del")); - bh.active_del = true; - } ), - ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "nr")) ), - ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "note")) ), - ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ul")) ), - ( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "anchor")) ), - ( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "footnote")) ), - ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "dul")) ), - ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ful")) ), - ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "up")) ), - ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("sub")) ), - ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tul")) ), - ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "header")) ), - ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "lemma")) ), - ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "entry")) ), - ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "title")) ), - ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "bzg")) ), - ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zh")) ), - ( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("em")); } ), - ( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "app")); } ), - ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "subcomment", tag["id"])) ), - ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "comment", tag["id"])) ), - ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "editreason")) ), - ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "letter")) ), - ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "tradition")) ), - ( ( x, _) => x.Name == "marginal", (sb, tag, bh) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "marginal")); - bh.active_skipwhitespace = !bh.active_skipwhitespace; - }), - ( ( x, _) => x.Name == "hand", (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "hand")); - } ), - ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "htable")) ), - ( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "htab htab-" + tag["value"]))) - }; - - public BriefeHelper(ILibrary lib, IReaderService readerService, Meta meta, Letter? letter, Tradition? tradition, ImmutableList? hands, ImmutableList editreasons, ImmutableList marginals) - { - Lib = lib; - ReaderService = readerService; - Letter = letter; - Meta = meta; - Tradition = tradition; - Hands = hands; - EditReasons = editreasons; - Marginals = marginals; - - initState(); - } - - private void initState() - { - rd_lettertext = Letter != null && !String.IsNullOrWhiteSpace(Letter.Element) ? ReaderService.RequestStringReader(Letter.Element) : null; - rd_tradition = Tradition != null && !String.IsNullOrWhiteSpace(Tradition.Element) ? ReaderService.RequestStringReader(Tradition.Element) : null; - if (Meta.ZH != null) - { - currpage = Meta.ZH.Page; - } - if (Hands != null) - { - foreach (var hand in Hands.OrderBy(x => x.StartPage.Length).ThenBy(x => x.StartPage).ThenBy(x => x.StartLine.Length).ThenBy(x => x.StartLine)) - { - var currstring = hand.StartPage + "/" + hand.StartLine; - if (hand.StartPage != hand.EndPage) - { - currstring += "–" + hand.EndPage + "/" + hand.EndLine; - } - else - { - if (hand.StartLine != hand.EndLine) - { - currstring += "–" + hand.EndLine; - } - } - if (Lib.HandPersons.Where(x => x.Key == hand.Person).Any()) - { - currstring += " " + Lib.HandPersons.Where(x => x.Key == hand.Person).FirstOrDefault().Value.Name; - handstrings.Add(currstring); - } - } - } - } - - public void CreateHTML() - { - var CTag_Funcs = new TagFuncList() { - ( ( x, _) => x.Name == "align", (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - } ), - ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "del", (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - active_del = false; - } ), - ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("sub")) ), - ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("em")) ), - ( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ), - ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ), - ( ( x, _) => x.Name == "hand", (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } ) - }; - - var Text_Funcs = new TextFuncList() { - ( ( x, _) => true, ( sb, txt, _) => { - if (active_del) - sb.Append(txt.Value.Replace("–", "")); - else - sb.Append(txt.Value); - } ) - }; - - var Text_Funcs_Tagging = new TextFuncList() { - ( ( _, _) => true, ( sb, txt, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ntext")); - sb.Append(txt.Value); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } ) - }; - - var STag_Funcs = new TagFuncList() { - ( ( x, _) => x.Name == "line", (sb, tag, _) => { - if(currline != "-1") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "ZHBreak")); - if(tag["type"] == "line") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("hr", "lineline")); - } ), - ( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tab-" + tag["tab"])); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } ) - }; - - var Whitespace_Funcs = new WhitespaceFuncList() { - ( ( _, _) => true, ( sb, txt, _) => { - if (active_skipwhitespace) - sb.Append(txt.Value); - else - active_skipwhitespace = !active_skipwhitespace; - }) - }; - - // Rules for the left sidebar - var STag_Funcs_LEFT = new TagFuncList() { - ( ( x, _) => x.Name == "line", (sb, tag, _) => { - if(currline != "-1") { - if (currpage == oldpage) - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", currpage + "-" + currline)); - else { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", oldpage + "-" + currline)); - oldpage = currpage; - } - } - else { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zhpage firstpage", currpage + "-" + tag["index"])); - sb.Append("S." + " "); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - if (tag["index"] != "1") - sb.Append(currpage + " / " + tag["index"]); - else - sb.Append(currpage); - oldpage = currpage; - } - }), - ( ( x, _) => x.Name == "line", (sb, tag, _) => { if(currline != "-1" && Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) { sb.Append(tag["index"]); } } ), - ( ( x, _) => x.Name == "line" && x["index"] == "1" && currline != "-1", (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zhpage", "")); - sb.Append("S. " + currpage); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - }), - ( ( x, _) => x.Name == "line", (sb, tag, _) => { currline = tag["index"]; } ), - ( ( x, _) => x.Name == "page", (sb, tag, _) => { currpage = tag["index"]; } ) - }; - - // Rules for the right sidebar - var STag_Funcs_RIGHT = new TagFuncList() { - ( ( x, _) => x.Name == "line", (sb, tag, _) => { - if(currline != "-1" && Marginals != null) { - var margs = Marginals.Where(x => x.Page == currpage && x.Line == currline); - if (margs != null && margs.Any()) - { - margs = margs.OrderBy(x => Int32.Parse(x.Index)); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commBox", commid.ToString())); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commselector")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("button", "button")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("button")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "comment")); - foreach (var marginal in margs) - { - var rd = ReaderService.RequestStringReader(marginal.Element); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs_Tagging, Whitespace_Funcs); - new HaWeb.HTMLHelpers.LinkHelper(Lib, rd, sb, false); - rd.Read(); - } - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); - } - else - { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "emptyline")); - } - } - commid++; - } - )}; - - // Rules for traditions - var OTag_Funcs_Trad = new TagFuncList() { - ( ( x, _) => x.Name == "app", (sb, tag, _) => { if (!active_firstedit) { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); } else { active_firstedit = false; } } ), - ( ( x, _) => x.Name == "ZHText", (sb, tag, _) => { - sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "row zhtext")); - sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "trad-text col order-2 letterbox")); - sb_trad_left = new StringBuilder(); - sb_trad_right = new StringBuilder(); - currline = "-1"; - currpage = ""; - active_trad = true; - sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "trad-linecount countbox nnumber d-none d-lg-block order-1")); - sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commentColumn trad-comm col-4 d-none d-lg-block order-3")); - sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "emptyline")); - if (rd_tradition != null) { - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_tradition, sb_trad_left, null, STag_Funcs_LEFT); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_tradition, sb_trad_right, null, STag_Funcs_RIGHT); - } - } ) - }; - - var CTag_Funcs_Trad = new TagFuncList() { - ( ( x, _) => x.Name == "ZHText", (sb, tag, _) => { - sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - sb_tradition.Append(sb_trad_left.ToString()); - sb_tradition.Append(sb_trad_right.ToString()); - sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - active_trad = false; - } ) - }; - - var STags_Funcs_TRAD = new TagFuncList() { - ( ( x, _) => x.Name == "line", (sb, tag, _) => { if(currline != "-1" || !active_trad) sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "ZHBreak")); } ), - ( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => { - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tab-" + tag["tab"])); - sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } ) - }; - - // Rules for Edits: - var STags_Funcs_EDIT = new TagFuncList() { - ( ( x, _) => x.Name == "line", (sb, tag, _) => sb.Append(" ") ) - }; - - string HandleEdit(Editreason edit) - { - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "edit")); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "pageline")); - var currstring = edit.StartPage + "/" + edit.StartLine; - if (edit.StartPage != edit.EndPage) - { - currstring += "–" + edit.EndPage + "/" + edit.EndLine; - } - else - { - if (edit.StartLine != edit.EndLine) - { - currstring += "–" + edit.EndLine; - } - } - sb_edits.Append(currstring + " "); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - if (!String.IsNullOrWhiteSpace(edit.Reference)) - { - var sb2 = new StringBuilder(); - sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference")); - var rd = ReaderService.RequestStringReader(edit.Reference); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd, sb2, OTag_Funcs, null, CTag_Funcs, Text_Funcs, Whitespace_Funcs); - rd.Read(); - sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - if ((edit.StartPage != edit.EndPage || edit.StartLine != edit.EndLine) && XElement.Parse(sb2.ToString()).Value.ToString().Length >= 60) - { - var text = XElement.Parse(sb2.ToString()).Value.ToString(); - text = text.ToString().Split(' ').Take(1).First() + " […] " + text.ToString().Split(' ').TakeLast(1).First(); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference")); - sb_edits.Append(text); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } - else - sb_edits.Append(sb2); - } - if (!String.IsNullOrWhiteSpace(edit.Element)) - { - sb_edits.Append(" "); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "corrections")); - var rd = ReaderService.RequestStringReader(edit.Element); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd, sb_edits, OTag_Funcs, STags_Funcs_EDIT, CTag_Funcs, Text_Funcs, Whitespace_Funcs); - rd.Read(); - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); - } - sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); - return sb_edits.ToString(); - } - - // Actual parsing - if (Letter != null && Letter.Element != null && !String.IsNullOrWhiteSpace(Letter.Element) && rd_lettertext != null) - { - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_lettertext, sb_lettertext, OTag_Funcs, STag_Funcs, CTag_Funcs, Text_Funcs, Whitespace_Funcs); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_lettertext, sb_linecount, null, STag_Funcs_LEFT); - - if (Marginals != null && Marginals.Any()) - { - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_lettertext, sb_marginals, null, STag_Funcs_RIGHT); - } - rd_lettertext.Read(); - } - - if (Tradition != null && !String.IsNullOrWhiteSpace(Tradition.Element) && rd_tradition != null) - { - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_tradition, sb_tradition, OTag_Funcs_Trad, null, CTag_Funcs_Trad, null, null); - new HaWeb.HTMLHelpers.GenericXMLHelper(this, rd_tradition, sb_tradition, OTag_Funcs, STags_Funcs_TRAD, CTag_Funcs, Text_Funcs, Whitespace_Funcs); - new HaWeb.HTMLHelpers.LinkHelper(Lib, rd_tradition, sb_tradition); - rd_tradition.Read(); - } - - if (EditReasons != null && EditReasons.Any()) - { - foreach (var edit in EditReasons) - { - HandleEdit(edit); - } - } - } -} \ No newline at end of file diff --git a/HaWeb/HTMLHelpers/BriefeHelpers.cs b/HaWeb/HTMLHelpers/BriefeHelpers.cs new file mode 100644 index 0000000..c1264dc --- /dev/null +++ b/HaWeb/HTMLHelpers/BriefeHelpers.cs @@ -0,0 +1,113 @@ +namespace HaWeb.HTMLHelpers; +using HaDocument.Interfaces; +using HaXMLReader.Interfaces; +using HaXMLReader.EvArgs; +using HaDocument.Models; +using System.Text; +using System.Collections.Immutable; +using System.Linq; +using System.Xml.Linq; + +using HaWeb.Settings.ParsingState; +using HaWeb.Settings.ParsingRules; + +public static class BriefeHelpers +{ + public static (string, string, string) CreateLetter(ILibrary lib, IReaderService readerService, Meta meta, Letter letter, IEnumerable? marginals) + { + var rd = readerService.RequestStringReader(letter.Element); + var letterState = new LetterState(lib, readerService, meta, marginals); + new HaWeb.HTMLParser.XMLHelper(letterState, rd, letterState.sb_lettertext, LetterRules.OTagRules, LetterRules.STagRules, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules); + new HaWeb.HTMLParser.XMLHelper(letterState, rd, letterState.sb_linecount, null, LetterRules.STagRulesLineCount); + + if (marginals != null && marginals.Any()) + { + new HaWeb.HTMLParser.XMLHelper(letterState, rd, letterState.sb_marginals, null, LetterRules.STagRulesMarginals); + } + rd.Read(); + + return (letterState.sb_linecount.ToString(), letterState.sb_lettertext.ToString(), letterState.sb_marginals.ToString()); + } + + public static string CreateTraditions(ILibrary lib, IReaderService readerService, IEnumerable? marginals, Tradition tradition) + { + var rd = readerService.RequestStringReader(tradition.Element); + var traditionState = new TraditionState(lib, rd, marginals); + new HaWeb.HTMLParser.XMLHelper(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRulesInitial, null, TraditionRules.CTagRulesInitial, null, null); + new HaWeb.HTMLParser.XMLHelper(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRules, TraditionRules.STagRulesInitial, TraditionRules.CTagRules, TraditionRules.TextRules, TraditionRules.WhitespaceRules); + new HaWeb.HTMLHelpers.LinkHelper(lib, rd, traditionState.sb_tradition); + rd.Read(); + return traditionState.sb_tradition.ToString(); + } + + public static List CreateEdits(ILibrary lib, IReaderService readerService, IEnumerable editreasons) + { + var editstrings = new List(); + var editsState = new EditState(); + foreach (var edit in editreasons) + { + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "edit")); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "pageline")); + var currstring = edit.StartPage + "/" + edit.StartLine; + if (edit.StartPage != edit.EndPage) + currstring += "–" + edit.EndPage + "/" + edit.EndLine; + else if (edit.StartLine != edit.EndLine) + currstring += "–" + edit.EndLine; + editsState.sb_edits.Append(currstring + " "); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); + if (!String.IsNullOrWhiteSpace(edit.Reference)) + { + var sb2 = new StringBuilder(); + sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference")); + var rd = readerService.RequestStringReader(edit.Reference); + new HaWeb.HTMLParser.XMLHelper(editsState, rd, sb2, EditRules.OTagRules, null, EditRules.CTagRules, EditRules.TextRules, EditRules.WhitespaceRules); + rd.Read(); + sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); + if ((edit.StartPage != edit.EndPage || edit.StartLine != edit.EndLine) && XElement.Parse(sb2.ToString()).Value.ToString().Length >= 60) + { + var text = XElement.Parse(sb2.ToString()).Value.ToString(); + text = text.ToString().Split(' ').Take(1).First() + " […] " + text.ToString().Split(' ').TakeLast(1).First(); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference")); + editsState.sb_edits.Append(text); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); + } + else + editsState.sb_edits.Append(sb2); + } + if (!String.IsNullOrWhiteSpace(edit.Element)) + { + editsState.sb_edits.Append(" "); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "corrections")); + var rd = readerService.RequestStringReader(edit.Element); + new HaWeb.HTMLParser.XMLHelper(editsState, rd, editsState.sb_edits, EditRules.OTagRules, EditRules.STagRules, EditRules.CTagRules, EditRules.TextRules, EditRules.WhitespaceRules); + rd.Read(); + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")); + } + editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")); + editstrings.Add(editsState.sb_edits.ToString()); + editsState.sb_edits.Clear(); + } + return editstrings; + } + + public static List CreateHands(ILibrary lib, ImmutableList hands) + { + var handstrings = new List(); + foreach (var hand in hands.OrderBy(x => x.StartPage.Length).ThenBy(x => x.StartPage).ThenBy(x => x.StartLine.Length).ThenBy(x => x.StartLine)) + { + var currstring = hand.StartPage + "/" + hand.StartLine; + if (hand.StartPage != hand.EndPage) + currstring += "–" + hand.EndPage + "/" + hand.EndLine; + else + if (hand.StartLine != hand.EndLine) + currstring += "–" + hand.EndLine; + var persons = lib.HandPersons.Where(x => x.Key == hand.Person); + if (persons.Any()) + { + currstring += " " + persons.FirstOrDefault().Value.Name; + handstrings.Add(currstring); + } + } + return handstrings; + } +} \ No newline at end of file diff --git a/HaWeb/HTMLHelpers/CommentHelper.cs b/HaWeb/HTMLHelpers/CommentHelper.cs index b4acc9f..1e08ffa 100644 --- a/HaWeb/HTMLHelpers/CommentHelper.cs +++ b/HaWeb/HTMLHelpers/CommentHelper.cs @@ -3,55 +3,24 @@ using HaDocument.Interfaces; using HaXMLReader.Interfaces; using HaXMLReader.EvArgs; using HaDocument.Models; +using HaWeb.Settings.ParsingRules; +using HaWeb.Settings.ParsingState; using System.Text; -// Type aliasses for incredible long types -using TagFuncList = List<(Func, Action)>; -using TextFuncList = List<(Func, Action)>; -using WhitespaceFuncList = List<(Func, Action)>; - public static class CommentHelpers { - private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; - private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS; - private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; private static readonly string BACKLINKSCLASS = HaWeb.Settings.CSSClasses.BACKLINKSCLASS; private static readonly string LETLINKCLASS = HaWeb.Settings.CSSClasses.LETLINKCLASS; private static readonly string COMMENTHEADCLASS = HaWeb.Settings.CSSClasses.COMMENTHEADCLASS; - private static readonly string COMMENTBODYCLASS = HaWeb.Settings.CSSClasses.COMMENTBODYCLASS; private static readonly string BACKLINKSHKBCLASS = HaWeb.Settings.CSSClasses.BACKLINKSHKBCLASS; - - // Parsing Rules - private static readonly TagFuncList _OTagFuncs = new TagFuncList() { - ( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS))), - ( x => x.Name == "title", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS))), - ( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS))) - }; - - private static readonly TagFuncList _CTagFuncs = new TagFuncList() { - ( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), - ( x => x.Name == "title", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), - ( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))) - }; - - private static readonly TagFuncList _STagFuncs = new TagFuncList() { - ( x => x.Name == "line", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement("br")) ) - }; - - private static readonly TextFuncList _TextFuncs = new TextFuncList() { - ( x => true, ( sb, txt ) => sb.Append(txt.Value) ) - }; - - private static readonly WhitespaceFuncList _WhitespaceFuncs = new WhitespaceFuncList() { - ( x => true, ( sb, txt ) => sb.Append(txt.Value) ) - }; public static string CreateHTML(ILibrary lib, IReaderService readerService, Comment comment) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); var rd = readerService.RequestStringReader(comment.Lemma); - new HTMLHelpers.XMLHelper(rd, sb, _OTagFuncs, _STagFuncs, _CTagFuncs, _TextFuncs, _WhitespaceFuncs); + var commentState = new CommentState(); + new HTMLParser.XMLHelper(commentState, rd, sb, CommentRules.OTagRules, CommentRules.STagRules, CommentRules.CTagRules, CommentRules.TextRules, CommentRules.WhitespaceRules); sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTHEADCLASS, comment.Index)); new HTMLHelpers.LinkHelper(lib, rd, sb); rd.Read(); @@ -90,12 +59,10 @@ public static class CommentHelpers sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); } sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); - sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTBODYCLASS)); rd = readerService.RequestStringReader(comment.Entry); - new HTMLHelpers.XMLHelper(rd, sb, _OTagFuncs, _STagFuncs, _CTagFuncs, _TextFuncs, _WhitespaceFuncs); + new HTMLParser.XMLHelper(commentState, rd, sb, CommentRules.OTagRules, CommentRules.STagRules, CommentRules.CTagRules, CommentRules.TextRules, CommentRules.WhitespaceRules); new HTMLHelpers.LinkHelper(lib, rd, sb); rd.Read(); - sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); return sb.ToString(); } } \ No newline at end of file diff --git a/HaWeb/HTMLHelpers/GenericXMLHelper.cs b/HaWeb/HTMLHelpers/GenericXMLHelper.cs deleted file mode 100644 index 4a65aa6..0000000 --- a/HaWeb/HTMLHelpers/GenericXMLHelper.cs +++ /dev/null @@ -1,116 +0,0 @@ -namespace HaWeb.HTMLHelpers; -using HaXMLReader.Interfaces; -using HaXMLReader.EvArgs; -using System.Text; -using System.Collections.Generic; -using System; - -public class GenericXMLHelper -{ - private T _caller; - private IReader _in; - private StringBuilder _target; - private List<(Func, Action)>? _OTag_Funcs; - private List<(Func, Action)>? _STag_Funcs; - private List<(Func, Action)>? _CTag_Funcs; - private List<(Func, Action)>? _Text_Funcs; - private List<(Func, Action)>? _WS_Funcs; - private bool _deleteLeadingWS; - private bool _deleteTrailingWS; - - public GenericXMLHelper( - T caller, - IReader input, - StringBuilder target, - List<(Func, Action)>? OTag_Funcs = null, - List<(Func, Action)>? STag_Funcs = null, - List<(Func, Action)>? CTag_Funcs = null, - List<(Func, Action)>? Text_Funcs = null, - List<(Func, Action)>? WS_Funcs = null, - bool deleteLeadingWS = false, - bool deleteTrailingWS = false - ) - { - if (input == null || target == null || caller == null) throw new ArgumentNullException(); - - _caller = caller; - _in = input; - _target = target; - _deleteLeadingWS = deleteLeadingWS; - _deleteTrailingWS = deleteTrailingWS; - - _OTag_Funcs = OTag_Funcs; - _STag_Funcs = STag_Funcs; - _CTag_Funcs = CTag_Funcs; - _Text_Funcs = Text_Funcs; - _WS_Funcs = WS_Funcs; - - if (_OTag_Funcs != null) - _in.OpenTag += OnOTag; - if (_STag_Funcs != null) - _in.SingleTag += OnSTag; - if (_CTag_Funcs != null) - _in.CloseTag += OnCTag; - if (_Text_Funcs != null) - _in.Text += OnText; - if (_WS_Funcs != null) - _in.Whitespace += OnWS; - } - - void OnOTag(object _, Tag tag) - { - if (_OTag_Funcs != null) - foreach (var entry in _OTag_Funcs) - if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller); - } - - void OnText(object _, Text text) - { - if (_deleteLeadingWS) text.Value = text.Value.TrimStart(); - if (_deleteTrailingWS) text.Value = text.Value.TrimEnd(); - foreach (var entry in _Text_Funcs) - if (entry.Item1(text, _caller)) entry.Item2(_target, text, _caller); - } - - void OnSTag(object _, Tag tag) - { - foreach (var entry in _STag_Funcs) - if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller); - } - - void OnCTag(object _, Tag tag) - { - foreach (var entry in _CTag_Funcs) - if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller); - } - - void OnWS(object _, Whitespace ws) - { - foreach (var entry in _WS_Funcs) - { - if (entry.Item1(ws, _caller)) entry.Item2(_target, ws, _caller); - } - } - - internal void Dispose() - { - if (_in != null) - { - if (_OTag_Funcs != null) - _in.OpenTag -= OnOTag; - if (_STag_Funcs != null) - _in.SingleTag -= OnSTag; - if (_CTag_Funcs != null) - _in.CloseTag -= OnCTag; - if (_Text_Funcs != null) - _in.Text -= OnText; - if (_WS_Funcs != null) - _in.Whitespace -= OnWS; - } - } - - ~GenericXMLHelper() - { - Dispose(); - } -} diff --git a/HaWeb/HTMLHelpers/LinkHelper.cs b/HaWeb/HTMLHelpers/LinkHelper.cs index 2ccf3db..17ad629 100644 --- a/HaWeb/HTMLHelpers/LinkHelper.cs +++ b/HaWeb/HTMLHelpers/LinkHelper.cs @@ -7,12 +7,8 @@ using HaXMLReader.Interfaces; using HaXMLReader.EvArgs; using HaXMLReader; using System.Collections.Generic; - -// Type aliasses for incredible long types -using TagFuncList = List<(Func, Action)>; -using TextFuncList = List<(Func, Action)>; -using WhitespaceFuncList = List<(Func, Action)>; - +using HaWeb.Settings.ParsingRules; +using HaWeb.Settings.ParsingState; public class LinkHelper { private ILibrary _lib; @@ -26,25 +22,6 @@ public class LinkHelper { private static readonly string LETLINKCLASS = HaWeb.Settings.CSSClasses.LETLINKCLASS; private static readonly string REFLINKCLASS = HaWeb.Settings.CSSClasses.REFLINKCLASS; private static readonly string WWWLINKCLASS = HaWeb.Settings.CSSClasses.WWWLINKCLASS; - private static readonly string INSERTEDLEMMACLASS = HaWeb.Settings.CSSClasses.INSERTEDLEMMACLASS; - private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; - - // Parsing Rules for inserting lemmas - private static readonly TagFuncList OTag_Funcs = new TagFuncList() { - ( x => x.Name == "lemma", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, INSERTEDLEMMACLASS)) ), - ( x => x.Name == "titel", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ), - ( x => x.Name == "title", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ) - }; - - private static readonly TagFuncList CTag_Funcs = new TagFuncList() { - ( x => x.Name == "lemma", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), - ( x => x.Name == "titel", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), - ( x => x.Name == "title", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT)) ) - }; - - private static readonly TextFuncList Text_Funcs = new TextFuncList() { - ( x => true, (strbd, txt) => strbd.Append(txt.Value)) - }; public LinkHelper(ILibrary lib, IReader reader, StringBuilder stringBuilder, bool followlinksinchildren = true, bool followlinksinthis = true) { if (lib == null || reader == null || stringBuilder == null) throw new ArgumentNullException(); @@ -119,10 +96,11 @@ public class LinkHelper { private string GetLemmaString(Tag tag, Comment comment) { if (!tag.Values.ContainsKey("linktext") || tag.Values["linktext"] == "true") { + var linkState = new LinkState(); var sb = new StringBuilder(); var subreader = new UTF8StringReader(comment.Lemma); new LinkHelper(_lib, subreader, sb, _followlinksinchildren, _followlinksinchildren); - new XMLHelper(subreader, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs, null); + new HTMLParser.XMLHelper(linkState, subreader, sb, LinkRules.OTagRules, null, LinkRules.CTagRules, LinkRules.TextRules, null); subreader.Read(); return sb.ToString(); } diff --git a/HaWeb/HTMLHelpers/XMLHelper.cs b/HaWeb/HTMLHelpers/XMLHelper.cs deleted file mode 100644 index 91dcf2f..0000000 --- a/HaWeb/HTMLHelpers/XMLHelper.cs +++ /dev/null @@ -1,113 +0,0 @@ -namespace HaWeb.HTMLHelpers; -using HaXMLReader.Interfaces; -using HaXMLReader.EvArgs; -using System.Text; -using System.Collections.Generic; -using System; - -public class XMLHelper -{ - private IReader _in; - private StringBuilder _target; - private List<(Func, Action)>? _OTag_Funcs; - private List<(Func, Action)>? _STag_Funcs; - private List<(Func, Action)>? _CTag_Funcs; - private List<(Func, Action)>? _Text_Funcs; - private List<(Func, Action)>? _WS_Funcs; - private bool _deleteLeadingWS; - private bool _deleteTrailingWS; - - public XMLHelper( - IReader input, - StringBuilder target, - List<(Func, Action)>? OTag_Funcs = null, - List<(Func, Action)>? STag_Funcs = null, - List<(Func, Action)>? CTag_Funcs = null, - List<(Func, Action)>? Text_Funcs = null, - List<(Func, Action)>? WS_Funcs = null, - bool deleteLeadingWS = false, - bool deleteTrailingWS = false - ) - { - if (input == null || target == null ) throw new ArgumentNullException(); - - _in = input; - _target = target; - _deleteLeadingWS = deleteLeadingWS; - _deleteTrailingWS = deleteTrailingWS; - - _OTag_Funcs = OTag_Funcs; - _STag_Funcs = STag_Funcs; - _CTag_Funcs = CTag_Funcs; - _Text_Funcs = Text_Funcs; - _WS_Funcs = WS_Funcs; - - if (_OTag_Funcs != null) - _in.OpenTag += OnOTag; - if (_STag_Funcs != null) - _in.SingleTag += OnSTag; - if (_CTag_Funcs != null) - _in.CloseTag += OnCTag; - if (_Text_Funcs != null) - _in.Text += OnText; - if (_WS_Funcs != null) - _in.Whitespace += OnWS; - } - - void OnOTag(object _, Tag tag) - { - if (_OTag_Funcs != null) - foreach (var entry in _OTag_Funcs) - if (entry.Item1(tag)) entry.Item2(_target, tag); - } - - void OnText(object _, Text text) - { - if (_deleteLeadingWS) text.Value = text.Value.TrimStart(); - if (_deleteTrailingWS) text.Value = text.Value.TrimEnd(); - foreach (var entry in _Text_Funcs) - if (entry.Item1(text)) entry.Item2(_target, text); - } - - void OnSTag(object _, Tag tag) - { - foreach (var entry in _STag_Funcs) - if (entry.Item1(tag)) entry.Item2(_target, tag); - } - - void OnCTag(object _, Tag tag) - { - foreach (var entry in _CTag_Funcs) - if (entry.Item1(tag)) entry.Item2(_target, tag); - } - - void OnWS(object _, Whitespace ws) - { - foreach (var entry in _WS_Funcs) - { - if (entry.Item1(ws)) entry.Item2(_target, ws); - } - } - - internal void Dispose() - { - if (_in != null) - { - if (_OTag_Funcs != null) - _in.OpenTag -= OnOTag; - if (_STag_Funcs != null) - _in.SingleTag -= OnSTag; - if (_CTag_Funcs != null) - _in.CloseTag -= OnCTag; - if (_Text_Funcs != null) - _in.Text -= OnText; - if (_WS_Funcs != null) - _in.Whitespace -= OnWS; - } - } - - ~XMLHelper() - { - Dispose(); - } -} diff --git a/HaWeb/HTMLParser/IRules.cs b/HaWeb/HTMLParser/IRules.cs new file mode 100644 index 0000000..a3e5cca --- /dev/null +++ b/HaWeb/HTMLParser/IRules.cs @@ -0,0 +1 @@ +// TODO: maybe implement, so XMLHelper gets the IRULE signature instead of giving all Lists on a per list basis. \ No newline at end of file diff --git a/HaWeb/HTMLParser/IState.cs b/HaWeb/HTMLParser/IState.cs new file mode 100644 index 0000000..9a799d6 --- /dev/null +++ b/HaWeb/HTMLParser/IState.cs @@ -0,0 +1,5 @@ +namespace HaWeb.HTMLParser; + +public interface IState { + public void SetupState(); +} \ No newline at end of file diff --git a/HaWeb/HTMLParser/Parser.cs b/HaWeb/HTMLParser/Parser.cs new file mode 100644 index 0000000..55519f8 --- /dev/null +++ b/HaWeb/HTMLParser/Parser.cs @@ -0,0 +1,5 @@ +namespace HaWeb.HTMLParser; + +class GenericParser where T : IState { + +} \ No newline at end of file diff --git a/HaWeb/HTMLParser/XMLHelper.cs b/HaWeb/HTMLParser/XMLHelper.cs new file mode 100644 index 0000000..9727064 --- /dev/null +++ b/HaWeb/HTMLParser/XMLHelper.cs @@ -0,0 +1,136 @@ +namespace HaWeb.HTMLParser; +using HaXMLReader.Interfaces; +using HaXMLReader.EvArgs; +using System.Text; +using System.Collections.Generic; +using System; + +public class XMLHelper where T : IState +{ + private IReader _in; + private StringBuilder _target; + private List<(Func, bool>, Action>)>? _OTag_Funcs; + private List<(Func, bool>, Action>)>? _STag_Funcs; + private List<(Func, bool>, Action>)>? _CTag_Funcs; + private List<(Func, bool>, Action>)>? _Text_Funcs; + private List<(Func, bool>, Action>)>? _WS_Funcs; + private bool _deleteLeadingWS; + private bool _deleteTrailingWS; + + public T State; + public Stack OpenTags; + public Dictionary> LastSingleTags; + public StringBuilder LastText; + + public XMLHelper( + T state, + IReader input, + StringBuilder target, + List<(Func, bool>, Action>)>? OTag_Funcs = null, + List<(Func, bool>, Action>)>? STag_Funcs = null, + List<(Func, bool>, Action>)>? CTag_Funcs = null, + List<(Func, bool>, Action>)>? Text_Funcs = null, + List<(Func, bool>, Action>)>? WS_Funcs = null, + bool deleteLeadingWS = false, + bool deleteTrailingWS = false + ) + { + if (input == null || target == null || state == null) throw new ArgumentNullException(); + + State = state; + _in = input; + _target = target; + _deleteLeadingWS = deleteLeadingWS; + _deleteTrailingWS = deleteTrailingWS; + + _OTag_Funcs = OTag_Funcs; + _STag_Funcs = STag_Funcs; + _CTag_Funcs = CTag_Funcs; + _Text_Funcs = Text_Funcs; + _WS_Funcs = WS_Funcs; + + OpenTags = new Stack(); + LastSingleTags = new Dictionary>(); + LastText = new StringBuilder(); + + if (_OTag_Funcs != null) + _in.OpenTag += OnOTag; + if (_STag_Funcs != null) + _in.SingleTag += OnSTag; + if (_CTag_Funcs != null) + _in.CloseTag += OnCTag; + if (_Text_Funcs != null) + _in.Text += OnText; + if (_WS_Funcs != null) + _in.Whitespace += OnWS; + } + + void OnOTag(object _, Tag tag) + { + OpenTags.Push(tag); + if (_OTag_Funcs != null) + foreach (var entry in _OTag_Funcs) + if (entry.Item1(tag, this)) entry.Item2(_target, tag, this); + } + + void OnText(object _, Text text) + { + if (_deleteLeadingWS) text.Value = text.Value.TrimStart(); + if (_deleteTrailingWS) text.Value = text.Value.TrimEnd(); + LastText.Append(text.Value); + if (_Text_Funcs != null) + foreach (var entry in _Text_Funcs) + if (entry.Item1(text, this)) entry.Item2(_target, text, this); + } + + void OnSTag(object _, Tag tag) + { + if (!LastSingleTags.ContainsKey(tag.Name)) + LastSingleTags.Add(tag.Name, new List()); + LastSingleTags[tag.Name].Add(tag); + if (_STag_Funcs != null) + foreach (var entry in _STag_Funcs) + if (entry.Item1(tag, this)) entry.Item2(_target, tag, this); + } + + void OnCTag(object _, Tag tag) + { + OpenTags.Pop(); + if(_CTag_Funcs != null) + foreach (var entry in _CTag_Funcs) + if (entry.Item1(tag, this)) entry.Item2(_target, tag, this); + } + + void OnWS(object _, Whitespace ws) + { + LastText.Append(ws.Value); + if (_WS_Funcs != null) + foreach (var entry in _WS_Funcs) + if (entry.Item1(ws, this)) entry.Item2(_target, ws, this); + } + + internal void Dispose() + { + OpenTags = null; + LastSingleTags = null; + LastText = null; + if (_in != null) + { + if (_OTag_Funcs != null) + _in.OpenTag -= OnOTag; + if (_STag_Funcs != null) + _in.SingleTag -= OnSTag; + if (_CTag_Funcs != null) + _in.CloseTag -= OnCTag; + if (_Text_Funcs != null) + _in.Text -= OnText; + if (_WS_Funcs != null) + _in.Whitespace -= OnWS; + } + } + + ~XMLHelper() + { + Dispose(); + } +} diff --git a/HaWeb/Models/BriefeViewModel.cs b/HaWeb/Models/BriefeViewModel.cs index 9ec12b8..bcdb3ec 100644 --- a/HaWeb/Models/BriefeViewModel.cs +++ b/HaWeb/Models/BriefeViewModel.cs @@ -10,10 +10,11 @@ public class BriefeViewModel public string? ParsedLineCount { get; set; } public string? ParsedMarginals { get; set; } public string? ParsedTradition { get; set; } - public string? ParsedEdits { get; set; } + public List? ParsedEdits { get; set; } + public List? ParsedHands { get; set; } - public BriefeMetaViewModel? Next { get; set; } - public BriefeMetaViewModel? Prev { get; set; } + public (BriefeMetaViewModel, string)? Next { get; set; } + public (BriefeMetaViewModel, string)? Prev { get; set; } public BriefeViewModel(string id, string index, BriefeMetaViewModel meta) { diff --git a/HaWeb/Settings/CSSClassesSettings.cs b/HaWeb/Settings/CSSClassesSettings.cs index 59ab30e..fb6d4c3 100644 --- a/HaWeb/Settings/CSSClassesSettings.cs +++ b/HaWeb/Settings/CSSClassesSettings.cs @@ -2,19 +2,72 @@ namespace HaWeb.Settings; public static class CSSClasses { // Classes generated by parsing the XML: - public const string LEMMACLASS = "ha-lemma"; // XML: + // Root elements + // TODO We dont parse all the root elements, so , etc. as of right now + public const string COMMENTCLASS = "ha-comment"; // XML: + public const string EDITREASONCLASS = "ha-editreason"; // XML: + public const string SUBSECTIONCLASS = "ha-subsection"; // XML: + public const string TRADITIONCLASS = "ha-tradition"; // XML: + public const string MARGINALCLASS = "ha-marginal"; // XML: + public const string LETTERCLASS = "ha-lettertext"; // XML: + + // Comments: + public const string LEMMACLASS = "ha-lemma"; // XML: public const string TITLECLASS = "ha-title"; // XML: + public const string ENTRYCLASS = "ha-entry"; // XML: <eintrag> public const string BACKLINKSCLASS = "ha-letlinks"; // Collection containing links to references in letters public const string BACKLINKSHKBCLASS = "ha-hkb"; // HKB-Text infront of l;ink collection public const string COMMENTHEADCLASS = "ha-commenthead"; // Head of a comment, containing lemma and backlinks - public const string COMMENTBODYCLASS = "ha-commentbody"; // Body of a comment, contasining the text + // Links: public const string LETLINKCLASS = "ha-letlink"; // XML: <link> public const string REFLINKCLASS = "ha-reflink"; // XML <intlink> public const string WWWLINKCLASS = "ha-wwwlink"; // XML: <wwwlink> - public const string INSERTEDLEMMACLASS = "ha-insertedlemma"; // XML <link linktext="true"></link> - + + // Hauptsächlich Brieftext: + public const string ALIGNCENTERCLASS = "ha-aligncenter"; // XML: <align pos = center> + public const string ALIGNRIGHTCLASS = "ha-alignright"; // XML: <align pos = rigth> + public const string ADDEDCLASS = "ha-added"; // XML: <added> + public const string SALCLASS = "ha-sal"; // XML: <sal> + public const string AQCLASS = "ha-aq"; // XML: <aq> + public const string SUPERCLASS = "ha-super"; // XML: <super> + public const string DELCLASS = "ha-del"; // XML: <del> + public const string NRCLASS = "ha-nr"; // XML: + public const string NOTECLASS = "ha-note"; // XML: + public const string ULCLASS = "ha-ul"; // XML: + public const string ANCHORCLASS = "ha-anchor"; // XML: + public const string FNCLASS = "ha-fn"; // XML: + public const string DULCLASS = "ha-dul"; // XML: + public const string FULCLASS = "ha-ful"; // XML: + public const string UPCLASS = "ha-up"; // XML: + public const string SUBCLASS = "ha-sub"; // XML: + public const string TULCLASS = "ha-tul"; // XML: + public const string HEADERCLASS = "ha-textheader"; // XML: + public const string HANDCLASS = "ha-hand"; + public const string TABLECLASS = "ha-table"; + public const string TABCLASS = "ha-hatab-"; // TODO: GEN + public const string CROSSEDDASHCLASS = "ha-diagdel"; + public const string TEXTCLASS = "ha-text"; + + public const string BZGCLASS = "ha-bzg"; + public const string ZHCLASS = "ha-zh"; + public const string EMPHCLASS = "ha-emph"; + public const string APPCLASS = "ha-app"; + public const string MARGINGALBOXCLASS = "ha-marginalbox"; + + public const string TRADLINECOUNTCLASS = "ha-tradlinecount"; + public const string TRADCOMMENTCOLUMNCLASS = "ha-tradcommentcolumn"; + public const string TRADZHTEXTCLASS = "ha-tradzhtext"; + public const string TRADZHTEXTBOXCLASS = "ha-tradtextbox"; + + // Zeilen: + public const string ZHBREAKCLASS = "ha-zhbreak"; + public const string LINELINECLASS = "ha-hr"; + public const string LINEINDENTCLASS = "ha-indent-"; // TODO: GEN + public const string ZHPAGECLASS = "ha-zhpage"; + public const string FIRSTPAGECLASS = "ha-firstpage"; + public const string EMPTYLINECLASS = "ha-emptyline"; // TODO Classes used in Razor Pages: @@ -22,4 +75,6 @@ public static class CSSClasses { // TODO Classes used in Javascript: // TODO IDs used by JavaScript: + + } \ No newline at end of file diff --git a/HaWeb/Settings/HaDocumentSettings.cs b/HaWeb/Settings/HaDocumentSettings.cs new file mode 100644 index 0000000..0ffdd02 --- /dev/null +++ b/HaWeb/Settings/HaDocumentSettings.cs @@ -0,0 +1 @@ +// TODO \ No newline at end of file diff --git a/HaWeb/Settings/ParsingRules/CommentRules.cs b/HaWeb/Settings/ParsingRules/CommentRules.cs new file mode 100644 index 0000000..3afcbf5 --- /dev/null +++ b/HaWeb/Settings/ParsingRules/CommentRules.cs @@ -0,0 +1,39 @@ +namespace HaWeb.Settings.ParsingRules; +using System.Text; + +using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>>)>; +using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>>)>; +using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.CommentState>>)>; + +public static class CommentRules { + private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; + private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS; + private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; + private static readonly string ENTRYCLASS = HaWeb.Settings.CSSClasses.ENTRYCLASS; + + public static readonly TagFuncList OTagRules = new TagFuncList() { + ( (x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS))), + ( (x, _) => x.Name == "title", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS))), + ( (x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS))), + ( (x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ENTRYCLASS))), + }; + + public static readonly TagFuncList CTagRules = new TagFuncList() { + ( (x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), + ( (x, _) => x.Name == "title", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), + ( (x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), + ( (x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))), + }; + + public static readonly TagFuncList STagRules = new TagFuncList() { + ( (x, _) => x.Name == "line", (sb, tag, _) => sb.Append(HTMLHelpers.TagHelpers.CreateElement("br")) ) + }; + + public static readonly TextFuncList TextRules = new TextFuncList() { + ( (x, _) => true, ( sb, txt, _) => sb.Append(txt.Value) ) + }; + + public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() { + ( (x, _) => true, ( sb, txt, _) => sb.Append(txt.Value) ) + }; +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingRules/EditRules.cs b/HaWeb/Settings/ParsingRules/EditRules.cs new file mode 100644 index 0000000..eb143e8 --- /dev/null +++ b/HaWeb/Settings/ParsingRules/EditRules.cs @@ -0,0 +1,164 @@ +namespace HaWeb.Settings.ParsingRules; +using System.Text; + +using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>>)>; +using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>>)>; +using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.EditState>>)>; + +public static class EditRules { + private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; + + private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS; + private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; + private static readonly string ENTRYCLASS = HaWeb.Settings.CSSClasses.ENTRYCLASS; + + private static readonly string ALIGNCENTERCLASS = HaWeb.Settings.CSSClasses.ALIGNCENTERCLASS; + private static readonly string ALIGNRIGHTCLASS = HaWeb.Settings.CSSClasses.ALIGNRIGHTCLASS; + private static readonly string ADDEDCLASS = HaWeb.Settings.CSSClasses.ADDEDCLASS; + private static readonly string SALCLASS = HaWeb.Settings.CSSClasses.SALCLASS; + private static readonly string AQCLASS = HaWeb.Settings.CSSClasses.AQCLASS; + private static readonly string SUPERCLASS = HaWeb.Settings.CSSClasses.SUPERCLASS; + private static readonly string DELCLASS = HaWeb.Settings.CSSClasses.DELCLASS; + private static readonly string NRCLASS = HaWeb.Settings.CSSClasses.NRCLASS; + private static readonly string NOTECLASS = HaWeb.Settings.CSSClasses.NOTECLASS; + private static readonly string ULCLASS = HaWeb.Settings.CSSClasses.ULCLASS; + private static readonly string ANCHORCLASS = HaWeb.Settings.CSSClasses.ANCHORCLASS; + private static readonly string FNCLASS = HaWeb.Settings.CSSClasses.FNCLASS; + private static readonly string DULCLASS = HaWeb.Settings.CSSClasses.DULCLASS; + private static readonly string FULCLASS = HaWeb.Settings.CSSClasses.FULCLASS; + private static readonly string UPCLASS = HaWeb.Settings.CSSClasses.UPCLASS; + private static readonly string SUBCLASS = HaWeb.Settings.CSSClasses.SUBCLASS; + private static readonly string TULCLASS = HaWeb.Settings.CSSClasses.TULCLASS; + private static readonly string HEADERCLASS = HaWeb.Settings.CSSClasses.HEADERCLASS; + private static readonly string HANDCLASS = HaWeb.Settings.CSSClasses.HANDCLASS; + private static readonly string TABLECLASS = HaWeb.Settings.CSSClasses.TABLECLASS; + private static readonly string TABCLASS = HaWeb.Settings.CSSClasses.TABCLASS; + private static readonly string CROSSEDDASHCLASS = HaWeb.Settings.CSSClasses.CROSSEDDASHCLASS; + private static readonly string TEXTCLASS = HaWeb.Settings.CSSClasses.TEXTCLASS; + + private static readonly string BZGCLASS = HaWeb.Settings.CSSClasses.BZGCLASS; + private static readonly string ZHCLASS = HaWeb.Settings.CSSClasses.ZHCLASS; + private static readonly string EMPHCLASS = HaWeb.Settings.CSSClasses.EMPHCLASS; + private static readonly string APPCLASS = HaWeb.Settings.CSSClasses.APPCLASS; + private static readonly string MARGINGALBOXCLASS = HaWeb.Settings.CSSClasses.MARGINGALBOXCLASS; + + // Zeilen: + private static readonly string ZHBREAKCLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string LINELINECLASS = HaWeb.Settings.CSSClasses.LINELINECLASS; + private static readonly string LINEINDENTCLASS = HaWeb.Settings.CSSClasses.LINEINDENTCLASS; + private static readonly string ZHPAGECLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string FIRSTPAGECLASS = HaWeb.Settings.CSSClasses.FIRSTPAGECLASS; + private static readonly string EMPTYLINECLASS = HaWeb.Settings.CSSClasses.EMPTYLINECLASS; + + // Root-Elemente + private static readonly string COMMENTCLASS = HaWeb.Settings.CSSClasses.COMMENTCLASS; + private static readonly string EDITREASONCLASS = HaWeb.Settings.CSSClasses.EDITREASONCLASS; + private static readonly string SUBSECTIONCLASS = HaWeb.Settings.CSSClasses.SUBSECTIONCLASS; + private static readonly string TRADITIONCLASS = HaWeb.Settings.CSSClasses.TRADITIONCLASS; + private static readonly string MARGINALCLASS = HaWeb.Settings.CSSClasses.MARGINALCLASS; + private static readonly string LETTERCLASS = HaWeb.Settings.CSSClasses.LETTERCLASS; + + public static readonly TagFuncList OTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS)) ), + ( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNRIGHTCLASS)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ADDEDCLASS)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, AQCLASS)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUPERCLASS)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "del")); + reader.State.active_del = true; + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NOTECLASS)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ULCLASS)) ), + ( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ANCHORCLASS)) ), + ( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FNCLASS)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DULCLASS)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FULCLASS)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, UPCLASS)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBCLASS)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TULCLASS)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HEADERCLASS)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ENTRYCLASS)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, BZGCLASS)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHCLASS)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EMPHCLASS)); } ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, APPCLASS)); } ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBSECTIONCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EDITREASONCLASS)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LETTERCLASS)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TRADITIONCLASS)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS)); + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + }), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDCLASS)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS)) ), + ( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]))) + }; + + public static readonly TagFuncList CTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.active_del = false; // TODO SMTH IS FISHY HERE! + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ) + }; + + public static readonly TextFuncList TextRules = new TextFuncList() { + ( ( x, _) => true, (sb, txt, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TEXTCLASS)); + if (reader.State.active_del) + sb.Append(txt.Value.Replace("–", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\">–</" + DEFAULTELEMENT + ">")); + else + sb.Append(txt.Value); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; + + public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() { + ( ( _, _) => true, ( sb, txt, reader) => { + if (reader.State.active_skipwhitespace) + sb.Append(txt.Value); + else + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + })}; + + public static readonly TagFuncList STagRules = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, _) => sb.Append(" ") ) + }; +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingRules/LetterRules.cs b/HaWeb/Settings/ParsingRules/LetterRules.cs new file mode 100644 index 0000000..016300c --- /dev/null +++ b/HaWeb/Settings/ParsingRules/LetterRules.cs @@ -0,0 +1,233 @@ +namespace HaWeb.Settings.ParsingRules; +using System.Text; + +using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>; +using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>; +using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>; + +public class LetterRules +{ + private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; + + private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS; + private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; + private static readonly string ENTRYCLASS = HaWeb.Settings.CSSClasses.ENTRYCLASS; + + private static readonly string ALIGNCENTERCLASS = HaWeb.Settings.CSSClasses.ALIGNCENTERCLASS; + private static readonly string ALIGNRIGHTCLASS = HaWeb.Settings.CSSClasses.ALIGNRIGHTCLASS; + private static readonly string ADDEDCLASS = HaWeb.Settings.CSSClasses.ADDEDCLASS; + private static readonly string SALCLASS = HaWeb.Settings.CSSClasses.SALCLASS; + private static readonly string AQCLASS = HaWeb.Settings.CSSClasses.AQCLASS; + private static readonly string SUPERCLASS = HaWeb.Settings.CSSClasses.SUPERCLASS; + private static readonly string DELCLASS = HaWeb.Settings.CSSClasses.DELCLASS; + private static readonly string NRCLASS = HaWeb.Settings.CSSClasses.NRCLASS; + private static readonly string NOTECLASS = HaWeb.Settings.CSSClasses.NOTECLASS; + private static readonly string ULCLASS = HaWeb.Settings.CSSClasses.ULCLASS; + private static readonly string ANCHORCLASS = HaWeb.Settings.CSSClasses.ANCHORCLASS; + private static readonly string FNCLASS = HaWeb.Settings.CSSClasses.FNCLASS; + private static readonly string DULCLASS = HaWeb.Settings.CSSClasses.DULCLASS; + private static readonly string FULCLASS = HaWeb.Settings.CSSClasses.FULCLASS; + private static readonly string UPCLASS = HaWeb.Settings.CSSClasses.UPCLASS; + private static readonly string SUBCLASS = HaWeb.Settings.CSSClasses.SUBCLASS; + private static readonly string TULCLASS = HaWeb.Settings.CSSClasses.TULCLASS; + private static readonly string HEADERCLASS = HaWeb.Settings.CSSClasses.HEADERCLASS; + private static readonly string HANDCLASS = HaWeb.Settings.CSSClasses.HANDCLASS; + private static readonly string TABLECLASS = HaWeb.Settings.CSSClasses.TABLECLASS; + private static readonly string TABCLASS = HaWeb.Settings.CSSClasses.TABCLASS; + private static readonly string CROSSEDDASHCLASS = HaWeb.Settings.CSSClasses.CROSSEDDASHCLASS; + private static readonly string TEXTCLASS = HaWeb.Settings.CSSClasses.TEXTCLASS; + + private static readonly string BZGCLASS = HaWeb.Settings.CSSClasses.BZGCLASS; + private static readonly string ZHCLASS = HaWeb.Settings.CSSClasses.ZHCLASS; + private static readonly string EMPHCLASS = HaWeb.Settings.CSSClasses.EMPHCLASS; + private static readonly string APPCLASS = HaWeb.Settings.CSSClasses.APPCLASS; + private static readonly string MARGINGALBOXCLASS = HaWeb.Settings.CSSClasses.MARGINGALBOXCLASS; + + // Zeilen: + private static readonly string ZHBREAKCLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string LINELINECLASS = HaWeb.Settings.CSSClasses.LINELINECLASS; + private static readonly string LINEINDENTCLASS = HaWeb.Settings.CSSClasses.LINEINDENTCLASS; + private static readonly string ZHPAGECLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string FIRSTPAGECLASS = HaWeb.Settings.CSSClasses.FIRSTPAGECLASS; + private static readonly string EMPTYLINECLASS = HaWeb.Settings.CSSClasses.EMPTYLINECLASS; + + // Root-Elemente + private static readonly string COMMENTCLASS = HaWeb.Settings.CSSClasses.COMMENTCLASS; + private static readonly string EDITREASONCLASS = HaWeb.Settings.CSSClasses.EDITREASONCLASS; + private static readonly string SUBSECTIONCLASS = HaWeb.Settings.CSSClasses.SUBSECTIONCLASS; + private static readonly string TRADITIONCLASS = HaWeb.Settings.CSSClasses.TRADITIONCLASS; + private static readonly string MARGINALCLASS = HaWeb.Settings.CSSClasses.MARGINALCLASS; + private static readonly string LETTERCLASS = HaWeb.Settings.CSSClasses.LETTERCLASS; + + // Parsing Rules for Letters + // General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons) + public static readonly TagFuncList OTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS)) ), + ( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNRIGHTCLASS)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ADDEDCLASS)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, AQCLASS)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUPERCLASS)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "del")); + reader.State.active_del = true; + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NOTECLASS)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ULCLASS)) ), + ( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ANCHORCLASS)) ), + ( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FNCLASS)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DULCLASS)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FULCLASS)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, UPCLASS)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBCLASS)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TULCLASS)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HEADERCLASS)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ENTRYCLASS)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, BZGCLASS)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHCLASS)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EMPHCLASS)); } ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, APPCLASS)); } ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBSECTIONCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EDITREASONCLASS)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LETTERCLASS)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TRADITIONCLASS)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS)); + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + }), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDCLASS)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS)) ), + ( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]))) + }; + + public static readonly TagFuncList CTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.active_del = false; // TODO SMTH IS FISHY HERE! + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ) + }; + + public static readonly TextFuncList TextRules = new TextFuncList() { + ( ( x, _) => true, (sb, txt, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TEXTCLASS)); + if (reader.State.active_del) + sb.Append(txt.Value.Replace("–", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\">–</" + DEFAULTELEMENT + ">")); + else + sb.Append(txt.Value); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; + + public static readonly TagFuncList STagRules = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS)); + if(tag["type"] == "line") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS)); + } ), + ( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINEINDENTCLASS + tag["tab"])); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; + + public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() { + ( ( _, _) => true, ( sb, txt, reader) => { + if (reader.State.active_skipwhitespace) + sb.Append(txt.Value); + else + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + })}; + + // Rules for the left sidebar + public static readonly TagFuncList STagRulesLineCount = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1") { + if (reader.State.currpage == reader.State.oldpage) + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", reader.State.currpage + "-" + reader.State.currline)); + else { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", reader.State.oldpage + "-" + reader.State.currline)); + reader.State.oldpage = reader.State.currpage; + } + } + else { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS + " " + FIRSTPAGECLASS, reader.State.currpage + "-" + tag["index"])); + sb.Append("S." + " "); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + if (tag["index"] != "1") + sb.Append(reader.State.currpage + " / " + tag["index"]); + else + sb.Append(reader.State.currpage); + reader.State.oldpage = reader.State.currpage; + } + }), + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1" && Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) + sb.Append(tag["index"]); + }), + ( ( x, reader) => x.Name == "line" && x["index"] == "1" && reader.State.currline != "-1", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS, "")); + sb.Append("S. " + reader.State.currpage); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + }), + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { reader.State.currline = tag["index"]; } ), + ( ( x, _) => x.Name == "page", (sb, tag, reader) => { reader.State.currpage = tag["index"]; } ) + }; + + // Rules for the right sidebar + public static readonly TagFuncList STagRulesMarginals = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1" && reader.State.Marginals != null) { + var margs = reader.State.Marginals.Where(x => x.Page == reader.State.currpage && x.Line == reader.State.currline); + if (margs != null && margs.Any()) + { + margs = margs.OrderBy(x => Int32.Parse(x.Index)); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINGALBOXCLASS, reader.State.commid.ToString())); + foreach (var marginal in margs) + { + var rd = reader.State.ReaderService.RequestStringReader(marginal.Element); + new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>(reader.State, rd, sb, LetterRules.OTagRules, null, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules); + new HaWeb.HTMLHelpers.LinkHelper(reader.State.Lib, rd, sb, false); + rd.Read(); + } + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); + } + else + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", EMPTYLINECLASS)); + } + reader.State.commid++; + })}; +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingRules/LinkRules.cs b/HaWeb/Settings/ParsingRules/LinkRules.cs new file mode 100644 index 0000000..d5128d3 --- /dev/null +++ b/HaWeb/Settings/ParsingRules/LinkRules.cs @@ -0,0 +1,29 @@ +namespace HaWeb.Settings.ParsingRules; +using System.Text; + +using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>>)>; +using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>>)>; +using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LinkState>>)>; + +public static class LinkRules { + private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; + private static readonly string INSERTEDLEMMACLASS = HaWeb.Settings.CSSClasses.INSERTEDLEMMACLASS; + private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; + + // Parsing Rules for inserting lemmas + public static readonly TagFuncList OTagRules = new TagFuncList() { + ( (x, _) => x.Name == "lemma", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, INSERTEDLEMMACLASS)) ), + ( (x, _) => x.Name == "titel", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ), + ( (x, _) => x.Name == "title", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ) + }; + + public static readonly TagFuncList CTagRules = new TagFuncList() { + ( (x, _) => x.Name == "lemma", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( (x, _) => x.Name == "titel", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( (x, _) => x.Name == "title", (strbd, _, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT)) ) + }; + + public static readonly TextFuncList TextRules = new TextFuncList() { + ( (x, _) => true, (strbd, txt, _) => strbd.Append(txt.Value)) + }; +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingRules/TraditionRules.cs b/HaWeb/Settings/ParsingRules/TraditionRules.cs new file mode 100644 index 0000000..9f27f5a --- /dev/null +++ b/HaWeb/Settings/ParsingRules/TraditionRules.cs @@ -0,0 +1,286 @@ +namespace HaWeb.Settings.ParsingRules; +using System.Text; + +using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>; +using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>; +using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>; + +public static class TraditionRules +{ + private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT; + + private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS; + private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS; + private static readonly string ENTRYCLASS = HaWeb.Settings.CSSClasses.ENTRYCLASS; + + private static readonly string ALIGNCENTERCLASS = HaWeb.Settings.CSSClasses.ALIGNCENTERCLASS; + private static readonly string ALIGNRIGHTCLASS = HaWeb.Settings.CSSClasses.ALIGNRIGHTCLASS; + private static readonly string ADDEDCLASS = HaWeb.Settings.CSSClasses.ADDEDCLASS; + private static readonly string SALCLASS = HaWeb.Settings.CSSClasses.SALCLASS; + private static readonly string AQCLASS = HaWeb.Settings.CSSClasses.AQCLASS; + private static readonly string SUPERCLASS = HaWeb.Settings.CSSClasses.SUPERCLASS; + private static readonly string DELCLASS = HaWeb.Settings.CSSClasses.DELCLASS; + private static readonly string NRCLASS = HaWeb.Settings.CSSClasses.NRCLASS; + private static readonly string NOTECLASS = HaWeb.Settings.CSSClasses.NOTECLASS; + private static readonly string ULCLASS = HaWeb.Settings.CSSClasses.ULCLASS; + private static readonly string ANCHORCLASS = HaWeb.Settings.CSSClasses.ANCHORCLASS; + private static readonly string FNCLASS = HaWeb.Settings.CSSClasses.FNCLASS; + private static readonly string DULCLASS = HaWeb.Settings.CSSClasses.DULCLASS; + private static readonly string FULCLASS = HaWeb.Settings.CSSClasses.FULCLASS; + private static readonly string UPCLASS = HaWeb.Settings.CSSClasses.UPCLASS; + private static readonly string SUBCLASS = HaWeb.Settings.CSSClasses.SUBCLASS; + private static readonly string TULCLASS = HaWeb.Settings.CSSClasses.TULCLASS; + private static readonly string HEADERCLASS = HaWeb.Settings.CSSClasses.HEADERCLASS; + private static readonly string HANDCLASS = HaWeb.Settings.CSSClasses.HANDCLASS; + private static readonly string TABLECLASS = HaWeb.Settings.CSSClasses.TABLECLASS; + private static readonly string TABCLASS = HaWeb.Settings.CSSClasses.TABCLASS; + private static readonly string CROSSEDDASHCLASS = HaWeb.Settings.CSSClasses.CROSSEDDASHCLASS; + private static readonly string TEXTCLASS = HaWeb.Settings.CSSClasses.TEXTCLASS; + + private static readonly string BZGCLASS = HaWeb.Settings.CSSClasses.BZGCLASS; + private static readonly string ZHCLASS = HaWeb.Settings.CSSClasses.ZHCLASS; + private static readonly string EMPHCLASS = HaWeb.Settings.CSSClasses.EMPHCLASS; + private static readonly string APPCLASS = HaWeb.Settings.CSSClasses.APPCLASS; + private static readonly string MARGINGALBOXCLASS = HaWeb.Settings.CSSClasses.MARGINGALBOXCLASS; + + // Zeilen: + private static readonly string ZHBREAKCLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string LINELINECLASS = HaWeb.Settings.CSSClasses.LINELINECLASS; + private static readonly string LINEINDENTCLASS = HaWeb.Settings.CSSClasses.LINEINDENTCLASS; + private static readonly string ZHPAGECLASS = HaWeb.Settings.CSSClasses.ZHBREAKCLASS; + private static readonly string FIRSTPAGECLASS = HaWeb.Settings.CSSClasses.FIRSTPAGECLASS; + private static readonly string EMPTYLINECLASS = HaWeb.Settings.CSSClasses.EMPTYLINECLASS; + + // Root-Elemente + private static readonly string COMMENTCLASS = HaWeb.Settings.CSSClasses.COMMENTCLASS; + private static readonly string EDITREASONCLASS = HaWeb.Settings.CSSClasses.EDITREASONCLASS; + private static readonly string SUBSECTIONCLASS = HaWeb.Settings.CSSClasses.SUBSECTIONCLASS; + private static readonly string TRADITIONCLASS = HaWeb.Settings.CSSClasses.TRADITIONCLASS; + private static readonly string MARGINALCLASS = HaWeb.Settings.CSSClasses.MARGINALCLASS; + private static readonly string LETTERCLASS = HaWeb.Settings.CSSClasses.LETTERCLASS; + + // Tradition-spezifische Elemente + public static readonly string TRADLINECOUNTCLASS = HaWeb.Settings.CSSClasses.TRADLINECOUNTCLASS; + public static readonly string TRADCOMMENTCOLUMNCLASS = HaWeb.Settings.CSSClasses.TRADCOMMENTCOLUMNCLASS; + public static readonly string TRADZHTEXTCLASS = HaWeb.Settings.CSSClasses.TRADZHTEXTCLASS; + public static readonly string TRADZHTEXTBOXCLASS = HaWeb.Settings.CSSClasses.TRADZHTEXTBOXCLASS; + + // Parsing Rules for Letters + // General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons) + public static readonly TagFuncList OTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS)) ), + ( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNRIGHTCLASS)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ADDEDCLASS)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, AQCLASS)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUPERCLASS)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "del")); + reader.State.active_del = true; + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NOTECLASS)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ULCLASS)) ), + ( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ANCHORCLASS)) ), + ( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FNCLASS)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DULCLASS)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, FULCLASS)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, UPCLASS)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBCLASS)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TULCLASS)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HEADERCLASS)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ENTRYCLASS)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, BZGCLASS)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHCLASS)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EMPHCLASS)); } ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, APPCLASS)); } ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBSECTIONCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTCLASS, tag["id"])) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EDITREASONCLASS)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LETTERCLASS)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TRADITIONCLASS)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS)); + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + }), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDCLASS)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS)) ), + ( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]))) + }; + + public static readonly TagFuncList CTagRules = new TagFuncList() { + ( ( x, _) => x.Name == "align", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "del", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.active_del = false; // TODO SMTH IS FISHY HERE! + }), + ( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ), + ( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ) + }; + + public static readonly TextFuncList TextRules = new TextFuncList() { + ( ( x, _) => true, (sb, txt, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TEXTCLASS)); + if (reader.State.active_del) + sb.Append(txt.Value.Replace("–", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\">–</" + DEFAULTELEMENT + ">")); + else + sb.Append(txt.Value); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; + + public static readonly TagFuncList STagRules = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS)); + if(tag["type"] == "line") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS)); + } ), + ( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINEINDENTCLASS + tag["tab"])); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; + + public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() { + ( ( _, _) => true, ( sb, txt, reader) => { + if (reader.State.active_skipwhitespace) + sb.Append(txt.Value); + else + reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; + })}; + + + // Rules for the left sidebar + public static readonly TagFuncList STagRulesLineCount = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1") { + if (reader.State.currpage == reader.State.oldpage) + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", reader.State.currpage + "-" + reader.State.currline)); + else { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", reader.State.oldpage + "-" + reader.State.currline)); + reader.State.oldpage = reader.State.currpage; + } + } + else { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS + " " + FIRSTPAGECLASS, reader.State.currpage + "-" + tag["index"])); + sb.Append("S." + " "); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + if (tag["index"] != "1") + sb.Append(reader.State.currpage + " / " + tag["index"]); + else + sb.Append(reader.State.currpage); + reader.State.oldpage = reader.State.currpage; + } + }), + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1" && Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) + sb.Append(tag["index"]); + }), + ( ( x, reader) => x.Name == "line" && x["index"] == "1" && reader.State.currline != "-1", (sb, tag, reader) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS, "")); + sb.Append("S. " + reader.State.currpage); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + }), + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { reader.State.currline = tag["index"]; } ), + ( ( x, _) => x.Name == "page", (sb, tag, reader) => { reader.State.currpage = tag["index"]; } ) + }; + + + // Rules for the right sidebar + public static readonly TagFuncList STagRulesMarginals = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1" && reader.State.Marginals != null) { + var margs = reader.State.Marginals.Where(x => x.Page == reader.State.currpage && x.Line == reader.State.currline); + if (margs != null && margs.Any()) + { + margs = margs.OrderBy(x => Int32.Parse(x.Index)); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINGALBOXCLASS, reader.State.commid.ToString())); + foreach (var marginal in margs) + { + var rd = reader.State.ReaderService.RequestStringReader(marginal.Element); + new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>(reader.State, rd, sb, TraditionRules.OTagRules, null, TraditionRules.CTagRules, TraditionRules.TextRules, TraditionRules.WhitespaceRules); + new HaWeb.HTMLHelpers.LinkHelper(reader.State.Lib, rd, sb, false); + rd.Read(); + } + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); + } + else + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", EMPTYLINECLASS)); + } + reader.State.commid++; + })}; + + public static readonly TagFuncList OTagRulesInitial = new TagFuncList() { + ( ( x, _) => x.Name == "app", (sb, tag, reader) => { + if (!reader.State.active_firstedit) + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); + else + reader.State.active_firstedit = false; + }), + ( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => { + reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "row zhtext")); + reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "trad-text col order-2 letterbox")); + reader.State.sb_trad_left = new StringBuilder(); + reader.State.sb_trad_right = new StringBuilder(); + reader.State.currline = "-1"; + reader.State.currpage = ""; + reader.State.active_trad = true; + reader.State.sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "trad-linecount countbox nnumber d-none d-lg-block order-1")); + reader.State.sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, "commentColumn trad-comm col-4 d-none d-lg-block order-3")); + reader.State.sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", EMPTYLINECLASS)); + if (reader.State.rd_tradition != null) { + new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>(reader.State, reader.State.rd_tradition, reader.State.sb_trad_left, null, TraditionRules.STagRulesLineCount); + new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>(reader.State, reader.State.rd_tradition, reader.State.sb_trad_right, null, TraditionRules.STagRulesMarginals); + } + })}; + + public static readonly TagFuncList CTagRulesInitial = new TagFuncList() { + ( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => { + reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.sb_tradition.Append(reader.State.sb_trad_left.ToString()); + reader.State.sb_tradition.Append(reader.State.sb_trad_right.ToString()); + reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + reader.State.active_trad = false; + })}; + + public static readonly TagFuncList STagRulesInitial = new TagFuncList() { + ( ( x, _) => x.Name == "line", (sb, tag, reader) => { + if(reader.State.currline != "-1" || !reader.State.active_trad) + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS)); + }), + ( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => { + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["tab"])); + sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); + })}; +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingState/CommentState.cs b/HaWeb/Settings/ParsingState/CommentState.cs new file mode 100644 index 0000000..bdb93ad --- /dev/null +++ b/HaWeb/Settings/ParsingState/CommentState.cs @@ -0,0 +1,6 @@ +namespace HaWeb.Settings.ParsingState; +using System.Text; + +public class CommentState : HaWeb.HTMLParser.IState { + public void SetupState() { } +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingState/EditState.cs b/HaWeb/Settings/ParsingState/EditState.cs new file mode 100644 index 0000000..7107f2f --- /dev/null +++ b/HaWeb/Settings/ParsingState/EditState.cs @@ -0,0 +1,19 @@ +namespace HaWeb.Settings.ParsingState; +using System.Text; + +public class EditState : HaWeb.HTMLParser.IState { + internal bool active_del; + internal bool active_skipwhitespace; + + internal StringBuilder sb_edits; + + public EditState() { + SetupState(); + } + + public void SetupState() { + sb_edits = new StringBuilder(); + active_del = false; + active_skipwhitespace = true; + } +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingState/LetterState.cs b/HaWeb/Settings/ParsingState/LetterState.cs new file mode 100644 index 0000000..da7acb4 --- /dev/null +++ b/HaWeb/Settings/ParsingState/LetterState.cs @@ -0,0 +1,60 @@ +namespace HaWeb.Settings.ParsingState; + +using HaDocument.Interfaces; +using HaXMLReader.Interfaces; +using HaXMLReader.EvArgs; +using HaDocument.Models; +using System.Text; +using System.Collections.Immutable; +using System.Linq; +using System.Xml.Linq; + +public class LetterState : HaWeb.HTMLParser.IState { + // Input + internal ILibrary Lib; + internal IReaderService ReaderService; + internal Meta Meta; + + internal IEnumerable<Marginal>? Marginals; + + // State + internal bool active_del; + internal bool active_skipwhitespace; + internal string currline; + internal string currpage; + internal string oldpage; + internal int commid; + + // Parsing-Combinations + internal StringBuilder sb_lettertext; // Hauptext + internal StringBuilder sb_linecount; // Linke Spalte (Zeilenzählung) + internal StringBuilder sb_marginals; // Rechte Spalte (Kommentare) + + + public LetterState(ILibrary lib, IReaderService readerService, Meta meta, IEnumerable<Marginal>? marginals) { + Lib = lib; + ReaderService = readerService; + Meta = meta; + Marginals = marginals; + + SetupState(); + } + + + public void SetupState() { + sb_lettertext = new StringBuilder(); + sb_linecount = new StringBuilder(); + sb_marginals = new StringBuilder(); + + active_skipwhitespace = true; + currline = "-1"; + currpage = ""; + oldpage = ""; + commid = 1; + + // Initialize State + if (Meta.ZH != null) { + currpage = Meta.ZH.Page; + } + } +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingState/LinkState.cs b/HaWeb/Settings/ParsingState/LinkState.cs new file mode 100644 index 0000000..9dc16a8 --- /dev/null +++ b/HaWeb/Settings/ParsingState/LinkState.cs @@ -0,0 +1,6 @@ +namespace HaWeb.Settings.ParsingState; +using System.Text; + +public class LinkState : HaWeb.HTMLParser.IState { + public void SetupState() { } +} \ No newline at end of file diff --git a/HaWeb/Settings/ParsingState/TraditionState.cs b/HaWeb/Settings/ParsingState/TraditionState.cs new file mode 100644 index 0000000..efb38d1 --- /dev/null +++ b/HaWeb/Settings/ParsingState/TraditionState.cs @@ -0,0 +1,54 @@ +namespace HaWeb.Settings.ParsingState; +using System.Text; +using HaXMLReader.Interfaces; +using HaDocument.Models; +using HaDocument.Interfaces; +using System.Collections.Immutable; + +public class TraditionState : HaWeb.HTMLParser.IState { + + internal ILibrary Lib; + internal IReaderService ReaderService; + + internal IEnumerable<Marginal>? Marginals; + + internal bool active_del; + internal bool active_skipwhitespace; + internal bool active_firstedit; + internal string currline; + internal string currpage; + internal string oldpage; + internal int commid; + internal bool active_trad; + + internal StringBuilder sb_tradition; // Überlieferung + internal StringBuilder sb_trad_zhtext; // Überlieferung, ZHText + internal StringBuilder sb_trad_left; // Überlieferung ZHText linke Spalte (zeilenzählung) + internal StringBuilder sb_trad_right; // Überlieferung ZHText rechte Spalte (Kommentare) + + internal IReader rd_tradition; + + public TraditionState(ILibrary lib, IReader reader, IEnumerable<Marginal>? marginals) + { + Lib = lib; + rd_tradition = reader; + Marginals = marginals; + SetupState(); + } + + public void SetupState() { + sb_tradition = new StringBuilder(); + sb_trad_zhtext = new StringBuilder(); + sb_trad_left = new StringBuilder(); + sb_trad_right = new StringBuilder(); + + active_trad = false; + active_del = false; + active_skipwhitespace = true; + active_firstedit = true; + currline = "-1"; + currpage = ""; + oldpage = ""; + commid = 1; + } +} \ No newline at end of file diff --git a/HaWeb/Views/Briefe/Index.cshtml b/HaWeb/Views/Briefe/Index.cshtml index f7d4902..499840a 100644 --- a/HaWeb/Views/Briefe/Index.cshtml +++ b/HaWeb/Views/Briefe/Index.cshtml @@ -1,2 +1,39 @@ @model BriefeViewModel; +@Model.Meta.Meta.Autopsic +@Model.Meta.ParsedSenders +@Model.Index +@Model.Id + +@if (Model.Next != null) { + <a href="@Model.Next.Value.Item2">@Model.Next.Value.Item1.Meta.Autopsic</a> +} + +@if (Model.ParsedText != null) { + @Html.Raw(@Model.ParsedText) +} + +@if (Model.ParsedLineCount != null) { + @Html.Raw(@Model.ParsedLineCount) +} + +@if (Model.ParsedMarginals != null) { + @Html.Raw(@Model.ParsedMarginals) +} + +@if (Model.ParsedTradition != null) { + @Html.Raw(@Model.ParsedTradition) +} + +@if (Model.ParsedEdits != null) { +@foreach (var edit in Model.ParsedEdits) { + @Html.Raw(edit) +} +} + +@if (Model.ParsedHands != null) +{ + @foreach (var hand in Model.ParsedHands) { + @Html.Raw(hand) +} +}