Freitext 1 (Bandnummer) in römische Ziffern umwandeln

Simon E. hinzugefügt 3 Monaten her
unbeantwortet

Hallo Liebe Community,

Ich muss für einen Zitationsstil die Bandnummer von Beiträgen in Gesetzeskommentaren als römische Ziffer ausgeben. Mangels eines dedizierten Bd-nr. Feldes habe ich hierzu das Freitext 1 Feld benutzt. Gleichzeitig soll aber dieselbe Datenbank mit einem anderen Stil verwendet werden, der die Bandnummer als arabische Zahl ausgibt (Verschiedene Verlage/Geschmäcker mit verschiedenen Vorgaben). Die momentan in der Datenbank als arabische Zahlen gespeicherten Bandnummern müssen also irgendwie römische Ziffern umgewandelt werden.

Eine besondere Schwierigkeit ergibt sich daraus, dass es Loseblattkommentare gibt, die auch schon mal einen Band "zwischenschieben" z.B.: BK Ordner 1a. Soweit ich das sehe wird dann aber früher oder später die Nummerierung der Bände geändert und der Odrner 1a somit zum Ordner 2. Das Problem tritt also sehr selten auf.


Basierend auf diesem Code habe ich mich bemüht etwas zu basteln, jedoch ohne Erfolg.


Ich wäre für jeden Hinweis dankbar.


Viele Grüße,

Simon


// #C5_43142
//Version 1.0

using System;
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 (componentPart == null) return null;
			if (citation == null || citation.Reference == null) return null;
			var volumestring = citation.Reference.CustomField1;
			if (string.IsNullOrWhiteSpace(volumestring)) return null;
			var VolumeFieldElement = componentPart.GetFieldElements().FirstOrDefault<FieldElement>(item => item.PropertyId == ReferencePropertyId.Volume);
			if (VolumeFieldElement == null) return null;
		
			var output = new TextUnitCollection();
			
			var VolumeStringRoman = NumeralSystemConverter.ToRomanNumber(arabicNumber: volumestring.ToString(), lowerCase: false);
			
			var VolumeStringTextUnit = new LiteralTextUnit(VolumeStringRoman);
			output.Add(VolumeStringTextUnit);
			
			handled = true;
			return output;
		}}}


Antworten (2)

Foto
1

using System;
using System.Linq;
using System.Collections.Generic;
using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Collections;
using SwissAcademic.Drawing;

using System.Text.RegularExpressions;

namespace SwissAcademic.Citavi.Citations
{
	public class ComponentPartFilter
		:
		IComponentPartFilter
	{
		public IEnumerable<ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
		{
			handled = true;

			if (componentPart == null) return null;
			if (citation == null || citation.Reference == null) return null;
			
			
			Regex rx = new Regex(@"([0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
			Regex ry = new Regex(@"([A-Za-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
			
			string volumenumberstring = string.Empty;
			if  (rx.Matches(citation.Reference.CustomField1).Count > 0) volumenumberstring = rx.Matches(citation.Reference.CustomField1)[0].Value;
			
			if (string.IsNullOrWhiteSpace(volumenumberstring)) return null;			

			string volumeletterstring = string.Empty;
			if  (ry.Matches(citation.Reference.CustomField1).Count > 0) volumeletterstring = ry.Matches(citation.Reference.CustomField1)[0].Value;
			
			if (string.IsNullOrWhiteSpace(volumeletterstring)) return null;
			
			
			var output = new TextUnitCollection();
			
			var VolumeStringRoman = NumeralSystemConverter.ToRomanNumber(arabicNumber: volumenumberstring.ToString(), lowerCase: false);
			
			var VolumeStringTextUnit = new LiteralTextUnit(VolumeStringRoman + volumeletterstring);
			output.Add(VolumeStringTextUnit);

			return output;
			
		}}}

Foto
1

Um das zu erläutern: ich vermute, es ist daran gescheitert

var VolumeFieldElement = componentPart.GetFieldElements().FirstOrDefault<FieldElement>(item => item.PropertyId == ReferencePropertyId.Volume);			if (VolumeFieldElement == null) return null;
Das funktioniert nämlich nur, wenn es eine Komponente gibt, welche das Band-Feld ausgibt. Wenn der ganze Output aber eh durch das Freitextfeld und den Code erzeugt wird, braucht man das auch nicht. Im Übrigen bin ich froh, dass ich nicht der einzige bin, der sich an der fehlenden Unterscheidung Bandnr. der Reihe/Band innerhalb eines mehrbändigen Werkes stört.

Foto