Mergess TraditionRules with TextRules. Added tabs for other Text. Some bugs persist see readme

This commit is contained in:
Simon Martens
2022-11-26 23:15:42 +01:00
parent 49c32dcc6a
commit 6370b70e35
21 changed files with 420 additions and 789 deletions

View File

@@ -5,6 +5,7 @@ using HaWeb.FileHelpers;
using HaDocument.Interfaces;
using HaXMLReader.Interfaces;
using HaDocument.Models;
using System.Xml.Linq;
namespace HaWeb.Controllers;
@@ -62,21 +63,53 @@ public class Briefecontroller : Controller {
if (prevmeta != null) model.MetaData.Prev = (generateMetaViewModel(lib, 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)) {
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);
}
model.DefaultCategory = lib.Apps.ContainsKey("-1") ? lib.Apps["-1"].Category : null;
List<(string Category, List<Text>)>? texts = null;
if (text != null && !String.IsNullOrWhiteSpace(text.Element)) {
var parsedLetter = HaWeb.HTMLHelpers.LetterHelpers.CreateLetter(lib, _readerService, meta, text, marginals, hands, editreasons);
(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;
model.MetaData.Startline = parsedLetter.Startline;
model.MetaData.Startpage = parsedLetter.Startpage;
if (String.IsNullOrWhiteSpace(model.ParsedText))
var state = HaWeb.HTMLHelpers.LetterHelpers.ParseText(lib, _readerService, text.Element, meta, marginals, hands, editreasons);
// TODO: it is still hardcoded that <letterText> means <app id="0">
var textid = "0";
var category = lib.Apps[textid].Category;
var name = lib.Apps[textid].Name;
var t = new Text(id, textid, category, state.minwidth);
t.ParsedMarginals = state.ParsedMarginals;
t.ParsedText = state.sb.ToString();
t.Title = name;
if (!String.IsNullOrWhiteSpace(t.ParsedText)) {
if (texts == null) texts = new List<(string, List<Text>)>();
if(!texts.Where(x => x.Category == category).Any())
texts.Add((category, new List<Text>() { t }));
else
texts.Where(x => x.Category == category).First().Item2.Add(t);
} else {
model.MetaData.HasText = false;
}
}
if (tradition != null && !String.IsNullOrWhiteSpace(tradition.Element)) {
var additions = XElement.Parse(tradition.Element, LoadOptions.PreserveWhitespace).Descendants("app");
foreach (var a in additions) {
var app = a.HasAttributes && a.Attribute("ref") != null && lib.Apps.ContainsKey(a.Attribute("ref").Value) ?
lib.Apps[a.Attribute("ref").Value] :
null;
if (app != null && !a.IsEmpty) {
var state = HaWeb.HTMLHelpers.LetterHelpers.ParseText(lib, _readerService, a, meta, marginals, hands, editreasons);
var t = new Text(id, app.Index, app.Category, state.minwidth);
t.Title = app.Name;
t.ParsedMarginals = state.ParsedMarginals;
t.ParsedText = state.sb.ToString();
if (texts == null) texts = new List<(string, List<Text>)>();
if(!texts.Where(x => x.Category == app.Category).Any())
texts.Add((app.Category, new List<Text>() { t }));
else
texts.Where(x => x.Category == app.Category).First().Item2.Add(t);
}
}
}
model.Texts = texts;
// Return
return View("~/Views/HKB/Dynamic/Briefe.cshtml", model);
}

View File

@@ -185,8 +185,8 @@ public class SucheController : Controller {
foreach (var c in l) {
var sb = new StringBuilder();
var rd = _readerService.RequestStringReader(c.Element);
var st = new LetterState(lib, _readerService, lib.Metas[c.Letter], null, null, null);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>(st, rd, sb, LetterRules.OTagRules, null, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules);
var st = new TextState(lib, _readerService, lib.Metas[c.Letter], null, null, null);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>(st, rd, sb, TextRules.OTagRules, null, TextRules.CTagRules, TextRules.TRules, TextRules.WhitespaceRules);
new HaWeb.HTMLHelpers.LinkHelper(st.Lib, rd, sb, false);
rd.Read();
list.Add((c, sb.ToString()));

View File

@@ -12,22 +12,17 @@ using HaWeb.Settings.ParsingState;
using HaWeb.Settings.ParsingRules;
public static class LetterHelpers {
public static LetterState CreateLetter(ILibrary lib, IReaderService readerService, Meta meta, Letter letter, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits) {
var rd = readerService.RequestStringReader(letter.Element);
var letterState = new LetterState(lib, readerService, meta, marginals, hands, edits);
new HaWeb.HTMLParser.XMLHelper<LetterState>(letterState, rd, letterState.sb_lettertext, LetterRules.OTagRules, LetterRules.STagRules, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules);
rd.Read();
return letterState;
}
public static TextState ParseText(ILibrary lib, IReaderService readerService, string text, Meta meta, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits)
=> ParseText(lib, readerService, XElement.Parse(text, LoadOptions.PreserveWhitespace), meta, marginals, hands, edits);
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, 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);
public static TextState ParseText(ILibrary lib, IReaderService readerService, XElement text, Meta meta, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits) {
var rd = readerService.RequestReader(text);
var state = new TextState(lib, readerService, meta, marginals, hands, edits);
new HaWeb.HTMLParser.XMLHelper<TextState>(state, rd, state.sb, TextRules.OTagRules, TextRules.STagRules, TextRules.CTagRules, TextRules.TRules, TextRules.WhitespaceRules);
new HaWeb.HTMLHelpers.LinkHelper(lib, rd, state.sb);
rd.Read();
return traditionState;
return state;
}
public static List<(string, string, string, string, string, string)> CreateEdits(ILibrary lib, IReaderService readerService, IEnumerable<Editreason> editreasons) {

View File

@@ -44131,7 +44131,6 @@
<line index="23" autopsic="24" />sehr. Hans ist wohl u. wird von Tag zu Tage beßer. Leben Sie wohl mit Ihrer
<line index="24" autopsic="25" />Hausmutter u. kleinem Dreiblatt.
<line index="25" autopsic="26" /><align pos="right"><sig>H.</sig></align>
</letterText><letterText index="458">
</letterText><letterText index="459">
<page index="210" autopsic="210" />
<line index="31" autopsic="31" /><align pos="right"><datum>Mohrungen den 9ten Januar 1776</datum></align>
@@ -97891,7 +97890,6 @@
<line index="12" autopsic="10" /><edit ref="4057">HErrn / HErrn <ul>Franz Buchholz</ul> / Herrn von Welbergen / zu / <ul>Münster</ul>.
<line type="empty" />
<line index="13" autopsic="10" />den 5. Febr. 86.</edit>
</letterText><letterText index="935">
</letterText><letterText index="936">
<page index="263" autopsic="263" />
<line index="17" autopsic="14" /><align pos="right"><datum>Kgb. den 6 <aq>Febr.</aq> 86.</datum></align>

View File

@@ -64,8 +64,8 @@ public class BriefeMetaViewModel {
}
}
public (BriefeMetaViewModel, string)? Next { get; set; }
public (BriefeMetaViewModel, string)? Prev { get; set; }
public (BriefeMetaViewModel Model, string)? Next { get; set; }
public (BriefeMetaViewModel Model, string)? Prev { get; set; }
public BriefeMetaViewModel(Meta meta, bool hasMarginals) {

View File

@@ -5,18 +5,26 @@ public class BriefeViewModel {
public string Id { get; private set; }
public string Index { get; private set; }
public BriefeMetaViewModel MetaData { get; private set; }
public string? DefaultCategory { get; set; }
private List<(string, string, string)>? _ParsedMarginals;
private List<(string, string, string, string, string, string)>? _ParsedEdits;
public List<(string, string, string, string, string)>? _ParsedHands;
private List<(string, string, string, string, string)>? _ParsedHands;
private List<(string Category, List<Text>)>? _Texts;
public string? ParsedText { get; set; }
public string? ParsedTradition { get; set; }
public bool MinWidth { get; set; } = false;
public bool MinWidthTrad { get; set; } = false;
public List<(string Category, List<Text>)>? Texts {
get => _Texts;
set {
if (value != null)
_Texts = value.Select(x => (
x.Item1,
x.Item2
)).ToList();
else _Texts = null;
}
}
// From, Until, Reference, Edit, sartpage, startline
public List<(string, string, string, string, string, string)>? ParsedEdits {
public List<(string ParsedStart, string ParsedEnd, string Preview, string Text, string Page, string Line)>? ParsedEdits {
get => _ParsedEdits;
set {
if (value != null)
@@ -28,13 +36,12 @@ public class BriefeViewModel {
HttpUtility.HtmlAttributeEncode(x.Item5),
HttpUtility.HtmlAttributeEncode(x.Item6)
)).ToList();
else
_ParsedEdits = null;
else _ParsedEdits = null;
}
}
// From, Until, Person, startpage, startline
public List<(string, string, string, string, string)>? ParsedHands {
public List<(string ParsedStart, string ParsedEnd, string Person, string Page, string Line)>? ParsedHands {
get => _ParsedHands;
set {
if (value != null)
@@ -45,23 +52,7 @@ public class BriefeViewModel {
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;
else _ParsedHands = null;
}
}

43
HaWeb/Models/Text.cs Normal file
View File

@@ -0,0 +1,43 @@
namespace HaWeb.Models;
using System.Web;
public class Text {
public string Id { get; private set; }
public string Number { get; private set; }
public bool MinWidth { get; private set; }
public string Category { get; private set; }
public string? ParsedText { get; set; }
private string? _Title;
private List<(string, string, string)>? _ParsedMarginals;
public List<(string Page, string Line, string Text)>? 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 string? Title {
get => _Title;
set {
if (!String.IsNullOrWhiteSpace(value)) {
_Title = value;
} else _Title = null;
}
}
public Text(string id, string number, string category, bool minwidth) {
Id = id;
Number = number;
Category = category;
MinWidth = minwidth;
}
}

View File

@@ -90,3 +90,11 @@ A TODO fixed width briefe kommentar bisschen nach links 306, 309
Liste für Janina/Luca:
tabellen ok, ausser 939
KOmmentare verschobem 202 Anhang
458 leeren lettertext löschen
935 leeren lettertext löschen
min-width 673 1150
doppel- empfänder sender 876
1075 zwischentitel

View File

@@ -9,7 +9,8 @@ public static class CSSClasses {
public const string SUBSECTIONCLASS = "ha-subsection"; // XML: <subsection>
public const string TRADITIONCLASS = "ha-tradition"; // XML: <tradition>
public const string MARGINALCLASS = "ha-marginal"; // XML: <marginal>
public const string LETTERCLASS = "ha-lettertext"; // XML: <lemma>
public const string INDEXEDTEXTCONTAINERCLASS = "ha-textcontainer";
public const string INDEXEDTEXTCLASS = "ha-text";
// Comments:
public const string LEMMACLASS = "ha-lemma"; // XML: <lemma>
@@ -50,7 +51,7 @@ public static class CSSClasses {
public const string TABLECLASS = "ha-table";
public const string TABCLASS = "ha-hatab-"; // TODO: GEN
public const string CROSSEDDASHCLASS = "ha-diagdel";
public const string TEXTCLASS = "ha-text";
public const string TEXTCLASS = "ha-literal";
public const string BZGCLASS = "ha-bzg";
public const string ZHCLASS = "ha-zh";
@@ -60,7 +61,6 @@ public static class CSSClasses {
public const string MARGINALLISTCLASS = "ha-marginallist";
public const string TRADLINECOUNTCLASS = "ha-tradlinecount";
public const string TRADCOMMENTCOLUMNCLASS = "ha-tradcommentcolumn";
public const string TRADZHTEXTCLASS = "ha-tradzhtext";
public const string TRADZHTEXTBOXCLASS = "ha-tradtextbox";
// Zeilen:

View File

@@ -40,11 +40,7 @@ public static class EditRules {
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHCLASS)) ),
( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EMPHCLASS)); } ),
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS)); } ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SUBSECTIONCLASS, tag["id"])) ),
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.COMMENTCLASS, tag["id"])) ),
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EDITREASONCLASS)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.LETTERCLASS)) ),
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TRADITIONCLASS)) ),
( ( x, _) => x.Name == "marginal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.MARGINALCLASS));
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
@@ -83,11 +79,7 @@ public static class EditRules {
( ( 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)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( 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)) ),

View File

@@ -3,12 +3,12 @@ using System.Text;
using System.Web;
using HaWeb.Settings;
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>;
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>;
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>>)>;
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>>)>;
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>>)>;
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>>)>;
// TODO: stringbuilder als Rückgabeparameter des XMHelpers ist eigentlich auch Part vom State
public class LetterRules {
public class TextRules {
private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT;
// Parsing Rules for Letters
@@ -51,11 +51,14 @@ public class LetterRules {
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.BZGCLASS)) ),
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHCLASS)) ),
( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EMPHCLASS)); } ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SUBSECTIONCLASS, tag["id"])) ),
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.COMMENTCLASS, tag["id"])) ),
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EDITREASONCLASS)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.LETTERCLASS)) ),
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TRADITIONCLASS)) ),
( ( x, _) => x.Name == "letterText", (sb, tag, _) => {
// TODO Workaround, instead of <app ref="0"><ZHText>
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS + " " + CSSClasses.APPCLASS + "-0"));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.INDEXEDTEXTCONTAINERCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.INDEXEDTEXTCLASS));
} ),
( ( x, _) => x.Name == "marginal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.MARGINALCLASS, "m-" + tag["index"]));
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
@@ -81,11 +84,14 @@ public class LetterRules {
// Tradition specific:
( ( x, _) => x.Name == "app", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS));
if (!String.IsNullOrWhiteSpace(tag["ref"]))
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS + " " + CSSClasses.APPCLASS + "-" + tag["ref"]));
else sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS));
reader.State.activelinecount = false;
} ),
( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TRADZHTEXTCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.INDEXEDTEXTCONTAINERCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.INDEXEDTEXTCLASS));
reader.State.activelinecount = true;
})
};
@@ -124,11 +130,14 @@ public class LetterRules {
( ( 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 == "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)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "letterText", (sb, tag, _) => {
// Hacky, to clear floats and absolute positioned elements:
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br"));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
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, reader) => {
@@ -143,12 +152,15 @@ public class LetterRules {
reader.State.activelinecount = true;
} ),
( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.currline = "-1";
reader.State.currpage = "-1";
reader.State.activelinecount = false;
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
})
};
public static readonly TextFuncList TextRules = new TextFuncList() {
public static readonly TextFuncList TRules = new TextFuncList() {
( ( x, _) => true, (sb, txt, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TEXTCLASS));
if (reader.OpenTags.Where(x => x.Name == "del").Any())
@@ -159,7 +171,7 @@ public class LetterRules {
})};
public static readonly TagFuncList STagRules = new TagFuncList() {
( (x, _) => x.Name == "page", (sb, tag, reader) => reader.State.currpage = tag["index"] ),
( (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 = (false, true);
@@ -205,6 +217,12 @@ public class LetterRules {
} else if (reader.State.currline == "-1" && !String.IsNullOrWhiteSpace(tag["index"])) {
reader.State.Startline = tag["index"];
reader.State.currline = tag["index"];
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHPAGECLASS + " " + CSSClasses.FIRSTPAGECLASS));
if (reader.State.currline == "1") sb.Append("S. " + reader.State.currpage);
else sb.Append(reader.State.currpage + "/" + reader.State.currline);
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
reader.State.pagebreak = false;
}
@@ -225,9 +243,9 @@ public class LetterRules {
// 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.LetterState>(reader.State, rd, sb, LetterRules.OTagRules, null, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>(reader.State, rd, sb, ParsingRules.TextRules.OTagRules, null, ParsingRules.TextRules.CTagRules, ParsingRules.TextRules.TRules, ParsingRules.TextRules.WhitespaceRules);
new HaWeb.HTMLHelpers.LinkHelper(reader.State.Lib, rd, sb, false);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.LetterState>(reader.State, rd, sb2, LetterRules.OTagRules, null, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules);
new HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TextState>(reader.State, rd, sb2, ParsingRules.TextRules.OTagRules, null, ParsingRules.TextRules.CTagRules, ParsingRules.TextRules.TRules, ParsingRules.TextRules.WhitespaceRules);
new HaWeb.HTMLHelpers.LinkHelper(reader.State.Lib, rd, sb2, false);
rd.Read();
}

View File

@@ -1,269 +0,0 @@
using System.ComponentModel;
namespace HaWeb.Settings.ParsingRules;
using System.Text;
using System.Web;
using HaWeb.Settings;
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>>)>;
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, HaWeb.HTMLParser.XMLHelper<HaWeb.Settings.ParsingState.TraditionState>>)>;
public static class TraditionRules {
private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.DEFAULTELEMENT;
// 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, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ALIGNCENTERCLASS));
reader.State.mustwrap = (true, true);
} ),
( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ALIGNRIGHTCLASS));
reader.State.mustwrap = (true, true);
}),
( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ADDEDCLASS)) ),
( ( x, _) => x.Name == "sal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SALCLASS));
reader.State.mustwrap = (true, true);
}),
( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.AQCLASS)) ),
( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SUPERCLASS)) ),
( ( x, _) => x.Name == "del", (sb, tag, reader) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.DELCLASS)) ),
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.NRCLASS)) ),
( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.NOTECLASS)) ),
( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ULCLASS)) ),
( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ANCHORCLASS)) ),
( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.FNCLASS)) ),
( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.DULCLASS)) ),
( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.FULCLASS)) ),
( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.UPCLASS)) ),
( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SUBCLASS)) ),
( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TULCLASS)) ),
( ( x, _) => x.Name == "insertion", (sb, tag,_) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.INSERTIONCLASS)) ),
( ( x, _) => x.Name == "header", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.HEADERCLASS));
reader.State.mustwrap = (true, true);
}),
( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.LEMMACLASS)) ),
( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ENTRYCLASS)) ),
( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TITLECLASS)) ),
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.BZGCLASS)) ),
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHCLASS)) ),
( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EMPHCLASS)); } ),
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS)); } ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.SUBSECTIONCLASS, tag["id"])) ),
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.COMMENTCLASS, tag["id"])) ),
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EDITREASONCLASS)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.LETTERCLASS)) ),
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TRADITIONCLASS)) ),
( ( x, _) => x.Name == "marginal", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.MARGINALCLASS, "m-" + tag["index"]));
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
}),
( ( x, _) => x.Name == "tabs", (sb, tag, reader) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.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, CSSClasses.TABCLASS + tag["value"]));
}),
( ( x, _) => x.Name == "edit" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.EDITMARKERCLASS, "ea-" + tag["ref"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
}),
( ( x, _) => x.Name == "hand", (sb, tag, _) => {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.HANDMARKERCLASS, "ha-" + tag["ref"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.HANDCLASS));
}),
// Tradition specific:
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.APPCLASS)); } ),
( ( x, _) => x.Name == "ZHText", (sb, tag, reader) => {
reader.State.sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.TRADZHTEXTCLASS));
reader.State.active_trad = true;
})
};
public static readonly TagFuncList CTagRules = new TagFuncList() {
( ( 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, 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)) ),
( ( 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)) ),
( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( 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 == "insertion", (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)) ),
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
( ( 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, 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, CSSClasses.TEXTCLASS));
if (reader.OpenTags.Where(x => x.Name == "del").Any())
sb.Append(HttpUtility.HtmlEncode(txt.Value).Replace("", "<" + DEFAULTELEMENT + " class=\"" + CSSClasses.CROSSEDDASHCLASS + "\"></" + DEFAULTELEMENT + ">"));
else
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) => {
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) {
// 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", CSSClasses.ZHBREAKCLASS));
else
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br"));
reader.State.mustwrap = (false, false);
// Linecount
if(!String.IsNullOrWhiteSpace(tag["index"])) {
reader.State.currline = tag["index"];
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHLINECOUNTCLASS, reader.State.currpage + "-" + reader.State.currline));
// Fall 1: Neue Seite
if (reader.State.currline == "1") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.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, CSSClasses.ZHLINECLASS, ""));
sb.Append(tag["index"]);
}
// Fall 3: Neue Zeile, nicht teilbar durch 5, deswegen versteckt
else {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.ZHLINECLASS + " " + CSSClasses.HIDDENZHLINECOUNT, ""));
sb.Append(tag["index"]);
}
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, CSSClasses.ZHLINECOUNTCLASS + " " + CSSClasses.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, 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, CSSClasses.COMMENTMARKERCLASS, "ma-" + reader.State.currpage + "-" + reader.State.currline));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.MARGINGALBOXCLASS));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.MARGINALLISTCLASS));
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);
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") {
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, CSSClasses.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, CSSClasses.LINEINDENTCLASS + tag["tab"]));
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
if (tag["tab"] != "1") reader.State.mustwrap = (false, true);
}
}
// Tradition specific: only do this if not in ZHText
if (!reader.State.active_trad) {
sb.Append("<br>");
}
}
)};
public static readonly WhitespaceFuncList WhitespaceRules = new WhitespaceFuncList() {
( ( _, _) => true, ( sb, txt, reader) => {
if (reader.State.active_skipwhitespace)
sb.Append(txt.Value);
else
reader.State.active_skipwhitespace = !reader.State.active_skipwhitespace;
})};
}

View File

@@ -9,7 +9,7 @@ using System.Collections.Immutable;
using System.Linq;
using System.Xml.Linq;
public class LetterState : HaWeb.HTMLParser.IState {
public class TextState : HaWeb.HTMLParser.IState {
// Input
internal ILibrary Lib;
internal IReaderService ReaderService;
@@ -43,12 +43,12 @@ public class LetterState : HaWeb.HTMLParser.IState {
internal bool activelinecount;
// Results
internal StringBuilder sb_lettertext;
internal StringBuilder sb;
internal List<(string, string, string)>? ParsedMarginals;
internal string? Startline;
internal string? Startpage = null;
public LetterState(ILibrary lib, IReaderService readerService, Meta meta, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits) {
public TextState(ILibrary lib, IReaderService readerService, Meta meta, IEnumerable<Marginal>? marginals, IEnumerable<Hand>? hands, IEnumerable<Editreason>? edits) {
Lib = lib;
ReaderService = readerService;
Meta = meta;
@@ -60,7 +60,7 @@ public class LetterState : HaWeb.HTMLParser.IState {
public void SetupState() {
sb_lettertext = new StringBuilder();
sb = new StringBuilder();
active_skipwhitespace = true;
currline = "-1";
mustwrap = (false, false);

View File

@@ -1,55 +0,0 @@
namespace HaWeb.Settings.ParsingState;
using System.Text;
using HaXMLReader.Interfaces;
using HaDocument.Models;
using HaDocument.Interfaces;
using System.Collections.Immutable;
public class TraditionState : HaWeb.HTMLParser.IState {
internal ILibrary Lib;
internal IReaderService ReaderService;
internal IEnumerable<Marginal>? Marginals;
internal IEnumerable<Hand>? Hands;
internal IEnumerable<Editreason>? Edits;
// State
// Must we skip all of the upcoming whitespace?
internal bool active_skipwhitespace;
// 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 List<(string, string, string)>? ParsedMarginals;
internal string Startline;
internal IReader rd_tradition;
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();
active_trad = false;
active_skipwhitespace = true;
currline = "-1";
currpage = string.Empty;
}
}

View File

@@ -1,11 +1,11 @@
@model BriefeViewModel;
@{
var minwidth = "";
@* var minwidth = "";
if (Model.MinWidth)
minwidth = "ha-minwidth";
var minwidthtrads = "";
if (Model.MinWidthTrad)
minwidthtrads = "ha-minwidth";
minwidthtrads = "ha-minwidth"; *@
}
<script defer src="/js/briefe.js" asp-append-version="true"></script>
@@ -14,16 +14,14 @@
@await Html.PartialAsync("/Views/Shared/_LetterHead.cshtml", (Model.MetaData, true, false))
<div class="ha-letterheadernav">
<div class="ha-lettertabs">
@if (!String.IsNullOrWhiteSpace(Model.ParsedText))
@foreach (var app in Model.Texts)
{
<a class="" id="ha-lettertextbtn">Brieftext</a>
@if (Model.ParsedMarginals != null)
{
<a class="ha-marginalsbtn " id="ha-marginalsbtn">Stellenkommentar</a>
}
@if (app.Category != Model.DefaultCategory) { <a class="ha-tabbtn">@app.Category</a> }
}
<a class="" id="ha-additionsbtn">Überlieferung & Textkritik</a>
<a class="">PDF</a>
@if (Model.Texts != null && Model.Texts.Where(x => x.Category == Model.DefaultCategory).Any()) {
<a class="ha-tabbtn">@Model.DefaultCategory</a>
}
<a >PDF</a>
</div>
@if (Model.MetaData.Next != null || Model.MetaData.Prev != null)
@@ -32,7 +30,7 @@
@if (Model.MetaData.Prev != null)
{
<a href="@Model.MetaData.Prev.Value.Item2">
@Model.MetaData.Prev.Value.Item1.Meta.Autopsic ◀
@Model.MetaData.Prev.Value.Model.Meta.Autopsic ◀
</a>
}
@@ -43,7 +41,7 @@
@if (Model.MetaData.Next != null)
{
<a href="@Model.MetaData.Next.Value.Item2">
▶ @Model.MetaData.Next.Value.Item1.Meta.Autopsic
▶ @Model.MetaData.Next.Value.Model.Meta.Autopsic
</a>
}
</div>
@@ -51,99 +49,94 @@
</div>
</div>
<div class="ha-letterbody " id="ha-letterbody">
<div class="ha-lettertext @minwidth" id="ha-lettertext">
<div class="ha-linecount">
@if (Model.MetaData.Startline == "1") {
<div id="@Model.MetaData.Startpage-@Model.MetaData.Startline" class="ha-zhpage">S. @Html.Raw(Model.MetaData.Startpage)</div>
} else {
<div id="@Model.MetaData.Startpage-@Model.MetaData.Startline" class="ha-zhpage">@Html.Raw(Model.MetaData.Startpage)/@Html.Raw(Model.MetaData.Startline)</div>
}
</div>
@Html.Raw(@Model.ParsedText)
@* It's not beautiful but it's a hack to keep the last comment within parent element boundaries: *@
<br>
<div class="ha-marginalbox"></div>
</div>
@if (Model.ParsedMarginals != null)
<div class="ha-letterbody" id="ha-letterbody">
@foreach (var app in Model.Texts)
{
<div class="ha-marginals " id="ha-marginals">
<table>
@foreach (var marginal in Model.ParsedMarginals)
{
<tr>
<td class="ha-marginalfromto">@marginal.Item1/@marginal.Item2</td>
<td class="ha-marginaltext">@Html.Raw(@marginal.Item3)</td>
</tr>
@if (app.Category != Model.DefaultCategory) {
<div class="ha-tab">
@foreach (var text in app.Item2)
{
<div class="ha-appcontainer">
@if (app.Item2.Count > 1 && !String.IsNullOrWhiteSpace(text.ParsedText) && !String.IsNullOrWhiteSpace(text.Title) ) {
<h3>@text.Title</h3>
}
</table>
</div>
@if (!String.IsNullOrWhiteSpace(text.ParsedText)) { @Html.Raw(text.ParsedText) }
</div>
}
</div>
}
}
<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">
<div class="ha-handstitle">Zusätze fremder Hand</div>
<div class="ha-handentries">
<table>
@foreach (var hand in Model.ParsedHands)
{
<tr class="ha-handentry">
<td>
@* Not beautiful, but here's whitespace in between otherwise *@
<div class="ha-handfrom">@hand.Item1</div>@if(!String.IsNullOrEmpty(hand.Item2)){<div class="ha-handto">@hand.Item2</div>}
</td>
<td class="ha-handperson">@Html.Raw(@hand.Item3)</td>
</tr>
}
</table>
@if (Model.Texts != null && Model.Texts.Where(x => x.Category == Model.DefaultCategory).Any()) {
<div class="ha-tab ha-defaulttab">
@foreach (var text in Model.Texts.Where(x => x.Category == Model.DefaultCategory).First().Item2)
{
<div class="ha-appcontainer">
@if (!String.IsNullOrWhiteSpace(text.ParsedText) && !String.IsNullOrWhiteSpace(text.Title) ) {
<h3>@text.Title</h3>
}
@if (!String.IsNullOrWhiteSpace(text.ParsedText)) { @Html.Raw(text.ParsedText) }
</div>
}
@if (Model.ParsedHands != null && Model.ParsedHands.Any())
{
<div class="ha-hands ha-appcontainer">
<h3>Zusätze fremder Hand</h3>
<div class="ha-app">
<div class="ha-handentries">
<table>
@foreach (var hand in Model.ParsedHands)
{
<tr class="ha-handentry">
<td>
<div class="ha-handfrom">@hand.ParsedStart</div>@if(!String.IsNullOrEmpty(hand.ParsedEnd)){<div class="ha-handto">@hand.ParsedEnd</div>}
</td>
<td class="ha-handperson">@Html.Raw(@hand.Person)</td>
</tr>
}
</table>
</div>
</div>
</div>
}
@if (Model.ParsedEdits != null)
{
<div class="ha-edits ha-appcontainer">
<h3>Textkritische Anmerkungen</h3>
<div class="ha-editsinfo">Der Brieftext wurde anhand der überlieferten Quellen (vgl. Provenienz) kritisch
geprüft. Notwendige Korrekturen gegenüber dem in ZH gedruckten Text wurden vorgenommen und sind
vollständig annotiert. Die in den beiden Auflagen von ZH angehängten Korrekturvorschläge werden
vollständig aufgelistet, werden aber nur dann im Text realisiert, sofern diese anhand überlieferter
Quellen verifiziert werden konnten.</div>
<div class="ha-app">
<div class="ha-editentries">
<table>
@foreach (var edit in Model.ParsedEdits)
{
<tr>
<td class="ha-editfromto">
<div class="ha-editfrom">@edit.ParsedStart</div>@if(!String.IsNullOrEmpty(edit.ParsedEnd)){<div class="ha-editto">@edit.ParsedEnd</div>}
</td>
<td class="ha-editreference">
@if (!String.IsNullOrWhiteSpace(edit.Text))
{
<span>
@Html.Raw(@edit.Preview)]
</span>
}
</td>
<td class="ha-editreas">
@Html.Raw(@edit.Text)
</td>
</tr>
}
</table>
</div>
</div>
</div>
}
</div>
}
@if (Model.ParsedEdits != null)
{
<div class="ha-edits">
<div class="ha-editstitle">Textkritische Anmerkungen</div>
<div class="ha-editsinfo">Der Brieftext wurde anhand der überlieferten Quellen (vgl. Provenienz) kritisch
geprüft. Notwendige Korrekturen gegenüber dem in ZH gedruckten Text wurden vorgenommen und sind
vollständig annotiert. Die in den beiden Auflagen von ZH angehängten Korrekturvorschläge werden
vollständig aufgelistet, werden aber nur dann im Text realisiert, sofern diese anhand überlieferter
Quellen verifiziert werden konnten.</div>
<div class="ha-editentries">
<table>
@foreach (var edit in Model.ParsedEdits)
{
<tr>
<td class="ha-editfromto">
<div class="ha-editfrom">@edit.Item1</div>@if(!String.IsNullOrEmpty(edit.Item2)){<div class="ha-editto">@edit.Item2</div>}
</td>
<td class="ha-editreference">
@if (!String.IsNullOrWhiteSpace(edit.Item3))
{
<span>
@Html.Raw(@edit.Item3)]
</span>
}
</td>
<td class="ha-editreas">
@Html.Raw(@edit.Item4)
</td>
</tr>
}
</table>
</div>
</div>
}
</div>
</div>

View File

@@ -1,24 +1,21 @@
<!DOCTYPE html>
<html lang="de" id="top">
<html class="h-full w-full" lang="de" id="top">
<head>
@await Html.PartialAsync("/Views/Shared/_Head.cshtml")
</head>
<body class="w-full ">
<div class="relative min-h-screen">
<div class="pb-24">
@await Html.PartialAsync("/Views/Shared/_HKBMenu.cshtml")
<main role="main" class="pb-3 w-full desktop:max-w-screen-desktop mx-auto h-full">
@RenderBody()
</main>
</div>
<div class="absolute bottom-0 w-full">
@await Html.PartialAsync("/Views/Shared/_Footer.cshtml")
</div>
</div>
@await Html.PartialAsync("/Views/Shared/_ScrollButton.cshtml")
<body class="h-full w-full">
<div class="flex flex-col h-full">
@await Html.PartialAsync("/Views/Shared/_HKBMenu.cshtml")
<main role="main" class="mb-6 w-full desktop:max-w-screen-desktop mx-auto grow">
@RenderBody()
</main>
<div class="w-full">
@await Html.PartialAsync("/Views/Shared/_Footer.cshtml")
</div>
</div>
@await Html.PartialAsync("/Views/Shared/_ScrollButton.cshtml")
@await RenderSectionAsync("JavaScript", false)
</body>
</html>

View File

@@ -24,19 +24,19 @@
@apply bg-slate-50 dark:bg-slate-900 dark:shadow-xl
}
.ha-lettertext {
@apply bg-slate-50 dark:bg-slate-900 border-slate-200 sm:border-l-2 sm:dark:border-none
.ha-text {
@apply bg-slate-50 dark:bg-slate-900 border-slate-200 sm:border-l-2 sm:dark:border-none
}
.ha-marginals {
@apply bg-slate-50 dark:bg-slate-900
}
.ha-additions {
.ha-defaulttab {
@apply bg-slate-50 dark:bg-slate-900
}
.ha-additions .ha-edits .ha-editentries table tr:nth-child(even) {
.ha-defaulttab .ha-edits .ha-editentries table tr:nth-child(even) {
@apply bg-slate-100 dark:bg-slate-900
}
@@ -49,23 +49,19 @@
@apply sm:bg-slate-50 sm:dark:bg-slate-900
}
.ha-tradzhtext .ha-marginal::before,
.ha-lettertext .ha-marginal:before {
.ha-text .ha-marginal::before {
@apply bg-hamannSlate-500 dark:bg-slate-500
}
.ha-tradzhtext .ha-marginalbox,
.ha-lettertext .ha-marginalbox {
.ha-text .ha-marginalbox {
@apply bg-slate-50 dark:bg-slate-900
}
.ha-tradzhtext .ha-marginalbox.ha-expanded-box .ha-marginallist,
.ha-lettertext .ha-marginalbox.ha-expanded-box .ha-marginallist {
.ha-text .ha-marginalbox.ha-expanded-box .ha-marginallist {
@apply shadow-md dark:shadow-lg pb-1 bg-slate-100 dark:bg-slate-600
}
.ha-tradzhtext .ha-btn-collapsed-box,
.ha-lettertext .ha-btn-collapsed-box {
.ha-text .ha-btn-collapsed-box {
@apply text-slate-700 hover:text-slate-900 dark:text-white dark:hover:text-gray-200
}
@@ -110,149 +106,35 @@
@apply inline-block caps-allpetite
}
.ha-letterbody {
@apply flex flex-row flex-nowrap rounded-b-sm
.ha-tab {
@apply max-w-[52rem] pt-2
}
.ha-lettertext {
@apply max-w-[38rem] desktop:max-w-[52rem] sm:shrink-0 ml-4 sm:ml-12 px-4 pt-4 pb-8 relative flow-root font-serif leading-[1.48] numeric-mediaeval
.ha-tab .ha-appcontainer {
@apply ml-6 md:ml-16 mb-4 pb-3 font-serif numeric-mediaeval
}
.ha-marginals {
@apply hidden max-w-3xl ml-4 md:ml-12 px-4 py-4 relative leading-[1.48] numeric-mediaeval
.ha-app {
}
.ha-marginals table td {
@apply align-text-top
}
.ha-marginals .ha-marginalfromto {
@apply whitespace-nowrap text-sm font-semibold pr-4
}
.ha-marginals .ha-marginaltext .ha-bzg {
@apply inline
}
.ha-marginals .ha-marginaltext a {
@apply underline decoration-dotted hover:decoration-solid
}
.ha-additions .ha-tradition div {
@apply inline
}
.ha-additions .ha-tradition {
@apply max-w-4xl
}
.ha-additions {
@apply ml-4 md:ml-12 px-4 pt-4 pb-4 relative font-serif leading-[1.48] numeric-mediaeval
}
.ha-additions .ha-app {
@apply !block font-bold pt-6
}
.ha-additions .ha-app + br {
@apply hidden
}
.ha-additions .ha-tradition .ha-app:first-child {
@apply pt-0
}
.ha-additions .ha-tradition {
@apply hyphenate
}
.ha-additions .ha-tradition .ha-tradzhtext {
@apply !flow-root font-serif relative w-fit -ml-4 pl-4 unhyphenate
}
.ha-additions .ha-tradition a {
@apply !underline decoration-dotted hover:decoration-solid
}
.ha-additions .ha-hands {
@apply pt-6
}
.ha-additions .ha-hands .ha-handstitle {
.ha-appcontainer h3 {
@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-appcontainer a {
@apply underline decoration-dotted decoration-slate-800 hover:decoration-solid hover:decoration-slate-900
}
.ha-additions .ha-hands .ha-handentries .ha-handperson {
@apply inline pl-4 whitespace-nowrap
.ha-textcontainer {
@apply flex -ml-6 -mt-2 -mb-3 md:-ml-16
}
.ha-additions .ha-edits .ha-editstitle {
@apply font-bold
.ha-text {
@apply pt-2 pb-3 max-w-[38rem] desktop:max-w-[52rem] sm:shrink-0 ml-4 sm:ml-12 px-4 relative flow-root font-serif leading-[1.48] numeric-mediaeval
}
.ha-additions .ha-edits .ha-editentries .ha-editfromto {
@apply whitespace-nowrap
}
.ha-additions .ha-edits .ha-editentries .ha-editfrom,
.ha-additions .ha-edits .ha-editentries .ha-editto {
@apply inline text-sm font-semibold 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 max-w-4xl
}
.ha-additions .ha-edits .ha-editstitle {
@apply font-bold
}
.ha-additions .ha-edits .ha-editsinfo {
@apply pb-4 hyphenate
}
.ha-additions .ha-edits .ha-editentries tr td {
@apply align-text-top
}
.ha-additions .ha-edits .ha-editentries .ha-editreas div {
@apply inline font-sans
}
.ha-additions .ha-edits .ha-editentries .ha-editfromto {
@apply pr-1 pl-1
}
.ha-additions .ha-edits .ha-editentries .ha-editreference {
@apply border-r-2 pl-1 pr-3 text-sm
}
.ha-additions .ha-edits .ha-editentries .ha-editreference br {
@apply hidden
}
.ha-additions .ha-edits .ha-editentries .ha-editreas {
@apply pl-3 w-full
}
.ha-additions .ha-edits .ha-editentries .ha-editreas .ha-zh * {
@apply !font-serif
}
.ha-lettertext div {
.ha-text div {
@apply inline
}
@@ -261,7 +143,7 @@
}
.ha-linecount {
@apply sm:absolute sm:right-full sm:mr-2 sm:text-right text-xs sm:mt-1 font-sans select-none whitespace-nowrap
@apply sm:absolute sm:right-full sm:mr-2 sm:text-right text-xs sm:mt-[.35rem] font-sans select-none whitespace-nowrap
}
.ha-linecount .ha-zhline {
@@ -281,43 +163,117 @@
@apply !hidden
}
.ha-tradzhtext .ha-marginal::before,
.ha-lettertext .ha-marginal::before {
.ha-text .ha-marginal::before {
@apply absolute top-[0.2rem] bottom-[0.1rem] left-[0.1rem] w-0.5 content-['']
}
.ha-tradzhtext .ha-marginalbox,
.ha-lettertext .ha-marginalbox {
.ha-text .ha-marginalbox {
@apply hidden select-none hover:select-auto hyphenate pl-1 md:inline-block absolute left-full ml-6 desktop:ml-16 mt-1 w-[16rem] desktop:w-[28rem] text-sm leading-tight rounded-sm font-sans
}
.ha-tradzhtext .ha-marginalbox .ha-marginallist,
.ha-lettertext .ha-marginalbox .ha-marginallist {
.ha-text .ha-marginalbox .ha-marginallist {
@apply text-sm leading-tight flex flex-wrap gap-x-6 pr-1
}
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal {
.ha-text .ha-marginalbox .ha-marginallist .ha-marginal {
@apply pl-2 inline relative
}
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal a,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal a {
.ha-text .ha-marginalbox .ha-marginallist .ha-marginal a {
@apply !underline decoration-dotted hover:decoration-solid
}
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal,
.ha-tradzhtext .ha-marginalbox .ha-marginallist .ha-marginal *,
.ha-lettertext .ha-marginalbox .ha-marginallist .ha-marginal * {
.ha-text .ha-marginalbox .ha-marginallist .ha-marginal,
.ha-text .ha-marginalbox .ha-marginallist .ha-marginal * {
@apply min-h-0 min-w-0 overflow-ellipsis overflow-hidden
}
.ha-tradzhtext .ha-btn-collapsed-box,
.ha-lettertext .ha-btn-collapsed-box {
.ha-text .ha-btn-collapsed-box {
@apply absolute left-full ml-4 desktop:ml-[3.4rem] hidden md:inline-block cursor-pointer leading-none mt-0.5
}
.ha-defaulttab .ha-hands {
@apply ml-6 md:ml-16
}
.ha-defaulttab .ha-hands .ha-handstitle {
@apply font-bold
}
.ha-defaulttab .ha-hands .ha-handentries .ha-handfrom,
.ha-defaulttab .ha-hands .ha-handentries .ha-handto {
@apply inline text-sm font-semibold whitespace-nowrap
}
.ha-defaulttab .ha-hands .ha-handentries .ha-handperson {
@apply inline pl-4 whitespace-nowrap
}
.ha-defaulttab .ha-edits .ha-editstitle {
@apply font-bold
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editfromto {
@apply whitespace-nowrap
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editfrom,
.ha-defaulttab .ha-edits .ha-editentries .ha-editto {
@apply inline text-sm font-semibold whitespace-nowrap
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreference {
@apply whitespace-nowrap
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreference div {
@apply inline
}
.ha-defaulttab .ha-edits {
@apply max-w-4xl ml-6 md:ml-16
}
.ha-defaulttab .ha-edits .ha-editentries {
@apply md:-mr-36
}
.ha-defaulttab .ha-edits .ha-editstitle {
@apply font-bold
}
.ha-defaulttab .ha-edits .ha-editsinfo {
@apply pb-4 hyphenate
}
.ha-defaulttab .ha-edits .ha-editentries tr td {
@apply align-text-top
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreas div {
@apply inline font-sans
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editfromto {
@apply pr-1 pl-1
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreference {
@apply border-r-2 pl-1 pr-3 text-sm
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreference br {
@apply hidden
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreas {
@apply pl-3 w-full
}
.ha-defaulttab .ha-edits .ha-editentries .ha-editreas .ha-zh * {
@apply !font-serif
}
/*
.ha-minwidth .ha-tradzhtext,
.ha-lettertext.ha-minwidth {
@apply min-w-[44rem] desktop:min-w-[52rem]
@@ -330,7 +286,7 @@
.ha-lettertext.ha-minwidth .ha-aligncenter {
@apply absolute left-1/3 whitespace-nowrap -translate-x-1/2
}
} */
}
.ha-lettertext .ha-marginalbox:before {

File diff suppressed because one or more lines are too long

View File

@@ -78,7 +78,7 @@
@apply !font-serif !text-xs !font-semibold
}
.ha-text {
.ha-literal {
@apply inline
}

View File

@@ -1,92 +1,23 @@
// Code specifically for the letter view
const showhidebutton = function (
buttonid,
divid,
buttonlist,
divlist,
starthidden
) {
let button = document.getElementById(buttonid);
let div = document.getElementById(divid);
// // Code specifically for the letter view
let activetab = null;
let activetabbtn = null;
let tabbtnlist = document.querySelectorAll(".ha-tabbtn");
let tablist = document.querySelectorAll(".ha-tab");
if (starthidden && div !== null) {
div.classList.add("hide");
}
for (let i = 0; i < tabbtnlist.length; i++) {
tablist[i].classList.add("hidden");
tabbtnlist[i].addEventListener("click", () => {
if (activetab != null)
activetab.classList.add("hidden");
if (activetabbtn != null)
activetabbtn.classList.remove("active");
if (!starthidden && button !== null) {
button.classList.add("active");
}
if (button !== null) {
button.addEventListener("click", function () {
for (let btn of buttonlist) {
let inactivebutton = document.getElementById(btn);
if (inactivebutton !== null) inactivebutton.classList.remove("active");
}
for (let element of divlist) {
let hiddenelement = document.getElementById(element);
if (hiddenelement !== null) {
hiddenelement.classList.add("hide")
hiddenelement.classList.remove("flow-root");
};
}
if (button !== null) button.classList.add("active");
if (div !== null) {
div.classList.add("flow-root");
div.classList.remove("hide");
}
});
}
};
// Letter View: Show / Hide Tabs
let buttonlist = ["ha-lettertextbtn", "ha-additionsbtn", "ha-marginalsbtn"];
let divlist = ["ha-lettertext", "ha-additions", "ha-marginals"];
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
);
tablist[i].classList.remove("hidden");
tabbtnlist[i].classList.add("active");
activetab = tablist[i];
activetabbtn = tabbtnlist[i];
});
}
if (tabbtnlist.length > 0)
tabbtnlist[0].click();

View File

@@ -133,11 +133,11 @@ const overlappingcollapsebox = function (selector, hoverfunction) {
const marginalboxwidthset = function () {
let lt = document.getElementById("ha-letterbody");
if (lt !== null) {
let mg = lt.querySelectorAll(".ha-lettertext .ha-marginalbox");
let mg = lt.querySelectorAll(".ha-text .ha-marginalbox");
if (mg.length > 0) {
let ltbcr = lt.getBoundingClientRect();
let mgbcr = mg[0].getBoundingClientRect();
let nw = ltbcr.right - mgbcr.left - 18;
let nw = ltbcr.right - mgbcr.left - 20;
for (let element of mg) {
element.style.width = nw + "px";
@@ -152,14 +152,14 @@ const collapseboxes = function () {
overlappingcollapsebox(".ha-neuzeit .ha-letlinks", true);
overlappingcollapsebox(".ha-forschung .ha-letlinks", true);
overlappingcollapsebox(".ha-commentlist .ha-letlinks", true);
overlappingcollapsebox(".ha-lettertext .ha-marginalbox", true);
overlappingcollapsebox(".ha-text .ha-marginalbox", true);
};
marginalboxwidthset();
collapseboxes();
var doit;
this.window.addEventListener("resize", function () {
this.clearTimeout(doit);
marginalboxwidthset();
doit = this.setTimeout(collapseboxes, 250);
});
// var doit;
// this.window.addEventListener("resize", function () {
// this.clearTimeout(doit);
// marginalboxwidthset();
// doit = this.setTimeout(collapseboxes, 250);
// });