@page "{id?}" @using System.Linq; @using System.Threading.Tasks; @using System.Collections.Generic; @using System.Threading; @using System.Linq; @using System.Xml.Linq; @using System.IO; @model HaLive.Pages.BriefeModel @inject IReaderService readerService @inject ILibrary lib @{ // Acquire data ViewData["Title"] = "Brief"; var meta = lib.Metas.Where(x => x.Value.Autopsic == Model.id).First().Value; var id = meta.Index; var letter = lib.Letters[id]; var marginals = lib.MarginalsByLetter.Contains(id) ? lib.MarginalsByLetter[id] : null; var tradition = lib.Traditions.ContainsKey(id) ? lib.Traditions[id] : null; var editreasons = lib.EditreasonsByLetter.Contains(id) ? lib.EditreasonsByLetter[id].OrderBy(x => HTMLHelpers.RomanOrNumberToInt(x.StartPage)).ThenBy(x => HTMLHelpers.RomanOrNumberToInt(x.StartLine)) : null; var senders = HTMLHelpers.GetEnumerationString(meta.Senders.Select(x => lib.Persons[x].Name).ToList()); var receivers = HTMLHelpers.GetEnumerationString(meta.Receivers.Select(x => lib.Persons[x].Name).ToList()); var next = meta == lib.MetasByDate.Last() ? null : lib.MetasByDate.ItemRef(lib.MetasByDate.IndexOf(meta) + 1); var prev = meta == lib.MetasByDate.First() ? null : lib.MetasByDate.ItemRef(lib.MetasByDate.IndexOf(meta) - 1); var hands = lib.Hands.ContainsKey(id) ? lib.Hands[id] : null; var filename = "HKB_" + meta.Autopsic + ".pdf"; // State var currline = "-1"; var currpage = ""; var oldpage = ""; var commid = 1; var active_firstedit = true; var active_trad = false; var active_skipwhitespace = true; var active_del = false; List handstrings = new List(); // Parsing-Combinations var sb_lettertext = new StringBuilder(); // Hauptext var sb_linecount = new StringBuilder(); // Linke Spalte (Zeilenzählung) var sb_marginals = new StringBuilder(); // Rechte Spalte (Kommentare) var sb_tradition = new StringBuilder(); // Überlieferung var sb_trad_zhtext = new StringBuilder(); // Überlieferung, ZHText var sb_trad_left = new StringBuilder(); // Überlieferung ZHText linke Spalte (zeilenzählung) var sb_trad_right = new StringBuilder(); // Überlieferung ZHText rechte Spalte (Kommentare) var sb_edits = new StringBuilder(); // Edits var rd_lettertext = readerService.RequestStringReader(letter.Element); // Liest den Brieftext var rd_tradition = tradition != null && !String.IsNullOrWhiteSpace(tradition.Element) ? readerService.RequestStringReader(tradition.Element) : null; // Liest die Überlieferung // Initialize State 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); } } } // Parsing Rules // General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons) List<(Func, Action)> OTag_Funcs = new List<(Func, Action)>() { ( x => x.Name == "align" && x["pos"] == "center", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "align center")) ), ( x => x.Name == "align" && x["pos"] == "right", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "align right")) ), ( x => x.Name == "added", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "added")) ), ( x => x.Name == "sal", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "sal")) ), ( x => x.Name == "aq", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "aq")) ), ( x => x.Name == "super", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "super")) ), ( x => x.Name == "del", (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("span", "del")); active_del = true; } ), ( x => x.Name == "nr", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "nr")) ), ( x => x.Name == "note", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "note")) ), ( x => x.Name == "ul", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "ul")) ), ( x => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "anchor")) ), ( x => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "footnote")) ), ( x => x.Name == "dul", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "dul")) ), ( x => x.Name == "ful", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "ful")) ), ( x => x.Name == "up", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "up")) ), ( x => x.Name == "sub", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("sub")) ), ( x => x.Name == "tul", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "tul")) ), ( x => x.Name == "header", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "header")) ), ( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "lemma")) ), ( x => x.Name == "eintrag", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "entry")) ), ( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "title")) ), ( x => x.Name == "bzg", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "bzg")) ), ( x => x.Name == "zh", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("span", "zh")) ), ( x => x.Name == "emph", (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("em")); } ), ( x => x.Name == "app", (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("span", "app")); } ), ( x => x.Name == "subsection", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "subcomment", tag["id"])) ), ( x => x.Name == "kommentar", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "comment", tag["id"])) ), ( x => x.Name == "editreason", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "editreason")) ), ( x => x.Name == "subsection", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "letter")) ), ( x => x.Name == "letterTradition", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "tradition")) ), ( x => x.Name == "marginal", (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("div", "marginal")); active_skipwhitespace = !active_skipwhitespace; }), ( x => x.Name == "hand", (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("span", "hand")); } ), ( x => x.Name == "tabs", (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "htable")) ), ( x => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag) => sb.Append(HTMLHelpers.CreateElement("div", "htab htab-" + tag["value"]))) }; List<(Func, Action)> CTag_Funcs = new List<(Func, Action)>() { ( x => x.Name == "align", (sb, tag) => { sb.Append(HTMLHelpers.CreateEndElement("div")); } ), ( x => x.Name == "added", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "sal", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "aq", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "super", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "del", (sb, tag) => { sb.Append(HTMLHelpers.CreateEndElement("span")); active_del = false; } ), ( x => x.Name == "nr", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "note", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "ul", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "anchor", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "fn", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "dul", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "up", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "ful", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "sub", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("sub")) ), ( x => x.Name == "tul", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "header", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "eintrag", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "bzg", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "zh", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "emph", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("em")) ), ( x => x.Name == "app", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("span")) ), ( x => x.Name == "subsection", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "kommentar", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "editreason", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "subsection", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "letterTradition", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "marginal", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "tabs", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "tab", (sb, tag) => sb.Append(HTMLHelpers.CreateEndElement("div")) ), ( x => x.Name == "hand", (sb, tag) => { sb.Append(HTMLHelpers.CreateEndElement("span")); } ) }; List<(Func, Action)> Text_Funcs = new List<(Func, Action)>() { ( x => true, ( sb, txt ) => { if (active_del) sb.Append(txt.Value.Replace("–", "")); else sb.Append(txt.Value); } ) }; List<(Func, Action)> Text_Funcs_Tagging = new List<(Func, Action)>() { ( x => true, ( sb, txt ) => { sb.Append(HTMLHelpers.CreateElement("span", "ntext")); sb.Append(txt.Value); sb.Append(HTMLHelpers.CreateEndElement("span")); } ) }; List<(Func, Action)> STag_Funcs = new List<(Func, Action)>() { ( x => x.Name == "line", (sb, tag) => { if(currline != "-1") sb.Append(HTMLHelpers.CreateElement("br", "ZHBreak")); if(tag["type"] == "line") sb.Append(HTMLHelpers.CreateElement("hr", "lineline")); } ), ( x => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("span", "tab-" + tag["tab"])); sb.Append(HTMLHelpers.CreateEndElement("span")); } ) }; List<(Func, Action)> Whitespace_Funcs = new List<(Func, Action)>() { ( x => true, ( sb, txt ) => { if (active_skipwhitespace) sb.Append(txt.Value); else active_skipwhitespace = !active_skipwhitespace; }) }; // Rules for the left sidebar List<(Func, Action)> STag_Funcs_LEFT = new List<(Func, Action)>() { ( x => x.Name == "line", (sb, tag) => { if(currline != "-1") { if (currpage == oldpage) sb.Append(HTMLHelpers.CreateElement("br", "", currpage + "-" + currline)); else { sb.Append(HTMLHelpers.CreateElement("br", "", oldpage + "-" + currline)); oldpage = currpage; } } else { sb.Append(HTMLHelpers.CreateElement("span", "zhpage firstpage", currpage + "-" + tag["index"])); sb.Append("S." + " "); sb.Append(HTMLHelpers.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(HTMLHelpers.CreateElement("span", "zhpage", "")); sb.Append("S. " + currpage); sb.Append(HTMLHelpers.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 List<(Func, Action)> STag_Funcs_RIGHT = new List<(Func, Action)>() { ( 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(HTMLHelpers.CreateElement("div", "commBox", commid.ToString())); sb.Append(HTMLHelpers.CreateElement("div", "commselector")); sb.Append(HTMLHelpers.CreateElement("button", "button")); sb.Append(HTMLHelpers.CreateEndElement("button")); sb.Append(HTMLHelpers.CreateEndElement("div")); sb.Append(HTMLHelpers.CreateElement("div", "comment")); foreach (var marginal in margs) { var rd = readerService.RequestStringReader(marginal.Element); new StandardSubscriber(rd, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs_Tagging, Whitespace_Funcs); new LinkBuilder(lib, rd, sb, false); rd.Read(); } sb.Append(HTMLHelpers.CreateEndElement("div")); sb.Append(HTMLHelpers.CreateEndElement("div")); sb.Append(HTMLHelpers.CreateElement("br")); } else { sb.Append(HTMLHelpers.CreateElement("br", "emptyline")); } } commid++; } )}; // Rules for traditions List<(Func, Action)> OTag_Funcs_Trad = new List<(Func, Action)>() { ( x => x.Name == "app", (sb, tag) => { if (!active_firstedit) { sb.Append(HTMLHelpers.CreateElement("br")); } else { active_firstedit = false; } } ), ( x => x.Name == "ZHText", (sb, tag) => { sb_tradition.Append(HTMLHelpers.CreateElement("div", "row zhtext")); sb_tradition.Append(HTMLHelpers.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(HTMLHelpers.CreateElement("div", "trad-linecount countbox nnumber d-none d-lg-block order-1")); sb_trad_right.Append(HTMLHelpers.CreateElement("div", "commentColumn trad-comm col-4 d-none d-lg-block order-3")); sb_trad_right.Append(HTMLHelpers.CreateElement("br", "emptyline")); new StandardSubscriber(rd_tradition, sb_trad_left, null, STag_Funcs_LEFT); new StandardSubscriber(rd_tradition, sb_trad_right, null, STag_Funcs_RIGHT); } ) }; List<(Func, Action)> CTag_Funcs_Trad = new List<(Func, Action)>() { ( x => x.Name == "ZHText", (sb, tag) => { sb_tradition.Append(HTMLHelpers.CreateEndElement("div")); sb_trad_left.Append(HTMLHelpers.CreateEndElement("div")); sb_trad_right.Append(HTMLHelpers.CreateEndElement("div")); sb_tradition.Append(sb_trad_left.ToString()); sb_tradition.Append(sb_trad_right.ToString()); sb_tradition.Append(HTMLHelpers.CreateEndElement("div")); active_trad = false; } ) }; List<(Func, Action)> STags_Funcs_TRAD = new List<(Func, Action)>() { ( x => x.Name == "line", (sb, tag) => { if(currline != "-1" || !active_trad) sb.Append(HTMLHelpers.CreateElement("br", "ZHBreak")); } ), ( x => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag) => { sb.Append(HTMLHelpers.CreateElement("span", "tab-" + tag["tab"])); sb.Append(HTMLHelpers.CreateEndElement("span")); } ) }; // Rules for Edits: List<(Func, Action)> STags_Funcs_EDIT = new List<(Func, Action)>() { ( x => x.Name == "line", (sb, tag) => sb.Append(" ") ) }; // Functionms for Parsing: string HandleEdit(Editreason edit) { sb_edits.Append(HTMLHelpers.CreateElement("div", "edit")); sb_edits.Append(HTMLHelpers.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(HTMLHelpers.CreateEndElement("span")); if (!String.IsNullOrWhiteSpace(edit.Reference)) { var sb2 = new StringBuilder(); sb2.Append(HTMLHelpers.CreateElement("span", "reference")); var rd = readerService.RequestStringReader(edit.Reference); new StandardSubscriber(rd, sb2, OTag_Funcs, null, CTag_Funcs, Text_Funcs, Whitespace_Funcs); rd.Read(); sb2.Append(HTMLHelpers.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(HTMLHelpers.CreateElement("span", "reference")); sb_edits.Append(text); sb_edits.Append(HTMLHelpers.CreateEndElement("span")); } else sb_edits.Append(sb2); @* MIT FORMATIERUNGEN: if (edit.StartPage != edit.EndPage || edit.StartLine != edit.EndLine) { var text1 = XElement.Parse(sb2.ToString()); var text2 = new XElement(text1); if (!String.IsNullOrWhiteSpace(text1.Value)) { text1.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).Skip(1).Remove(); text2.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).SkipLast(1).Remove(); var element1 = text1.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).Any() ? text1.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).First().Parent : null; var element2 = text2.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).Any() ? text2.DescendantNodes().Where(x => x.NodeType == System.Xml.XmlNodeType.Text && !String.IsNullOrWhiteSpace(x.ToString())).Last().Parent : null; element1.Value = element1.Value.ToString().Split(' ').Take(1).First(); element2.Value = element2.Value.ToString().Split(' ').TakeLast(1).First(); text1.DescendantNodes().Where(x => (x.NodeType == System.Xml.XmlNodeType.Element && String.IsNullOrWhiteSpace(((XElement)x).Value.ToString())) || (x.NodeType == System.Xml.XmlNodeType.Text && String.IsNullOrWhiteSpace(x.ToString())) || (x.NodeType == System.Xml.XmlNodeType.Whitespace) ).Remove(); text2.DescendantNodes().Where(x => (x.NodeType == System.Xml.XmlNodeType.Element && String.IsNullOrWhiteSpace(((XElement)x).Value.ToString())) || (x.NodeType == System.Xml.XmlNodeType.Text && String.IsNullOrWhiteSpace(x.ToString())) || (x.NodeType == System.Xml.XmlNodeType.Whitespace) ).Remove(); sb_edits.Append(text1.ToString().Trim()); sb_edits.Append(" […] "); sb_edits.Append(text2.ToString().Trim()); } } else sb_edits.Append(sb2); *@ } if (!String.IsNullOrWhiteSpace(edit.Element)) { sb_edits.Append(" "); sb_edits.Append(HTMLHelpers.CreateElement("span", "corrections")); var rd = readerService.RequestStringReader(edit.Element); new StandardSubscriber(rd, sb_edits, OTag_Funcs, STags_Funcs_EDIT, CTag_Funcs, Text_Funcs, Whitespace_Funcs); rd.Read(); sb_edits.Append(HTMLHelpers.CreateEndElement("span")); } sb_edits.Append(HTMLHelpers.CreateEndElement("div")); return sb_edits.ToString(); } // Actual parsing if (letter.Element != null && !String.IsNullOrWhiteSpace(letter.Element) && rd_lettertext != null) { new StandardSubscriber(rd_lettertext, sb_lettertext, OTag_Funcs, STag_Funcs, CTag_Funcs, Text_Funcs, Whitespace_Funcs); new StandardSubscriber(rd_lettertext, sb_linecount, null, STag_Funcs_LEFT); if (marginals != null && marginals.Any()) { new StandardSubscriber(rd_lettertext, sb_marginals, null, STag_Funcs_RIGHT); } rd_lettertext.Read(); } if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element) && rd_tradition != null) { new StandardSubscriber(rd_tradition, sb_tradition, OTag_Funcs_Trad, null, CTag_Funcs_Trad, null, null); new StandardSubscriber(rd_tradition, sb_tradition, OTag_Funcs, STags_Funcs_TRAD, CTag_Funcs, Text_Funcs, Whitespace_Funcs); new LinkBuilder(lib, rd_tradition, sb_tradition); rd_tradition.Read(); } if (editreasons != null && editreasons.Any()) { foreach (var edit in editreasons) { HandleEdit(edit); } } }
@if (System.IO.File.Exists("./wwwroot/pdf/" + filename)) { } else {
}
@meta.Autopsic
@if(!String.IsNullOrWhiteSpace(sb_lettertext.ToString())) {
@meta.Date   @if (meta.ZH != null) { ZH @HTMLHelpers.ToRoman(Int32.Parse(meta.ZH.Volume)) @meta.ZH.Page   } else { Neu   } @if(meta.hasOriginal == OptionalBool.True) {  Orig   } else { Orig   } @if (meta.ZH != null && meta.ZH.dateChanged) {  neu datiert   } @if(meta.isProofread == OptionalBool.True) {  geprüft   } else { geprüft   } @if (lib.MarginalsByLetter.Contains(meta.Index)) {  Komm   }
@if (meta.Senders.Intersect(meta.Receivers).Any()) { @for (int i = 0; i < meta.Senders.Count; i++) { @Html.Raw(lib.Persons[meta.Senders.ElementAt(i)].Name); @if(meta.isDraft == OptionalBool.True) {  ↛  } else {  →  } @Html.Raw(lib.Persons[meta.Receivers.ElementAt(i)].Name);
} } else { @HTMLHelpers.GetEnumerationString(meta.Senders.Select(x => lib.Persons[x].Name).ToList()) @if(meta.isDraft == OptionalBool.True) {  ↛  } else {  →  } @HTMLHelpers.GetEnumerationString(meta.Receivers.Select(x => lib.Persons[x].Name).ToList()) }
} else {   }
@if(prev != null) { @prev.Autopsic ◀ } HKB @if(next != null) { ▶ @next.Autopsic }
@if(!String.IsNullOrWhiteSpace(sb_lettertext.ToString())) {
@Html.Raw(sb_linecount.ToString())
@Html.Raw(sb_lettertext.ToString())
@if(marginals != null && marginals.Any()) {
@Html.Raw(sb_marginals.ToString())
} else {
}
} @*
*@
@if(rd_tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) {
@Html.Raw(sb_tradition.ToString())
} @if (hands != null) {

Zusätze fremder Hand @foreach (var hand in handstrings) {
@Html.Raw(hand) }
} @if (editreasons != null) {

Textkritische Anmerkungen @*
Der Brieftext wurde anhand der überlieferten Quellen (vgl. Provenienz) kritisch geprüft. Notwendige Korrekturen gegenüber dem in ZH gedruckten Text wurden vorgenommen und sind vollständig annotiert. Die in den beiden Auflagen von ZH angehängten Korrekturvorschläge werden vollständig aufgelistet, werden aber nur dann im Text realisiert, sofern diese anhand überlieferter Quellen verifiziert werden konnten.
*@ @Html.Raw(sb_edits)
}
@section Scripts { }