Fixed marginals; fixed Tables

This commit is contained in:
schnulller
2022-05-31 21:05:55 +02:00
parent 72a9e61065
commit 1bfc24cec5
14 changed files with 5483 additions and 425 deletions

View File

@@ -60,10 +60,15 @@ public class Briefecontroller : Controller
if (prevmeta != null) model.MetaData.Prev = (generateMetaViewModel(prevmeta, false), url + prevmeta.Autopsic);
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).sb_tradition.ToString();
if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) {
var parsedTraditions = HaWeb.HTMLHelpers.LetterHelpers.CreateTraditions(_lib, _readerService, marginals, tradition, hands, editreasons);
(model.ParsedTradition, model.ParsedMarginals, model.MinWidthTrad) = (parsedTraditions.sb_tradition.ToString(), parsedTraditions.ParsedMarginals, parsedTraditions.minwidth);
}
if (text != null && !String.IsNullOrWhiteSpace(text.Element)) {
var parsedLetter = HaWeb.HTMLHelpers.LetterHelpers.CreateLetter(_lib, _readerService, meta, text, marginals, hands, editreasons);
(model.ParsedText, model.ParsedMarginals, model.MinWidth) = (parsedLetter.sb_lettertext.ToString(), parsedLetter.ParsedMarginals, parsedLetter.minwidth);
(model.ParsedText, model.MinWidth) = (parsedLetter.sb_lettertext.ToString(), parsedLetter.minwidth);
if (model.ParsedMarginals != null && parsedLetter.ParsedMarginals != null) model.ParsedMarginals.AddRange(parsedLetter.ParsedMarginals);
else model.ParsedMarginals = parsedLetter.ParsedMarginals;
if (parsedLetter.Startline != "-1" && parsedLetter.Startline != "1" && model.MetaData.ParsedZHString != null)
model.MetaData.ParsedZHString += " / " + parsedLetter.Startline;
if (model.ParsedText == null || String.IsNullOrWhiteSpace(model.ParsedText))

View File

@@ -23,10 +23,10 @@ public static class LetterHelpers
return letterState;
}
public static TraditionState CreateTraditions(ILibrary lib, IReaderService readerService, IEnumerable<Marginal>? marginals, Tradition tradition)
public static TraditionState CreateTraditions(ILibrary lib, IReaderService readerService, IEnumerable<Marginal>? marginals, Tradition tradition, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits)
{
var rd = readerService.RequestStringReader(tradition.Element);
var traditionState = new TraditionState(lib, rd, readerService, marginals);
var traditionState = new TraditionState(lib, rd, readerService, marginals, hands, edits);
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();

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ public class BriefeViewModel
public string? ParsedText { get; set; }
public string? ParsedTradition { get; set; }
public bool MinWidth { get; set; } = false;
public bool MinWidthTrad { get; set; } = false;
// From, Until, Reference, Edit, sartpage, startline
public List<(string, string, string, string, string, string)>? ParsedEdits

View File

@@ -36,9 +36,7 @@ Briefe beim Namen
- GND Normdaten der Namen
TODO 367 684 708 tabellen, min-size für ha-lettertext
TODO 682 kein word-wrap, max-size für ha-lettertext
TODO Regeln nach tradition übertragen, mit min-width
TODO tabellen ok, ausser 939: dort sind htabs geschachtelt
TODO Word-wrap before align, tabs
TODO blinken before js

View File

@@ -55,6 +55,7 @@ public static class CSSClasses {
public const string EMPHCLASS = "ha-emph";
public const string APPCLASS = "ha-app";
public const string MARGINGALBOXCLASS = "ha-marginalbox";
public const string MARGINALLISTCLASS = "ha-marginallist";
public const string TRADLINECOUNTCLASS = "ha-tradlinecount";
public const string TRADCOMMENTCOLUMNCLASS = "ha-tradcommentcolumn";
public const string TRADZHTEXTCLASS = "ha-tradzhtext";

View File

@@ -44,6 +44,7 @@ public class LetterRules
private static readonly string EMPHCLASS = HaWeb.Settings.CSSClasses.EMPHCLASS;
private static readonly string APPCLASS = HaWeb.Settings.CSSClasses.APPCLASS;
private static readonly string MARGINGALBOXCLASS = HaWeb.Settings.CSSClasses.MARGINGALBOXCLASS;
private static readonly string MARGINALLISTCLASS = HaWeb.Settings.CSSClasses.MARGINALLISTCLASS;
// Zeilen:
private static readonly string ZHLINECLASS = HaWeb.Settings.CSSClasses.ZHLINECLASS;
@@ -254,6 +255,7 @@ public class LetterRules
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTMARKERCLASS, "ma-" + reader.State.currpage + "-" + reader.State.currline));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINGALBOXCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALLISTCLASS));
foreach (var marginal in margs)
{
// In Marginal, the Root-Element (<marginal>) is somehow parsed,
@@ -266,6 +268,7 @@ public class LetterRules
rd.Read();
}
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.ParsedMarginals.Add((reader.State.currpage, reader.State.currline, sb2.ToString()));
}
}

View File

@@ -1,5 +1,6 @@
namespace HaWeb.Settings.ParsingRules;
using System.Text;
using System.Web;
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>;
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>;
@@ -61,6 +62,7 @@ public static class TraditionRules
private static readonly string SUBSECTIONCLASS = HaWeb.Settings.CSSClasses.SUBSECTIONCLASS;
private static readonly string TRADITIONCLASS = HaWeb.Settings.CSSClasses.TRADITIONCLASS;
private static readonly string MARGINALCLASS = HaWeb.Settings.CSSClasses.MARGINALCLASS;
private static readonly string MARGINALLISTCLASS = HaWeb.Settings.CSSClasses.MARGINALLISTCLASS;
private static readonly string LETTERCLASS = HaWeb.Settings.CSSClasses.LETTERCLASS;
// Tradition-spezifische Elemente
@@ -78,16 +80,22 @@ public static class TraditionRules
// Parsing Rules for Letters
// General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons)
public static readonly TagFuncList OTagRules = new TagFuncList() {
( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS)) ),
( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNRIGHTCLASS)) ),
( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS));
reader.State.mustwrap = (true, true);
} ),
( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNRIGHTCLASS));
reader.State.mustwrap = (true, true);
}),
( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ADDEDCLASS)) ),
( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS)) ),
( ( x, _) => x.Name == "sal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS));
reader.State.mustwrap = (true, true);
}),
( ( 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, DELCLASS));
reader.State.active_del = true;
}),
( ( x, _) => x.Name == "del", (sb, tag, reader) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, DELCLASS)) ),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NRCLASS)) ),
( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, NOTECLASS)) ),
( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ULCLASS)) ),
@@ -98,44 +106,66 @@ public static class TraditionRules
( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, UPCLASS)) ),
( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBCLASS)) ),
( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TULCLASS)) ),
( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HEADERCLASS)) ),
( ( x, _) => x.Name == "header", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HEADERCLASS));
reader.State.mustwrap = (true, true);
}),
( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS)) ),
( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ENTRYCLASS)) ),
( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ),
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, BZGCLASS)) ),
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHCLASS)) ),
( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EMPHCLASS)); } ),
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, APPCLASS)); } ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SUBSECTIONCLASS, tag["id"])) ),
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTCLASS, tag["id"])) ),
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EDITREASONCLASS)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LETTERCLASS)) ),
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TRADITIONCLASS)) ),
( ( x, _) => x.Name == "marginal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS, "m-" + tag["index"]));
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
}),
( ( x, _) => x.Name == "hand", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDCLASS)) ),
( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS)) ),
( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]))),
( ( x, _) => x.Name == "tabs", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS));
// Tabs work with percentages, so we need a static width of the conttainer:
reader.State.minwidth = true;
} ),
( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, reader) => {
reader.State.mustwrap = (true, true);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABCLASS + tag["value"]));
}),
( ( x, _) => x.Name == "edit" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, EDITMARKERCLASS, "ea-" + tag["ref"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}),
( ( x, _) => x.Name == "hand", (sb, tag, _) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDMARKERCLASS, "ha-" + tag["ref"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, HANDCLASS));
}),
// Tradition specific:
// 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)) ),
( ( x, _) => x.Name == "align", (sb, tag, reader) => {
reader.State.mustwrap = (true, true);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}),
( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "sal", (sb, tag, reader) => {
reader.State.mustwrap = (true, true);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}),
( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "del", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.active_del = false; // TODO SMTH IS FISHY HERE!
}),
( ( x, _) => x.Name == "del", (sb, tag, reader) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
@@ -146,13 +176,17 @@ public static class TraditionRules
( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "header", (sb, tag, reader) => {
reader.State.mustwrap = (true, true);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}),
( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
@@ -160,113 +194,124 @@ public static class TraditionRules
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "tab", (sb, tag, reader) => {
reader.State.mustwrap = (true, true);
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) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TEXTCLASS));
if (reader.State.active_del)
sb.Append(txt.Value.Replace("", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\"></" + DEFAULTELEMENT + ">"));
if (reader.OpenTags.Where(x => x.Name == "del").Any())
sb.Append(HttpUtility.HtmlEncode(txt.Value).Replace("", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\"></" + DEFAULTELEMENT + ">"));
else
sb.Append(txt.Value);
sb.Append(HttpUtility.HtmlEncode(txt.Value));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
})};
public static readonly TagFuncList STagRules = new TagFuncList() {
( (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
// Tradition specific: only do this if in ZHText
if(!String.IsNullOrWhiteSpace(tag["tab"]) || !String.IsNullOrWhiteSpace(tag["type"])) {
reader.State.mustwrap = (false, true);
}
// Tradition specific: only 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(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHPAGECLASS + " " + FIRSTLINECLASS, ""));
sb.Append("S." + "&nbsp;");
if (tag["index"] != "1")
sb.Append(reader.State.currpage + "&thinsp;/&thinsp;" + tag["index"]);
// This is NOT the beginning of the text, so we set a br, and then, linecount
if(reader.State.currline != "-1") {
if (!reader.State.mustwrap.Item2)
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS));
else
sb.Append(reader.State.currpage);
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));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br"));
reader.State.mustwrap = (false, false);
// Linecount
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
if(!String.IsNullOrWhiteSpace(tag["index"])) {
reader.State.currline = tag["index"];
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 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"]);
// 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));
}
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
} else if (reader.State.currline == "-1" && !String.IsNullOrWhiteSpace(tag["index"])) {
reader.State.Startline = tag["index"];
reader.State.currline = tag["index"];
// Tradition specifics: the first linecount must be shown
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ZHLINECOUNTCLASS + " " + FIRSTLINECLASS, reader.State.currpage + "-" + reader.State.currline));
sb.Append("S. " + reader.State.currpage + "&thinsp;/&thinsp;" + reader.State.currline);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}
// Marginalien
if(reader.State.Marginals != null) {
// Marginalien, only for lines with a linenumber
if(reader.State.Marginals != null && !String.IsNullOrWhiteSpace(tag["index"])) {
var margs = reader.State.Marginals.Where(x => x.Page == reader.State.currpage && x.Line == reader.State.currline);
if (margs != null && margs.Any())
{
if(reader.State.ParsedMarginals == null) reader.State.ParsedMarginals = new List<(string, string, string)>();
var sb2 = new StringBuilder();
margs = margs.OrderBy(x => Int32.Parse(x.Index));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTMARKERCLASS, "ma-" + reader.State.currpage + "-" + reader.State.currline));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINGALBOXCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALLISTCLASS));
foreach (var marginal in margs)
{
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTMARKERCLASS, marginal.Index));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
// 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();
}
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);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>(reader.State, rd, sb2, TraditionRules.OTagRules, null, TraditionRules.CTagRules, TraditionRules.TextRules, TraditionRules.WhitespaceRules);
new HaWeb.HTMLHelpers.LinkHelper(reader.State.Lib, rd, sb2, false);
rd.Read();
}
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.ParsedMarginals.Add((reader.State.currpage, reader.State.currline, sb2.ToString()));
}
}
// Line type=line
if(tag["type"] == "line") {
// Line type=line
if(tag["type"] == "line") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.mustwrap = (false, true);
}
// Line tab=
if(!String.IsNullOrWhiteSpace(tag["tab"])) {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINEINDENTCLASS + tag["tab"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
if (tag["tab"] != "1") reader.State.mustwrap = (false, true);
}
}

View File

@@ -11,36 +11,45 @@ public class TraditionState : HaWeb.HTMLParser.IState {
internal IReaderService ReaderService;
internal IEnumerable<Marginal>? Marginals;
internal IEnumerable<Hand>? Hands;
internal IEnumerable<Editreason>? Edits;
internal bool active_del;
// State
// Must we skip all of the upcoming whitespace?
internal bool active_skipwhitespace;
internal bool active_firstedit;
// Is there a semantically important line break, left or right of the current line?
internal (bool, bool) mustwrap;
// What's the current line?
internal string currline;
// What's the current page?
internal string currpage;
// Does the container need a min-widt, so percentages are useful (tables)
internal bool minwidth;
// Is there an active_zhtext
internal bool active_trad;
internal StringBuilder sb_tradition; // Überlieferung
internal StringBuilder sb_trad_zhtext; // Überlieferung, ZHText
internal List<(string, string, string)>? ParsedMarginals;
internal string Startline;
internal IReader rd_tradition;
public TraditionState(ILibrary lib, IReader reader, IReaderService readerService, IEnumerable<Marginal>? marginals)
public TraditionState(ILibrary lib, IReader reader, IReaderService readerService, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits)
{
Lib = lib;
rd_tradition = reader;
Marginals = marginals;
ReaderService = readerService;
Hands = hands;
Edits = edits;
SetupState();
}
public void SetupState() {
sb_tradition = new StringBuilder();
sb_trad_zhtext = new StringBuilder();
active_trad = false;
active_del = false;
active_skipwhitespace = true;
active_firstedit = true;
currline = "-1";
currpage = "";
}

View File

@@ -3,6 +3,9 @@
var minwidth = "";
if (Model.MinWidth)
minwidth = "ha-minwidth";
var minwidthtrads = "";
if (Model.MinWidthTrad)
minwidthtrads = "ha-minwidth";
}
<div class="ha-twilighttogglebar">
<div class="ha-letterheader">
@@ -86,11 +89,13 @@
}
<div class="ha-additions" id="ha-additions">
<div class="@minwidthtrads">
@if (Model.ParsedTradition != null)
{
@Html.Raw(Model.ParsedTradition)
}
</div>
@if (Model.ParsedHands != null && Model.ParsedHands.Any())
{
<div class="ha-hands">

View File

@@ -96,17 +96,17 @@
<div class="ha-metadatapersons">
@if (!String.IsNullOrWhiteSpace(Model.ParsedReceivers)) {
@if (Model.Meta.isDraft == HaDocument.Models.OptionalBool.True) {
<span>@Model.ParsedSenders</span>
<span>@Html.Raw(Model.ParsedSenders)</span>
<div class="ha-tooltip">
<div class="ha-tooltiptext" style="bottom: 100%;">
Entwurf
</div>
</div>
<span>@Model.ParsedReceivers</span>
<span>@Html.Raw(Model.ParsedReceivers)</span>
}
else {
<span>@Model.ParsedSenders → @Model.ParsedReceivers</span>
<span>@Html.Raw(Model.ParsedSenders) → @Html.Raw(Model.ParsedReceivers)</span>
}
}
</div>

View File

@@ -1390,16 +1390,6 @@ body {
}
}
.ha-lettertext.ha-minwidth {
min-width: 38rem;
}
@media (min-width: 1190px) {
.ha-lettertext.ha-minwidth {
min-width: 45rem;
}
}
.ha-marginals {
position: relative;
margin-left: 1rem;
@@ -1510,51 +1500,6 @@ body {
hyphens: none;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
position: absolute;
right: -20rem;
margin-top: 0.25rem;
display: none;
width: 19rem;
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;
}
@media (min-width: 960px) {
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
display: flex;
}
}
@media (min-width: 1190px) {
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
right: -26rem;
width: 23rem;
}
}
.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 {
-webkit-text-decoration-line: underline !important;
text-decoration-line: underline !important;
@@ -1567,50 +1512,6 @@ body {
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 {
-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 {
-webkit-text-decoration-style: solid;
text-decoration-style: solid;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
position: absolute;
right: -0.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: 960px) {
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
display: block;
}
}
@media (min-width: 1190px) {
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
right: -2.5rem;
}
}
.ha-additions .ha-hands {
padding-top: 1.5rem;
}
@@ -1814,21 +1715,29 @@ body {
display: none !important;
}
.ha-lettertext .ha-marginalbox {
.ha-tradzhtext .ha-marginal::before, .ha-lettertext .ha-marginal:before {
position: absolute;
right: -20rem;
top: 0.1rem;
bottom: 0.1rem;
left: 0px;
width: 0.125rem;
--tw-bg-opacity: 1;
background-color: rgb(148 163 184 / var(--tw-bg-opacity));
--tw-content: '';
content: var(--tw-content);
}
.ha-tradzhtext .ha-marginalbox, .ha-lettertext .ha-marginalbox {
position: absolute;
left: 100%;
margin-left: 1.5rem;
margin-top: 0.25rem;
display: none;
width: 19rem;
flex-wrap: wrap;
width: 16rem;
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;
@@ -1839,49 +1748,57 @@ body {
}
@media (min-width: 960px) {
.ha-lettertext .ha-marginalbox {
display: flex;
.ha-tradzhtext .ha-marginalbox, .ha-lettertext .ha-marginalbox {
display: block;
}
}
@media (min-width: 1190px) {
.ha-lettertext .ha-marginalbox {
right: -26rem;
width: 23rem;
.ha-tradzhtext .ha-marginalbox, .ha-lettertext .ha-marginalbox {
width: 24rem;
}
}
.ha-lettertext .ha-marginalbox .ha-marginal {
display: inline-block;
.ha-tradzhtext .ha-marginalbox.ha-expanded-box .ha-marginallist, .ha-lettertext .ha-marginalbox.ha-expanded-box .ha-marginallist {
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-lettertext .ha-marginalbox.ha-expanded-box {
padding-bottom: 0.25rem;
.ha-tradzhtext .ha-marginalbox .ha-marginallist, .ha-lettertext .ha-marginalbox .ha-marginallist {
display: flex;
flex-wrap: wrap;
-moz-column-gap: 1rem;
column-gap: 1rem;
font-size: 0.875rem;
line-height: 1.25rem;
line-height: 1.25;
}
.ha-lettertext .ha-marginalbox .ha-marginal {
padding-right: 1.5rem;
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal, .ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal {
position: relative;
display: inline;
flex-grow: 1;
padding-left: 0.5rem;
}
.ha-lettertext .ha-marginalbox .ha-marginal .ha-text {
}
.ha-lettertext .ha-marginalbox .ha-marginal a {
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal a, .ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal a {
-webkit-text-decoration-line: underline !important;
text-decoration-line: underline !important;
-webkit-text-decoration-style: dotted;
text-decoration-style: dotted;
}
.ha-lettertext .ha-marginalbox .ha-marginal a:hover {
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal a:hover, .ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal a:hover {
-webkit-text-decoration-style: solid;
text-decoration-style: solid;
}
.ha-lettertext .ha-btn-collapsed-box {
.ha-tradzhtext .ha-btn-collapsed-box, .ha-lettertext .ha-btn-collapsed-box {
position: absolute;
right: -0.5rem;
margin-top: 2px;
left: 100%;
margin-left: 1rem;
margin-top: 0.125rem;
display: none;
cursor: pointer;
line-height: 1;
@@ -1889,23 +1806,40 @@ body {
color: rgb(51 65 85 / var(--tw-text-opacity));
}
.ha-lettertext .ha-btn-collapsed-box:hover {
.ha-tradzhtext .ha-btn-collapsed-box:hover, .ha-lettertext .ha-btn-collapsed-box:hover {
--tw-text-opacity: 1;
color: rgb(15 23 42 / var(--tw-text-opacity));
}
@media (min-width: 960px) {
.ha-lettertext .ha-btn-collapsed-box {
.ha-tradzhtext .ha-btn-collapsed-box, .ha-lettertext .ha-btn-collapsed-box {
display: block;
}
}
.ha-minwidth .ha-tradzhtext, .ha-lettertext.ha-minwidth {
min-width: 38rem;
}
@media (min-width: 1190px) {
.ha-lettertext .ha-btn-collapsed-box {
right: -2.5rem;
.ha-minwidth .ha-tradzhtext, .ha-lettertext.ha-minwidth {
min-width: 55rem;
}
}
.ha-minwidth .ha-tradzhtext .ha-alignright, .ha-lettertext.ha-minwidth .ha-alignright {
float: right;
margin-right: 20%;
}
.ha-lettertext.ha-minwidth .ha-aligncenter {
position: absolute;
left: 33.333333%;
--tw-translate-x: -50%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
white-space: nowrap;
}
/* Classes from the General parser */
/* Classes from .NET */
@@ -2301,16 +2235,16 @@ body {
.ha-collapsed-box {
z-index: 0;
cursor: default;
overflow: hidden;
text-overflow: ellipsis;
}
.ha-expanded-box {
z-index: 1000;
height: auto !important;
max-height: 100vh !important;
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
padding-bottom: 0.25rem;
}
/* .ha-register .ha-neuzeit .ha-register-body .ha-commenthead .ha-collapsed-box:hover,
@@ -2644,6 +2578,10 @@ body {
font-style: normal;
}
.ha-lettertext .ha-marginalbox:before {
content: "";
}
.ha-lettertext .ha-marginalbox .ha-marginal::after {
content: "";
}

View File

@@ -489,10 +489,6 @@
@apply max-w-[38rem] desktop:max-w-[45rem] sm:shrink-0 sm:border-l-2 ml-4 sm:ml-12 px-4 pt-4 pb-8 relative font-serif leading-[1.48] bg-slate-50 numeric-mediaeval;
}
.ha-lettertext.ha-minwidth {
@apply min-w-[38rem] desktop:min-w-[45rem]
}
.ha-marginals {
@apply max-w-3xl ml-4 md:ml-12 px-4 py-4 relative leading-[1.48] bg-slate-50 numeric-mediaeval;
}
@@ -545,34 +541,10 @@
@apply !block font-serif relative w-fit -ml-4 pl-4 unhyphenate;
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox {
@apply absolute -right-[20rem] desktop:-right-[26rem] w-[19rem] desktop:w-[23rem] text-sm border-l-2 border-slate-300 leading-tight pl-2 bg-slate-50 pr-1 hyphenate mt-1 rounded-sm font-sans hidden md: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
}
.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
}
.ha-additions .ha-tradition .ha-tradzhtext .ha-btn-collapsed-box {
@apply hidden md:block absolute text-slate-600 hover:text-slate-900 cursor-pointer -right-[0.5rem] desktop:-right-[2.5rem] leading-none mt-[2px];
}
.ha-additions .ha-hands {
@apply pt-6;
}
@@ -692,32 +664,53 @@
@apply !hidden;
}
.ha-tradzhtext .ha-marginal::before,
.ha-lettertext .ha-marginal:before {
@apply absolute top-[0.1rem] bottom-[0.1rem] left-0 w-0.5 bg-slate-400 content-['']
}
.ha-tradzhtext .ha-marginalbox,
.ha-lettertext .ha-marginalbox {
@apply absolute -right-[20rem] desktop:-right-[26rem] w-[19rem] desktop:w-[23rem] text-sm border-l-2 border-slate-300 leading-tight pl-2 bg-slate-50 pr-1 hyphenate mt-1 rounded-sm font-sans hidden md:flex flex-wrap;
@apply hidden pl-2 md:block absolute left-full ml-6 mt-1 w-[16rem] desktop:w-[24rem] text-sm leading-tight bg-slate-50 hyphenate rounded-sm font-sans
}
.ha-tradzhtext .ha-marginalbox.ha-expanded-box .ha-marginallist,
.ha-lettertext .ha-marginalbox.ha-expanded-box .ha-marginallist {
@apply shadow-md
}
.ha-tradzhtext .ha-marginalbox .ha-marginallist,
.ha-lettertext .ha-marginalbox .ha-marginallist {
@apply text-sm leading-tight flex flex-wrap gap-x-4
}
.ha-lettertext .ha-marginalbox .ha-marginal {
@apply inline-block;
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal {
@apply pl-2 inline grow relative
}
.ha-lettertext .ha-marginalbox.ha-expanded-box {
@apply pb-1;
}
.ha-lettertext .ha-marginalbox .ha-marginal {
@apply pr-6;
}
.ha-lettertext .ha-marginalbox .ha-marginal .ha-text {
}
.ha-lettertext .ha-marginalbox .ha-marginal a {
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal a,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal a {
@apply !underline decoration-dotted hover:decoration-solid
}
.ha-tradzhtext .ha-btn-collapsed-box,
.ha-lettertext .ha-btn-collapsed-box {
@apply hidden md:block absolute text-slate-700 hover:text-slate-900 cursor-pointer -right-[0.5rem] desktop:-right-[2.5rem] leading-none mt-[2px];
@apply absolute left-full ml-4 hidden md:block text-slate-700 hover:text-slate-900 cursor-pointer leading-none mt-0.5;
}
.ha-minwidth .ha-tradzhtext,
.ha-lettertext.ha-minwidth {
@apply min-w-[38rem] desktop:min-w-[55rem]
}
.ha-minwidth .ha-tradzhtext .ha-alignright,
.ha-lettertext.ha-minwidth .ha-alignright {
@apply float-right mr-[20%];
}
.ha-lettertext.ha-minwidth .ha-aligncenter {
@apply absolute left-1/3 whitespace-nowrap -translate-x-1/2;
}
/* Classes from the General parser */
@@ -926,11 +919,11 @@
}
.ha-collapsed-box {
@apply z-0 overflow-hidden;
@apply z-0 overflow-hidden overflow-ellipsis cursor-default
}
.ha-expanded-box {
@apply shadow-md z-[1000] !h-auto !max-h-screen;
@apply pb-1 z-[1000] !h-auto !max-h-screen;
}
/* .ha-register .ha-neuzeit .ha-register-body .ha-commenthead .ha-collapsed-box:hover,
@@ -939,6 +932,10 @@
} */
}
.ha-lettertext .ha-marginalbox:before {
content: "";
}
.ha-lettertext .ha-marginalbox .ha-marginal::after {
content: "";
}

View File

@@ -48,11 +48,9 @@ const getLineHeight = function (element) {
ret;
temp.setAttribute("class", element.className);
temp.innerHTML = "Ü";
element.parentNode.appendChild(temp);
ret = temp.clientHeight;
ret = temp.getBoundingClientRect().height;
temp.parentNode.removeChild(temp);
return ret;
};
@@ -68,7 +66,7 @@ const uncollapsebox = function (element) {
};
const addbuttoncaollapsebox = function (element, height, hoverfunction) {
const btn = document.createElement("div");
let btn = document.createElement("div");
btn.classList.add("ha-btn-collapsed-box");
if (element.classList.contains("ha-collapsed-box")) {
@@ -125,37 +123,26 @@ const addbuttoncaollapsebox = function (element, height, hoverfunction) {
};
/* TODO: need a resize watcher to undo and reapply the effect on breakpoint */
const overlappingcollapsebox = function (selector, hoverfunction, parentbox) {
const overlappingcollapsebox = function (selector, hoverfunction) {
let boxes = document.querySelectorAll(selector);
let clientrects = [];
let lineheight = 1;
if (boxes.length >= 1) {
lineheight = getLineHeight(boxes[0]);
}
for (element of boxes) {
clientrects.push([element, element.getBoundingClientRect()]);
}
let boundigparent = null;
let pb = null;
if (parentbox !== null) {
pb = document.getElementById(parentbox);
if (pb !== null) {
boundigparent = pb.getBoundingClientRect();
}
}
for (var i = 0; i < clientrects.length; i++) {
if (i < clientrects.length - 1) {
let overlap = clientrects[i][1].bottom - clientrects[i + 1][1].top;
if (overlap >= 0) {
let newlength = clientrects[i][1].height - overlap;
for (var i = 0; i < boxes.length; i++) {
if (i < boxes.length - 1) {
let element = boxes[i];
let thisrect = element.getBoundingClientRect();
let nextrect = boxes[i+1].getBoundingClientRect();
let overlap = thisrect.bottom - nextrect.top;
if (overlap >= 0 && !(window.getComputedStyle(element).display === "none")) {
let newlength = thisrect.height - overlap;
let remainder = newlength % lineheight;
newlength = newlength - remainder - 1;
collapsebox(clientrects[i][0], newlength);
addbuttoncaollapsebox(clientrects[i][0], newlength, hoverfunction);
requestAnimationFrame(() => { collapsebox(element, newlength) });
requestAnimationFrame(() => { addbuttoncaollapsebox(element, newlength, hoverfunction) });
}
}
}
@@ -230,26 +217,12 @@ const get_theme_settings = function(standard) {
}
const collapseboxes = function() {
for (entry of this.document.getElementsByClassName("ha-letlinks")) {
entry.maxHeight = "auto";
let btns = entry.parentNode.getElementsByClassName("ha-btn-collapsed-box");
for (btn of btns) {
btn.remove();
}
}
for (entry of this.document.getElementsByClassName("ha-marginalbox")) {
entry.maxHeight = "auto";
let btns = entry.parentNode.getElementsByClassName("ha-btn-collapsed-box");
for (btn of btns) {
btn.remove();
}
}
overlappingcollapsebox(".ha-neuzeit .ha-letlinks", true);
overlappingcollapsebox(".ha-forschung .ha-letlinks", true);
overlappingcollapsebox(".ha-lettertext .ha-marginalbox", true, "ha-letterbody");
overlappingcollapsebox(".ha-lettertext .ha-marginalbox", true);
}
//////////////////////////////// ONLOAD ////////////////////////////////////
window.addEventListener("load", function () {
// Menu: Show / Hide Buttons for mobile View
@@ -271,9 +244,13 @@ window.addEventListener("load", function () {
if (document.getElementById("ha-register-nav") != null)
markactive_exact(document.getElementById("ha-register-nav"));
// Letter / Register View: Collapse all unfit boxes
// Letter / Register View: Collapse all unfit boxes + resize observer
collapseboxes();
//this.window.addEventListener('resize', collapseboxes);
var doit;
this.window.addEventListener('resize', function() {
this.clearTimeout(doit);
this.setTimeout(collapseboxes, 250);
});
// Letter View: Show / Hide Tabs