mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-30 01:35:32 +00:00
Added settings classes for CSS; added Register parsing
This commit is contained in:
92
HaWeb/HTMLHelpers/CommentHelper.cs
Normal file
92
HaWeb/HTMLHelpers/CommentHelper.cs
Normal file
@@ -0,0 +1,92 @@
|
||||
namespace HaWeb.HTMLHelpers;
|
||||
using HaDocument.Interfaces;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using HaDocument.Models;
|
||||
using System.Text;
|
||||
|
||||
public static class CommentHelpers
|
||||
{
|
||||
|
||||
private static readonly string DEFAULTELEMENT = HaWeb.Settings.ParsingSettings.DEFAULTELEMENT;
|
||||
private static readonly string LEMMACLASS = HaWeb.Settings.CSSClasses.LEMMACLASS;
|
||||
private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS;
|
||||
private static readonly string BACKLINKSCLASS = HaWeb.Settings.CSSClasses.BACKLINKSCLASS;
|
||||
private static readonly string LETLINKCLASS = HaWeb.Settings.CSSClasses.LETLINKCLASS;
|
||||
private static readonly string COMMENTHEADCLASS = HaWeb.Settings.CSSClasses.COMMENTHEADCLASS;
|
||||
private static readonly string COMMENTBODYCLASS = HaWeb.Settings.CSSClasses.COMMENTBODYCLASS;
|
||||
// Parsing Rules
|
||||
private static readonly List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _OTagFuncs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, LEMMACLASS))),
|
||||
( x => x.Name == "title", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS))),
|
||||
( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)))
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _CTagFuncs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))),
|
||||
( x => x.Name == "title", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT))),
|
||||
( x => x.Name == "titel", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)))
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _STagFuncs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "line", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement("br")) )
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Text, bool>, Action<StringBuilder, Text>)> _TextFuncs = new List<(Func<Text, bool>, Action<StringBuilder, Text>)>() {
|
||||
( x => true, ( sb, txt ) => sb.Append(txt.Value) )
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)> _WhitespaceFuncs = new List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)>() {
|
||||
( x => true, ( sb, txt ) => sb.Append(txt.Value) )
|
||||
};
|
||||
|
||||
public static string CreateHTML(ILibrary lib, IReaderService readerService, Comment comment)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var rd = readerService.RequestStringReader(comment.Lemma);
|
||||
new HTMLHelpers.XMLHelper(rd, sb, _OTagFuncs, _STagFuncs, _CTagFuncs, _TextFuncs, _WhitespaceFuncs);
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTHEADCLASS, comment.Index));
|
||||
new HTMLHelpers.LinkHelper(lib, rd, sb);
|
||||
rd.Read();
|
||||
var backlinks = lib.Backlinks.ContainsKey(comment.Index) ? lib.Backlinks[comment.Index]
|
||||
.Where(x => lib.Metas.ContainsKey(x.Letter))
|
||||
.OrderBy(x => lib.Metas[x.Letter].Sort)
|
||||
.ThenBy(x => lib.Metas[x.Letter].Order) : null;
|
||||
if (backlinks != null)
|
||||
{
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, BACKLINKSCLASS));
|
||||
var arrow = false;
|
||||
foreach (var blk in backlinks)
|
||||
{
|
||||
var let = lib.Metas.ContainsKey(blk.Letter) ? lib.Metas[blk.Letter] : null;
|
||||
if (let != null)
|
||||
{
|
||||
if (!arrow)
|
||||
{
|
||||
sb.Append("HKB ");
|
||||
arrow = true;
|
||||
}
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", LETLINKCLASS, "/Briefe/" + let.Autopsic + "#" + blk.Page + "-" + blk.Line));
|
||||
var linkstring = "";
|
||||
var pglnstring = "";
|
||||
linkstring += let.Autopsic;
|
||||
pglnstring += " ( " + blk.Page + "/" + blk.Line + " )";
|
||||
linkstring += pglnstring;
|
||||
sb.Append(linkstring);
|
||||
if (blk != backlinks.Last())
|
||||
sb.Append(", ");
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateEndElement("a"));
|
||||
}
|
||||
}
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
|
||||
}
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTBODYCLASS));
|
||||
rd = readerService.RequestStringReader(comment.Entry);
|
||||
new HTMLHelpers.XMLHelper(rd, sb, _OTagFuncs, _STagFuncs, _CTagFuncs, _TextFuncs, _WhitespaceFuncs);
|
||||
new HTMLHelpers.LinkHelper(lib, rd, sb);
|
||||
rd.Read();
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
@@ -14,9 +14,32 @@ public class LinkHelper {
|
||||
private StringBuilder _sb;
|
||||
|
||||
private bool _followlinksinchildren;
|
||||
|
||||
private bool _followlinksinthis;
|
||||
|
||||
private static readonly string DEFAULTELEMENT = HaWeb.Settings.ParsingSettings.DEFAULTELEMENT;
|
||||
private static readonly string LETLINKCLASS = HaWeb.Settings.CSSClasses.LETLINKCLASS;
|
||||
private static readonly string REFLINKCLASS = HaWeb.Settings.CSSClasses.REFLINKCLASS;
|
||||
private static readonly string WWWLINKCLASS = HaWeb.Settings.CSSClasses.WWWLINKCLASS;
|
||||
private static readonly string INSERTEDLEMMACLASS = HaWeb.Settings.CSSClasses.INSERTEDLEMMACLASS;
|
||||
private static readonly string TITLECLASS = HaWeb.Settings.CSSClasses.TITLECLASS;
|
||||
|
||||
// Parsing Rules for inserting lemmas
|
||||
private static readonly List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> OTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, INSERTEDLEMMACLASS)) ),
|
||||
( x => x.Name == "titel", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ),
|
||||
( x => x.Name == "title", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) )
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> CTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
|
||||
( x => x.Name == "titel", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
|
||||
( x => x.Name == "title", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT)) )
|
||||
};
|
||||
|
||||
private static readonly List<(Func<Text, bool>, Action<StringBuilder, Text>)> Text_Funcs = new List<(Func<Text, bool>, Action<StringBuilder, Text>)>() {
|
||||
( x => true, (strbd, txt) => strbd.Append(txt.Value))
|
||||
};
|
||||
|
||||
public LinkHelper(ILibrary lib, IReader reader, StringBuilder stringBuilder, bool followlinksinchildren = true, bool followlinksinthis = true) {
|
||||
if (lib == null || reader == null || stringBuilder == null) throw new ArgumentNullException();
|
||||
_lib = lib;
|
||||
@@ -35,13 +58,13 @@ public class LinkHelper {
|
||||
else {
|
||||
if (tag.Name == "wwwlink" && tag.Values.ContainsKey("address") && _followlinksinthis)
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateCustomElement("a",
|
||||
new HaWeb.HTMLHelpers.TagHelpers.Attribute() { Name = "class", Value = "hlink wwwlink invlink" },
|
||||
new HaWeb.HTMLHelpers.TagHelpers.Attribute() { Name = "class", Value = WWWLINKCLASS },
|
||||
new HaWeb.HTMLHelpers.TagHelpers.Attribute() { Name = "href", Value = tag["address"]},
|
||||
new HaWeb.HTMLHelpers.TagHelpers.Attribute() { Name = "target", Value = "_blank"},
|
||||
new HaWeb.HTMLHelpers.TagHelpers.Attribute() { Name = "rel", Value = "noopener noreferrer"}));
|
||||
if (tag.Name == "intlink" && tag.Values.ContainsKey("letter") && _lib.Metas.ContainsKey(tag["letter"])) {
|
||||
var letter = _lib.Metas[tag["letter"]];
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", "hlink intlink invlink", "/Briefe/" + letter.Autopsic + "#" + tag["page"] + "-" + tag["line"]));
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", LETLINKCLASS, "/Briefe/" + letter.Autopsic + "#" + tag["page"] + "-" + tag["line"]));
|
||||
if (!tag.Values.ContainsKey("linktext") || tag.Values["linktext"] == "true") {
|
||||
var linkstring = "";
|
||||
var ZHstring = "";
|
||||
@@ -75,11 +98,11 @@ public class LinkHelper {
|
||||
var linkloc = String.IsNullOrWhiteSpace(comment.Parent) ? comment.Index : comment.Parent;
|
||||
if (_followlinksinthis)
|
||||
if (comment.Type == "neuzeit")
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", "hlink link invlink", "/Supplementa/Register/" + linkloc[0] + "#" + comment.Index));
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", REFLINKCLASS, "/Register/Register/" + linkloc[0] + "#" + comment.Index));
|
||||
else if (comment.Type == "bibel")
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", "hlink link invlink", "/Supplementa/Bibelstellen/" + linkloc[0] + linkloc[1] + "#" + comment.Index));
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", REFLINKCLASS, "/Register/Bibelstellen/" + linkloc[0] + linkloc[1] + "#" + comment.Index));
|
||||
else if (comment.Type == "forschung")
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", "hlink link invlink", "/Supplementa/Forschung/" + linkloc[0] + "#" + comment.Index));
|
||||
_sb.Append(HTMLHelpers.TagHelpers.CreateElement("a", REFLINKCLASS, "/Register/Forschung/" + linkloc[0] + "#" + comment.Index));
|
||||
_sb.Append(GetLemmaString(tag, comment));
|
||||
}
|
||||
}
|
||||
@@ -93,17 +116,6 @@ public class LinkHelper {
|
||||
var sb = new StringBuilder();
|
||||
var subreader = new UTF8StringReader(comment.Lemma);
|
||||
new LinkHelper(_lib, subreader, sb, _followlinksinchildren, _followlinksinchildren);
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> OTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement("div", "reference")) ),
|
||||
( x => x.Name == "titel", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement("span", "title")) )
|
||||
};
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> CTag_Funcs = new List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>() {
|
||||
( x => x.Name == "lemma", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( x => x.Name == "titel", (strbd, x) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement("span")) )
|
||||
};
|
||||
List<(Func<Text, bool>, Action<StringBuilder, Text>)> Text_Funcs = new List<(Func<Text, bool>, Action<StringBuilder, Text>)>() {
|
||||
( x => true, (strbd, txt) => strbd.Append(txt.Value))
|
||||
};
|
||||
new XMLHelper(subreader, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs, null);
|
||||
subreader.Read();
|
||||
return sb.ToString();
|
||||
|
||||
@@ -5,28 +5,30 @@ using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
public class XMLHelper {
|
||||
public class XMLHelper
|
||||
{
|
||||
private IReader _in;
|
||||
private StringBuilder _target;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _OTag_Funcs;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _STag_Funcs;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> _CTag_Funcs;
|
||||
private List<(Func<Text, bool>, Action<StringBuilder, Text>)> _Text_Funcs;
|
||||
private List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)> _WS_Funcs;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? _OTag_Funcs;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? _STag_Funcs;
|
||||
private List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? _CTag_Funcs;
|
||||
private List<(Func<Text, bool>, Action<StringBuilder, Text>)>? _Text_Funcs;
|
||||
private List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)>? _WS_Funcs;
|
||||
private bool _deleteLeadingWS;
|
||||
private bool _deleteTrailingWS;
|
||||
|
||||
public XMLHelper(
|
||||
IReader input,
|
||||
StringBuilder target,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> OTag_Funcs = null,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> STag_Funcs = null,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)> CTag_Funcs = null,
|
||||
List<(Func<Text, bool>, Action<StringBuilder, Text>)> Text_Funcs = null,
|
||||
List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)> WS_Funcs = null,
|
||||
StringBuilder target,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? OTag_Funcs = null,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? STag_Funcs = null,
|
||||
List<(Func<Tag, bool>, Action<StringBuilder, Tag>)>? CTag_Funcs = null,
|
||||
List<(Func<Text, bool>, Action<StringBuilder, Text>)>? Text_Funcs = null,
|
||||
List<(Func<Whitespace, bool>, Action<StringBuilder, Whitespace>)>? WS_Funcs = null,
|
||||
bool deleteLeadingWS = false,
|
||||
bool deleteTrailingWS = false
|
||||
) {
|
||||
)
|
||||
{
|
||||
if (input == null || target == null) throw new ArgumentNullException();
|
||||
|
||||
_in = input;
|
||||
@@ -52,36 +54,45 @@ public class XMLHelper {
|
||||
_in.Whitespace += OnWS;
|
||||
}
|
||||
|
||||
void OnOTag(object _, Tag tag) {
|
||||
foreach(var entry in _OTag_Funcs)
|
||||
if (entry.Item1(tag)) entry.Item2(_target, tag);
|
||||
void OnOTag(object _, Tag tag)
|
||||
{
|
||||
if (_OTag_Funcs != null)
|
||||
foreach (var entry in _OTag_Funcs)
|
||||
if (entry.Item1(tag)) entry.Item2(_target, tag);
|
||||
}
|
||||
|
||||
void OnText(object _, Text text) {
|
||||
void OnText(object _, Text text)
|
||||
{
|
||||
if (_deleteLeadingWS) text.Value = text.Value.TrimStart();
|
||||
if (_deleteTrailingWS) text.Value = text.Value.TrimEnd();
|
||||
foreach(var entry in _Text_Funcs)
|
||||
foreach (var entry in _Text_Funcs)
|
||||
if (entry.Item1(text)) entry.Item2(_target, text);
|
||||
}
|
||||
|
||||
void OnSTag(object _, Tag tag) {
|
||||
foreach(var entry in _STag_Funcs)
|
||||
void OnSTag(object _, Tag tag)
|
||||
{
|
||||
foreach (var entry in _STag_Funcs)
|
||||
if (entry.Item1(tag)) entry.Item2(_target, tag);
|
||||
}
|
||||
|
||||
void OnCTag (object _, Tag tag) {
|
||||
void OnCTag(object _, Tag tag)
|
||||
{
|
||||
foreach (var entry in _CTag_Funcs)
|
||||
if (entry.Item1(tag)) entry.Item2(_target, tag);
|
||||
}
|
||||
|
||||
void OnWS (object _, Whitespace ws) {
|
||||
foreach (var entry in _WS_Funcs) {
|
||||
void OnWS(object _, Whitespace ws)
|
||||
{
|
||||
foreach (var entry in _WS_Funcs)
|
||||
{
|
||||
if (entry.Item1(ws)) entry.Item2(_target, ws);
|
||||
}
|
||||
}
|
||||
|
||||
internal void Dispose() {
|
||||
if (_in != null) {
|
||||
internal void Dispose()
|
||||
{
|
||||
if (_in != null)
|
||||
{
|
||||
if (_OTag_Funcs != null)
|
||||
_in.OpenTag -= OnOTag;
|
||||
if (_STag_Funcs != null)
|
||||
@@ -95,7 +106,8 @@ public class XMLHelper {
|
||||
}
|
||||
}
|
||||
|
||||
~XMLHelper() {
|
||||
~XMLHelper()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user