Kombination von zwei Komponentenfiltern

Lukas C. hinzugefügt 2 Monaten her
unbeantwortet

Guten Tag Freunde der Sonne,


ich möchte die Filtervorlagen aus Github "COT027 Replace Divis By Dash in Page Range" und den "COT018 Use prefixes + suffixes with numeral system = 'None [as entered]'/" miteinander verbinden. Ersteres habe ich für meine Zwecke leicht verändert. Sobald ich beide in den Makro-Editor eingefügt habe und mich etliche Male daran versucht habe, wie wirklich beide Codes ausgeführt werden, habe ich aufgegeben. Es wird immer nur ein Code ausgeführt, egal ob der Code an erster oder an zweiter Stelle steht. Möglicherweise könnte es an der Anweisung liegen, die am Ende folgt (componentsPart.Elements.ReplaceItem...) und sich im Wesentlichen ähneln. Vielleicht ist es aber auch etwas anderes, was ich nicht sehe. Falls jemand Erfahrung damit hat, würde ich mich über Hilfe freuen.

//C6#COT027
//Description: Replace Divis by Dash in Page Range
//Version: 1.0 

using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;
namespace SwissAcademic.Citavi.Citations
{
	public class ComponentPartFilter
		:
		IComponentPartFilter
	{
		public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
		{
			handled = false;
			
			if (citation == null) return null;
			if (citation.Reference == null) return null;
			if (componentPart == null) return null;
			if (componentPart.Elements == null || componentPart.Elements.Count == 0) return null;


			PageRangeFieldElement pageRangeFieldElement = componentPart.Elements.OfType<PageRangeFieldElement>().FirstOrDefault();
			if (pageRangeFieldElement == null) return null;
			PageRange pageRangeResolved = PageRange.Empty;
			
			
			
			if (pageRangeFieldElement is QuotationPageRangeFieldElement)
			{							
				PlaceholderCitation placeholderCitation = citation as PlaceholderCitation;
				if (placeholderCitation == null) return null;
				if (placeholderCitation.Entry == null) return null;
				pageRangeResolved = placeholderCitation.Entry.PageRange;	
			}
			else
			{
				pageRangeResolved = citation.Reference.PageRange;
			}	
			
			if (pageRangeResolved == null) return null;
			if (pageRangeResolved == PageRange.Empty) return null;			
			if (pageRangeResolved.NumeralSystem != NumeralSystem.Omit) return null;
			
			LiteralElement prefix = null;
			LiteralElement suffix = null;
			switch (pageRangeResolved.NumberingType)
			{
				case NumberingType.Page:
					prefix = pageRangeFieldElement.PageMultiPrefix;
					suffix = pageRangeFieldElement.PageMultiSuffix;
					break;
				
				case NumberingType.Column:
					prefix = pageRangeFieldElement.ColumnMultiPrefix;
					suffix = pageRangeFieldElement.ColumnMultiSuffix;
					break;
				
				case NumberingType.Paragraph:
					prefix = pageRangeFieldElement.ParagraphMultiPrefix;
					suffix = pageRangeFieldElement.ParagraphMultiSuffix;
					break;
				
				case NumberingType.Margin:
					prefix = pageRangeFieldElement.MarginMultiPrefix;
					suffix = pageRangeFieldElement.MarginMultiSuffix;
					break;
				
				case NumberingType.Other:
					prefix = pageRangeFieldElement.OtherMultiPrefix;
					suffix = pageRangeFieldElement.OtherMultiSuffix;
					break;
			}
			
			bool hasPrefix = prefix != null && !string.IsNullOrEmpty(prefix.Text);
			bool hasSuffix = suffix != null && !string.IsNullOrEmpty(suffix.Text);
			
			
		
			TextUnitCollection pageRangeTextUnits = pageRangeFieldElement.GetTextUnits(citation, template);
			if (pageRangeTextUnits == null || !pageRangeTextUnits.Any()) return null;
			
			
			
			foreach(ITextUnit unit in pageRangeTextUnits)
			{
				unit.Text = unit.Text.Replace(System.StringUtility.Divis, System.StringUtility.EnDash);
			}

			TextUnitCollection output = new TextUnitCollection();
			
			if (hasPrefix && pageRangeTextUnits.First().Text != prefix.Text)
			{
				TextUnitCollection prefixTextUnits = prefix.GetTextUnits(citation, template);
				if (prefixTextUnits != null && prefixTextUnits.Any()) output.AddRange(prefixTextUnits);
			}
				
			output.AddRange(pageRangeTextUnits);
			
			if (hasSuffix && pageRangeTextUnits.Last().Text != suffix.Text)
			{
				TextUnitCollection suffixTextUnits = suffix.GetTextUnits(citation, template);
				if (suffixTextUnits != null && suffixTextUnits.Any()) output.AddRange(suffixTextUnits);
			}
			
			componentPart.Elements.ReplaceItem(pageRangeFieldElement, TextUnitCollectionUtility.TextUnitsToLiteralElements(output, componentPart));
			handled = false;
			
			//all literal elements should always be output:
			foreach (LiteralElement literalElement in componentPart.Elements.OfType<LiteralElement>())
			{
				literalElement.ApplyCondition = ElementApplyCondition.Always;
			}
			
			return null;
			
						
			if (citation == null) return null;
			if (citation.Reference == null) return null;
			if (componentPart == null) return null;
			if (componentPart.Elements == null || componentPart.Elements.Count == 0) return null;
			
			bool found = false;
			TextUnitCollection textUnits = pageRangeFieldElement.GetTextUnits(citation, template);
			if (textUnits == null) return null;
			
			foreach(ITextUnit textUnit in textUnits)
			{
				if (textUnit.Text.Contains(";"))
				{
					found = true;
					textUnit.Text = textUnit.Text.Replace(";", " Rn. ");
				}
			}
			
			if (found)
			{
				componentPart.Elements.ReplaceItem(pageRangeFieldElement, textUnits.TextUnitsToLiteralElements(componentPart));
			}
			return null;
		}
	}
}

Antwort schreiben
 
Dateianlage anfügen (KEINE vertraulichen Dokumente!)