mirror of
				https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
				synced 2025-11-04 12:15:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using HaXMLReader.Interfaces;
 | 
						|
using HaXMLReader.EvArgs;
 | 
						|
using HaDocument.Models;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System;
 | 
						|
using HaDocument.Comparers;
 | 
						|
 | 
						|
namespace HaDocument.Reactors {
 | 
						|
    class CommentReactor : Reactor {
 | 
						|
        
 | 
						|
        Dictionary<string, Comment> CreatedInstances;
 | 
						|
 | 
						|
        private bool _normalizeWhitespace = false;
 | 
						|
 | 
						|
        // State
 | 
						|
        private string Type = "";
 | 
						|
        private string Index = "";
 | 
						|
        private string Lemma = "";
 | 
						|
        private string Entry = "";
 | 
						|
        private int Order = -1;
 | 
						|
        private SortedDictionary<string, Comment> Subcomments;
 | 
						|
 | 
						|
        private bool subsection = false;
 | 
						|
        private string subsectionIndex = "";
 | 
						|
        private string subsectionLemma = "";
 | 
						|
        private string subsectionEntry = "";
 | 
						|
        private int subsectionOrder = -1;
 | 
						|
 | 
						|
        internal CommentReactor(IReader reader, IntermediateLibrary lib, bool normalizeWhitespace) : base(reader, lib) {
 | 
						|
            _normalizeWhitespace = normalizeWhitespace;
 | 
						|
            _lib.Comments = _lib.Comments ?? new Dictionary<string, Comment>();
 | 
						|
            CreatedInstances = _lib.Comments;
 | 
						|
            reader.OpenTag += Listen;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Listen(object _, Tag tag) {
 | 
						|
            if (
 | 
						|
                !tag.IsEmpty &&
 | 
						|
                !tag.EndTag &&
 | 
						|
                tag.Name == "kommcat" &&
 | 
						|
                !string.IsNullOrWhiteSpace(tag["value"])
 | 
						|
            ) {
 | 
						|
                Type = tag["value"];
 | 
						|
                Activate(_reader, tag);
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                tag.EndTag &&
 | 
						|
                tag.Name == "kommcat"
 | 
						|
            ) {
 | 
						|
                ResetType();
 | 
						|
                Deactivate();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Activate(IReader _, Tag tag) {
 | 
						|
            _reader.Tag += OnTag;
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnTag(object _, Tag tag) {
 | 
						|
            if (
 | 
						|
                !tag.IsEmpty &&
 | 
						|
                !tag.EndTag &&
 | 
						|
                tag.Name == "kommentar" &&
 | 
						|
                !string.IsNullOrWhiteSpace(tag["id"])
 | 
						|
            ) {
 | 
						|
                Index = tag["id"];
 | 
						|
                Order = String.IsNullOrWhiteSpace(tag["sort"]) ? 0 : Int32.Parse(tag["sort"]);
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                tag.EndTag &&
 | 
						|
                tag.Name == "kommentar"
 | 
						|
            ) {
 | 
						|
                AddComment();
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                !tag.EndTag &&
 | 
						|
                !tag.IsEmpty &&
 | 
						|
                tag.Name == "lemma"
 | 
						|
            ) {
 | 
						|
                _ = new ElementStringBinder(_reader, tag, AddLemma, _normalizeWhitespace);
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                !tag.EndTag &&
 | 
						|
                !tag.IsEmpty &&
 | 
						|
                tag.Name == "eintrag"
 | 
						|
                ) {
 | 
						|
                _ = new ElementStringBinder(_reader, tag, AddEntry, _normalizeWhitespace);
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                !tag.EndTag &&
 | 
						|
                !tag.IsEmpty &&
 | 
						|
                tag.Name == "subsection"
 | 
						|
            ) {
 | 
						|
                if (!String.IsNullOrWhiteSpace(tag["id"])) subsectionIndex = tag["id"];
 | 
						|
                if (!String.IsNullOrWhiteSpace(tag["sort"])) subsectionOrder = Int32.Parse(tag["sort"]);
 | 
						|
                if (Subcomments ==null) Subcomments = new SortedDictionary<string, Comment>();
 | 
						|
                subsection = true;
 | 
						|
            }
 | 
						|
            else if (
 | 
						|
                tag.EndTag &&
 | 
						|
                tag.Name == "subsection"
 | 
						|
            ) {
 | 
						|
                subsection = false;
 | 
						|
                AddSubsection();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void Deactivate() {
 | 
						|
            _reader.Tag -= OnTag;
 | 
						|
        }
 | 
						|
 | 
						|
        private void AddLemma(string str) {
 | 
						|
            if (String.IsNullOrEmpty(str)) return;
 | 
						|
            if (subsection) subsectionLemma = str;
 | 
						|
            else Lemma = str;
 | 
						|
        }
 | 
						|
 | 
						|
        private void AddEntry(string str) {
 | 
						|
            if (String.IsNullOrWhiteSpace(str)) str = "";
 | 
						|
            if (subsection) subsectionEntry = str;
 | 
						|
            else Entry = str;
 | 
						|
        }
 | 
						|
 | 
						|
        private void AddSubsection() {
 | 
						|
            if (String.IsNullOrWhiteSpace(subsectionIndex)) return;
 | 
						|
            if (String.IsNullOrWhiteSpace(subsectionLemma)) return;
 | 
						|
            if (!Subcomments.ContainsKey(subsectionIndex))
 | 
						|
            { 
 | 
						|
                Subcomments.Add(subsectionIndex, new Comment(
 | 
						|
                    subsectionEntry,
 | 
						|
                    subsectionIndex,
 | 
						|
                    Type,
 | 
						|
                    subsectionLemma,
 | 
						|
                    subsectionOrder,
 | 
						|
                    null,
 | 
						|
                    Index
 | 
						|
                ));
 | 
						|
            }
 | 
						|
            ResetSubsection();
 | 
						|
        }
 | 
						|
 | 
						|
        private void AddComment() {
 | 
						|
            if (String.IsNullOrWhiteSpace(Index)) return;
 | 
						|
            if (String.IsNullOrWhiteSpace(Lemma)) return;
 | 
						|
            if (CreatedInstances.ContainsKey(Index)) return;
 | 
						|
            CreatedInstances.Add(Index, new Comment(
 | 
						|
                Entry,
 | 
						|
                Index,
 | 
						|
                Type,
 | 
						|
                Lemma,
 | 
						|
                Order,
 | 
						|
                Subcomments
 | 
						|
            ));
 | 
						|
            Reset();
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Reset() {
 | 
						|
            Index = "";
 | 
						|
            Lemma = "";
 | 
						|
            Entry = "";
 | 
						|
            Order = -1;
 | 
						|
            Subcomments = null;
 | 
						|
            ResetSubsection();
 | 
						|
        }
 | 
						|
        
 | 
						|
        private void ResetSubsection() {
 | 
						|
            subsection = false;
 | 
						|
            subsectionEntry = "";
 | 
						|
            subsectionIndex = "";
 | 
						|
            subsectionLemma = "";
 | 
						|
            subsectionOrder = -1;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ResetType() {
 | 
						|
            Type = "";
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |