using System; using HaDocument.Interfaces; using HaDocument; using System.Text; using System.Xml.Linq; using System.Collections.Generic; using System.Xml; using System.Linq; namespace HamannPrinter { public class Parser { class Options : IHaDocumentOptions { public string HamannXMLFilePath { get; set; } public string[] AvailableVolumes { get; set; } = { }; public bool NormalizeWhitespace { get; set; } = true; public (int, int) AvailableYearRange {get; set; } = (1700, 1800); public Options(string HamannXmlPath) { HamannXMLFilePath = HamannXmlPath; } } public class DocOptions { public string OutputDir { get; set; } public string VolumesOutputDir { get; set; } public string Editionsrichtlinien { get; set; } public string LineHight { get; set; } = "280"; public string SmallDistance { get; set; } = "140"; public string MiddleLineHight { get; set; } = "224"; public string FontSize { get; set; } = "20"; public string MiddleFontSize { get; set; } = "16"; public string SmallFontSize { get; set; } = "12"; public string BigFontSize { get; set; } = "32"; public int MarginTop { get; set; } = 1416; public UInt32 MarginRight { get; set; } = 2400U; public int MarginBottom { get; set; } = 2132; public UInt32 MarginLeft { get; set; } = 1984U; public UInt32 MarginFooter { get; set; } = 1417U; public string ColumnDistance { get; set; } = "560"; public UInt32 MarginRightColumns { get; set; } = 1900U; public string FooterToText { get; set; } = "420"; public string NormalFont { get; set; } = "Linux Libertine G"; public string SpecialFont { get; set; } = "Linux Biolinum"; public string Diodone { get; set; } = "Playfair Display"; public string SuperValue { get; set; } = "6"; public string SubValue { get; set; } = "-4"; public (int, int) Years { get; set; } public DocOptions((int, int) years, string outputDir, string editionsRichtlinien) { Editionsrichtlinien = editionsRichtlinien; Years = years; OutputDir = outputDir; VolumesOutputDir = System.IO.Directory.CreateDirectory(outputDir + @"bände_register\").FullName; } } public static class Logger { public static StringBuilder LogString = new StringBuilder(); public static void Out(string str) { Console.WriteLine(str); LogString.Append(str).Append(Environment.NewLine); } } public void MakeDocuments(Confix confix) { // try { var hamannDoc = Document.Create(new Options(confix.HamannXmlPath)); DocOptions docOpt = new DocOptions(confix.Years, confix.OutputPath, confix.Editionsrichtlinien); CheckXML(confix, docOpt, hamannDoc); Coordinator(docOpt, hamannDoc, hamannDoc, docOpt.Years, confix.VolumeDocx, confix.RegisterDocx); // DEV Helper.Ok("Fertig!"); // } catch (Exception ex) { // Console.WriteLine("Quelle: " + ex.Source); // Console.WriteLine("Msg: " + ex.Message); // Console.WriteLine("Trace: " + ex.StackTrace); // Console.ReadKey(); // } Environment.Exit(0); } public void CheckXML(Confix confix, DocOptions docOpt, ILibrary hamannDoc) { var errors = new StringBuilder(); var document = XDocument.Load(confix.HamannXmlPath, LoadOptions.SetLineInfo); var kommentare = document.Descendants("kommentar"); var subsections = document.Descendants("subsection"); var intlinks = document.Descendants("intlink"); var links = document.Descendants("link"); var marginals = document.Descendants("marginal"); var hands = document.Descendants("hand"); var edits = document.Descendants("edit"); var editreasons = document.Descendants("editreason"); var ids = new HashSet(); foreach (var kommentar in kommentare) { if (kommentar.HasAttributes && kommentar.Attribute("id") != null) { if (!ids.Contains(kommentar.Attribute("id").Value)) ids.Add(kommentar.Attribute("id").Value); else { errors.AppendLine("Kommentar-ID " + kommentar.Attribute("id").Value + " doppelt vergeben!"); errors.AppendLine(); } } } foreach (var kommentar in subsections) { if (kommentar.HasAttributes && kommentar.Attribute("id") != null) { if (!ids.Contains(kommentar.Attribute("id").Value)) ids.Add(kommentar.Attribute("id").Value); else { errors.AppendLine("Kommentar-ID " + kommentar.Attribute("id").Value + " doppelt vergeben!"); errors.AppendLine(); } } } foreach (var link in intlinks) { if (link.HasAttributes && link.Attribute("letter") != null) { if (hamannDoc.Letters.ContainsKey(link.Attribute("letter").Value)) { if (link.Attribute("page") != null) { var lettertext = XElement.Parse(hamannDoc.Letters[link.Attribute("letter").Value].Element); var lettertext2 = XElement.Parse(hamannDoc.Traditions[link.Attribute("letter").Value].Element); var page = lettertext.Descendants("page").Where(x => x.Attribute("index").Value.ToString() == link.Attribute("page").Value.ToString()).Union(lettertext2.Descendants("page").Where(x => x.Attribute("index").Value.ToString() == link.Attribute("page").Value.ToString())); if (page.Any()) { if (link.Attribute("line") != null) { var elementsafter = lettertext.Descendants().SkipWhile(x => x.Name != "page" || !x.Attributes("index").Any() || x.Attribute("index").Value != link.Attribute("page").Value).TakeWhile(x => x.Name.ToString() != "page" || (x.Name.ToString() == "page" && x.Attribute("index").Value == link.Attribute("page").Value)); var elementsafter2 = lettertext2.Descendants().SkipWhile(x => x.Name != "page" || !x.Attributes("index").Any() || x.Attribute("index").Value != link.Attribute("page").Value).TakeWhile(x => x.Name.ToString() != "page" || (x.Name.ToString() == "page" && x.Attribute("index").Value == link.Attribute("page").Value)); var line = elementsafter.Where(x => x.Name == "line" && x.HasAttributes && x.Attributes("index").Any() && x.Attribute("index").Value == link.Attribute("line").Value).Union(elementsafter2.Where(x => x.Name == "line" && x.HasAttributes && x.Attributes("index").Any() && x.Attribute("index").Value == link.Attribute("line").Value)); if (!line.Any()) { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf eine nicht existierende Zeile (" + link.Attribute("line").Value + ") !"); errors.AppendLine(); } } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf eine nicht existierende Seite (" + link.Attribute("page").Value + ") !"); errors.AppendLine(); } } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf einen nicht existierenden Brief (" + link.Attribute("letter").Value + ") !"); errors.AppendLine(); } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " hat kein letter-Attribut!"); errors.AppendLine(); } } var marginalset = new HashSet(); foreach (var link in marginals) { if (link.HasAttributes && link.Attribute("index") != null) { if (marginalset.Contains(link.Attribute("index").Value.ToString())) { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " hate eine bereits vergebene Indexnummer und wird ignoriert. (" + link.Attribute("index").Value + ") !"); errors.AppendLine(); } else marginalset.Add(link.Attribute("index").Value.ToString()); } if (link.HasAttributes && link.Attribute("letter") != null) { if (hamannDoc.Letters.ContainsKey(link.Attribute("letter").Value)) { if (link.Attribute("page") != null) { var lettertext = XElement.Parse(hamannDoc.Letters[link.Attribute("letter").Value].Element); var page = lettertext.Descendants("page").Where(x => x.Attribute("index").Value.ToString() == link.Attribute("page").Value.ToString()); if (page.Any()) { if (link.Attribute("line") != null) { var elementsafter = lettertext.Descendants().SkipWhile(x => x.Name != "page" || !x.Attributes("index").Any() || x.Attribute("index").Value != link.Attribute("page").Value).TakeWhile(x => x.Name.ToString() != "page" || (x.Name.ToString() == "page" && x.Attribute("index").Value == link.Attribute("page").Value)); var line = elementsafter.Where(x => x.Name == "line" && x.HasAttributes && x.Attributes("index").Any() && x.Attribute("index").Value.ToString() == link.Attribute("line").Value.ToString()); if (!line.Any()) { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf eine nicht existierende Zeile (" + link.Attribute("line").Value + ") !"); errors.AppendLine(); } } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf eine nicht existierende Seite (" + link.Attribute("page").Value + ") !"); errors.AppendLine(); } } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf einen nicht existierenden Brief (" + link.Attribute("letter").Value + ") !"); errors.AppendLine(); } } else { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " hat kein letter-Attribut!"); errors.AppendLine(); } } foreach (var link in links) { if (link.HasAttributes && link.Attribute("ref") != null) { if (!ids.Contains(link.Attribute("ref").Value)) { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf einen nicht existierenden Kommentar (" + link.Attribute("ref").Value + ") !"); errors.AppendLine(); } } if (link.HasAttributes && link.Attribute("subref") != null) { if (!ids.Contains(link.Attribute("subref").Value)) { var info = (IXmlLineInfo)link; errors.AppendLine(link.ToString() + " Z. " + info.LineNumber + " verweist auf einen nicht existierenden Kommentar (" + link.Attribute("subref").Value + ") !"); errors.AppendLine(); } } } foreach (var hand in hands) { if (hand.HasAttributes && hand.Attribute("ref") != null) { if (!hamannDoc.HandPersons.ContainsKey(hand.Attribute("ref").Value)) { var info = (IXmlLineInfo)hand; errors.AppendLine(hand.ToString() + " Z. " + info.LineNumber + " verweist auf einen nicht angelegte Person in den Handrefs (" + hand.Attribute("ref").Value + ") !"); errors.AppendLine(); } } } foreach (var edit in edits) { if (edit.HasAttributes && edit.Attribute("ref") != null) { if (!hamannDoc.Editreasons.ContainsKey(edit.Attribute("ref").Value)) { var info = (IXmlLineInfo)edit; errors.AppendLine(edit.ToString() + " Z. " + info.LineNumber + " verweist auf eine nicht existierende Editreason (" + edit.Attribute("ref").Value + ") !"); errors.AppendLine(); } } } //foreach (var link in links) //{ // if (link.HasAttributes && link.Attribute("subref") != null) // { // if (ids.Contains(link.Attribute("subref").Value)) // ids.Remove(link.Attribute("subref").Value); // } // else if (link.HasAttributes && link.Attribute("ref") != null) // { // if (ids.Contains(link.Attribute("ref").Value)) // ids.Remove(link.Attribute("ref").Value); // } // if (ids.Any()) // { // foreach (var id in ids) // { // errors.AppendLine("WARNUNG: Auf den Kommentar mit der ID " + id + " wird nirgends verwiesen."); // errors.AppendLine(); // } // } //} System.IO.File.WriteAllText(docOpt.OutputDir + "errors.txt", errors.ToString()); } public void Coordinator(DocOptions docOpt, ILibrary hamannDoc, ILibrary lib, (int, int) years, bool? volDocs, bool? registerDocs) { /* koordiniert das Erstellen der einzelnen Dokumenttypen/-sorten*/ //try //{ var h2w = new Hamann2Word(hamannDoc, docOpt); if (volDocs == true) { Logger.Out("Erstelle docx für BandDateien"); h2w.MakeYearDocuments(lib, years); } if (registerDocs == true) { Logger.Out("Erstelle docx für Register"); Hamann2Word.MakeRegisterComms(); } //} //catch (Exception ex) //{ // Logger.Out(ex.Message); // System.IO.File.WriteAllText(Hamann2Word.OutputDir + "logfile.txt", Logger.LogString.ToString()); // Environment.Exit(1); //} System.IO.File.WriteAllText(Hamann2Word.OutputDir + "logfile.txt", Logger.LogString.ToString()); } } }