mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 09:15:33 +00:00
154 lines
5.1 KiB
C#
154 lines
5.1 KiB
C#
using HaDocument.Models;
|
|
using System.Collections.Generic;
|
|
using HaXMLReader.EvArgs;
|
|
using HaXMLReader.Interfaces;
|
|
using System;
|
|
|
|
namespace HaDocument.Reactors {
|
|
class EditreasonReactor : Reactor {
|
|
internal Dictionary<string, Editreason> CreatedInstances;
|
|
|
|
private Dictionary<string, string[]> _intermediateReasons = new Dictionary<string, string[]>();
|
|
private bool _normalizeWhitespace = false;
|
|
|
|
// State
|
|
private string Index = "";
|
|
|
|
private string letter = "";
|
|
private string page = "";
|
|
private string line = "";
|
|
private Stack<string> index;
|
|
|
|
private ElementStringBinder _element = null;
|
|
|
|
internal EditreasonReactor(IReader reader, IntermediateLibrary lib, bool normalizeWhitespace) : base (reader, lib) {
|
|
CreatedInstances = lib.Editreasons;
|
|
index = new Stack<string>();
|
|
_normalizeWhitespace = normalizeWhitespace;
|
|
lib.Editreasons = new Dictionary<string, Editreason>();
|
|
CreatedInstances = lib.Editreasons;
|
|
reader.Tag += Listen;
|
|
reader.ReadingStop += Scaffold;
|
|
}
|
|
|
|
protected void Scaffold(object _, EventArgs __) {
|
|
foreach (var entry in _intermediateReasons) {
|
|
if (
|
|
!String.IsNullOrWhiteSpace(entry.Value[0]) &&
|
|
!String.IsNullOrWhiteSpace(entry.Value[1]) &&
|
|
!String.IsNullOrWhiteSpace(entry.Value[2]) &&
|
|
!String.IsNullOrWhiteSpace(entry.Value[3])
|
|
) {
|
|
CreatedInstances.Add(
|
|
entry.Key,
|
|
new Editreason(
|
|
entry.Key,
|
|
entry.Value[0],
|
|
entry.Value[1],
|
|
entry.Value[2],
|
|
entry.Value[3],
|
|
entry.Value[5],
|
|
entry.Value[6],
|
|
entry.Value[4]
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void Listen(object sender, Tag tag) {
|
|
if (
|
|
!tag.EndTag &&
|
|
!tag.IsEmpty &&
|
|
tag.Name == "editreason" &&
|
|
!String.IsNullOrWhiteSpace(tag["index"])
|
|
) {
|
|
Activate(_reader, tag);
|
|
}
|
|
else if (
|
|
!tag.EndTag &&
|
|
!tag.IsEmpty &&
|
|
tag.Name == "letterText"
|
|
) {
|
|
letter = tag["index"];
|
|
}
|
|
else if (
|
|
!tag.EndTag &&
|
|
!tag.IsEmpty &&
|
|
tag.Name == "letterTradition"
|
|
) {
|
|
letter = tag["ref"];
|
|
}
|
|
else if (
|
|
!tag.EndTag &&
|
|
tag.IsEmpty &&
|
|
tag.Name == "page"
|
|
) {
|
|
page = tag["index"];
|
|
}
|
|
else if (
|
|
!tag.EndTag &&
|
|
tag.IsEmpty &&
|
|
tag.Name == "line"
|
|
) {
|
|
line = tag["index"];
|
|
}
|
|
else if (
|
|
!tag.EndTag &&
|
|
tag.Name == "edit" &&
|
|
!String.IsNullOrWhiteSpace(tag["ref"])
|
|
) {
|
|
if (!_intermediateReasons.ContainsKey(tag["ref"])) {
|
|
_intermediateReasons.Add(tag["ref"], new string[7]);
|
|
}
|
|
_intermediateReasons[tag["ref"]][1] = letter;
|
|
_intermediateReasons[tag["ref"]][2] = page;
|
|
_intermediateReasons[tag["ref"]][3] = line;
|
|
if (!tag.IsEmpty) {
|
|
index.Push(tag["ref"]);
|
|
new ElementStringBinder(_reader, tag, AddReference);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void Activate(IReader reader, Tag tag) {
|
|
if (!_active && reader != null && tag != null) {
|
|
_active = true;
|
|
_reader = reader;
|
|
Index = tag["index"];
|
|
_element = new ElementStringBinder(reader, tag, Add, _normalizeWhitespace);
|
|
}
|
|
}
|
|
|
|
private void Add(string element) {
|
|
if (String.IsNullOrWhiteSpace(element)) return;
|
|
if (!_intermediateReasons.ContainsKey(Index)) {
|
|
_intermediateReasons.Add(Index, new string[7]);
|
|
}
|
|
_intermediateReasons[Index][0] = element;
|
|
Reset();
|
|
}
|
|
|
|
private void AddReference(string element) {
|
|
if (String.IsNullOrWhiteSpace(element)) return;
|
|
var ci = index.Pop();
|
|
if (!_intermediateReasons.ContainsKey(ci)) {
|
|
_intermediateReasons.Add(ci, new string[7]);
|
|
}
|
|
_intermediateReasons[ci][4] = element;
|
|
_intermediateReasons[ci][5] = page;
|
|
_intermediateReasons[ci][6] = line;
|
|
}
|
|
|
|
protected override void Reset() {
|
|
Index = "";
|
|
_active = false;
|
|
_element = null;
|
|
}
|
|
|
|
protected void Deactivate() {
|
|
_element.Unsubscribe();
|
|
Reset();
|
|
}
|
|
}
|
|
} |