Worked on Letter MEtadata (Provinienz etc)

This commit is contained in:
schnulller
2022-05-24 23:48:56 +02:00
parent f706036063
commit 1dd39d6fc3
15 changed files with 705 additions and 213 deletions

View File

@@ -58,10 +58,10 @@ public class Briefecontroller : Controller
var model = new BriefeViewModel(this.id, index, generateMetaViewModel(meta, hasMarginals));
if (nextmeta != null) model.MetaData.Next = (generateMetaViewModel(nextmeta, false), url + nextmeta.Autopsic);
if (prevmeta != null) model.MetaData.Prev = (generateMetaViewModel(prevmeta, false), 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.ParsedText = HaWeb.HTMLHelpers.BriefeHelpers.CreateLetter(_lib, _readerService, meta, text, marginals);
if (hands != null && hands.Any()) model.ParsedHands = HaWeb.HTMLHelpers.LetterHelpers.CreateHands(_lib, hands);
if (editreasons != null && editreasons.Any()) model.ParsedEdits = HaWeb.HTMLHelpers.LetterHelpers.CreateEdits(_lib, _readerService, editreasons);
if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) model.ParsedTradition = HaWeb.HTMLHelpers.LetterHelpers.CreateTraditions(_lib, _readerService, marginals, tradition);
if (text != null && !String.IsNullOrWhiteSpace(text.Element)) model.ParsedText = HaWeb.HTMLHelpers.LetterHelpers.CreateLetter(_lib, _readerService, meta, text, marginals);
// Return
return View(model);
@@ -77,8 +77,10 @@ public class Briefecontroller : Controller
{
var senders = meta.Senders.Select(x => _lib.Persons[x].Name) ?? new List<string>();
var recivers = meta.Receivers.Select(x => _lib.Persons[x].Name) ?? new List<string>();
var zhstring = meta.ZH != null ? HaWeb.HTMLHelpers.LetterHelpers.CreateZHString(meta) : null;
return new BriefeMetaViewModel(meta, hasMarginals)
{
ParsedZHString = zhstring,
ParsedSenders = HTMLHelpers.StringHelpers.GetEnumerationString(senders),
ParsedReceivers = HTMLHelpers.StringHelpers.GetEnumerationString(recivers)
};

View File

@@ -11,7 +11,7 @@ using System.Xml.Linq;
using HaWeb.Settings.ParsingState;
using HaWeb.Settings.ParsingRules;
public static class BriefeHelpers
public static class LetterHelpers
{
public static string CreateLetter(ILibrary lib, IReaderService readerService, Meta meta, Letter letter, IEnumerable<Marginal>? marginals)
{
@@ -32,29 +32,29 @@ public static class BriefeHelpers
public static string CreateTraditions(ILibrary lib, IReaderService readerService, IEnumerable<Marginal>? marginals, Tradition tradition)
{
var rd = readerService.RequestStringReader(tradition.Element);
var traditionState = new TraditionState(lib, rd, marginals);
new HaWeb.HTMLParser.XMLHelper<TraditionState>(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRulesInitial, null, TraditionRules.CTagRulesInitial, null, null);
new HaWeb.HTMLParser.XMLHelper<TraditionState>(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRules, TraditionRules.STagRulesInitial, TraditionRules.CTagRules, TraditionRules.TextRules, TraditionRules.WhitespaceRules);
var traditionState = new TraditionState(lib, rd, readerService, marginals);
new HaWeb.HTMLParser.XMLHelper<TraditionState>(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRules, TraditionRules.STagRules, 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<string> CreateEdits(ILibrary lib, IReaderService readerService, IEnumerable<Editreason> editreasons)
public static List<(string, string, string, string, string, string)> CreateEdits(ILibrary lib, IReaderService readerService, IEnumerable<Editreason> editreasons)
{
var editstrings = new List<string>();
editreasons = editreasons.OrderBy(x => HaWeb.HTMLHelpers.ConversionHelpers.RomanOrNumberToInt(x.StartPage)).ThenBy(x => HaWeb.HTMLHelpers.ConversionHelpers.RomanOrNumberToInt(x.StartLine));
var editstrings = new List<(string, string, string, string, string, string)>();
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;
var endstring = "";
var refstring = "";
if (edit.StartPage != edit.EndPage)
currstring += "" + edit.EndPage + "/" + edit.EndLine;
endstring += edit.EndPage + "/" + edit.EndLine;
else if (edit.StartLine != edit.EndLine)
currstring += "" + edit.EndLine;
editsState.sb_edits.Append(currstring + "&emsp;");
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
endstring += edit.EndLine;
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "edit"));
if (!String.IsNullOrWhiteSpace(edit.Reference))
{
var sb2 = new StringBuilder();
@@ -67,16 +67,17 @@ public static class BriefeHelpers
{
var text = XElement.Parse(sb2.ToString()).Value.ToString();
text = text.ToString().Split(' ').Take(1).First() + " [&#x2026;] " + 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"));
var sb3 = new StringBuilder();
sb3.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference"));
sb3.Append(text);
sb3.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
refstring = sb3.ToString();
}
else
editsState.sb_edits.Append(sb2);
refstring = sb2.ToString();
}
if (!String.IsNullOrWhiteSpace(edit.Element))
{
editsState.sb_edits.Append("&emsp;");
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "corrections"));
var rd = readerService.RequestStringReader(edit.Element);
new HaWeb.HTMLParser.XMLHelper<EditState>(editsState, rd, editsState.sb_edits, EditRules.OTagRules, EditRules.STagRules, EditRules.CTagRules, EditRules.TextRules, EditRules.WhitespaceRules);
@@ -84,30 +85,41 @@ public static class BriefeHelpers
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
}
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
editstrings.Add(editsState.sb_edits.ToString());
editstrings.Add((currstring, endstring, refstring, editsState.sb_edits.ToString(), edit.StartPage, edit.StartLine));
editsState.sb_edits.Clear();
}
return editstrings;
}
public static List<string> CreateHands(ILibrary lib, ImmutableList<Hand> hands)
public static List<(string, string, string, string, string)> CreateHands(ILibrary lib, ImmutableList<Hand> hands)
{
var handstrings = new List<string>();
var handstrings = new List<(string, string, string, string, string)>();
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;
var endstring = "";
var personstring = "";
if (hand.StartPage != hand.EndPage)
currstring += "" + hand.EndPage + "/" + hand.EndLine;
endstring += hand.EndPage + "/" + hand.EndLine;
else
if (hand.StartLine != hand.EndLine)
currstring += "" + hand.EndLine;
endstring += hand.EndLine;
var persons = lib.HandPersons.Where(x => x.Key == hand.Person);
if (persons.Any())
{
currstring += " " + persons.FirstOrDefault().Value.Name;
handstrings.Add(currstring);
personstring += " " + persons.FirstOrDefault().Value.Name;
handstrings.Add((currstring, endstring, personstring, hand.StartPage, hand.StartLine));
}
}
return handstrings;
}
public static string CreateZHString(Meta meta) {
var zhstrring = "ZH ";
var a = 1;
if (Int32.TryParse(meta.ZH.Volume, out a))
zhstrring += HTMLHelpers.ConversionHelpers.ToRoman(a) + " ";
zhstrring += meta.ZH.Page;
return zhstrring;
}
}

View File

@@ -10,8 +10,10 @@ public class BriefeViewModel
public string? ParsedLineCount { get; set; }
public string? ParsedMarginals { get; set; }
public string? ParsedTradition { get; set; }
public List<string>? ParsedEdits { get; set; }
public List<string>? ParsedHands { get; set; }
// From, Until, Reference, Edit, sartpage, startline
public List<(string, string, string, string, string, string)>? ParsedEdits { get; set; }
// From, Until, Person, startpage, startline
public List<(string, string, string, string, string)>? ParsedHands { get; set; }
public BriefeViewModel(string id, string index, BriefeMetaViewModel meta)
{

View File

@@ -25,6 +25,16 @@ Veränderungen im Code
- Code open source zugänglich machen?
Für diese Anpassungen sind in etwa 3-4 Monate eingeplant.
- Ladezeiten (???)
- PDF-Parser
- PDF-Parser
hamann-werke.de
Startseite für die Briefausgebe / Werkausgabe. Unterschiedliche Menüs für die Ausgaben...
Briefe beim Namen
- GND Normdaten der Namen
- Esther falsch abgekürzt
- Marginalien in dne Traditions an die falsche Zeile gesetzt
- Lessing-Registereitrag

View File

@@ -66,7 +66,7 @@ public static class EditRules {
( ( 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"));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DELCLASS));
reader.State.active_del = true;
}),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ),
@@ -149,6 +149,10 @@ public static class EditRules {
sb.Append(txt.Value);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
})};
public static readonly TagFuncList STagRules = new TagFuncList() {
( ( x, _) => x.Name == "line", (sb, tag, _) => sb.Append("&emsp;") )
};
public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() {
( ( _, _) => true, ( sb, txt, reader) => {
@@ -157,8 +161,4 @@ public static class EditRules {
else
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
})};
public static readonly TagFuncList STagRules = new TagFuncList() {
( ( x, _) => x.Name == "line", (sb, tag, _) => sb.Append("&emsp;") )
};
}

View File

@@ -74,7 +74,7 @@ public class LetterRules
( ( 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"));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DELCLASS));
reader.State.active_del = true;
}),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ),

View File

@@ -44,6 +44,9 @@ public static class TraditionRules
private static readonly string MARGINGALBOXCLASS = HaWeb.Settings.CSSClasses.MARGINGALBOXCLASS;
// Zeilen:
// :
private static readonly string ZHLINECLASS = HaWeb.Settings.CSSClasses.ZHLINECLASS;
private static readonly string FIRSTLINECLASS = HaWeb.Settings.CSSClasses.FIRSTLINECLASS;
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;
@@ -77,7 +80,7 @@ public static class TraditionRules
( ( 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"));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DELCLASS));
reader.State.active_del = true;
}),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ),
@@ -97,7 +100,6 @@ public static class TraditionRules
( ( 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)) ),
@@ -109,8 +111,15 @@ public static class TraditionRules
}),
( ( 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"])))
};
( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]))),
// Tradition specific:
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, APPCLASS)); } ),
( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => {
reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TRADZHTEXTCLASS));
reader.State.active_trad = true;
})};
public static readonly TagFuncList CTagRules = new TagFuncList() {
( ( x, _) => x.Name == "align", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
@@ -139,7 +148,6 @@ public static class TraditionRules
( ( 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)) ),
@@ -148,8 +156,14 @@ public static class TraditionRules
( ( 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)) )
};
( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
// Tradition specifics
( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => {
reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.active_trad = false;
})};
public static readonly TextFuncList TextRules = new TextFuncList() {
( ( x, _) => true, (sb, txt, reader) => {
@@ -165,76 +179,92 @@ public static class TraditionRules
( (x, _) => x.Name == "page", (sb, tag, reader) => reader.State.currpage = tag["index"] ),
( (x, _) => x.Name == "line", (sb, tag, reader) => {
// This is the beginning of the Text, so no <br> needed, just a special linecount
if(reader.State.currline == "-1") {
reader.State.currline = tag["index"];
// Tradition specific: only do this if in ZHText
if (reader.State.active_trad) {
if(reader.State.currline == "-1") {
reader.State.currline = tag["index"];
// First Linecount
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
sb.Append("S." + "&nbsp;");
if (tag["index"] != "1")
sb.Append(reader.State.currpage + "&thinsp;/&thinsp;" + tag["index"]);
else
sb.Append(reader.State.currpage);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
// First Linecount
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS + " " + FIRSTLINECLASS, ""));
// This is NOT the beginning of the text, so we set a br, and then, linecount
else {
reader.State.currline = tag["index"];
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS));
// Linecount
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
// Fall 1: Neue Seite
if (reader.State.currline == "1") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS, ""));
sb.Append("S.&nbsp;" + reader.State.currpage);
}
// Fall 2: Neue Zeile, teilbar durch 5
else if (Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS, ""));
sb.Append(tag["index"]);
}
// Fall 3: Neue Zeile, nicht teilbar durch 5, deswegen versteckt
else {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS + " " + HIDDENZHLINECOUNT, ""));
sb.Append(tag["index"]);
sb.Append("S." + "&nbsp;");
if (tag["index"] != "1")
sb.Append(reader.State.currpage + "&thinsp;/&thinsp;" + tag["index"]);
else
sb.Append(reader.State.currpage);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
/// This is NOT the beginning of the text, so we set a br, and then, linecount
else {
reader.State.currline = tag["index"];
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS));
// Marginalien
if(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));
foreach (var marginal in margs)
{
// In Marginal, the Root-Element (<marginal>) is somehow parsed,
// so we don't need to enclose it in a seperate div.
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();
// Linecount
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
// Fall 1: Neue Seite
if (reader.State.currline == "1") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS, ""));
sb.Append("S.&nbsp;" + reader.State.currpage);
}
// Fall 2: Neue Zeile, teilbar durch 5
else if (Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECLASS, ""));
sb.Append(tag["index"]);
}
// Fall 3: Neue Zeile, nicht teilbar durch 5, deswegen versteckt
else {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECLASS + " " + HIDDENZHLINECOUNT, ""));
sb.Append(tag["index"]);
}
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
// Marginalien
if(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));
foreach (var marginal in margs)
{
// In Marginal, the Root-Element (<marginal>) is somehow parsed,
// so we don't need to enclose it in a seperate div.
if (marginal.Element != null) {
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));
}
}
// Line type=line
if(tag["type"] == "line") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
// Line tab=
if(!String.IsNullOrWhiteSpace(tag["tab"])) {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINEINDENTCLASS + tag["tab"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
}
// Line type=line
if(tag["type"] == "line") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS));
// Line tab=
if(!String.IsNullOrWhiteSpace(tag["tab"])) {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINEINDENTCLASS + tag["tab"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
// Tradition specific: only do this if not in ZHText
if (!reader.State.active_trad) {
sb.Append("<br>");
}
}
)};
@@ -246,37 +276,4 @@ public static class TraditionRules
else
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
})};
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, TRADZHTEXTCLASS));
reader.State.currline = "-1";
reader.State.currpage = "";
reader.State.active_trad = true;
})};
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.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));
})};
}

View File

@@ -24,11 +24,12 @@ public class TraditionState : HaWeb.HTMLParser.IState {
internal IReader rd_tradition;
public TraditionState(ILibrary lib, IReader reader, IEnumerable<Marginal>? marginals)
public TraditionState(ILibrary lib, IReader reader, IReaderService readerService, IEnumerable<Marginal>? marginals)
{
Lib = lib;
rd_tradition = reader;
Marginals = marginals;
ReaderService = readerService;
SetupState();
}

View File

@@ -16,9 +16,11 @@
@Model.MetaData.Prev.Value.Item1.Meta.Autopsic ◀
</a>
}
<div class="ha-hkb">
HKB
</div>
@if (Model.MetaData.Next != null) {
<a href="@Model.MetaData.Next.Value.Item2">
▶ @Model.MetaData.Next.Value.Item1.Meta.Autopsic
@@ -39,10 +41,44 @@
@if (Model.ParsedTradition != null) {
@Html.Raw(Model.ParsedTradition)
}
@if(Model.ParsedHands != null && Model.ParsedHands.Any()) {
<div class="ha-hands">
<div class="ha-handstitle">Zusätze fremder Hand</div>
<div class="ha-handentries">
<table>
@foreach (var hand in Model.ParsedHands) {
<tr class="ha-handentry">
@* Not beautiful, but here's whitespace in between otherwise *@
<td><div class="ha-handfrom">@hand.Item1</div>@if (!String.IsNullOrEmpty(hand.Item2)) {<div class="ha-handto">@hand.Item2</div>
}</td>
<td class="ha-handperson">@hand.Item3</td>
</tr>
}
</table>
</div>
</div>
}
@if (Model.ParsedEdits != null) {
@foreach (var edit in Model.ParsedEdits) {
@Html.Raw(edit)
}
<div class="ha-edits">
<div class="ha-editstitle">Textkritische Anmerkungen</div>
<div class="ha-editentries">
<table>
@foreach (var edit in Model.ParsedEdits) {
<tr>
<td>
<div class="ha-editfrom">@edit.Item1</div>
@if (!String.IsNullOrEmpty(edit.Item2)) {
<div class="ha-editto">@edit.Item2</div>
}
</td>
<td class="ha-editreference">@Html.Raw(@edit.Item3)</td>
<td class="ha-editreas">@Html.Raw(@edit.Item4)</td>
</tr>
}
</table>
</div>
</div>
}
</div>
</div>

View File

@@ -1,3 +1,3 @@
<div class="ha-footer ">
<div class="ha-footer">
<a href="/Edition/Kontakt">Kontakt</a> · <a href="/Edition/Datenschutzerklaerung">Datenschutzerklärung</a>
</div>

View File

@@ -28,15 +28,20 @@
</head>
<body class="w-full h-full">
<body class="w-full ">
<div class="relative min-h-screen">
<div class="pb-24">
@await Html.PartialAsync("/Views/Shared/_Menu.cshtml")
<main role="main" class="pb-3 w-full desktop:max-w-screen-desktop mx-auto">
@RenderBody()
</main>
@await Html.PartialAsync("/Views/Shared/_Footer.cshtml")
</div>
<div class="absolute bottom-0 w-full">
@await Html.PartialAsync("/Views/Shared/_Footer.cshtml")
</div>
</div>
<environment exclude="Development">
@await Html.PartialAsync("/Views/Shared/_Javascript.cshtml")
</environment>

View File

@@ -12,6 +12,21 @@
<div class="ha-metadatadate">
@Model.Meta.Date
</div>
@if (Model.ParsedZHString != null) {
<div class="ha-tooltip">
<div class="ha-pill">
<span>@Model.ParsedZHString</span>
</div>
</div>
}
else {
<div class="ha-tooltip">
<div class="ha-pill">
<span>Neu</span>
</div>
</div>
}
@if (Model.Meta.hasOriginal != HaDocument.Models.OptionalBool.True) {
<div class="ha-tooltip">
<div class="ha-pill">
@@ -38,8 +53,8 @@
<div class="ha-pill">
<span class="ha-cross">geprüft</span>
</div>
<div class="ha-tooltiptext">
Nicht textkritisch geprüft
<div class="ha-tooltiptext whitespace-nowrap">
Noch nicht textkritisch geprüft
</div>
</div>
}
@@ -48,18 +63,29 @@
<div class="ha-pill">
geprüft
</div>
<div class="ha-tooltiptext">
<div class="ha-tooltiptext whitespace-nowrap">
Textkritisch geprüft
</div>
</div>
}
@if (Model.Meta.ZH != null && Model.Meta.ZH.dateChanged) {
<div class="ha-tooltip">
<div class="ha-pill">
neu datiert
</div>
<div class="ha-tooltiptext whitespace-nowrap" style="margin-left: -165px;">
Der Brief wurde gegenüber der Ausgabe ZH neu datiert
</div>
</div>
}
@if (Model.HasMarginals) {
<div class="ha-tooltip">
<div class="ha-pill">
Komm
</div>
<div class="ha-tooltiptext">
<div class="ha-tooltiptext whitespace-nowrap">
Mit Stellenkommentar
</div>
</div>
@@ -70,7 +96,7 @@
<span>@Model.ParsedSenders</span>
<div class="ha-tooltip">
<div class="ha-tooltiptext">
<div class="ha-tooltiptext" style="bottom: 100%;">
Entwurf
</div>
</div>

View File

@@ -2,4 +2,5 @@
@using HaWeb.Models
@using HaWeb.Settings
@using HaDocument.Models
@using System.Text
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@@ -604,11 +604,11 @@ body {
margin-left: auto;
margin-right: auto;
margin-top: 1rem;
height: 100%;
height: 4rem;
width: 100%;
--tw-bg-opacity: 1;
background-color: rgb(248 250 252 / var(--tw-bg-opacity));
padding: 0.5rem;
padding: 1rem;
text-align: right;
font-family: Libertine, serif;
font-size: 1.125rem;
@@ -623,8 +623,7 @@ body {
@media (min-width: 1190px) {
.ha-footer {
max-width: 1190px;
padding: 2rem;
padding: 1rem;
}
}
@@ -1173,7 +1172,7 @@ body {
}
.ha-letterheader .ha-letterheadernav {
margin-top: 1.75rem;
margin-top: 2.25rem;
display: flex;
flex-grow: 1;
}
@@ -1247,6 +1246,7 @@ body {
flex-wrap: nowrap;
--tw-bg-opacity: 1;
background-color: rgb(248 250 252 / var(--tw-bg-opacity));
padding-bottom: 2rem;
}
.ha-lettertext {
@@ -1259,9 +1259,249 @@ body {
padding-left: 1rem;
padding-right: 1rem;
padding-top: 1rem;
padding-bottom: 1.75rem;
font-family: Libertine, serif;
line-height: 1.48;
font-variant-numeric: oldstyle-nums;
}
.ha-additions .ha-tradition div {
display: inline;
}
.ha-additions .ha-tradition {
max-width: 48rem;
}
.ha-additions {
position: relative;
margin-left: 3rem;
--tw-bg-opacity: 1;
background-color: rgb(248 250 252 / var(--tw-bg-opacity));
padding-left: 1rem;
padding-right: 1rem;
padding-top: 1rem;
font-family: Libertine, serif;
line-height: 1.48;
font-variant-numeric: oldstyle-nums;
}
.ha-additions .ha-app {
display: inline-block !important;
padding-top: 1.5rem;
font-weight: 700;
}
.ha-additions .ha-tradition .ha-app:first-child {
padding-top: 0px;
}
.ha-additions .ha-tradition .ha-tradzhtext {
position: relative;
margin-left: -1rem;
display: block !important;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
padding-left: 1rem;
font-family: Libertine, serif;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-firstline {
border-radius: 0.25rem;
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount {
position: absolute;
left: -8.6rem;
margin-top: 0.25rem;
width: 8rem;
text-align: right;
font-family: Biolinum, sans-serif;
font-size: 0.75rem;
line-height: 1rem;
--tw-numeric-figure: oldstyle-nums;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-zhpage, .ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-zhline {
--tw-bg-opacity: 1;
background-color: rgb(248 250 252 / var(--tw-bg-opacity));
padding-left: 0.25rem;
padding-right: 0.25rem;
padding-bottom: 0.25rem;
font-variant-numeric: normal;
font-variant-caps: all-petite-caps;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-hiddenlinecount {
display: none;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
position: absolute;
right: -28rem;
margin-right: 1rem;
margin-top: 0.25rem;
display: flex;
width: 24rem;
flex-wrap: wrap;
border-radius: 0.125rem;
border-left-width: 2px;
--tw-border-opacity: 1;
border-color: rgb(203 213 225 / var(--tw-border-opacity));
--tw-bg-opacity: 1;
background-color: rgb(248 250 252 / var(--tw-bg-opacity));
padding-left: 0.5rem;
padding-right: 0.25rem;
font-family: Biolinum, sans-serif;
font-size: 0.875rem;
line-height: 1.25rem;
line-height: 1.25;
-webkit-hyphens: auto;
-ms-hyphens: auto;
hyphens: auto;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal {
display: inline-block;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox.ha-expanded-box {
padding-bottom: 0.25rem;
}
.ha-additions .ha-tradition a {
--tw-text-opacity: 1;
color: rgb(51 65 85 / var(--tw-text-opacity));
-webkit-text-decoration-line: underline !important;
text-decoration-line: underline !important;
-webkit-text-decoration-style: dotted;
text-decoration-style: dotted;
}
.ha-additions .ha-tradition a:hover {
--tw-text-opacity: 1;
color: rgb(15 23 42 / var(--tw-text-opacity));
-webkit-text-decoration-style: solid;
text-decoration-style: solid;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal {
padding-right: 1.5rem;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal a {
--tw-text-opacity: 1;
color: rgb(30 41 59 / var(--tw-text-opacity));
-webkit-text-decoration-line: underline !important;
text-decoration-line: underline !important;
-webkit-text-decoration-style: dotted;
text-decoration-style: dotted;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal a:hover {
--tw-text-opacity: 1;
color: rgb(15 23 42 / var(--tw-text-opacity));
-webkit-text-decoration-style: solid;
text-decoration-style: solid;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
position: absolute;
right: -2.5rem;
margin-top: 2px;
display: none;
cursor: pointer;
line-height: 1;
--tw-text-opacity: 1;
color: rgb(71 85 105 / var(--tw-text-opacity));
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box:hover {
--tw-text-opacity: 1;
color: rgb(15 23 42 / var(--tw-text-opacity));
}
@media (min-width: 1190px) {
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
display: block;
}
}
.ha-additions .ha-hands {
padding-top: 1.5rem;
}
.ha-additions .ha-hands .ha-handstitle {
font-weight: 700;
}
.ha-additions .ha-hands .ha-handentries .ha-handfrom, .ha-additions .ha-hands .ha-handentries .ha-handto {
display: inline;
white-space: nowrap;
font-size: 0.875rem;
line-height: 1.25rem;
font-weight: 600;
}
.ha-additions .ha-hands .ha-handentries .ha-handperson {
display: inline;
white-space: nowrap;
padding-left: 1rem;
}
.ha-additions .ha-edits .ha-editstitle {
font-weight: 700;
}
.ha-additions .ha-edits .ha-editentries .ha-editfrom, .ha-additions .ha-edits .ha-editentries .ha-editto {
white-space: nowrap;
padding-left: 0.25rem;
font-size: 0.875rem;
line-height: 1.25rem;
font-weight: 600;
}
.ha-additions .ha-edits .ha-editentries .ha-editreference {
white-space: nowrap;
}
.ha-additions .ha-edits .ha-editentries .ha-editreference div {
display: inline;
}
.ha-additions .ha-edits {
padding-top: 1.5rem;
}
.ha-additions .ha-edits .ha-editstitle {
font-weight: 700;
}
.ha-additions .ha-edits .ha-editentries td {
padding-right: 1rem;
vertical-align: top;
}
.ha-additions .ha-edits .ha-editentries .ha-editreas div {
display: inline;
font-family: Biolinum, sans-serif;
}
.ha-additions .ha-edits .ha-editentries table {
width: 100%;
}
.ha-additions .ha-edits .ha-editentries table tr:nth-child(even) {
--tw-bg-opacity: 1;
background-color: rgb(226 232 240 / var(--tw-bg-opacity));
}
.ha-additions .ha-edits .ha-editentries .ha-editreas .ha-zh * {
font-family: Libertine, serif !important;
}
.hide {
@@ -1339,16 +1579,18 @@ body {
padding-bottom: 0.25rem;
}
.ha-lettertext .ha-marginalbox .ha-marginal:first {
}
.ha-lettertext .ha-marginalbox .ha-marginal {
padding-right: 1.5rem;
}
.ha-lettertext .ha-marginalbox .ha-marginal .ha-text {
}
.ha-lettertext .ha-marginalbox .ha-marginal a {
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
--tw-text-opacity: 1;
color: rgb(30 41 59 / var(--tw-text-opacity));
-webkit-text-decoration-line: underline !important;
text-decoration-line: underline !important;
-webkit-text-decoration-style: dotted;
text-decoration-style: dotted;
}
@@ -1368,7 +1610,7 @@ body {
cursor: pointer;
line-height: 1;
--tw-text-opacity: 1;
color: rgb(71 85 105 / var(--tw-text-opacity));
color: rgb(51 65 85 / var(--tw-text-opacity));
}
.ha-lettertext .ha-btn-collapsed-box:hover {
@@ -1386,11 +1628,16 @@ body {
/* Classes from .NET */
.ha-up {
position: relative;
top: -0.75rem;
}
.ha-bzg {
font-family: Libertine, serif;
font-size: 0.75rem;
line-height: 1rem;
font-weight: 600;
font-family: Libertine, serif !important;
font-size: 0.75rem !important;
line-height: 1rem !important;
font-weight: 600 !important;
}
.ha-text {
@@ -1410,40 +1657,40 @@ body {
font-family: Libertine, serif;
}
.ha-aq, .ha-aq * {
.ha-aq, .ha-aq * :not(.ha-marginal *, .ha-marginal) {
font-family: Biolinum, sans-serif;
}
.ha-ul
.ha-ul * {
.ha-ul, .ha-ul * :not(.ha-marginal *, .ha-marginal) {
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
}
.ha-del, .ha-del * {
.ha-del, .ha-del * :not(.ha-marginal *, .ha-marginal) {
-webkit-text-decoration-line: line-through;
text-decoration-line: line-through;
}
.ha-hand, .ha-hand * {
.ha-hand, .ha-hand * :not(.ha-marginal *, .ha-marginal) {
font-family: Playfair, serif;
font-size: 0.9rem;
}
.ha-added, .ha-added * {
.ha-added, .ha-added * :not(.ha-marginal *, .ha-marginal) {
border-radius: 0.125rem;
--tw-bg-opacity: 1;
background-color: rgb(203 213 225 / var(--tw-bg-opacity));
padding-left: 0.25rem;
padding-right: 0.25rem;
}
.ha-note, .ha-note * {
.ha-note, .ha-note * :not(.ha-marginal *, .ha-marginal) {
font-style: italic;
--tw-text-opacity: 1;
color: rgb(51 65 85 / var(--tw-text-opacity));
}
.ha-sup, .ha-sup * {
.ha-sup {
position: relative;
top: -0.3em;
font-size: 80%;
@@ -1470,7 +1717,7 @@ body {
line-height: 1;
}
.ha-ful, .ha-ful * {
.ha-ful, .ha-ful * :not(.ha-marginal *, .ha-marginal) {
display: inline;
border-bottom-width: 1px;
--tw-border-opacity: 1;
@@ -1478,16 +1725,18 @@ body {
padding-bottom: 2px;
}
.ha-dul, .ha-dul * {
.ha-dul, .ha-dul * :not(.ha-marginal *, .ha-marginal) {
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
-webkit-text-decoration-style: double;
text-decoration-style: double;
}
.ha-tul, .ha-tul * {
.ha-tul, .ha-tul * :not(.ha-marginal *, .ha-marginal) {
border-bottom-width: 3px;
border-style: double;
--tw-border-opacity: 1;
border-color: rgb(0 0 0 / var(--tw-border-opacity));
-webkit-text-decoration-line: underline;
text-decoration-line: underline;
}
@@ -1692,11 +1941,23 @@ body {
position: static;
}
.absolute {
position: absolute;
}
.relative {
position: relative;
}
.sticky {
position: -webkit-sticky;
position: sticky;
}
.bottom-0 {
bottom: 0px;
}
.my-8 {
margin-top: 2rem;
margin-bottom: 2rem;
@@ -1744,14 +2005,14 @@ body {
display: none;
}
.h-full {
height: 100%;
}
.h-8 {
height: 2rem;
}
.min-h-screen {
min-height: 100vh;
}
.w-full {
width: 100%;
}
@@ -1855,6 +2116,10 @@ body {
padding-right: 0.75rem;
}
.pb-24 {
padding-bottom: 6rem;
}
.pb-3 {
padding-bottom: 0.75rem;
}
@@ -2159,8 +2424,9 @@ body {
}
.ha-tooltip .ha-tooltiptext {
white-space: nowrap;
visibility: hidden;
width: 160px;
min-width: 160px;
bottom: 155%;
left: 50%;
margin-left: -80px;

View File

@@ -122,7 +122,7 @@
}
.ha-footer {
@apply bg-slate-50 w-full h-full desktop:max-w-screen-desktop mx-auto mt-4 p-2 md:p-4 desktop:p-8 text-lg font-serif text-right
@apply bg-slate-50 w-full h-16 mx-auto mt-4 p-4 md:p-4 desktop:p-4 text-lg font-serif text-right
}
.ha-footer a {
@@ -380,7 +380,7 @@
}
.ha-letterheader .ha-letterheadernav {
@apply mt-7 flex grow
@apply mt-9 flex grow
}
.ha-letterheader .ha-lettertabs {
@@ -412,21 +412,150 @@
}
.ha-letterbody {
@apply flex flex-row flex-nowrap bg-slate-50
@apply flex flex-row flex-nowrap bg-slate-50 pb-8
}
.ha-lettertext {
@apply shrink-0 border-l-2 ml-12 px-4 pt-4 relative font-serif leading-[1.48] pb-7 bg-slate-50
@apply shrink-0 border-l-2 ml-12 px-4 pt-4 relative font-serif leading-[1.48] bg-slate-50 numeric-mediaeval
}
.ha-additions .ha-tradition div {
@apply inline
}
.ha-additions .ha-tradition {
@apply max-w-3xl
}
.ha-additions {
@apply ml-12 px-4 pt-4 relative font-serif leading-[1.48] bg-slate-50 numeric-mediaeval
}
.ha-additions .ha-app {
@apply !inline-block font-bold pt-6
}
.ha-additions .ha-tradition .ha-app:first-child {
@apply pt-0
}
.ha-additions .ha-tradition .ha-tradzhtext {
@apply !block font-serif relative w-fit -ml-4 pl-4
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-firstline {
@apply shadow rounded
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount {
@apply absolute -left-[8.6rem] text-right w-32 text-xs oldstyle-nums mt-1 font-sans
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-zhpage,
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-zhline {
@apply px-1 pb-1 bg-slate-50 caps-allpetite normal-nums
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-linecount .ha-hiddenlinecount {
@apply hidden
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
@apply absolute -right-[28rem] w-[24rem] text-sm border-l-2 border-slate-300 leading-tight pl-2 bg-slate-50 mr-4 pr-1 hyphenate mt-1 rounded-sm font-sans flex flex-wrap
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal {
@apply inline-block
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox.ha-expanded-box {
@apply pb-1
}
.ha-additions .ha-tradition a {
@apply !underline decoration-dotted hover:decoration-solid text-slate-700 hover:text-slate-900
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal {
@apply pr-6
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox .ha-marginal a {
@apply !underline decoration-dotted hover:decoration-solid text-slate-800 hover:text-slate-900
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
@apply hidden desktop:block absolute text-slate-600 hover:text-slate-900 cursor-pointer -right-[2.5rem] leading-none mt-[2px]
}
.ha-additions .ha-hands {
@apply pt-6
}
.ha-additions .ha-hands .ha-handstitle {
@apply font-bold
}
.ha-additions .ha-hands .ha-handentries .ha-handfrom,
.ha-additions .ha-hands .ha-handentries .ha-handto {
@apply inline text-sm font-semibold whitespace-nowrap
}
.ha-additions .ha-hands .ha-handentries .ha-handperson {
@apply inline pl-4 whitespace-nowrap
}
.ha-additions .ha-edits .ha-editstitle {
@apply font-bold
}
.ha-additions .ha-edits .ha-editentries .ha-editfrom,
.ha-additions .ha-edits .ha-editentries .ha-editto {
@apply text-sm font-semibold pl-1 whitespace-nowrap
}
.ha-additions .ha-edits .ha-editentries .ha-editreference {
@apply whitespace-nowrap
}
.ha-additions .ha-edits .ha-editentries .ha-editreference div {
@apply inline
}
.ha-additions .ha-edits {
@apply pt-6
}
.ha-additions .ha-edits .ha-editstitle {
@apply font-bold
}
.ha-additions .ha-edits .ha-editentries td {
@apply pr-4 align-top
}
.ha-additions .ha-edits .ha-editentries .ha-editreas div {
@apply inline font-sans
}
.ha-additions .ha-edits .ha-editentries table {
@apply w-full
}
.ha-additions .ha-edits .ha-editentries table tr:nth-child(even) {
@apply bg-slate-200
}
.ha-additions .ha-edits .ha-editentries .ha-editreas .ha-zh * {
@apply !font-serif
}
.hide {
@apply hidden
}
.ha-rightsidebar {
@apply shrink-0 grow basis-1/3
}
.ha-lettertext div {
@apply inline
}
@@ -460,20 +589,20 @@
@apply pb-1
}
.ha-lettertext .ha-marginalbox .ha-marginal:first {
}
.ha-lettertext .ha-marginalbox .ha-marginal {
@apply pr-6
}
.ha-lettertext .ha-marginalbox .ha-marginal .ha-text {
}
.ha-lettertext .ha-marginalbox .ha-marginal a {
@apply underline decoration-dotted hover:decoration-solid hover:text-slate-900
@apply !underline decoration-dotted hover:decoration-solid text-slate-800 hover:text-slate-900
}
.ha-lettertext .ha-btn-collapsed-box {
@apply hidden desktop:block absolute text-slate-600 hover:text-slate-900 cursor-pointer -right-[2.5rem] leading-none mt-[2px]
@apply hidden desktop:block absolute text-slate-700 hover:text-slate-900 cursor-pointer -right-[2.5rem] leading-none mt-[2px]
}
@@ -481,8 +610,13 @@
/* Classes from .NET */
.ha-up {
@apply -top-3 relative
}
.ha-bzg {
@apply font-serif text-xs font-semibold
@apply !font-serif !text-xs !font-semibold
}
.ha-text {
@@ -502,37 +636,36 @@
}
.ha-aq,
.ha-aq * {
.ha-aq * :not(.ha-marginal *, .ha-marginal) {
@apply font-sans
}
.ha-ul
.ha-ul * {
.ha-ul,
.ha-ul * :not(.ha-marginal *, .ha-marginal) {
@apply underline
}
.ha-del,
.ha-del * {
.ha-del * :not(.ha-marginal *, .ha-marginal) {
@apply line-through
}
.ha-hand,
.ha-hand * {
.ha-hand * :not(.ha-marginal *, .ha-marginal) {
@apply font-classy text-[0.9rem]
}
.ha-added,
.ha-added * {
@apply bg-slate-300 px-1
.ha-added * :not(.ha-marginal *, .ha-marginal) {
@apply bg-slate-300 px-1 rounded-sm
}
.ha-note,
.ha-note * {
.ha-note * :not(.ha-marginal *, .ha-marginal) {
@apply italic text-slate-700
}
.ha-sup,
.ha-sup * {
.ha-sup {
@apply relative -top-[0.3em] text-[80%]
}
@@ -546,18 +679,18 @@
}
.ha-ful,
.ha-ful * {
.ha-ful * :not(.ha-marginal *, .ha-marginal) {
@apply inline border-b border-black pb-[2px]
}
.ha-dul,
.ha-dul * {
.ha-dul * :not(.ha-marginal *, .ha-marginal) {
@apply underline decoration-double
}
.ha-tul,
.ha-tul * {
@apply underline border-b-[3px] border-double
.ha-tul * :not(.ha-marginal *, .ha-marginal) {
@apply underline border-b-[3px] border-double border-black
}
.up {
@@ -807,8 +940,9 @@ body {
}
.ha-tooltip .ha-tooltiptext {
white-space: nowrap;
visibility: hidden;
width: 160px;
min-width: 160px;
bottom: 155%;
left: 50%;
margin-left: -80px;