mirror of
				https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
				synced 2025-11-03 19:55:32 +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();
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |