added basic start page setup; began rewrite of parser

This commit is contained in:
schnulller
2022-06-14 00:31:52 +02:00
parent 6be85d495b
commit 9e53de8be3
61 changed files with 532745 additions and 661 deletions

View File

@@ -132,6 +132,9 @@ public class APIController : Controller {
if (docs == null) docs = new List<XMLRootDocument>();
docs.Add(doc);
}
xdocument = null;
retdocs = null;
streamedFileContent = null;
}
try {

View File

@@ -87,7 +87,7 @@ public class Briefecontroller : Controller {
var senders = meta.Senders.Select(x => lib.Persons[x].Name) ?? new List<string>();
var recivers = meta.Receivers.Select(x => lib.Persons[x].Name) ?? new List<string>();
var zhstring = meta.ZH != null ? HaWeb.HTMLHelpers.LetterHelpers.CreateZHString(meta) : null;
return new BriefeMetaViewModel(meta, hasMarginals, false) {
return new BriefeMetaViewModel(meta, hasMarginals) {
ParsedZHString = zhstring,
ParsedSenders = HTMLHelpers.StringHelpers.GetEnumerationString(senders),
ParsedReceivers = HTMLHelpers.StringHelpers.GetEnumerationString(recivers)

View File

@@ -17,42 +17,116 @@ public class SucheController : Controller {
_lettersForPage = config.GetValue<int>("LettersOnPage");
}
[Route("Suche")]
// Filter, Order By Year, Paginate, Order By Date and by Order, Parse
public IActionResult Index() {
[Route("Suche/{letterno}")]
public IActionResult GoTo(string letterno) {
var lib = _lib.GetLibrary();
return View();
var letter = lib.Metas.Where(x => x.Value.Autopsic == letterno);
if (letter != null)
return RedirectToAction("Index", "Briefe", new { id = letterno });
return _error404();
}
private BriefeMetaViewModel generateMetaViewModel(ILibrary lib, Meta meta) {
[Route("Suche/{zhvolume}/{zhpage}")]
public IActionResult GoToZH(string zhvolume, string zhpage) {
// TODO: Bug in letter parsing: dictionary is WRONG!
var lib = _lib.GetLibrary();
var pages = lib.Structure.ContainsKey(zhvolume) ? lib.Structure[zhvolume] : null;
if (pages == null) return _error404();
var lines = pages.ContainsKey(zhpage) ? pages[zhpage] : null;
if (lines == null) return _error404();
var letters = lines.Aggregate(new HashSet<string>(), (x, y) => { x.Add(y.Value); return x; });
if (letters != null && letters.Any() && letters.Count == 1) return RedirectToAction("Index", "Briefe", new { id = letters.First() });
if (letters != null && letters.Any()) {
var metas = lib.Metas.Where(x => letters.Contains(x.Key)).Select(x => x.Value);
if (metas == null) return _error404();
var metasbyyear = metas.ToLookup(x => x.Sort.Year).OrderBy(x => x.Key).ToList();
return _paginateSend(lib, 0, metasbyyear);
}
return _error404();
}
[Route("Suche")]
// Order of actions:
// Filter, sort by year, paginate, sort by Meta.Sort & .Order, parse
public IActionResult Index(string? person, int page = 0) {
var lib = _lib.GetLibrary();
List<IGrouping<int, Meta>>? metasbyyear = null;
if (person != null) {
var letters = lib.Metas
.Where(x => x.Value.Senders.Contains(person) || x.Value.Receivers.Contains(person))
.Select(x => x.Value);
if (letters == null) return _error404();
metasbyyear = letters.ToLookup(x => x.Sort.Year).OrderBy(x => x.Key).ToList();
} else {
metasbyyear = lib.MetasByYear.OrderBy(x => x.Key).ToList();
}
return _paginateSend(lib, page, metasbyyear, person);
}
private List<(string Key, string Person)> _getAvailablePersons(ILibrary lib) {
return lib.Persons
.OrderBy(x => x.Value.Surname)
.ThenBy(x => x.Value.Prename)
.Select(x => (x.Key, x.Value.Name))
.ToList();
}
private BriefeMetaViewModel _generateMetaViewModel(ILibrary lib, Meta meta) {
var hasMarginals = lib.MarginalsByLetter.Contains(meta.Index) ? true : false;
var senders = meta.Senders.Select(x => lib.Persons[x].Name) ?? new List<string>();
var recivers = meta.Receivers.Select(x => lib.Persons[x].Name) ?? new List<string>();
var zhstring = meta.ZH != null ? HaWeb.HTMLHelpers.LetterHelpers.CreateZHString(meta) : null;
return new BriefeMetaViewModel(meta, hasMarginals, false) {
return new BriefeMetaViewModel(meta, hasMarginals) {
ParsedZHString = zhstring,
ParsedSenders = HTMLHelpers.StringHelpers.GetEnumerationString(senders),
ParsedReceivers = HTMLHelpers.StringHelpers.GetEnumerationString(recivers)
};
}
private List<(int StartYear, int EndYear)>? Paginate(ILookup<int, List<Meta>>? letters) {
private List<(int StartYear, int EndYear)>? _paginate(List<IGrouping<int, Meta>>? letters) {
if (letters == null || !letters.Any()) return null;
var orderedl = letters.OrderBy(x => x.Key);
List<(int StartYear, int EndYear)>? res = null;
int startyear = 0;
int count = 0;
foreach (var letterlist in orderedl) {
count += letterlist.Count();
foreach (var letterlist in letters) {
if (count == 0) {
startyear = letterlist.Key;
}
count += letterlist.Count();
if (count >= _lettersForPage) {
if (res == null) res = new List<(int StartYear, int EndYear)>();
res.Add((startyear, letterlist.Key));
count = 0;
}
if (letterlist == letters.Last()) {
if (res == null) res = new List<(int StartYear, int EndYear)>();
res.Add((startyear, letterlist.Key));
}
}
return res;
}
private IActionResult _paginateSend(ILibrary lib, int page, List<IGrouping<int, Meta>>? metasbyyear, string? person = null) {
var pages = _paginate(metasbyyear);
if (pages != null && page >= pages.Count) return _error404();
if (pages == null && page > 0) return _error404();
List<(int Year, List<BriefeMetaViewModel> LetterList)>? letters = null;
if (pages != null)
letters = metasbyyear
.Where(x => x.Key >= pages[page].StartYear && x.Key <= pages[page].EndYear)
.Select(x => (x.Key, x
.Select(y => _generateMetaViewModel(lib, y))
.OrderBy(x => x.Meta.Sort)
.ThenBy(x => x.Meta.Order)
.ToList()))
.ToList();
var model = new SucheViewModel(letters, page, pages, _getAvailablePersons(lib));
if (person != null) model.ActivePerson = person;
return View("Index", model);
}
private IActionResult _error404() {
Response.StatusCode = 404;
return Redirect("/Error404");
}
}

View File

@@ -42,6 +42,7 @@ public class HaDocumentWrapper : IHaDocumentWrappper {
if (ModelState != null) ModelState.AddModelError("Error", "Das Dokument konnte nicht geparst werden: " + ex.Message);
return null;
}
return Library;
}

211648
HaWeb/Hammannoindet.xml Normal file

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,6 @@ 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;
@@ -47,9 +46,8 @@ public class BriefeMetaViewModel {
public (BriefeMetaViewModel, string)? Prev { get; set; }
public BriefeMetaViewModel(Meta meta, bool hasMarginals, bool showZHData) {
public BriefeMetaViewModel(Meta meta, bool hasMarginals) {
Meta = meta;
HasMarginals = hasMarginals;
ShowZHData = showZHData;
}
}

View File

@@ -1,15 +1,21 @@
namespace HaWeb.Models;
public class SucheViewModel {
public List<(int Year, List<BriefeMetaViewModel> LetterList)> Letters { get; private set; }
public List<(int Year, List<BriefeMetaViewModel> LetterList)>? Letters { get; private set; }
public int Count { get; private set; }
public int ActiveYears { get; private set; }
public List<(int StartYear, int EndYear)> AvailableYears { get; private set; }
public int ActiveYear { get; private set; }
public List<(int StartYear, int EndYear)>? AvailableYears { get; private set; }
public string? ActivePerson {get; set; }
public List<(string Key, string Name)>? AvailablePersons { get; private set; }
public SucheViewModel(List<(int Year, List<BriefeMetaViewModel> LetterList)> letters, int count, int activeYears, List<(int StartYear, int EndYear)> availableYears) {
public SucheViewModel(List<(int Year, List<BriefeMetaViewModel> LetterList)>? letters, int activeYear, List<(int StartYear, int EndYear)>? availableYears, List<(string Key, string Name)>? availablePersons) {
Letters = letters;
Count = count;
ActiveYears = activeYears;
if (letters != null)
Count = letters.Select(x => x.LetterList.Count).Aggregate(0, (x, y) => { x += y; return x; });
else
Count = 0;
ActiveYear = activeYear;
AvailableYears = availableYears;
AvailablePersons = availablePersons;
}
}

View File

@@ -8,20 +8,11 @@ using HaWeb.XMLParser;
public class XMLRootDocument {
private XElement? _Element;
private string? _filename;
private IFileInfo? _file;
[JsonIgnore]
public IXMLRoot XMLRoot { get; private set; }
[JsonIgnore]
public XElement Root {
get {
if (_Element == null) {
_Element = _GetElement();
}
return _Element;
}
}
public string FileName {
get {
if (_filename == null)
@@ -31,7 +22,17 @@ public class XMLRootDocument {
}
[JsonIgnore]
public IFileInfo? File { get; set; }
public IFileInfo? File {
get {
return _file;
}
set {
_file = value;
// After saving, we don't need to save the ELement anymore, it can get read in if it's used.
// We do this to prevent memory hogging. TODO: MAKE IT MORE EFFICIENT, EG ALL USED FILES HAVE SET ELEMENTS OR SO
// TODO Also make the file directory more efficient by reading in the directories as they are requested.
if (value != null) _Element = null;
} }
public string Prefix { get; private set; }
public DateTime Date { get; private set; }
@@ -89,7 +90,7 @@ public class XMLRootDocument {
}
}
private XElement _GetElement() {
public XElement GetElement() {
if (File == null || String.IsNullOrWhiteSpace(File.PhysicalPath) || !File.Exists)
throw new Exception("Es ist kein Pfad für die XML-Datei vorhanden.");
@@ -120,6 +121,15 @@ public class XMLRootDocument {
state.AddModelError("Error", "No corresponding Root Element found.");
return;
}
await root.CreateHamannDocument(Root).SaveAsync(stream, SaveOptions.DisableFormatting, new CancellationToken());
if (_Element == null) {
if (File == null) {
state.AddModelError("Error", "There is neither a file nor a saved element for this Document aborting the save.");
return;
}
_Element = GetElement();
}
await root.CreateHamannDocument(_Element).SaveAsync(stream, SaveOptions.DisableFormatting, new CancellationToken());
}
}

View File

@@ -5,7 +5,7 @@ To build the project install nodejs > 16.5 LTS. Install npm > 8.10.0. After that
Dotnet 6.0.300 is currently used. To build the project, do a `dotnet restore` and collect the `Microsoft.FeatureManagement.AspNetCore` nuget-package which is used to enable feauture-flags in `appsettings.json`. Some routes, such as the admin area of the project will only be mapped if certain flags are present and set to true.
Also, this project requires two other projects `HaDocumentV6` (for reading in the file into convenient to use models) and `HaXMLReader` (for forward parsing elements such as letters, comments, traditions and marginals in an HTML transform). They have no dependencies (apart from each other and `.NET 6`) and are build at build time automatically.
Also, this project requires two other projects `HaDocumentV6` (for reading in the file into convenient to use models) and `HaXMLReader` (for forward parsing elements such as letters, comments, traditions and marginals in an HTML transform). They have no dependencies (apart from each other and `.NET 6`) and are build and linked at build time automatically.
## Building the project
@@ -15,7 +15,7 @@ to build the necessary `output.css`-File.
`dotnet build HaWeb.csproj`
to build the App. Please do consider the order of these commands.
to build the Website. Please do consider the order of these commands.
Don't forget to place a valid `Hamann.xml`-File in the root of the build to provide a starting and fallback XML-file.
@@ -72,4 +72,5 @@ TODO Evtl alignment von center / right an der letzten oder nächsten zeile
TODO Abhärten des Konstruktors von XMLRootDokument für von außerhalb platzierte Dokumente
TODO XML-Check im Client
TODO Lock für die Liste, Bzw ConcurretBag
TODO 516A david friedlaender in den traditions
TODO 516A david friedlaender in den traditions
TODO 3 Zeilen marginal schließt perfekt an 2 zeilen text an

View File

@@ -46,7 +46,7 @@ public class CommentRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("kommentare") == null)
file.AddFirst(new XElement("kommentare"));
file.Element("kommentare")!.AddFirst(document.Root);
file.Element("kommentare")!.AddFirst(document.GetElement());
}
}

View File

@@ -41,7 +41,7 @@ public class DescriptionsRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("descriptions") == null)
file.AddFirst(new XElement("descriptions"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("descriptions");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -42,7 +42,7 @@ public class DocumentRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("document") == null)
file.AddFirst(new XElement("document"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("document");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -41,7 +41,7 @@ public class EditsRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("edits") == null)
file.AddFirst(new XElement("edits"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("edits");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -41,7 +41,7 @@ public class MarginalsRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("marginalien") == null)
file.AddFirst(new XElement("marginalien"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("marginalien");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -39,7 +39,7 @@ public class ReferencesRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("definitions") == null)
file.AddFirst(new XElement("definitions"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("definitions");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -41,7 +41,7 @@ public class TraditionsRoot : HaWeb.XMLParser.IXMLRoot {
public void MergeIntoFile(XElement file, XMLRootDocument document) {
if (file.Element("traditions") == null)
file.AddFirst(new XElement("traditions"));
var elements = document.Root.Elements().Where(x => IsCollectedObject(x));
var elements = document.GetElement().Elements().Where(x => IsCollectedObject(x));
var root = file.Element("traditions");
foreach (var element in elements) {
root!.Add(element);

View File

@@ -13,7 +13,7 @@
</noscript>
<div class="ha-letterheader">
@await Html.PartialAsync("/Views/Shared/_LetterHead.cshtml", Model.MetaData)
@await Html.PartialAsync("/Views/Shared/_LetterHead.cshtml", (Model.MetaData, false))
<div class="ha-letterheadernav">
<div class="ha-lettertabs">
@if (Model.ParsedText != null && !String.IsNullOrWhiteSpace(Model.ParsedText))

View File

@@ -1,26 +1,26 @@
@model BriefeMetaViewModel
@model (BriefeMetaViewModel Letter, bool ShowZHData)
<div class="ha-letterhead">
<div class="ha-letternumber">
<div class="ha-letternumberinline">
@Model.Meta.Autopsic
@Model.Letter.Meta.Autopsic
</div>
</div>
<div class="ha-metadata">
<div class="ha-metadatarows">
<div class="ha-metadataupperrow">
<div class="ha-metadatadate">
@Model.Meta.Date
@Model.Letter.Meta.Date
</div>
@if (Model.HasText) {
@if (Model.ParsedZHString != null && Model.ShowZHData) {
@if (Model.Letter.HasText) {
@if (Model.Letter.ParsedZHString != null && Model.ShowZHData) {
<div class="ha-tooltip">
<div class="ha-pill">
<span>@Html.Raw(Model.ParsedZHString)</span>
<span>@Html.Raw(Model.Letter.ParsedZHString)</span>
</div>
</div>
}
else if (Model.ParsedZHString == null) {
else if (Model.Letter.ParsedZHString == null) {
<div class="ha-tooltip">
<div class="ha-pill ha-newpill">
<span>Neu</span>
@@ -28,7 +28,7 @@
</div>
}
@if (Model.Meta.hasOriginal != HaDocument.Models.OptionalBool.True) {
@if (Model.Letter.Meta.hasOriginal != HaDocument.Models.OptionalBool.True) {
<div class="ha-tooltip">
<div class="ha-pill">
<span class="ha-cross">Orig</span>
@@ -49,7 +49,7 @@
</div>
}
@if (Model.Meta.isProofread != HaDocument.Models.OptionalBool.True) {
@if (Model.Letter.Meta.isProofread != HaDocument.Models.OptionalBool.True) {
<div class="ha-tooltip">
<div class="ha-pill">
<span class="ha-cross">geprüft</span>
@@ -70,7 +70,7 @@
</div>
}
@if (Model.Meta.ZH != null && Model.Meta.ZH.dateChanged) {
@if (Model.Letter.Meta.ZH != null && Model.Letter.Meta.ZH.dateChanged) {
<div class="ha-tooltip">
<div class="ha-pill">
neu datiert
@@ -81,7 +81,7 @@
</div>
}
@if (Model.HasMarginals) {
@if (Model.Letter.HasMarginals) {
<div class="ha-tooltip">
<div class="ha-pill">
Komm
@@ -94,19 +94,19 @@
}
</div>
<div class="ha-metadatapersons">
@if (!String.IsNullOrWhiteSpace(Model.ParsedReceivers)) {
@if (Model.Meta.isDraft == HaDocument.Models.OptionalBool.True) {
<span>@Html.Raw(Model.ParsedSenders)</span>
@if (!String.IsNullOrWhiteSpace(Model.Letter.ParsedReceivers)) {
@if (Model.Letter.Meta.isDraft == HaDocument.Models.OptionalBool.True) {
<span>@Html.Raw(Model.Letter.ParsedSenders)</span>
<div class="ha-tooltip">
<div class="ha-tooltiptext" style="bottom: 100%;">
Entwurf
</div>
</div>
<span>@Html.Raw(Model.ParsedReceivers)</span>
<span>@Html.Raw(Model.Letter.ParsedReceivers)</span>
}
else {
<span>@Html.Raw(Model.ParsedSenders) → @Html.Raw(Model.ParsedReceivers)</span>
<span>@Html.Raw(Model.Letter.ParsedSenders) → @Html.Raw(Model.Letter.ParsedReceivers)</span>
}
}
</div>

View File

@@ -6,5 +6,45 @@
}
<div class="ha-search">
@if (Model.Letters != null) {
<div class="ha-letterlisthead">
<h1>Briefauswahl</h1>
<div class="ha-letterlistnav">
@if (Model.AvailableYears != null && Model.AvailableYears.Any()) {
@for(var i = 0; i < Model.AvailableYears.Count; i++) {
<a class="@(Model.ActiveYear == i ? "active" : "")" asp-route-person="@Model.ActivePerson" asp-controller="Suche" asp-action="Index" asp-route-page="@i">
@if (Model.AvailableYears[i].StartYear != Model.AvailableYears[i].EndYear) {
<span>
@Model.AvailableYears[i].StartYear-@Model.AvailableYears[i].EndYear
</span>
}
else {
<span>
@Model.AvailableYears[i].StartYear
</span>
}
</a>
}
}
</div>
</div>
<div class="ha-personlist">
@if(Model.AvailablePersons != null) {
@foreach (var person in Model.AvailablePersons) {
<a class="@(Model.ActivePerson == person.Key ? "active" : "")" asp-controller="Suche" asp-action="Index" asp-route-person="@person.Key" asp-route-page="@null">
@person.Name
</a>
}
}
</div>
<div class="ha-letterlist">
@foreach (var year in Model.Letters) {
foreach (var letter in year.LetterList) {
<a asp-controller="Briefe" asp-action="Index" asp-route-id="@letter.Meta.Autopsic">
@await Html.PartialAsync("/Views/Shared/_LetterHead.cshtml", (letter, true))
</a>
}
}
</div>
}
</div>

View File

@@ -47,7 +47,7 @@ public interface IXMLRoot {
// public Dictionary<string, XElement>? GetCollectedObjects(XMLRootDocument document) {
// Dictionary<string, XElement>? ret = null;
// var root = document.Root;
// var root = document.GetElement();
// root.Elements().Where(x => this.IsCollectedObject(x)).ToList().ForEach(x => {
// var id = this.GetKey(x);
// if (id != null) {

281525
HaWeb/attributes.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,357 @@
opus
opus/data
opus/data/definitions
opus/data/definitions/handDefs
opus/data/definitions/locationDefs
opus/data/definitions/personDefs
opus/data/definitions/structureDefs
opus/data/descriptions
opus/document
opus/document/letterText/added/anchor
opus/document/letterText/added/anchor/@ref
opus/document/letterText/address/aq/del/ul
opus/document/letterText/address/aq/line/@type
opus/document/letterText/address/aq/ul/aq
opus/document/letterText/address/aq/ul/line
opus/document/letterText/address/aq/ul/line/@autopsic
opus/document/letterText/address/aq/ul/line/@index
opus/document/letterText/address/del/aq/line
opus/document/letterText/address/del/aq/line/@autopsic
opus/document/letterText/address/del/aq/line/@index
opus/document/letterText/address/del/ul
opus/document/letterText/address/edit/aq/dul
opus/document/letterText/address/edit/aq/hand
opus/document/letterText/address/edit/aq/hand/@ref
opus/document/letterText/address/edit/aq/ul/super
opus/document/letterText/address/edit/hand
opus/document/letterText/address/edit/hand/aq
opus/document/letterText/address/edit/hand/aq/super
opus/document/letterText/address/edit/hand/@ref
opus/document/letterText/address/hand/aq
opus/document/letterText/address/hand/aq/ul
opus/document/letterText/address/hand/super/ul
opus/document/letterText/address/line/@type
opus/document/letterText/address/note
opus/document/letterText/address/nr
opus/document/letterText/address/page
opus/document/letterText/address/page/@autopsic
opus/document/letterText/address/page/@index
opus/document/letterText/align/address/aq
opus/document/letterText/align/aq/del
opus/document/letterText/align/aq/edit
opus/document/letterText/align/aq/edit/@ref
opus/document/letterText/align/aq/super
opus/document/letterText/align/datum/del/aq
opus/document/letterText/align/datum/edit/gr
opus/document/letterText/align/datum/nr
opus/document/letterText/align/datum/sub/aq
opus/document/letterText/align/del/gr
opus/document/letterText/align/edit/aq/super
opus/document/letterText/align/edit/datum/del
opus/document/letterText/align/edit/datum/del/nr
opus/document/letterText/align/edit/datum/super
opus/document/letterText/align/edit/gr
opus/document/letterText/align/edit/gr/del
opus/document/letterText/align/edit/sig/aq
opus/document/letterText/align/edit/super
opus/document/letterText/align/hand/datum/super
opus/document/letterText/align/hand/datum/ul
opus/document/letterText/align/hand/del
opus/document/letterText/align/hand/sig
opus/document/letterText/align/hand/sig/aq
opus/document/letterText/align/sig/datum
opus/document/letterText/align/sig/nr/aq
opus/document/letterText/align/up/aq
opus/document/letterText/anchor/added
opus/document/letterText/anchor/note
opus/document/letterText/aq/address/del
opus/document/letterText/aq/address/edit
opus/document/letterText/aq/address/edit/@ref
opus/document/letterText/aq/address/edit/ul
opus/document/letterText/aq/align/ul
opus/document/letterText/aq/del/edit
opus/document/letterText/aq/del/edit/@ref
opus/document/letterText/aq/dul/line
opus/document/letterText/aq/dul/line/@autopsic
opus/document/letterText/aq/dul/line/@index
opus/document/letterText/aq/edit/del
opus/document/letterText/aq/edit/del/nr
opus/document/letterText/aq/super/ul
opus/document/letterText/aq/ul/added
opus/document/letterText/aq/ul/del
opus/document/letterText/aq/ul/super
opus/document/letterText/datum/align/added
opus/document/letterText/datum/align/datum
opus/document/letterText/datum/align/del
opus/document/letterText/datum/aq/line
opus/document/letterText/datum/aq/line/@autopsic
opus/document/letterText/datum/aq/line/@index
opus/document/letterText/datum/edit/super
opus/document/letterText/datum/edit/ul
opus/document/letterText/datum/gr
opus/document/letterText/datum/hand
opus/document/letterText/datum/hand/@ref
opus/document/letterText/datum/super/aq
opus/document/letterText/del/added
opus/document/letterText/del/aq/del
opus/document/letterText/del/del/nr
opus/document/letterText/del/edit/nr
opus/document/letterText/del/gr
opus/document/letterText/del/gr/edit
opus/document/letterText/del/gr/edit/@ref
opus/document/letterText/del/gr/line
opus/document/letterText/del/gr/line/@autopsic
opus/document/letterText/del/gr/line/@index
opus/document/letterText/del/super
opus/document/letterText/del/super/aq
opus/document/letterText/del/ul/line
opus/document/letterText/del/ul/line/@autopsic
opus/document/letterText/del/ul/line/@index
opus/document/letterText/dul/super
opus/document/letterText/edit/added/nr
opus/document/letterText/edit/added/ul
opus/document/letterText/edit/address/hand
opus/document/letterText/edit/address/hand/@ref
opus/document/letterText/edit/address/hand/ul
opus/document/letterText/edit/address/line
opus/document/letterText/edit/address/line/@autopsic
opus/document/letterText/edit/address/line/@index
opus/document/letterText/edit/address/ul/aq
opus/document/letterText/edit/align/aq/ul
opus/document/letterText/edit/align/datum/aq
opus/document/letterText/edit/align/edit
opus/document/letterText/edit/align/edit/aq
opus/document/letterText/edit/align/edit/@ref
opus/document/letterText/edit/anchor
opus/document/letterText/edit/anchor/@ref
opus/document/letterText/edit/aq/dul
opus/document/letterText/edit/aq/edit
opus/document/letterText/edit/aq/edit/@ref
opus/document/letterText/edit/aq/line/@tab
opus/document/letterText/edit/aq/ul/del
opus/document/letterText/edit/aq/ul/line
opus/document/letterText/edit/aq/ul/line/@autopsic
opus/document/letterText/edit/aq/ul/line/@index
opus/document/letterText/edit/del/aq/del
opus/document/letterText/edit/del/del/line
opus/document/letterText/edit/del/del/line/@autopsic
opus/document/letterText/edit/del/del/line/@index
opus/document/letterText/edit/del/page
opus/document/letterText/edit/del/page/@autopsic
opus/document/letterText/edit/del/page/@index
opus/document/letterText/edit/edit/aq/del
opus/document/letterText/edit/edit/del/aq
opus/document/letterText/edit/edit/edit/aq
opus/document/letterText/edit/edit/page
opus/document/letterText/edit/edit/page/@autopsic
opus/document/letterText/edit/edit/page/@index
opus/document/letterText/edit/edit/super
opus/document/letterText/edit/gr/del/nr
opus/document/letterText/edit/hand/align/aq
opus/document/letterText/edit/hand/aq/del
opus/document/letterText/edit/hand/aq/del/ul
opus/document/letterText/edit/hand/aq/nr
opus/document/letterText/edit/hand/del/aq
opus/document/letterText/edit/hand/super
opus/document/letterText/edit/hand/ul
opus/document/letterText/edit/nr/aq/del
opus/document/letterText/edit/sig/aq
opus/document/letterText/edit/sig/aq/ul
opus/document/letterText/edit/sig/line
opus/document/letterText/edit/sig/line/@autopsic
opus/document/letterText/edit/sig/line/@index
opus/document/letterText/edit/ul/del/nr
opus/document/letterText/edit/ul/edit
opus/document/letterText/edit/ul/edit/@ref
opus/document/letterText/edit/ul/nr
opus/document/letterText/edit/ul/ul
opus/document/letterText/fn/added/aq
opus/document/letterText/fn/del
opus/document/letterText/fn/hand/aq
opus/document/letterText/fn/line/@type
opus/document/letterText/fn/note/ul
opus/document/letterText/ful/aq
opus/document/letterText/gr/del
opus/document/letterText/gr/edit/del
opus/document/letterText/gr/line/@tab
opus/document/letterText/hand/address/aq/del
opus/document/letterText/hand/address/aq/del/nr
opus/document/letterText/hand/address/aq/del/nr/ul
opus/document/letterText/hand/address/aq/line
opus/document/letterText/hand/address/aq/line/@autopsic
opus/document/letterText/hand/address/aq/line/@index
opus/document/letterText/hand/address/aq/line/@tab
opus/document/letterText/hand/address/edit
opus/document/letterText/hand/address/edit/@ref
opus/document/letterText/hand/address/edit/ul
opus/document/letterText/hand/address/edit/ul/aq
opus/document/letterText/hand/align/datum/edit
opus/document/letterText/hand/align/datum/edit/@ref
opus/document/letterText/hand/align/datum/edit/super
opus/document/letterText/hand/aq/address
opus/document/letterText/hand/aq/address/line
opus/document/letterText/hand/aq/address/line/@autopsic
opus/document/letterText/hand/aq/address/line/@index
opus/document/letterText/hand/aq/address/ul
opus/document/letterText/hand/datum/align
opus/document/letterText/hand/datum/align/@pos
opus/document/letterText/hand/datum/edit
opus/document/letterText/hand/datum/edit/aq
opus/document/letterText/hand/datum/edit/@ref
opus/document/letterText/hand/del/aq
opus/document/letterText/hand/del/line
opus/document/letterText/hand/del/line/@autopsic
opus/document/letterText/hand/del/line/@index
opus/document/letterText/hand/del/line/@tab
opus/document/letterText/hand/del/nr
opus/document/letterText/hand/edit/added
opus/document/letterText/hand/edit/aq/ul
opus/document/letterText/hand/edit/del/nr
opus/document/letterText/hand/edit/line
opus/document/letterText/hand/edit/line/@autopsic
opus/document/letterText/hand/edit/line/@index
opus/document/letterText/hand/edit/nr
opus/document/letterText/hand/edit/ul/aq
opus/document/letterText/hand/gr/del
opus/document/letterText/hand/gr/line
opus/document/letterText/hand/gr/line/@autopsic
opus/document/letterText/hand/gr/line/@index
opus/document/letterText/hand/ps
opus/document/letterText/hand/ps/aq
opus/document/letterText/hand/ps/datum
opus/document/letterText/hand/ps/datum/aq
opus/document/letterText/hand/ul/aq
opus/document/letterText/hand/ul/nr
opus/document/letterText/note/aq/ul
opus/document/letterText/note/line/@tab
opus/document/letterText/note/ul
opus/document/letterText/nr/del
opus/document/letterText/ps/added
opus/document/letterText/ps/align
opus/document/letterText/ps/align/aq
opus/document/letterText/ps/align/@pos
opus/document/letterText/ps/aq/line
opus/document/letterText/ps/aq/line/@autopsic
opus/document/letterText/ps/aq/line/@index
opus/document/letterText/ps/aq/super
opus/document/letterText/ps/del/line
opus/document/letterText/ps/del/line/@autopsic
opus/document/letterText/ps/del/line/@index
opus/document/letterText/ps/edit/dul
opus/document/letterText/ps/edit/dul/aq
opus/document/letterText/ps/ps
opus/document/letterText/ps/ps/del
opus/document/letterText/ps/ul/aq
opus/document/letterText/sig/align/ul
opus/document/letterText/sig/datum
opus/document/letterText/super/del
opus/document/letterText/tab/ful
opus/document/letterText/tabs/align/aq
opus/document/letterText/tabs/align/edit
opus/document/letterText/tabs/align/edit/aq
opus/document/letterText/tabs/align/edit/@ref
opus/document/letterText/tabs/aq/ul
opus/document/letterText/tabs/edit
opus/document/letterText/tabs/edit/page
opus/document/letterText/tabs/edit/page/@autopsic
opus/document/letterText/tabs/edit/page/@index
opus/document/letterText/tabs/edit/@ref
opus/document/letterText/tabs/edit/tab/del
opus/document/letterText/tabs/edit/tab/dul
opus/document/letterText/tabs/edit/tab/edit/tul
opus/document/letterText/tabs/edit/tab/ul
opus/document/letterText/tabs/line/@type
opus/document/letterText/tabs/tab/aq/added
opus/document/letterText/tabs/tab/aq/super
opus/document/letterText/tabs/tab/aq/ul
opus/document/letterText/tabs/tab/datum/aq
opus/document/letterText/tabs/tab/edit/aq
opus/document/letterText/tabs/tab/ful/aq
opus/document/letterText/tabs/tab/ful/del
opus/document/letterText/tabs/tab/ful/del/nr
opus/document/letterText/tabs/tab/nr
opus/document/letterText/tabs/tab/nr/aq
opus/document/letterText/tabs/tab/tab
opus/document/letterText/tabs/tab/tab/@value
opus/document/letterText/tabs/tab/up/edit
opus/document/letterText/tabs/tab/up/edit/aq
opus/document/letterText/tabs/tab/up/edit/@ref
opus/document/letterText/tab/ul
opus/document/letterText/ul/aq/added
opus/document/letterText/ul/edit/added
opus/document/letterText/ul/edit/del
opus/document/letterText/ul/edit/ul
opus/document/letterText/ul/super
opus/document/letterText/up
opus/edits
opus/edits/editreason/aq/del
opus/edits/editreason/aq/nr
opus/edits/editreason/aq/ul
opus/edits/editreason/del/added
opus/edits/editreason/nr
opus/edits/editreason/zh/added/aq
opus/edits/editreason/zh/address/hand
opus/edits/editreason/zh/address/hand/@ref
opus/edits/editreason/zh/address/ul
opus/edits/editreason/zh/aq/del
opus/edits/editreason/zh/aq/dul
opus/edits/editreason/zh/aq/nr
opus/edits/editreason/zh/del/note
opus/edits/editreason/zh/dul/aq
opus/edits/editreason/zh/note
opus/edits/editreason/zh/sig/ul
opus/edits/editreason/zh/ul/added
opus/edits/editreason/zh/ul/del
opus/kommentare
opus/kommentare/kommcat/kommentar/eintrag/titel/link
opus/kommentare/kommcat/kommentar/eintrag/titel/link/@linktext
opus/kommentare/kommcat/kommentar/eintrag/titel/link/@ref
opus/kommentare/kommcat/kommentar/lemma/titel
opus/kommentare/kommcat/kommentar/lemma/wwwlink
opus/kommentare/kommcat/kommentar/lemma/wwwlink/@address
opus/kommentare/kommcat/kommentar/subsection/wwwlink
opus/kommentare/kommcat/kommentar/subsection/wwwlink/@address
opus/marginalien
opus/marginalien/marginal/eintrag
opus/traditions
opus/traditions/letterTradition/align/note
opus/traditions/letterTradition/del
opus/traditions/letterTradition/del/aq
opus/traditions/letterTradition/note/ul
opus/traditions/letterTradition/nr
opus/traditions/letterTradition/ZHText/align/aq/del
opus/traditions/letterTradition/ZHText/align/aq/ul
opus/traditions/letterTradition/ZHText/align/datum
opus/traditions/letterTradition/ZHText/align/del/aq
opus/traditions/letterTradition/ZHText/aq/line/@type
opus/traditions/letterTradition/ZHText/aq/nr
opus/traditions/letterTradition/ZHText/aq/ul/line
opus/traditions/letterTradition/ZHText/aq/ul/line/@autopsic
opus/traditions/letterTradition/ZHText/aq/ul/line/@index
opus/traditions/letterTradition/ZHText/edit/align/aq
opus/traditions/letterTradition/ZHText/edit/aq/line
opus/traditions/letterTradition/ZHText/edit/aq/line/@autopsic
opus/traditions/letterTradition/ZHText/edit/aq/line/@index
opus/traditions/letterTradition/ZHText/edit/dul
opus/traditions/letterTradition/ZHText/edit/edit/ul
opus/traditions/letterTradition/ZHText/edit/nr
opus/traditions/letterTradition/ZHText/edit/super
opus/traditions/letterTradition/ZHText/hand/align/super
opus/traditions/letterTradition/ZHText/hand/aq/line
opus/traditions/letterTradition/ZHText/hand/aq/line/@autopsic
opus/traditions/letterTradition/ZHText/hand/aq/line/@index
opus/traditions/letterTradition/ZHText/hand/aq/ul
opus/traditions/letterTradition/ZHText/hand/edit/aq
opus/traditions/letterTradition/ZHText/hand/edit/dul
opus/traditions/letterTradition/ZHText/hand/ul/aq
opus/traditions/letterTradition/ZHText/hb
opus/traditions/letterTradition/ZHText/note/align
opus/traditions/letterTradition/ZHText/note/align/@pos
opus/traditions/letterTradition/ZHText/nr/aq
opus/traditions/letterTradition/ZHText/tabs
opus/traditions/letterTradition/ZHText/tabs/tab/aq
opus/traditions/letterTradition/ZHText/tabs/tab/del
opus/traditions/letterTradition/ZHText/tabs/tab/ful
opus/traditions/letterTradition/ZHText/tabs/tab/ful/del
opus/traditions/letterTradition/ZHText/tabs/tab/ful/del/nr
opus/traditions/letterTradition/ZHText/ul/super/aq

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,9 @@
@layer components {
.ha-search {
@apply pt-9 md:pt-12 px-9 md:px-16 bg-slate-50
}
.ha-search .ha-letterlist {
}
}

View File

@@ -148,7 +148,7 @@
}
.up {
@apply relative -top[0.5em]
@apply relative -top-[0.5em]
}
.ha-alignright {

View File

@@ -140,10 +140,17 @@ const overlappingcollapsebox = function (selector, hoverfunction) {
let nextrect = boxes[i + 1].getBoundingClientRect();
let overlap = thisrect.bottom - nextrect.top;
if (
overlap >= 0 &&
// -1 for caching lines that perfectly close up on each other
overlap >= -1 &&
!(window.getComputedStyle(element).display === "none")
) {
let newlength = thisrect.height - overlap;
let newlength = 0;
if (overlap >= 0)
newlength = thisrect.height - overlap;
else
newlength = thisrect.height - lineheight;
if (newlength % (lineheight * 3) <= 2)
newlength -= lineheight;
let remainder = newlength % lineheight;
newlength = newlength - remainder - 1;