mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-30 09:45:32 +00:00
- Abstracted the XML-HTML Parser into a neat little state machine
- Added Settings classes for all things XML-HTML conversion
This commit is contained in:
@@ -1,420 +0,0 @@
|
||||
namespace HaWeb.HTMLHelpers;
|
||||
using HaDocument.Interfaces;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using HaDocument.Models;
|
||||
using System.Text;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
|
||||
// Type aliasses for incredible long types
|
||||
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, BriefeHelper, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag, BriefeHelper>)>;
|
||||
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, BriefeHelper, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text, BriefeHelper>)>;
|
||||
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, BriefeHelper, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace, BriefeHelper>)>;
|
||||
|
||||
public class BriefeHelper
|
||||
{
|
||||
// Input
|
||||
private protected ILibrary Lib;
|
||||
private protected IReaderService ReaderService;
|
||||
private protected Meta Meta;
|
||||
|
||||
private protected Letter? Letter;
|
||||
private protected Tradition? Tradition;
|
||||
private protected ImmutableList<Hand>? Hands;
|
||||
private protected ImmutableList<Editreason>? EditReasons;
|
||||
private protected ImmutableList<Marginal>? Marginals;
|
||||
|
||||
// State
|
||||
private protected string currline = "-1";
|
||||
private protected string currpage = "";
|
||||
private protected string oldpage = "";
|
||||
private protected int commid = 1;
|
||||
private protected bool active_firstedit = true;
|
||||
private protected bool active_trad = false;
|
||||
private protected bool active_skipwhitespace = true;
|
||||
private protected bool active_del = false;
|
||||
private protected List<string> handstrings = new List<string>();
|
||||
|
||||
// Parsing-Combinations
|
||||
private protected StringBuilder sb_lettertext = new StringBuilder(); // Hauptext
|
||||
private protected StringBuilder sb_linecount = new StringBuilder(); // Linke Spalte (Zeilenzählung)
|
||||
private protected StringBuilder sb_marginals = new StringBuilder(); // Rechte Spalte (Kommentare)
|
||||
private protected StringBuilder sb_tradition = new StringBuilder(); // Überlieferung
|
||||
private protected StringBuilder sb_trad_zhtext = new StringBuilder(); // Überlieferung, ZHText
|
||||
private protected StringBuilder sb_trad_left = new StringBuilder(); // Überlieferung ZHText linke Spalte (zeilenzählung)
|
||||
private protected StringBuilder sb_trad_right = new StringBuilder(); // Überlieferung ZHText rechte Spalte (Kommentare)
|
||||
private protected StringBuilder sb_edits = new StringBuilder(); // Edits
|
||||
|
||||
private protected IReader? rd_lettertext;
|
||||
private protected IReader? rd_tradition;
|
||||
|
||||
// Parsing Rules
|
||||
// General rules (for the lettertext column, also for parsing the marginals, awa tradtions and editreasons)
|
||||
private static readonly TagFuncList OTag_Funcs = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "align" && x["pos"] == "center", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "align center")) ),
|
||||
( ( x, _) => x.Name == "align" && x["pos"] == "right", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "align right")) ),
|
||||
( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "added")) ),
|
||||
( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "sal")) ),
|
||||
( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "aq")) ),
|
||||
( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "super")) ),
|
||||
( ( x, _) => x.Name == "del", (sb, tag, bh) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "del"));
|
||||
bh.active_del = true;
|
||||
} ),
|
||||
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "nr")) ),
|
||||
( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "note")) ),
|
||||
( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ul")) ),
|
||||
( ( x, _) => x.Name == "anchor" && !String.IsNullOrWhiteSpace(x["ref"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "anchor")) ),
|
||||
( ( x, _) => x.Name == "fn" && !String.IsNullOrWhiteSpace(x["index"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "footnote")) ),
|
||||
( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "dul")) ),
|
||||
( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ful")) ),
|
||||
( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "up")) ),
|
||||
( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("sub")) ),
|
||||
( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tul")) ),
|
||||
( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "header")) ),
|
||||
( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "lemma")) ),
|
||||
( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "entry")) ),
|
||||
( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "title")) ),
|
||||
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "bzg")) ),
|
||||
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zh")) ),
|
||||
( ( x, _) => x.Name == "emph", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("em")); } ),
|
||||
( ( x, _) => x.Name == "app", (sb, tag, _) => { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "app")); } ),
|
||||
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "subcomment", tag["id"])) ),
|
||||
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "comment", tag["id"])) ),
|
||||
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "editreason")) ),
|
||||
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "letter")) ),
|
||||
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "tradition")) ),
|
||||
( ( x, _) => x.Name == "marginal", (sb, tag, bh) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "marginal"));
|
||||
bh.active_skipwhitespace = !bh.active_skipwhitespace;
|
||||
}),
|
||||
( ( x, _) => x.Name == "hand", (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "hand"));
|
||||
} ),
|
||||
( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "htable")) ),
|
||||
( ( x, _) => x.Name == "tab" && !String.IsNullOrWhiteSpace(x["value"]), (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "htab htab-" + tag["value"])))
|
||||
};
|
||||
|
||||
public BriefeHelper(ILibrary lib, IReaderService readerService, Meta meta, Letter? letter, Tradition? tradition, ImmutableList<Hand>? hands, ImmutableList<Editreason> editreasons, ImmutableList<Marginal> marginals)
|
||||
{
|
||||
Lib = lib;
|
||||
ReaderService = readerService;
|
||||
Letter = letter;
|
||||
Meta = meta;
|
||||
Tradition = tradition;
|
||||
Hands = hands;
|
||||
EditReasons = editreasons;
|
||||
Marginals = marginals;
|
||||
|
||||
initState();
|
||||
}
|
||||
|
||||
private void initState()
|
||||
{
|
||||
rd_lettertext = Letter != null && !String.IsNullOrWhiteSpace(Letter.Element) ? ReaderService.RequestStringReader(Letter.Element) : null;
|
||||
rd_tradition = Tradition != null && !String.IsNullOrWhiteSpace(Tradition.Element) ? ReaderService.RequestStringReader(Tradition.Element) : null;
|
||||
if (Meta.ZH != null)
|
||||
{
|
||||
currpage = Meta.ZH.Page;
|
||||
}
|
||||
if (Hands != null)
|
||||
{
|
||||
foreach (var hand in Hands.OrderBy(x => x.StartPage.Length).ThenBy(x => x.StartPage).ThenBy(x => x.StartLine.Length).ThenBy(x => x.StartLine))
|
||||
{
|
||||
var currstring = hand.StartPage + "/" + hand.StartLine;
|
||||
if (hand.StartPage != hand.EndPage)
|
||||
{
|
||||
currstring += "–" + hand.EndPage + "/" + hand.EndLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hand.StartLine != hand.EndLine)
|
||||
{
|
||||
currstring += "–" + hand.EndLine;
|
||||
}
|
||||
}
|
||||
if (Lib.HandPersons.Where(x => x.Key == hand.Person).Any())
|
||||
{
|
||||
currstring += " " + Lib.HandPersons.Where(x => x.Key == hand.Person).FirstOrDefault().Value.Name;
|
||||
handstrings.Add(currstring);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CreateHTML()
|
||||
{
|
||||
var CTag_Funcs = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "align", (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
} ),
|
||||
( ( x, _) => x.Name == "added", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "sal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "aq", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "super", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "del", (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
active_del = false;
|
||||
} ),
|
||||
( ( x, _) => x.Name == "nr", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "note", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "ul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "anchor", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "fn", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "dul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "up", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "ful", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "sub", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("sub")) ),
|
||||
( ( x, _) => x.Name == "tul", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "header", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "lemma", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "eintrag", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "titel", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "bzg", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "zh", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "emph", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("em")) ),
|
||||
( ( x, _) => x.Name == "app", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span")) ),
|
||||
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "kommentar", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "editreason", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "subsection", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "letterTradition", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "marginal", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "tabs", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "tab", (sb, tag, _) => sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div")) ),
|
||||
( ( x, _) => x.Name == "hand", (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
} )
|
||||
};
|
||||
|
||||
var Text_Funcs = new TextFuncList() {
|
||||
( ( x, _) => true, ( sb, txt, _) => {
|
||||
if (active_del)
|
||||
sb.Append(txt.Value.Replace("–", "<span class=\"diagdel\">–</span>"));
|
||||
else
|
||||
sb.Append(txt.Value);
|
||||
} )
|
||||
};
|
||||
|
||||
var Text_Funcs_Tagging = new TextFuncList() {
|
||||
( ( _, _) => true, ( sb, txt, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "ntext"));
|
||||
sb.Append(txt.Value);
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
} )
|
||||
};
|
||||
|
||||
var STag_Funcs = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => {
|
||||
if(currline != "-1") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "ZHBreak"));
|
||||
if(tag["type"] == "line") sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("hr", "lineline"));
|
||||
} ),
|
||||
( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tab-" + tag["tab"]));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
} )
|
||||
};
|
||||
|
||||
var Whitespace_Funcs = new WhitespaceFuncList() {
|
||||
( ( _, _) => true, ( sb, txt, _) => {
|
||||
if (active_skipwhitespace)
|
||||
sb.Append(txt.Value);
|
||||
else
|
||||
active_skipwhitespace = !active_skipwhitespace;
|
||||
})
|
||||
};
|
||||
|
||||
// Rules for the left sidebar
|
||||
var STag_Funcs_LEFT = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => {
|
||||
if(currline != "-1") {
|
||||
if (currpage == oldpage)
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", currpage + "-" + currline));
|
||||
else {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "", oldpage + "-" + currline));
|
||||
oldpage = currpage;
|
||||
}
|
||||
}
|
||||
else {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zhpage firstpage", currpage + "-" + tag["index"]));
|
||||
sb.Append("S." + " ");
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
if (tag["index"] != "1")
|
||||
sb.Append(currpage + " / " + tag["index"]);
|
||||
else
|
||||
sb.Append(currpage);
|
||||
oldpage = currpage;
|
||||
}
|
||||
}),
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => { if(currline != "-1" && Int32.TryParse(tag["index"], out var _) && Int32.Parse(tag["index"]) % 5 == 0) { sb.Append(tag["index"]); } } ),
|
||||
( ( x, _) => x.Name == "line" && x["index"] == "1" && currline != "-1", (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "zhpage", ""));
|
||||
sb.Append("S. " + currpage);
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
}),
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => { currline = tag["index"]; } ),
|
||||
( ( x, _) => x.Name == "page", (sb, tag, _) => { currpage = tag["index"]; } )
|
||||
};
|
||||
|
||||
// Rules for the right sidebar
|
||||
var STag_Funcs_RIGHT = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => {
|
||||
if(currline != "-1" && Marginals != null) {
|
||||
var margs = Marginals.Where(x => x.Page == currpage && x.Line == currline);
|
||||
if (margs != null && margs.Any())
|
||||
{
|
||||
margs = margs.OrderBy(x => Int32.Parse(x.Index));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commBox", commid.ToString()));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commselector"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("button", "button"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("button"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "comment"));
|
||||
foreach (var marginal in margs)
|
||||
{
|
||||
var rd = ReaderService.RequestStringReader(marginal.Element);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs_Tagging, Whitespace_Funcs);
|
||||
new HaWeb.HTMLHelpers.LinkHelper(Lib, rd, sb, false);
|
||||
rd.Read();
|
||||
}
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br"));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "emptyline"));
|
||||
}
|
||||
}
|
||||
commid++;
|
||||
}
|
||||
)};
|
||||
|
||||
// Rules for traditions
|
||||
var OTag_Funcs_Trad = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "app", (sb, tag, _) => { if (!active_firstedit) { sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br")); } else { active_firstedit = false; } } ),
|
||||
( ( x, _) => x.Name == "ZHText", (sb, tag, _) => {
|
||||
sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "row zhtext"));
|
||||
sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "trad-text col order-2 letterbox"));
|
||||
sb_trad_left = new StringBuilder();
|
||||
sb_trad_right = new StringBuilder();
|
||||
currline = "-1";
|
||||
currpage = "";
|
||||
active_trad = true;
|
||||
sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "trad-linecount countbox nnumber d-none d-lg-block order-1"));
|
||||
sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "commentColumn trad-comm col-4 d-none d-lg-block order-3"));
|
||||
sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "emptyline"));
|
||||
if (rd_tradition != null) {
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_tradition, sb_trad_left, null, STag_Funcs_LEFT);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_tradition, sb_trad_right, null, STag_Funcs_RIGHT);
|
||||
}
|
||||
} )
|
||||
};
|
||||
|
||||
var CTag_Funcs_Trad = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "ZHText", (sb, tag, _) => {
|
||||
sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb_trad_left.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb_trad_right.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
sb_tradition.Append(sb_trad_left.ToString());
|
||||
sb_tradition.Append(sb_trad_right.ToString());
|
||||
sb_tradition.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
active_trad = false;
|
||||
} )
|
||||
};
|
||||
|
||||
var STags_Funcs_TRAD = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => { if(currline != "-1" || !active_trad) sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("br", "ZHBreak")); } ),
|
||||
( ( x, _) => x.Name == "line" && !String.IsNullOrWhiteSpace(x["tab"]), (sb, tag, _) => {
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "tab-" + tag["tab"]));
|
||||
sb.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
} )
|
||||
};
|
||||
|
||||
// Rules for Edits:
|
||||
var STags_Funcs_EDIT = new TagFuncList() {
|
||||
( ( x, _) => x.Name == "line", (sb, tag, _) => sb.Append(" ") )
|
||||
};
|
||||
|
||||
string HandleEdit(Editreason edit)
|
||||
{
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "edit"));
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "pageline"));
|
||||
var currstring = edit.StartPage + "/" + edit.StartLine;
|
||||
if (edit.StartPage != edit.EndPage)
|
||||
{
|
||||
currstring += "–" + edit.EndPage + "/" + edit.EndLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (edit.StartLine != edit.EndLine)
|
||||
{
|
||||
currstring += "–" + edit.EndLine;
|
||||
}
|
||||
}
|
||||
sb_edits.Append(currstring + " ");
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
if (!String.IsNullOrWhiteSpace(edit.Reference))
|
||||
{
|
||||
var sb2 = new StringBuilder();
|
||||
sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference"));
|
||||
var rd = ReaderService.RequestStringReader(edit.Reference);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd, sb2, OTag_Funcs, null, CTag_Funcs, Text_Funcs, Whitespace_Funcs);
|
||||
rd.Read();
|
||||
sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
if ((edit.StartPage != edit.EndPage || edit.StartLine != edit.EndLine) && XElement.Parse(sb2.ToString()).Value.ToString().Length >= 60)
|
||||
{
|
||||
var text = XElement.Parse(sb2.ToString()).Value.ToString();
|
||||
text = text.ToString().Split(' ').Take(1).First() + " […] " + text.ToString().Split(' ').TakeLast(1).First();
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference"));
|
||||
sb_edits.Append(text);
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
}
|
||||
else
|
||||
sb_edits.Append(sb2);
|
||||
}
|
||||
if (!String.IsNullOrWhiteSpace(edit.Element))
|
||||
{
|
||||
sb_edits.Append(" ");
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "corrections"));
|
||||
var rd = ReaderService.RequestStringReader(edit.Element);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd, sb_edits, OTag_Funcs, STags_Funcs_EDIT, CTag_Funcs, Text_Funcs, Whitespace_Funcs);
|
||||
rd.Read();
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
}
|
||||
sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
return sb_edits.ToString();
|
||||
}
|
||||
|
||||
// Actual parsing
|
||||
if (Letter != null && Letter.Element != null && !String.IsNullOrWhiteSpace(Letter.Element) && rd_lettertext != null)
|
||||
{
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_lettertext, sb_lettertext, OTag_Funcs, STag_Funcs, CTag_Funcs, Text_Funcs, Whitespace_Funcs);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_lettertext, sb_linecount, null, STag_Funcs_LEFT);
|
||||
|
||||
if (Marginals != null && Marginals.Any())
|
||||
{
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_lettertext, sb_marginals, null, STag_Funcs_RIGHT);
|
||||
}
|
||||
rd_lettertext.Read();
|
||||
}
|
||||
|
||||
if (Tradition != null && !String.IsNullOrWhiteSpace(Tradition.Element) && rd_tradition != null)
|
||||
{
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_tradition, sb_tradition, OTag_Funcs_Trad, null, CTag_Funcs_Trad, null, null);
|
||||
new HaWeb.HTMLHelpers.GenericXMLHelper<BriefeHelper>(this, rd_tradition, sb_tradition, OTag_Funcs, STags_Funcs_TRAD, CTag_Funcs, Text_Funcs, Whitespace_Funcs);
|
||||
new HaWeb.HTMLHelpers.LinkHelper(Lib, rd_tradition, sb_tradition);
|
||||
rd_tradition.Read();
|
||||
}
|
||||
|
||||
if (EditReasons != null && EditReasons.Any())
|
||||
{
|
||||
foreach (var edit in EditReasons)
|
||||
{
|
||||
HandleEdit(edit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
113
HaWeb/HTMLHelpers/BriefeHelpers.cs
Normal file
113
HaWeb/HTMLHelpers/BriefeHelpers.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
namespace HaWeb.HTMLHelpers;
|
||||
using HaDocument.Interfaces;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using HaDocument.Models;
|
||||
using System.Text;
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
|
||||
using HaWeb.Settings.ParsingState;
|
||||
using HaWeb.Settings.ParsingRules;
|
||||
|
||||
public static class BriefeHelpers
|
||||
{
|
||||
public static (string, string, string) CreateLetter(ILibrary lib, IReaderService readerService, Meta meta, Letter letter, IEnumerable<Marginal>? marginals)
|
||||
{
|
||||
var rd = readerService.RequestStringReader(letter.Element);
|
||||
var letterState = new LetterState(lib, readerService, meta, marginals);
|
||||
new HaWeb.HTMLParser.XMLHelper<LetterState>(letterState, rd, letterState.sb_lettertext, LetterRules.OTagRules, LetterRules.STagRules, LetterRules.CTagRules, LetterRules.TextRules, LetterRules.WhitespaceRules);
|
||||
new HaWeb.HTMLParser.XMLHelper<LetterState>(letterState, rd, letterState.sb_linecount, null, LetterRules.STagRulesLineCount);
|
||||
|
||||
if (marginals != null && marginals.Any())
|
||||
{
|
||||
new HaWeb.HTMLParser.XMLHelper<LetterState>(letterState, rd, letterState.sb_marginals, null, LetterRules.STagRulesMarginals);
|
||||
}
|
||||
rd.Read();
|
||||
|
||||
return (letterState.sb_linecount.ToString(), letterState.sb_lettertext.ToString(), letterState.sb_marginals.ToString());
|
||||
}
|
||||
|
||||
public static string CreateTraditions(ILibrary lib, IReaderService readerService, IEnumerable<Marginal>? marginals, Tradition tradition)
|
||||
{
|
||||
var rd = readerService.RequestStringReader(tradition.Element);
|
||||
var traditionState = new TraditionState(lib, rd, marginals);
|
||||
new HaWeb.HTMLParser.XMLHelper<TraditionState>(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRulesInitial, null, TraditionRules.CTagRulesInitial, null, null);
|
||||
new HaWeb.HTMLParser.XMLHelper<TraditionState>(traditionState, rd, traditionState.sb_tradition, TraditionRules.OTagRules, TraditionRules.STagRulesInitial, TraditionRules.CTagRules, TraditionRules.TextRules, TraditionRules.WhitespaceRules);
|
||||
new HaWeb.HTMLHelpers.LinkHelper(lib, rd, traditionState.sb_tradition);
|
||||
rd.Read();
|
||||
return traditionState.sb_tradition.ToString();
|
||||
}
|
||||
|
||||
public static List<string> CreateEdits(ILibrary lib, IReaderService readerService, IEnumerable<Editreason> editreasons)
|
||||
{
|
||||
var editstrings = new List<string>();
|
||||
var editsState = new EditState();
|
||||
foreach (var edit in editreasons)
|
||||
{
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("div", "edit"));
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "pageline"));
|
||||
var currstring = edit.StartPage + "/" + edit.StartLine;
|
||||
if (edit.StartPage != edit.EndPage)
|
||||
currstring += "–" + edit.EndPage + "/" + edit.EndLine;
|
||||
else if (edit.StartLine != edit.EndLine)
|
||||
currstring += "–" + edit.EndLine;
|
||||
editsState.sb_edits.Append(currstring + " ");
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
if (!String.IsNullOrWhiteSpace(edit.Reference))
|
||||
{
|
||||
var sb2 = new StringBuilder();
|
||||
sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference"));
|
||||
var rd = readerService.RequestStringReader(edit.Reference);
|
||||
new HaWeb.HTMLParser.XMLHelper<EditState>(editsState, rd, sb2, EditRules.OTagRules, null, EditRules.CTagRules, EditRules.TextRules, EditRules.WhitespaceRules);
|
||||
rd.Read();
|
||||
sb2.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
if ((edit.StartPage != edit.EndPage || edit.StartLine != edit.EndLine) && XElement.Parse(sb2.ToString()).Value.ToString().Length >= 60)
|
||||
{
|
||||
var text = XElement.Parse(sb2.ToString()).Value.ToString();
|
||||
text = text.ToString().Split(' ').Take(1).First() + " […] " + text.ToString().Split(' ').TakeLast(1).First();
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "reference"));
|
||||
editsState.sb_edits.Append(text);
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
}
|
||||
else
|
||||
editsState.sb_edits.Append(sb2);
|
||||
}
|
||||
if (!String.IsNullOrWhiteSpace(edit.Element))
|
||||
{
|
||||
editsState.sb_edits.Append(" ");
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateElement("span", "corrections"));
|
||||
var rd = readerService.RequestStringReader(edit.Element);
|
||||
new HaWeb.HTMLParser.XMLHelper<EditState>(editsState, rd, editsState.sb_edits, EditRules.OTagRules, EditRules.STagRules, EditRules.CTagRules, EditRules.TextRules, EditRules.WhitespaceRules);
|
||||
rd.Read();
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("span"));
|
||||
}
|
||||
editsState.sb_edits.Append(HaWeb.HTMLHelpers.TagHelpers.CreateEndElement("div"));
|
||||
editstrings.Add(editsState.sb_edits.ToString());
|
||||
editsState.sb_edits.Clear();
|
||||
}
|
||||
return editstrings;
|
||||
}
|
||||
|
||||
public static List<string> CreateHands(ILibrary lib, ImmutableList<Hand> hands)
|
||||
{
|
||||
var handstrings = new List<string>();
|
||||
foreach (var hand in hands.OrderBy(x => x.StartPage.Length).ThenBy(x => x.StartPage).ThenBy(x => x.StartLine.Length).ThenBy(x => x.StartLine))
|
||||
{
|
||||
var currstring = hand.StartPage + "/" + hand.StartLine;
|
||||
if (hand.StartPage != hand.EndPage)
|
||||
currstring += "–" + hand.EndPage + "/" + hand.EndLine;
|
||||
else
|
||||
if (hand.StartLine != hand.EndLine)
|
||||
currstring += "–" + hand.EndLine;
|
||||
var persons = lib.HandPersons.Where(x => x.Key == hand.Person);
|
||||
if (persons.Any())
|
||||
{
|
||||
currstring += " " + persons.FirstOrDefault().Value.Name;
|
||||
handstrings.Add(currstring);
|
||||
}
|
||||
}
|
||||
return handstrings;
|
||||
}
|
||||
}
|
||||
@@ -3,55 +3,24 @@ using HaDocument.Interfaces;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using HaDocument.Models;
|
||||
using HaWeb.Settings.ParsingRules;
|
||||
using HaWeb.Settings.ParsingState;
|
||||
using System.Text;
|
||||
|
||||
// Type aliasses for incredible long types
|
||||
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag>)>;
|
||||
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text>)>;
|
||||
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace>)>;
|
||||
|
||||
public static class CommentHelpers
|
||||
{
|
||||
|
||||
private static readonly string DEFAULTELEMENT = HaWeb.Settings.HTML.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;
|
||||
private static readonly string BACKLINKSHKBCLASS = HaWeb.Settings.CSSClasses.BACKLINKSHKBCLASS;
|
||||
|
||||
// Parsing Rules
|
||||
private static readonly TagFuncList _OTagFuncs = new TagFuncList() {
|
||||
( 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 TagFuncList _CTagFuncs = new TagFuncList() {
|
||||
( 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 TagFuncList _STagFuncs = new TagFuncList() {
|
||||
( x => x.Name == "line", (sb, tag) => sb.Append(HTMLHelpers.TagHelpers.CreateElement("br")) )
|
||||
};
|
||||
|
||||
private static readonly TextFuncList _TextFuncs = new TextFuncList() {
|
||||
( x => true, ( sb, txt ) => sb.Append(txt.Value) )
|
||||
};
|
||||
|
||||
private static readonly WhitespaceFuncList _WhitespaceFuncs = new WhitespaceFuncList() {
|
||||
( x => true, ( sb, txt ) => sb.Append(txt.Value) )
|
||||
};
|
||||
|
||||
public static string CreateHTML(ILibrary lib, IReaderService readerService, Comment comment)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
var rd = readerService.RequestStringReader(comment.Lemma);
|
||||
new HTMLHelpers.XMLHelper(rd, sb, _OTagFuncs, _STagFuncs, _CTagFuncs, _TextFuncs, _WhitespaceFuncs);
|
||||
var commentState = new CommentState();
|
||||
new HTMLParser.XMLHelper<CommentState>(commentState, rd, sb, CommentRules.OTagRules, CommentRules.STagRules, CommentRules.CTagRules, CommentRules.TextRules, CommentRules.WhitespaceRules);
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, COMMENTHEADCLASS, comment.Index));
|
||||
new HTMLHelpers.LinkHelper(lib, rd, sb);
|
||||
rd.Read();
|
||||
@@ -90,12 +59,10 @@ public static class CommentHelpers
|
||||
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 HTMLParser.XMLHelper<CommentState>(commentState, rd, sb, CommentRules.OTagRules, CommentRules.STagRules, CommentRules.CTagRules, CommentRules.TextRules, CommentRules.WhitespaceRules);
|
||||
new HTMLHelpers.LinkHelper(lib, rd, sb);
|
||||
rd.Read();
|
||||
sb.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT));
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
namespace HaWeb.HTMLHelpers;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
public class GenericXMLHelper<T>
|
||||
{
|
||||
private T _caller;
|
||||
private IReader _in;
|
||||
private StringBuilder _target;
|
||||
private List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? _OTag_Funcs;
|
||||
private List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? _STag_Funcs;
|
||||
private List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? _CTag_Funcs;
|
||||
private List<(Func<Text, T, bool>, Action<StringBuilder, Text, T>)>? _Text_Funcs;
|
||||
private List<(Func<Whitespace, T, bool>, Action<StringBuilder, Whitespace, T>)>? _WS_Funcs;
|
||||
private bool _deleteLeadingWS;
|
||||
private bool _deleteTrailingWS;
|
||||
|
||||
public GenericXMLHelper(
|
||||
T caller,
|
||||
IReader input,
|
||||
StringBuilder target,
|
||||
List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? OTag_Funcs = null,
|
||||
List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? STag_Funcs = null,
|
||||
List<(Func<Tag, T, bool>, Action<StringBuilder, Tag, T>)>? CTag_Funcs = null,
|
||||
List<(Func<Text, T, bool>, Action<StringBuilder, Text, T>)>? Text_Funcs = null,
|
||||
List<(Func<Whitespace, T, bool>, Action<StringBuilder, Whitespace, T>)>? WS_Funcs = null,
|
||||
bool deleteLeadingWS = false,
|
||||
bool deleteTrailingWS = false
|
||||
)
|
||||
{
|
||||
if (input == null || target == null || caller == null) throw new ArgumentNullException();
|
||||
|
||||
_caller = caller;
|
||||
_in = input;
|
||||
_target = target;
|
||||
_deleteLeadingWS = deleteLeadingWS;
|
||||
_deleteTrailingWS = deleteTrailingWS;
|
||||
|
||||
_OTag_Funcs = OTag_Funcs;
|
||||
_STag_Funcs = STag_Funcs;
|
||||
_CTag_Funcs = CTag_Funcs;
|
||||
_Text_Funcs = Text_Funcs;
|
||||
_WS_Funcs = WS_Funcs;
|
||||
|
||||
if (_OTag_Funcs != null)
|
||||
_in.OpenTag += OnOTag;
|
||||
if (_STag_Funcs != null)
|
||||
_in.SingleTag += OnSTag;
|
||||
if (_CTag_Funcs != null)
|
||||
_in.CloseTag += OnCTag;
|
||||
if (_Text_Funcs != null)
|
||||
_in.Text += OnText;
|
||||
if (_WS_Funcs != null)
|
||||
_in.Whitespace += OnWS;
|
||||
}
|
||||
|
||||
void OnOTag(object _, Tag tag)
|
||||
{
|
||||
if (_OTag_Funcs != null)
|
||||
foreach (var entry in _OTag_Funcs)
|
||||
if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller);
|
||||
}
|
||||
|
||||
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)
|
||||
if (entry.Item1(text, _caller)) entry.Item2(_target, text, _caller);
|
||||
}
|
||||
|
||||
void OnSTag(object _, Tag tag)
|
||||
{
|
||||
foreach (var entry in _STag_Funcs)
|
||||
if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller);
|
||||
}
|
||||
|
||||
void OnCTag(object _, Tag tag)
|
||||
{
|
||||
foreach (var entry in _CTag_Funcs)
|
||||
if (entry.Item1(tag, _caller)) entry.Item2(_target, tag, _caller);
|
||||
}
|
||||
|
||||
void OnWS(object _, Whitespace ws)
|
||||
{
|
||||
foreach (var entry in _WS_Funcs)
|
||||
{
|
||||
if (entry.Item1(ws, _caller)) entry.Item2(_target, ws, _caller);
|
||||
}
|
||||
}
|
||||
|
||||
internal void Dispose()
|
||||
{
|
||||
if (_in != null)
|
||||
{
|
||||
if (_OTag_Funcs != null)
|
||||
_in.OpenTag -= OnOTag;
|
||||
if (_STag_Funcs != null)
|
||||
_in.SingleTag -= OnSTag;
|
||||
if (_CTag_Funcs != null)
|
||||
_in.CloseTag -= OnCTag;
|
||||
if (_Text_Funcs != null)
|
||||
_in.Text -= OnText;
|
||||
if (_WS_Funcs != null)
|
||||
_in.Whitespace -= OnWS;
|
||||
}
|
||||
}
|
||||
|
||||
~GenericXMLHelper()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,8 @@ using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using HaXMLReader;
|
||||
using System.Collections.Generic;
|
||||
|
||||
// Type aliasses for incredible long types
|
||||
using TagFuncList = List<(Func<HaXMLReader.EvArgs.Tag, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Tag>)>;
|
||||
using TextFuncList = List<(Func<HaXMLReader.EvArgs.Text, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Text>)>;
|
||||
using WhitespaceFuncList = List<(Func<HaXMLReader.EvArgs.Whitespace, bool>, Action<System.Text.StringBuilder, HaXMLReader.EvArgs.Whitespace>)>;
|
||||
|
||||
using HaWeb.Settings.ParsingRules;
|
||||
using HaWeb.Settings.ParsingState;
|
||||
|
||||
public class LinkHelper {
|
||||
private ILibrary _lib;
|
||||
@@ -26,25 +22,6 @@ public class LinkHelper {
|
||||
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 TagFuncList OTag_Funcs = new TagFuncList() {
|
||||
( x => x.Name == "lemma", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, INSERTEDLEMMACLASS)) ),
|
||||
( x => x.Name == "titel", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) ),
|
||||
( x => x.Name == "title", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT, TITLECLASS)) )
|
||||
};
|
||||
|
||||
private static readonly TagFuncList CTag_Funcs = new TagFuncList() {
|
||||
( x => x.Name == "lemma", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
|
||||
( x => x.Name == "titel", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateEndElement(DEFAULTELEMENT)) ),
|
||||
( x => x.Name == "title", (strbd, _) => strbd.Append(HTMLHelpers.TagHelpers.CreateElement(DEFAULTELEMENT)) )
|
||||
};
|
||||
|
||||
private static readonly TextFuncList Text_Funcs = new TextFuncList() {
|
||||
( 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();
|
||||
@@ -119,10 +96,11 @@ public class LinkHelper {
|
||||
|
||||
private string GetLemmaString(Tag tag, Comment comment) {
|
||||
if (!tag.Values.ContainsKey("linktext") || tag.Values["linktext"] == "true") {
|
||||
var linkState = new LinkState();
|
||||
var sb = new StringBuilder();
|
||||
var subreader = new UTF8StringReader(comment.Lemma);
|
||||
new LinkHelper(_lib, subreader, sb, _followlinksinchildren, _followlinksinchildren);
|
||||
new XMLHelper(subreader, sb, OTag_Funcs, null, CTag_Funcs, Text_Funcs, null);
|
||||
new HTMLParser.XMLHelper<LinkState>(linkState, subreader, sb, LinkRules.OTagRules, null, LinkRules.CTagRules, LinkRules.TextRules, null);
|
||||
subreader.Read();
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
namespace HaWeb.HTMLHelpers;
|
||||
using HaXMLReader.Interfaces;
|
||||
using HaXMLReader.EvArgs;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
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 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,
|
||||
bool deleteLeadingWS = false,
|
||||
bool deleteTrailingWS = false
|
||||
)
|
||||
{
|
||||
if (input == null || target == null ) throw new ArgumentNullException();
|
||||
|
||||
_in = input;
|
||||
_target = target;
|
||||
_deleteLeadingWS = deleteLeadingWS;
|
||||
_deleteTrailingWS = deleteTrailingWS;
|
||||
|
||||
_OTag_Funcs = OTag_Funcs;
|
||||
_STag_Funcs = STag_Funcs;
|
||||
_CTag_Funcs = CTag_Funcs;
|
||||
_Text_Funcs = Text_Funcs;
|
||||
_WS_Funcs = WS_Funcs;
|
||||
|
||||
if (_OTag_Funcs != null)
|
||||
_in.OpenTag += OnOTag;
|
||||
if (_STag_Funcs != null)
|
||||
_in.SingleTag += OnSTag;
|
||||
if (_CTag_Funcs != null)
|
||||
_in.CloseTag += OnCTag;
|
||||
if (_Text_Funcs != null)
|
||||
_in.Text += OnText;
|
||||
if (_WS_Funcs != null)
|
||||
_in.Whitespace += OnWS;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (_deleteLeadingWS) text.Value = text.Value.TrimStart();
|
||||
if (_deleteTrailingWS) text.Value = text.Value.TrimEnd();
|
||||
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)
|
||||
if (entry.Item1(tag)) entry.Item2(_target, 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)
|
||||
{
|
||||
if (entry.Item1(ws)) entry.Item2(_target, ws);
|
||||
}
|
||||
}
|
||||
|
||||
internal void Dispose()
|
||||
{
|
||||
if (_in != null)
|
||||
{
|
||||
if (_OTag_Funcs != null)
|
||||
_in.OpenTag -= OnOTag;
|
||||
if (_STag_Funcs != null)
|
||||
_in.SingleTag -= OnSTag;
|
||||
if (_CTag_Funcs != null)
|
||||
_in.CloseTag -= OnCTag;
|
||||
if (_Text_Funcs != null)
|
||||
_in.Text -= OnText;
|
||||
if (_WS_Funcs != null)
|
||||
_in.Whitespace -= OnWS;
|
||||
}
|
||||
}
|
||||
|
||||
~XMLHelper()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user