This forum is read-only - Please use our new Citavi Forum instead.
Dieses Forum dient nur zur Recherche - Bitte nutzen Sie das neue Citavi Forum für Ihre Fragen.

Titelzusätze bei Gesetzen

Schlagen Sie neue Funktionen vor. Wir sind gespannt auf Ihre Wünsche.

Re: Titelzusätze bei Gesetzen

Postby Felix Magin » 2016-06-21 16:43

P.S.

Immerhin hab ich einen Error-Handler eingebaut. Der Erfolg bleibt mir ;-)
Felix Magin
Citavi Expert
 

Re: Titelzusätze bei Gesetzen

Postby jay-squared » 2016-06-21 19:28

Ich glaube, der wesentliche Unterschied - neben der Verwendung von Listen, aber damit verwandt - ist dass ich innerhalb des Codes eine eigene Klasse "Language" definiert habe. Ich meine, im Ergebnis erlaubt das etwas kürzeren Code und Spielereien, je nachdem ob es nur eine oder mehrere Fassungen/Übersetzungen gibt, und damit ist er auch leichter ausbaubar, weitere Sprachen müssen nur am Anfang per
Code: Select all
availableLanguagesList.Add(new Language("vu", "vulkanische", "Vulkanisch"));
hinzugefügt werden. Aber wofür Du dich entscheidest, ist natürlich Dir überlassen. Gut wäre nur, wenn wir uns über die Codes einigen könnten. Wahrscheinlich sind die Dreibuchstabencodes besser, als die Zweibuchstabencodes, dem stimme ich zu.

Wie funktioniert das Ganze nun bei mir, was sind die Unterschiede?

Wesentlicher Punkt ist wie gesagt die neue Klasse "Language". Ein Mitglied der Klasse "Language" hat drei Eigenschaften: "Sprachcode", "Adjektiv" und "Substantiv" (das ganze klappt zugebenermaßen nur, weil "Übersetzung" und "Fassung" im deutschen das gleiche Geschlecht haben, sonst müsste man mehr Adjektiv-Eigenschaften definieren).

Zuerst wird eine Liste aller bekannter Sprachen - eine Liste, bestehend aus Mitgliedern der Klasse "Language" erstellt. Dann werden drei Versions-Listen - authentische, offizielle Übersetzungen, und inofizielle Übersetzungen - erstellt.

Diesen Versions-Listen werden Mitglieder der Art "Language", ermittelt anhand der Kombination "Statuscode-Sprachcode" zugewiesen.

Code: Select all
inofficialTranslationsList.Add(availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault()


Der Code heißt "füge der Liste inofficialTranslationsList das erste Mitglied der Liste availableLanguagesList hinzu, dessen Eigenschaft "Code" mit dem Code des aktuellen Elements des Sprachfelds (=string language in languagesList) übereinstimmt.

Im letzten Schritt wird dann aus den drei Versions-Listen der Output erstellt, wobei unterschieden wird, ob eine Liste nur ein Mitglied oder mehrere Mitglieder hat.

Was da wohl noch zu tun wäre, wäre erstens jeder der drei Versions-Listen zu sortieren, so dass etwa die Sortierung des Outputs einer Liste nicht einfach von der Sortierung im Sprachfeld abhängt, und zweitens sollte man wohl auch sichergehen, dass dieselbe Sprache nicht zweimal einer Versions-Liste zugewiesen werden kann.

Außerdem müsste man wohl auch überlegen, ob die Reihenfolge "inoffizelle Übersetzung, offizielle Übersetzung, authentische Fassung" der Versions-Listen, welche auch im Output Ausdruck findet, richtig ist. Die Überlegung war, dass bei einem Gesetz, bei dem es eine deutsche authentische Fassung gibt, wohl keine offizielle Übersetzungen mehr angegeben werden, bei einem Gesetz ohne authentische deutsche Fassung, aber mit offizieller deutscher Übersetzung wohl keine inofizielle, so dass es eigentlich keinen Input geben könnte, der falschen Output erzeugt, aber sauberer wäre es natürlich, wenn das programmatisch sichergestellt würde, dass etwa die Versions-Liste, in der "Deutsch" vorkommt, als erste gedruckt wird.

PS: Bin eigentlich entschiedener Gegner des Bindestrichs nach Fugen-S und habe das hier nur aus Gründen der Klarheit verwendet.
jay-squared
Citavi Expert
 

Re: Titelzusätze bei Gesetzen

Postby Felix Magin » 2016-06-23 14:45

Wow, Dein Code ist - wie ich bereits angenommen hatte, sehr viel eleganter als meiner.

Da ich mich bisher in nahezu keiner Programmiersprache auskenne (die einzige Ausnahme bilden das rudimentäre Basic meines programmierbaren Taschenrechners und Excel-Funktionen (aber nicht Makros)), kannte ich die Möglichkeit eigener Klassen gar nicht. Aber sie überzeugt mich total! Vielen Dank dafür.

Ich halte die Dreibuchstabencodes auch deshalb für besser, weil sie eine genauere Differenzierung ermöglichen. So steht nach ISO 639-2 gmh für Mittelhochdeutsch (1050-1500), gmo für Althochdeutsch (750-1050), gsw für Schweizerdeutsch und nds für Niederdeutsch; enm steht für Mittelenglisch (1100-1500), ang für Altenglisch (450-1100) und cpe für Kreolisch-Englisch. Das ist zwar für einen Juristen vermutlich alles relativ unwichtig (selbst, wenn wir den Sachsenspiegel zitieren würden, käme es hier wohl nicht auf eine so präzise Sprachangabe an), könnte aber für Linguisten, Historiker, Anthropologen, Archäologen und andere Disziplinen interessant werden.
Das heißt: Wenn sie denn jemals Deinen Code finden, der auf Seite 2 eines Wunschlisten-Threads zum Dokumententyp Gesetz/Verordnung steht...

Übrigens habe ich in meinem Code einen Fehler gemacht: nach ISO 639-2 ist der Code für Klingonisch nicht tho, sondern tlh...

Deinen Betrachtungen zur sinnvollen Reihenfolge stimme ich zu. Ich kann aber nicht ausschließen, dass mir nochmal ein Fall einfällt, wo eine andere Reihenfolge klüger wäre, aber derzeit ist das nicht der Fall.

Grüße,

Felix
Felix Magin
Citavi Expert
 

Re: Titelzusätze bei Gesetzen

Postby Felix Magin » 2016-06-24 10:45

JJ,

irgendwas mache ich offenbar falsch, denn Dein Code ändert den Output bei mir nicht.
Erst dachte ich, das liegt vielleicht an meinen leichten Anpassungen (ich hab aber nur die Sprachkürzel verändert und aus dem "auth"-Statuskürzel ein "aut" gemacht, sowie weitere Sprachen hinzugefügt).
Testweise habe ich Deinen Filter daher nochmal unverändert eingefügt, aber das Resultat ist dasselbe.


Ich bin vorgegangen wie folgt:
Ich habe eine neue Komponente erzeugt und ihr den Text "#Löschen" gegeben, für den ich in den Eigenschaften des Zitationsstils eine Ersetzung durch Nichts definiert habe.
Diese Komponente hat Deinen Code als "Filter" bekommen.
Im Sprachen-Feld meiner Titel habe ich die Sprachen so eingegeben, wie im Code definiert.

Die Ausgabe ist "#Löschen", die Citavi brav durch Nichts ersetzt.

Was mache ich falsch?

Gruß,
Felix
Felix Magin
Citavi Expert
 

Re: Titelzusätze bei Gesetzen

Postby jay-squared » 2016-06-24 12:43

Wenn statt des Outputs des Filters die Text-Komponente gezeigt wird, heißt das, das der Filter abgestürzt ist. Top-Verdächtiger dafür ist in meinem Code unerwarteter Input. Insbesondere kann der Code nicht damit umgehen, wenn im Sprachfeld ein Sprachcode steht, der nicht in der Liste verfügbarer Sprachen enthalten ist. Ein wichtiger Schritt ist also schonmal, im Loop diesen Fall abzufedern:

Code: Select all
if (availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault() == null) continue;


Warum kommt es überhaupt dazu, dass im Input ein Sprachcode steht, der nicht in der List vorhanden ist? Das kann etwa dann der Fall sein, wenn die Liste im Sprachfeld statt mit " " mit ", " oder "," getrennt ist. Ein weiterer Schritt wäre es also, das Parsen des Sprachfelds etwas toleranter ob des Inputs zu machen. Das lässt sich etwa erreichen, indem der Sprachfeld-String statt durch ein character durch ein array von strings getrennt wird.

Code: Select all
string[] separatorArray = {", ", ",", " ", "; ", ";"};
languagesList = languagesString.Split(separatorArray, StringSplitOptions.None).ToList();


Das erfordert, dass oben noch der Namespace System hinzugefügt wird, da der Code sonst nichts mit "string.Split(new string[] {}, StringSplitOptions.None)" anfangen kann.

Also muss die erste Zeile des Codes nun lauten

Code: Select all
using System;


Im Ganzen:

Code: Select all
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 = true;
         
         var output = new TextUnitCollection();
         
         var languagesString = citation.Reference.Language;
         
         if (languagesString == string.Empty || languagesString == null) return null;
         
         LiteralTextUnit separatorLiteral = new LiteralTextUnit(", ");
         LiteralTextUnit prefixLiteral = new LiteralTextUnit(" (");
         LiteralTextUnit suffixLiteral = new LiteralTextUnit(")");
         
         string[] separatorArray = {", ", ",", " ", "; ", ";"};
         
         FontStyle fontStyle = FontStyle.Neutral;
         
         List<string> languagesList = new List<string>();
         
         try
         {
            languagesList = languagesString.Split(separatorArray, StringSplitOptions.None).ToList();
         }
         catch
         {
            return null;
         }
         
         List<Language> officialTranslationsList = new List<Language>() ;
         List<Language> authenticLanguagesList = new List<Language>() ;
         List<Language> inofficialTranslationsList = new List<Language>() ;
         
         List<Language> availableLanguagesList = new List<Language>();
         
         availableLanguagesList.Add(new Language("eng", "englische", "Englisch"));
         availableLanguagesList.Add(new Language("fra", "französische", "Französisch"));
         availableLanguagesList.Add(new Language("deu", "deutsche", "Deutsch"));
         
         string authenticString = "aut";
         string inofficialString = "ino";
         string officialString = "off";
         
         foreach (string language in languagesList)
         {
            string code = string.Empty;
            string status = string.Empty;
            try
            {
               code = language.Split('-')[1];
               status = language.Split('-')[0];
            }
            catch
            {
               continue;
            }
            
            
            if (availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault() == null) continue;
            
            if (status == authenticString) authenticLanguagesList.Add(availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault());
            else if (status == inofficialString) inofficialTranslationsList.Add(availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault());
            else if (status == officialString) officialTranslationsList.Add(availableLanguagesList.Where(i => i.LanguageCode == code).FirstOrDefault());
         }
         
         if (inofficialTranslationsList.Count == 1)
         {
            output.Add(new LiteralTextUnit("inoffizielle "));
            output.Add(new LiteralTextUnit(inofficialTranslationsList.FirstOrDefault().Adjective));
            output.Add(new LiteralTextUnit(" Übersetzung"));
         }
         else if (inofficialTranslationsList.Count > 1)
         {
            int i = 0;
            output.Add(new LiteralTextUnit("inoffizielle Übersetzungen: "));
            foreach (Language language in inofficialTranslationsList)
            {
               if (i > 0) output.Add(new LiteralTextUnit(", "));
               output.Add(new LiteralTextUnit(language.Noun));
               i = i + 1;
            }
         }
         
         if (officialTranslationsList.Count == 1)
         {
            if (output.Count > 0) output.Add(new LiteralTextUnit(", "));
            output.Add(new LiteralTextUnit("offizielle "));
            output.Add(new LiteralTextUnit(officialTranslationsList.FirstOrDefault().Adjective));
            output.Add(new LiteralTextUnit(" Übersetzung"));
         }
         else if (officialTranslationsList.Count > 1)
         {
            if (output.Count > 0) output.Add(new LiteralTextUnit(", "));
            int i = 0;
            output.Add(new LiteralTextUnit("offizielle Übersetzungen: "));
            foreach (Language language in officialTranslationsList)
            {
               if (i > 0) output.Add(new LiteralTextUnit(", "));
               output.Add(new LiteralTextUnit(language.Noun));
               i = i + 1;
            }
         }         
         
         if (authenticLanguagesList.Count == 1)
         {
            if (output.Count > 0) output.Add(new LiteralTextUnit(", "));
            output.Add(new LiteralTextUnit("authentische "));
            output.Add(new LiteralTextUnit(authenticLanguagesList.FirstOrDefault().Adjective));
            output.Add(new LiteralTextUnit(" Fassung"));
         }
         else if (authenticLanguagesList.Count > 1)
         {
            if (output.Count > 0) output.Add(new LiteralTextUnit(", "));
            int i = 0;
            output.Add(new LiteralTextUnit("authentische Fassungen: "));
            foreach (Language language in authenticLanguagesList)
            {
               if (i > 0) output.Add(new LiteralTextUnit(", "));
               output.Add(new LiteralTextUnit(language.Noun));
               i = i + 1;
            }
         }
                  
         if (output.Count > 0)
         {
            output.Insert(0, prefixLiteral);
            output.Add(suffixLiteral);
         }
         
         foreach (LiteralTextUnit text in output)
         {
            text.FontStyle = fontStyle;
         }

         return output;      
         
      }
   }
   public class Language
   {
      public string LanguageCode { get; set; }
      public string Adjective { get; set; }
      public string Noun { get; set; }
      
      public Language(string languageCode, string adjective, string noun)
       {
           this.LanguageCode = languageCode;
           this.Adjective = adjective;
           this.Noun = noun;
         }
   }
}


Ich hab da auch noch ein paar try-catch-Error-Handler reingebaut.
jay-squared
Citavi Expert
 

Re: Titelzusätze bei Gesetzen

Postby Felix Magin » 2016-06-30 08:53

...wo auch immer mein Eingabefehler lag, jetzt funktioniert es! Vielen Dank für dieses großartige Tool!
Felix Magin
Citavi Expert
 

Previous

Return to Wunschliste