From 7929a34f5ad93327d440109a39af45f2d59469e5 Mon Sep 17 00:00:00 2001 From: schnulller Date: Sun, 29 May 2022 20:27:34 +0200 Subject: [PATCH] Added a lot of stuff --- HaWeb/Controllers/BriefeContoller.cs | 6 +- HaWeb/HTMLHelpers/StringHelpers.cs | 2 + HaWeb/Models/BriefeMetaViewModel.cs | 49 +++++++++++-- HaWeb/Models/BriefeViewModel.cs | 65 +++++++++++++++-- HaWeb/Models/RegisterViewModel.cs | 52 +++++++++++--- HaWeb/README.md | 16 ++--- HaWeb/Settings/ParsingRules/EditRules.cs | 6 +- HaWeb/Settings/ParsingRules/LetterRules.cs | 53 +++++++------- HaWeb/Settings/ParsingState/LetterState.cs | 12 +++- HaWeb/Views/Briefe/Index.cshtml | 81 +++++++++++++--------- HaWeb/Views/Shared/_LetterHead.cshtml | 33 +++++---- HaWeb/wwwroot/css/output.css | 31 ++++++--- HaWeb/wwwroot/css/site.css | 10 ++- HaWeb/wwwroot/js/site.js | 35 +++------- 14 files changed, 308 insertions(+), 143 deletions(-) diff --git a/HaWeb/Controllers/BriefeContoller.cs b/HaWeb/Controllers/BriefeContoller.cs index 6bcefbf..1fa28aa 100644 --- a/HaWeb/Controllers/BriefeContoller.cs +++ b/HaWeb/Controllers/BriefeContoller.cs @@ -63,9 +63,11 @@ public class Briefecontroller : Controller if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) model.ParsedTradition = HaWeb.HTMLHelpers.LetterHelpers.CreateTraditions(_lib, _readerService, marginals, tradition).sb_tradition.ToString(); if (text != null && !String.IsNullOrWhiteSpace(text.Element)) { var parsedLetter = HaWeb.HTMLHelpers.LetterHelpers.CreateLetter(_lib, _readerService, meta, text, marginals, hands, editreasons); - (model.ParsedText, model.ParsedMarginals) = (parsedLetter.sb_lettertext.ToString(), parsedLetter.ParsedMarginals); + (model.ParsedText, model.ParsedMarginals, model.MinWidth) = (parsedLetter.sb_lettertext.ToString(), parsedLetter.ParsedMarginals, parsedLetter.minwidth); if (parsedLetter.Startline != "-1" && parsedLetter.Startline != "1" && model.MetaData.ParsedZHString != null) - model.MetaData.ParsedZHString += " / " + parsedLetter.Startline; + model.MetaData.ParsedZHString += " / " + parsedLetter.Startline; + if (model.ParsedText == null || String.IsNullOrWhiteSpace(model.ParsedText)) + model.MetaData.HasText = false; } // Return diff --git a/HaWeb/HTMLHelpers/StringHelpers.cs b/HaWeb/HTMLHelpers/StringHelpers.cs index 1ecc0b9..971a55c 100644 --- a/HaWeb/HTMLHelpers/StringHelpers.cs +++ b/HaWeb/HTMLHelpers/StringHelpers.cs @@ -1,3 +1,5 @@ +using System.Web; + namespace HaWeb.HTMLHelpers; public static class StringHelpers { public static string GetEnumerationString(IEnumerable strlist) diff --git a/HaWeb/Models/BriefeMetaViewModel.cs b/HaWeb/Models/BriefeMetaViewModel.cs index b924ffc..7159f04 100644 --- a/HaWeb/Models/BriefeMetaViewModel.cs +++ b/HaWeb/Models/BriefeMetaViewModel.cs @@ -1,16 +1,55 @@ namespace HaWeb.Models; using HaDocument.Models; - +using System.Web; public class BriefeMetaViewModel { public Meta Meta { get; private set; } public bool HasMarginals { get; private set; } public bool ShowZHData { get; private set; } + public bool HasText { get; set; } = true; + + private string? _ParsedSenders; + private string? _ParsedReceivers; + private string? _ParsedZHString; + + public string? ParsedSenders + { + get => _ParsedSenders; + set + { + if (value != null) + _ParsedSenders = HttpUtility.HtmlEncode(value); + else + _ParsedSenders = value; + } + } + + public string? ParsedReceivers + { + get => _ParsedReceivers; + set + { + if (value != null) + _ParsedReceivers = HttpUtility.HtmlEncode(value); + else + _ParsedReceivers = value; + + } + } + + public string? ParsedZHString + { + get => _ParsedZHString; + set + { + if (value != null) + _ParsedZHString = HttpUtility.HtmlEncode(value); + else + _ParsedZHString = value; + + } + } - public string? ParsedSenders { get; set; } - public string? ParsedReceivers { get; set; } - public string? ParsedZHString { get; set; } - public (BriefeMetaViewModel, string)? Next { get; set; } public (BriefeMetaViewModel, string)? Prev { get; set; } diff --git a/HaWeb/Models/BriefeViewModel.cs b/HaWeb/Models/BriefeViewModel.cs index 65b8206..0ddac81 100644 --- a/HaWeb/Models/BriefeViewModel.cs +++ b/HaWeb/Models/BriefeViewModel.cs @@ -1,4 +1,5 @@ namespace HaWeb.Models; +using System.Web; public class BriefeViewModel { @@ -6,14 +7,70 @@ public class BriefeViewModel public string Index { get; private set; } public BriefeMetaViewModel MetaData { get; private set; } + private List<(string, string, string)>? _ParsedMarginals; + private List<(string, string, string, string, string, string)>? _ParsedEdits; + public List<(string, string, string, string, string)>? _ParsedHands; + public string? ParsedText { get; set; } - public List<(string, string, string)>? ParsedMarginals { get; set; } public string? ParsedTradition { get; set; } + public bool MinWidth { get; set; } = false; + // From, Until, Reference, Edit, sartpage, startline - public List<(string, string, string, string, string, string)>? ParsedEdits { get; set; } + public List<(string, string, string, string, string, string)>? ParsedEdits + { + get => _ParsedEdits; + set + { + if (value != null) + _ParsedEdits = value.Select(x => ( + HttpUtility.HtmlEncode(x.Item1), + HttpUtility.HtmlEncode(x.Item2), + x.Item3, + x.Item4, + HttpUtility.HtmlAttributeEncode(x.Item5), + HttpUtility.HtmlAttributeEncode(x.Item6) + )).ToList(); + else + _ParsedEdits = null; + } + } + // From, Until, Person, startpage, startline - public List<(string, string, string, string, string)>? ParsedHands { get; set; } - + public List<(string, string, string, string, string)>? ParsedHands + { + get => _ParsedHands; + set + { + if (value != null) + _ParsedHands = value.Select(x => ( + HttpUtility.HtmlEncode(x.Item1), + HttpUtility.HtmlEncode(x.Item2), + HttpUtility.HtmlEncode(x.Item3), + HttpUtility.HtmlAttributeEncode(x.Item4), + HttpUtility.HtmlAttributeEncode(x.Item5) + )).ToList(); + else + _ParsedHands = null; + } + } + + // Page, Line, Element + public List<(string, string, string)>? ParsedMarginals + { + get => _ParsedMarginals; + set + { + if (value != null) + _ParsedMarginals = value.Select(x => ( + HttpUtility.HtmlEncode(x.Item1), + HttpUtility.HtmlEncode(x.Item2), + x.Item3 + )).ToList(); + else + _ParsedMarginals = null; + } + } + public BriefeViewModel(string id, string index, BriefeMetaViewModel meta) { Id = id; diff --git a/HaWeb/Models/RegisterViewModel.cs b/HaWeb/Models/RegisterViewModel.cs index 629ebd9..f7e2c82 100644 --- a/HaWeb/Models/RegisterViewModel.cs +++ b/HaWeb/Models/RegisterViewModel.cs @@ -1,20 +1,56 @@ namespace HaWeb.Models; +using System.Web; -public class RegisterViewModel { +public class RegisterViewModel +{ public string Category { get; private set; } public string Id { get; private set; } - public string Title { get; private set; } + public string Title { get; private set; } + + private List<(string, string)>? _AvailableCategories; + private List<(string, string)>? _AvailableSideCategories; public string? Search { get; set; } = null; public bool? MaxSearch { get; set; } = null; public List ParsedComments { get; private set; } - public List<(string, string)>? AvailableCategories { get; set; } = null; - public List<(string, string)>? AvailableSideCategories { get; set; } = null; - public RegisterViewModel(string category, string id, List parsedComments, string title) { - this.Category = category; - this.Id = id; + // Title, URL + public List<(string, string)>? AvailableCategories + { + get => _AvailableCategories; + set + { + if (value != null) + _AvailableCategories = value.Select(x => ( + HttpUtility.HtmlEncode(x.Item1), + HttpUtility.HtmlAttributeEncode(x.Item2)) + ).ToList(); + else + _AvailableCategories = null; + } + } + + // Title, URL + public List<(string, string)>? AvailableSideCategories + { + get => _AvailableSideCategories; + set + { + if (value != null) + _AvailableSideCategories = value.Select(x => ( + HttpUtility.HtmlEncode(x.Item1), + HttpUtility.HtmlAttributeEncode(x.Item2)) + ).ToList(); + else + _AvailableSideCategories = null; + } + } + + public RegisterViewModel(string category, string id, List parsedComments, string title) + { + this.Category = HttpUtility.HtmlAttributeEncode(category); + this.Id = HttpUtility.HtmlAttributeEncode(id); this.ParsedComments = parsedComments; - this.Title = title; + this.Title = HttpUtility.HtmlEncode(title); } } \ No newline at end of file diff --git a/HaWeb/README.md b/HaWeb/README.md index 4134512..06df518 100644 --- a/HaWeb/README.md +++ b/HaWeb/README.md @@ -28,19 +28,17 @@ Für diese Anpassungen sind in etwa 3-4 Monate eingeplant. - Ladezeiten (???) - PDF-Parser -hamann-werke.de +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 -- 224 erse beidenkomm vertauscht -TODO Letter 41 2x Zeile 25, also auch zwei Mal der Kommentar -TODO 148 153 letzter kommentar -TODO 332 -TODO 367 \ No newline at end of file +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 Word-wrap before align, tabs +TODO blinken before js + diff --git a/HaWeb/Settings/ParsingRules/EditRules.cs b/HaWeb/Settings/ParsingRules/EditRules.cs index bdf545e..c1e0d65 100644 --- a/HaWeb/Settings/ParsingRules/EditRules.cs +++ b/HaWeb/Settings/ParsingRules/EditRules.cs @@ -1,6 +1,6 @@ namespace HaWeb.Settings.ParsingRules; using System.Text; - +using System.Web; using TagFuncList = List<(Func, bool>, Action>)>; using TextFuncList = List<(Func, bool>, Action>)>; using WhitespaceFuncList = List<(Func, bool>, Action>)>; @@ -144,9 +144,9 @@ public static class EditRules { ( ( 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 + "\">–")); + sb.Append(HttpUtility.HtmlEncode(txt.Value).Replace("–", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\">–")); else - sb.Append(txt.Value); + sb.Append(HttpUtility.HtmlEncode(txt.Value)); sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); })}; diff --git a/HaWeb/Settings/ParsingRules/LetterRules.cs b/HaWeb/Settings/ParsingRules/LetterRules.cs index 9f7e46e..0a574ef 100644 --- a/HaWeb/Settings/ParsingRules/LetterRules.cs +++ b/HaWeb/Settings/ParsingRules/LetterRules.cs @@ -1,5 +1,6 @@ namespace HaWeb.Settings.ParsingRules; using System.Text; +using System.Web; using TagFuncList = List<(Func, bool>, Action>)>; using TextFuncList = List<(Func, bool>, Action>)>; @@ -74,23 +75,20 @@ public class LetterRules public static readonly TagFuncList OTagRules = new TagFuncList() { ( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, reader) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, ALIGNCENTERCLASS)); - reader.State.mustwrap = true; + 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; + 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, reader) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, SALCLASS)); - reader.State.mustwrap = true; + 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)) ), @@ -102,8 +100,8 @@ public class LetterRules ( ( 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, reader) => { - reader.State.mustwrap = true; 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)) ), @@ -121,9 +119,13 @@ public class LetterRules sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, MARGINALCLASS, "m-" + tag["index"])); reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace; }), - ( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TABLECLASS)) ), + ( ( 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; + 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, _) => { @@ -139,20 +141,17 @@ public class LetterRules public static readonly TagFuncList CTagRules = new TagFuncList() { ( ( x, _) => x.Name == "align", (sb, tag, reader) => { - reader.State.mustwrap = true; + 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, reader) => { - reader.State.mustwrap = true; + 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)) ), @@ -164,7 +163,7 @@ public class LetterRules ( ( 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, reader) => { - reader.State.mustwrap = true; + 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)) ), @@ -182,7 +181,7 @@ public class LetterRules ( ( 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, reader) => { - reader.State.mustwrap = true; + 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)) ) @@ -191,10 +190,10 @@ public class LetterRules 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 + "\">–")); + if (reader.OpenTags.Where(x => x.Name == "del").Any()) + sb.Append(HttpUtility.HtmlEncode(txt.Value).Replace("–", "<" + DEFAULTELEMENT + " class=\"" + CROSSEDDASHCLASS + "\">–")); else - sb.Append(txt.Value); + sb.Append(HttpUtility.HtmlEncode(txt.Value)); sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); })}; @@ -202,16 +201,16 @@ public class LetterRules ( (x, _) => x.Name == "page", (sb, tag, reader) => reader.State.currpage = tag["index"] ), ( (x, _) => x.Name == "line", (sb, tag, reader) => { if(!String.IsNullOrWhiteSpace(tag["tab"]) || !String.IsNullOrWhiteSpace(tag["type"])) { - reader.State.mustwrap = true; + reader.State.mustwrap = (false, true); } // 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) + if (!reader.State.mustwrap.Item2) sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", ZHBREAKCLASS)); else sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); - reader.State.mustwrap = false; + reader.State.mustwrap = (false, false); // Linecount if(!String.IsNullOrWhiteSpace(tag["index"])) { @@ -244,7 +243,7 @@ public class LetterRules reader.State.currline = tag["index"]; } - // Marginalien + // 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()) @@ -275,14 +274,14 @@ public class LetterRules if(tag["type"] == "line") { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LINELINECLASS)); sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)); - reader.State.mustwrap = true; + 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 = true; + if (tag["tab"] != "1") reader.State.mustwrap = (false, true); } } )}; diff --git a/HaWeb/Settings/ParsingState/LetterState.cs b/HaWeb/Settings/ParsingState/LetterState.cs index bd86a2e..70bdcef 100644 --- a/HaWeb/Settings/ParsingState/LetterState.cs +++ b/HaWeb/Settings/ParsingState/LetterState.cs @@ -19,11 +19,16 @@ public class LetterState : HaWeb.HTMLParser.IState { internal IEnumerable? Edits; // State - internal bool active_del; + // Must we skip all of the upcoming whitespace? internal bool active_skipwhitespace; - internal bool mustwrap; + // 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; // Results internal StringBuilder sb_lettertext; @@ -46,7 +51,8 @@ public class LetterState : HaWeb.HTMLParser.IState { active_skipwhitespace = true; currline = "-1"; currpage = ""; - mustwrap = false; + mustwrap = (false, false); + minwidth = false; // Initialize State if (Meta.ZH != null) { diff --git a/HaWeb/Views/Briefe/Index.cshtml b/HaWeb/Views/Briefe/Index.cshtml index c73fb79..9bfb743 100644 --- a/HaWeb/Views/Briefe/Index.cshtml +++ b/HaWeb/Views/Briefe/Index.cshtml @@ -1,12 +1,22 @@ @model BriefeViewModel; - +@{ + var minwidth = ""; + if (Model.MinWidth) + minwidth = "ha-minwidth"; +}
@await Html.PartialAsync("/Views/Shared/_LetterHead.cshtml", Model.MetaData)
- Brieftext - Stellenkommentar + @if (Model.ParsedText != null && !String.IsNullOrWhiteSpace(Model.ParsedText)) + { + Brieftext + @if (Model.ParsedMarginals != null) + { + Stellenkommentar + } + } Überlieferung & Textkritik PDF
@@ -37,31 +47,33 @@
-
-
- @if (Model.ParsedText != null) - { -
- @if (Model.MetaData.ParsedZHString != null) { - @Html.Raw(Model.MetaData.ParsedZHString) - } - else { -
-
- Neu -
-
- } -
- @Html.Raw(@Model.ParsedText) - } + +
+
+
+ @if (Model.MetaData.ParsedZHString != null) + { + @Html.Raw(Model.MetaData.ParsedZHString) + } + else + { +
+
+ Neu +
+
+ } +
+ @Html.Raw(@Model.ParsedText) + @* It's not beautiful but it's a hack to keep the last comment within parent element boundaries: *@ +
+
-
- @if (Model.ParsedMarginals != null) - { + @if (Model.ParsedMarginals != null) + { +
- @foreach (var marginal in Model.ParsedMarginals) { @@ -70,9 +82,8 @@ }
- - } -
+
+ }
@if (Model.ParsedTradition != null) @@ -90,8 +101,11 @@ { - @* Not beautiful, but here's whitespace in between otherwise *@ -
@hand.Item1
@if (!String.IsNullOrEmpty(hand.Item2)) {
–@hand.Item2
+ @* Not beautiful, but here's whitespace in between otherwise *@ +
@hand.Item1
@if (!String.IsNullOrEmpty(hand.Item2)) + { +
–@hand.Item2
} @hand.Item3 @@ -117,7 +131,10 @@ { -
@edit.Item1
@if (!String.IsNullOrEmpty(edit.Item2)) {
–@edit.Item2
+
@edit.Item1
@if (!String.IsNullOrEmpty(edit.Item2)) + { +
–@edit.Item2
} @@ -138,4 +155,4 @@
}
-
+
\ No newline at end of file diff --git a/HaWeb/Views/Shared/_LetterHead.cshtml b/HaWeb/Views/Shared/_LetterHead.cshtml index 1eeca76..921823d 100644 --- a/HaWeb/Views/Shared/_LetterHead.cshtml +++ b/HaWeb/Views/Shared/_LetterHead.cshtml @@ -12,6 +12,7 @@
@Model.Meta.Date
+ @if (Model.HasText) { @if (Model.ParsedZHString != null && Model.ShowZHData) {
@@ -90,22 +91,26 @@
} + }
-
- @if (Model.Meta.isDraft == HaDocument.Models.OptionalBool.True) { - @Model.ParsedSenders -
- ↛ -
- Entwurf +
+ @if (!String.IsNullOrWhiteSpace(Model.ParsedReceivers)) { + @if (Model.Meta.isDraft == HaDocument.Models.OptionalBool.True) { + @Model.ParsedSenders +
+ ↛ +
+ Entwurf +
-
- @Model.ParsedReceivers - } - else { - @Model.ParsedSenders → @Model.ParsedReceivers - } -
+ @Model.ParsedReceivers + } + else { + @Model.ParsedSenders → @Model.ParsedReceivers + } + } +
+
\ No newline at end of file diff --git a/HaWeb/wwwroot/css/output.css b/HaWeb/wwwroot/css/output.css index 6ea7b4a..1418504 100644 --- a/HaWeb/wwwroot/css/output.css +++ b/HaWeb/wwwroot/css/output.css @@ -1364,6 +1364,7 @@ body { .ha-lettertext { position: relative; margin-left: 1rem; + max-width: 38rem; --tw-bg-opacity: 1; background-color: rgb(248 250 252 / var(--tw-bg-opacity)); padding-left: 1rem; @@ -1383,6 +1384,22 @@ body { } } +@media (min-width: 1190px) { + .ha-lettertext { + max-width: 45rem; + } +} + +.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; @@ -1495,8 +1512,7 @@ body { .ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox { position: absolute; - right: -21rem; - margin-right: 1rem; + right: -20rem; margin-top: 0.25rem; display: none; width: 19rem; @@ -1526,8 +1542,8 @@ body { @media (min-width: 1190px) { .ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox { - right: -28rem; - width: 24rem; + right: -26rem; + width: 23rem; } } @@ -1800,8 +1816,7 @@ body { .ha-lettertext .ha-marginalbox { position: absolute; - right: -21rem; - margin-right: 1rem; + right: -20rem; margin-top: 0.25rem; display: none; width: 19rem; @@ -1831,8 +1846,8 @@ body { @media (min-width: 1190px) { .ha-lettertext .ha-marginalbox { - right: -28rem; - width: 24rem; + right: -26rem; + width: 23rem; } } diff --git a/HaWeb/wwwroot/css/site.css b/HaWeb/wwwroot/css/site.css index c351dca..2e46dfc 100644 --- a/HaWeb/wwwroot/css/site.css +++ b/HaWeb/wwwroot/css/site.css @@ -486,7 +486,11 @@ } .ha-lettertext { - @apply 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; + @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 { @@ -542,7 +546,7 @@ } .ha-additions .ha-tradition .ha-tradzhtext .ha-marginalbox { - @apply absolute -right-[21rem] desktop:-right-[28rem] w-[19rem] desktop: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 hidden md:flex flex-wrap; + @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 { @@ -689,7 +693,7 @@ } .ha-lettertext .ha-marginalbox { - @apply absolute -right-[21rem] desktop:-right-[28rem] w-[19rem] desktop: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 hidden md:flex flex-wrap; + @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-lettertext .ha-marginalbox .ha-marginal { diff --git a/HaWeb/wwwroot/js/site.js b/HaWeb/wwwroot/js/site.js index 9a6245c..4a23cc2 100644 --- a/HaWeb/wwwroot/js/site.js +++ b/HaWeb/wwwroot/js/site.js @@ -157,22 +157,6 @@ const overlappingcollapsebox = function (selector, hoverfunction, parentbox) { collapsebox(clientrects[i][0], newlength); addbuttoncaollapsebox(clientrects[i][0], newlength, hoverfunction); } - } else { - if (boundigparent !== null) { - let overlap = clientrects[i][1].bottom - boundigparent.bottom; - console.log(clientrects[i][0]); - console.log(pb); - console.log(clientrects[i][1].bottom, boundigparent.bottom); - console.log(overlap); - if (overlap >= 0) { - let newlength = clientrects[i][1].height - overlap; - console.log(newlength); - let remainder = newlength % lineheight; - newlength = newlength - remainder; - collapsebox(clientrects[i][0], newlength); - addbuttoncaollapsebox(clientrects[i][0], newlength, hoverfunction); - } - } } } }; @@ -295,15 +279,16 @@ window.addEventListener("load", function () { // Letter View: Show / Hide Tabs let buttonlist = ["ha-lettertextbtn", "ha-additionsbtn", "ha-marginalsbtn"]; let divlist = ["ha-lettertext", "ha-additions", "ha-marginals"]; - showhidebutton( - "ha-lettertextbtn", - "ha-lettertext", - buttonlist, - divlist, - false - ); - showhidebutton("ha-additionsbtn", "ha-additions", buttonlist, divlist, true); - showhidebutton("ha-marginalsbtn", "ha-marginals", buttonlist, divlist, true); + + if (this.document.getElementById("ha-lettertextbtn") !== null) { + showhidebutton("ha-lettertextbtn", "ha-lettertext", buttonlist, divlist, false); + showhidebutton("ha-additionsbtn", "ha-additions", buttonlist, divlist, true); + showhidebutton("ha-marginalsbtn", "ha-marginals", buttonlist, divlist, true); + } else { + showhidebutton("ha-lettertextbtn", "ha-lettertext", buttonlist, divlist, true); + showhidebutton("ha-additionsbtn", "ha-additions", buttonlist, divlist, false); + showhidebutton("ha-marginalsbtn", "ha-marginals", buttonlist, divlist, true); + } // Theme: Get saved theme from memory and check the box accordingly // Register theme toggler