mirror of
				https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
				synced 2025-10-31 10:15:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			194 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using HaXMLReader.EvArgs;
 | |
| using HaXMLReader.Interfaces;
 | |
| using HaDocument.Models;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace HaDocument.Reactors {
 | |
|     class MetaReactor : Reactor {
 | |
| 
 | |
|         internal Dictionary<string, Meta> CreatedInstances { get; }
 | |
|         internal Dictionary<string, Meta> ExcludedInstances { get; }
 | |
|         private string[] _availableVolumes;
 | |
|         private (int, int) _availableYearRange;
 | |
| 
 | |
|         // State
 | |
|         private string ID { get; set; } = "";
 | |
|         private string Volume { get; set; } = "";
 | |
|         private string Page { get; set; } = "";
 | |
|         private string Date { get; set; } = "";
 | |
|         private DateTime Sort { get; set; } = new DateTime(1700, 1, 1);
 | |
|         private int Order { get; set; } = -1;
 | |
|         private bool AltLineNumbering { get; set; } = false;
 | |
|         private bool inZH { get; set; } = false;
 | |
|         private bool? hasOriginal { get; set; } = null;
 | |
|         private bool? isProofread { get; set; } = null;
 | |
|         private bool? isDraft { get; set; } = null;
 | |
|         private bool dateChanged {get; set; } = false;
 | |
|         private string Location { get; set; } = "";
 | |
|         private List<string> Senders { get; set; } = null;
 | |
|         private List<string> Receivers { get; set; } = null;
 | |
| 
 | |
|         internal MetaReactor(IReader reader, IntermediateLibrary lib, string[] availableVolumes, (int, int) availableYearRange) : base(reader, lib) {
 | |
|             _availableVolumes = availableVolumes;
 | |
|             _availableYearRange = availableYearRange;
 | |
|             lib.Metas = new Dictionary<string, Meta>();
 | |
|             CreatedInstances = lib.Metas;
 | |
|             lib.ExcludedMetas = new Dictionary<string, Meta>();
 | |
|             ExcludedInstances = lib.ExcludedMetas;
 | |
|             reader.OpenTag += Listen;
 | |
|         }
 | |
| 
 | |
|         protected override void Listen(object sender, Tag tag) {
 | |
|             if (
 | |
|                 !tag.EndTag && 
 | |
|                 !tag.IsEmpty &&
 | |
|                 tag.Name =="letterDesc" && 
 | |
|                 !String.IsNullOrWhiteSpace(tag["letter"])
 | |
|             ) {
 | |
|                 Activate(_reader, tag);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void Activate(IReader reader, Tag tag) {
 | |
|             if (!_active && reader != null && tag != null) { 
 | |
|                 Reset();
 | |
|                 _active = true;
 | |
|                 ID = tag["letter"];
 | |
|                 reader.Tag += OnTag;
 | |
|                 _reader = reader;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Deactivate() {
 | |
|             if (_active) {
 | |
|                 Abort();
 | |
|                 Add();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Abort() {
 | |
|             if (_active) {
 | |
|                 _active = false;
 | |
|                 _reader.Tag -= OnTag;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void OnTag(object _, Tag tag) {
 | |
|             switch (tag.Name)
 | |
|             {
 | |
|                 case "begin":
 | |
|                     Page = tag["page"];
 | |
|                     Volume = tag["vol"];
 | |
|                     break;
 | |
|                 case "date":
 | |
|                     Date = tag["value"];
 | |
|                     break;
 | |
|                 case "location":
 | |
|                     Location = tag["ref"];
 | |
|                     break;
 | |
|                 case "sender":
 | |
|                     if (!String.IsNullOrWhiteSpace(tag["ref"])) Senders.Add(tag["ref"]);
 | |
|                     break;
 | |
|                 case "receiver":
 | |
|                     if (!String.IsNullOrWhiteSpace(tag["ref"])) Receivers.Add(tag["ref"]);
 | |
|                     break;
 | |
|                 case "sort":
 | |
|                     DateTime res;
 | |
|                     System.DateTime.TryParse(tag["value"], out res);
 | |
|                     Sort = res;
 | |
|                     int res2 = 0;
 | |
|                     Int32.TryParse(tag["order"], out res2);
 | |
|                     Order = res2;
 | |
|                     break;
 | |
|                 case "hasOriginal":
 | |
|                     var val = tag["value"];
 | |
|                     if (val.ToLower() == "true")
 | |
|                         hasOriginal = true;
 | |
|                     else if (val.ToLower() == "false")
 | |
|                         hasOriginal = false;
 | |
|                     else
 | |
|                         hasOriginal = null;
 | |
|                     break;
 | |
|                 case "isProofread":
 | |
|                     var val2 = tag["value"];
 | |
|                     if (val2.ToLower() == "true")
 | |
|                         isProofread = true;
 | |
|                     else if (val2.ToLower() == "false")
 | |
|                         isProofread = false;
 | |
|                     else
 | |
|                         isProofread = null;
 | |
|                     break;
 | |
|                 case "isDraft":
 | |
|                     var val3 = tag["value"];
 | |
|                     if (val3.ToLower() == "true")
 | |
|                         isDraft = true;
 | |
|                     else if (val3.ToLower() == "false")
 | |
|                         isDraft = false;
 | |
|                     else
 | |
|                         isDraft = null;
 | |
|                     break;
 | |
|                 case "ZHInfo":
 | |
|                     if (!tag.EndTag) {
 | |
|                         inZH = tag["inzh"] == "false" ? false : true;
 | |
|                     }
 | |
|                     break;
 | |
|                 case "dateChanged":
 | |
|                     dateChanged = tag["value"].ToLower() == "true" ? true : false; 
 | |
|                     break;
 | |
|                 case "alternativeLineNumbering":
 | |
|                     AltLineNumbering =  tag["value"].ToLower() == "true" ? true : false;
 | |
|                     break;
 | |
|                 case "letterDesc":
 | |
|                     if (tag.EndTag) Deactivate();
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void Add() {
 | |
|             var ZHInfo = !inZH ? null : new ZHInfo(AltLineNumbering, dateChanged, Volume, Page);
 | |
|             var meta = new Meta(
 | |
|                     ID,
 | |
|                     Date,
 | |
|                     Sort,
 | |
|                     Order,
 | |
|                     hasOriginal,
 | |
|                     isProofread,
 | |
|                     isDraft,
 | |
|                     Location,
 | |
|                     Senders,
 | |
|                     Receivers,
 | |
|                     ZHInfo
 | |
|                 );
 | |
|             if (
 | |
|                 _availableVolumes.Contains(Volume) ||
 | |
|                 (Sort.Year >= _availableYearRange.Item1 && Sort.Year <= _availableYearRange.Item2) ||
 | |
|                 (_availableVolumes == null && _availableYearRange.Item1 == 0 && _availableYearRange.Item2 == 0)
 | |
|             ) {
 | |
|                 CreatedInstances.TryAdd(meta.ID, meta);
 | |
|             }
 | |
|             else {
 | |
|                 ExcludedInstances.TryAdd(meta.ID, meta);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void Reset() {
 | |
|             inZH = true;
 | |
|             hasOriginal = null;
 | |
|             isProofread = null;
 | |
|             isDraft = null;
 | |
|             dateChanged = false;
 | |
|             ID = "";
 | |
|             Volume = "";
 | |
|             Page = "";
 | |
|             Date = "";
 | |
|             DateTime Sort = new DateTime(1700, 1, 1);
 | |
|             Order = -1;
 | |
|             AltLineNumbering = false;
 | |
|             Location = "";
 | |
|             Senders = new List<string>();
 | |
|             Receivers = new List<string>();
 | |
|         }
 | |
|     }
 | |
| } | 
