mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 17:25:32 +00:00
662 lines
39 KiB
Plaintext
662 lines
39 KiB
Plaintext
@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<string> handstrings = new List<string>();
|
||
|
||
// 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<Tag, bool>, Action<StringBuilder, Tag>)> OTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> CTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Text, bool>, Action<StringBuilder, Text>)> Text_Funcs = new List<(Func<Text, bool>, Action<StringBuilder, Text>)>() {
|
||
( x => true, ( sb, txt ) => {
|
||
if (active_del)
|
||
sb.Append(txt.Value.Replace("–", "<span class=\"diagdel\">–</span>"));
|
||
else
|
||
sb.Append(txt.Value);
|
||
} )
|
||
};
|
||
List<(Func<Text, bool>, Action<StringBuilder, Text>)> Text_Funcs_Tagging = new List<(Func<Text, bool>, Action<StringBuilder, Text>)>() {
|
||
( x => true, ( sb, txt ) => {
|
||
sb.Append(HTMLHelpers.CreateElement("span", "ntext"));
|
||
sb.Append(txt.Value);
|
||
sb.Append(HTMLHelpers.CreateEndElement("span"));
|
||
} )
|
||
};
|
||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> STag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Whitespace, bool>, Action<StringBuilder, Whitespace>)> Whitespace_Funcs = new List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)>() {
|
||
( x => true, ( sb, txt ) => {
|
||
if (active_skipwhitespace)
|
||
sb.Append(txt.Value);
|
||
else
|
||
active_skipwhitespace = !active_skipwhitespace;
|
||
})
|
||
};
|
||
|
||
// Rules for the left sidebar
|
||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> STag_Funcs_LEFT = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> STag_Funcs_RIGHT = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> OTag_Funcs_Trad = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> CTag_Funcs_Trad = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> STags_Funcs_TRAD = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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<Tag, bool>, Action<StringBuilder, Tag>)> STags_Funcs_EDIT = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||
( 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);
|
||
}
|
||
}
|
||
}
|
||
|
||
<div class="mainhead no-gutters row"> <!-- + sticky-top if sticky -->
|
||
<div class="col">
|
||
<div class="widehead letterbar">
|
||
<div class="flexcol">
|
||
@if (System.IO.File.Exists("./wwwroot/pdf/" + filename))
|
||
{
|
||
<div style="align-self: flex-end" class="printbutton">
|
||
<span class="label">
|
||
<a class="hlink" href="/pdf/@filename">
|
||
PDF <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" class="bi bi-arrow-down-circle" viewBox="0 0 14 18">
|
||
<path fill-rule="evenodd" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8zm15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/>
|
||
</svg>
|
||
</a>
|
||
</span>
|
||
</div>
|
||
}
|
||
else
|
||
{
|
||
<div style="align-self: flex-end" class="printbutton disabled"></div>
|
||
}
|
||
<div class="lettercard flexrow">
|
||
<div class="nnumber letcount">
|
||
@meta.Autopsic
|
||
</div>
|
||
@if(!String.IsNullOrWhiteSpace(sb_lettertext.ToString()))
|
||
{
|
||
<div class="letdesc">
|
||
<span class="date">
|
||
@meta.Date
|
||
</span>
|
||
@if (meta.ZH != null) {
|
||
<span>
|
||
<span class="nnumber autopsic"> 
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="currentColor" class="bi bi-book" viewBox="0 0 16 18">
|
||
<path d="M1 2.828c.885-.37 2.154-.769 3.388-.893 1.33-.134 2.458.063 3.112.752v9.746c-.935-.53-2.12-.603-3.213-.493-1.18.12-2.37.461-3.287.811V2.828zm7.5-.141c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/>
|
||
</svg>
|
||
ZH @HTMLHelpers.ToRoman(Int32.Parse(meta.ZH.Volume)) @meta.ZH.Page
|
||
</span>
|
||
</span>
|
||
}
|
||
else
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic-new">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="currentColor" class="bi bi-asterisk" viewBox="0 0 16 20">
|
||
<path d="M8 0a1 1 0 0 1 1 1v5.268l4.562-2.634a1 1 0 1 1 1 1.732L10 8l4.562 2.634a1 1 0 1 1-1 1.732L9 9.732V15a1 1 0 1 1-2 0V9.732l-4.562 2.634a1 1 0 1 1-1-1.732L6 8 1.438 5.366a1 1 0 0 1 1-1.732L7 6.268V1a1 1 0 0 1 1-1z"/>
|
||
</svg>
|
||
Neu
|
||
</span>
|
||
</span>
|
||
}
|
||
@if(meta.hasOriginal == OptionalBool.True)
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Original vorhanden">
|
||
 Orig
|
||
</span>
|
||
</span>
|
||
}
|
||
else
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Original verschollen">
|
||
 <span class="cross">Orig</span>
|
||
</span>
|
||
</span>
|
||
}
|
||
@if (meta.ZH != null && meta.ZH.dateChanged)
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Der Brief wurde gegenüber der Ausgabe ZH neu datiert">
|
||
 neu datiert
|
||
</span>
|
||
</span>
|
||
}
|
||
@if(meta.isProofread == OptionalBool.True)
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Textkritisch geprüft">
|
||
 geprüft
|
||
</span>
|
||
</span>
|
||
}
|
||
else
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Nicht textkritisch geprüft">
|
||
 <span class="cross">geprüft</span>
|
||
</span>
|
||
</span>
|
||
}
|
||
@if (lib.MarginalsByLetter.Contains(meta.Index))
|
||
{
|
||
<span>
|
||
<span class="nnumber autopsic hv" data-bs-toggle="tooltip" data-bs-placement="top" title="Mit Stellenkommentar">
|
||
 Komm
|
||
</span>
|
||
</span>
|
||
}
|
||
<br>
|
||
<span class="title">
|
||
@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)
|
||
{
|
||
<span data-bs-toggle="tooltip" data-bs-placement="bottom" title="Entwurf"> ↛ </span>
|
||
}
|
||
else
|
||
{
|
||
<span> → </span>
|
||
}
|
||
@Html.Raw(lib.Persons[meta.Receivers.ElementAt(i)].Name);
|
||
<br>
|
||
}
|
||
}
|
||
else
|
||
{
|
||
@HTMLHelpers.GetEnumerationString(meta.Senders.Select(x => lib.Persons[x].Name).ToList())
|
||
@if(meta.isDraft == OptionalBool.True)
|
||
{
|
||
<span data-bs-toggle="tooltip" data-bs-placement="bottom" title="Entwurf"> ↛ </span>
|
||
}
|
||
else
|
||
{
|
||
<span> → </span>
|
||
}
|
||
@HTMLHelpers.GetEnumerationString(meta.Receivers.Select(x => lib.Persons[x].Name).ToList())
|
||
}
|
||
</div>
|
||
}
|
||
else
|
||
{
|
||
<span> </span>
|
||
}
|
||
</span>
|
||
|
||
</div>
|
||
|
||
<div class="metas" style="align-self: flex-end">
|
||
@if(prev != null)
|
||
{
|
||
<a class="hlink invlink" href="/Briefe/@prev.Autopsic" >@prev.Autopsic ◀</a>
|
||
}
|
||
HKB
|
||
@if(next != null)
|
||
{
|
||
<a class="hlink invlink" href="/Briefe/@next.Autopsic">▶ @next.Autopsic</a>
|
||
}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@if(!String.IsNullOrWhiteSpace(sb_lettertext.ToString()))
|
||
{
|
||
<div class="row no-gutters">
|
||
<div class="col">
|
||
<div class="flexrow h-100">
|
||
<div class="countbox nnumber d-none d-lg-block">
|
||
@Html.Raw(sb_linecount.ToString())
|
||
<br>
|
||
</div>
|
||
<div class="letterbox">
|
||
@Html.Raw(sb_lettertext.ToString())
|
||
</div>
|
||
</div>
|
||
</div>
|
||
@if(marginals != null && marginals.Any())
|
||
{
|
||
<div class="col-4 d-none d-lg-block">
|
||
<div class="commentColumn">
|
||
@Html.Raw(sb_marginals.ToString())
|
||
</div>
|
||
</div>
|
||
} else
|
||
{
|
||
<div class="col-4 NoCommentColumn"></div>
|
||
}
|
||
</div>
|
||
}
|
||
@* <div class="row no-gutters dividerrow">
|
||
|
||
</div> *@
|
||
<div class="row no-gutters additions">
|
||
<div class="flexol additionbox">
|
||
@if(rd_tradition != null && !String.IsNullOrWhiteSpace(tradition.Element))
|
||
{
|
||
<div class="traditions">
|
||
@Html.Raw(sb_tradition.ToString())
|
||
</div>
|
||
}
|
||
@if (hands != null)
|
||
{
|
||
<div class="hands">
|
||
<br>
|
||
<span class="app">Zusätze fremder Hand</span>
|
||
@foreach (var hand in handstrings)
|
||
{
|
||
<br>
|
||
@Html.Raw(hand)
|
||
}
|
||
</div>
|
||
}
|
||
@if (editreasons != null)
|
||
{
|
||
<div class="edits">
|
||
<br>
|
||
<span class="app">Textkritische Anmerkungen <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle" viewBox="0 0 16 20" data-bs-toggle="tooltip" data-bs-placement="right" title="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.">
|
||
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
|
||
<path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/>
|
||
</svg></span>
|
||
@* <div class="disclaimer">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.</div> *@
|
||
@Html.Raw(sb_edits)
|
||
</div>
|
||
}
|
||
</div>
|
||
</div>
|
||
|
||
@section Scripts {
|
||
<script src="~/js/new.js" asp-append-version="true"></script>
|
||
|
||
<script>
|
||
function offsetAnchor() {
|
||
if (location.hash.length !== 0) {
|
||
window.scrollTo(window.scrollX, window.scrollY - 280);
|
||
}
|
||
}
|
||
|
||
$(document).on('click', 'a[href^="#"]', function(event) {
|
||
window.setTimeout(function() {
|
||
offsetAnchor();
|
||
}, 0);
|
||
});
|
||
|
||
window.setTimeout(offsetAnchor, 0);
|
||
$( "#" + window.location.hash.substr(1) ).before("<div class=\"selected\">☛</div>");
|
||
</script>
|
||
|
||
<script>
|
||
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
||
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||
return new bootstrap.Tooltip(tooltipTriggerEl)
|
||
})
|
||
</script>
|
||
}
|