Benutzer:Euku/persDaten.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
 /************************************************************************
  * von [[:de:User:Euku]]
  * 8. März 2007 <nowiki>
  *
  * ACHTUNG nicht ohne Nachkontrolle ausführen!
  * Insbesondere bei Russen ist auf das Datum zu achten.
  *
  * Fügt automatisch Personen-Kategorien und {{Personendaten}} ein. Wenn
  * Daten/Kategorien schon vorhanden sind bleiben sie bestehen bzw.
  * werden mitgenutzt.
  *
  * Wie man das Skript übernimmt steht auf der Diskussionseite.
  *
  * Läuft gut in Firefox 3.6
  *
  * Lizenz: CC-by-sa: Dieser Quellcode wurde unter den Bedingungen der Creative Commons Attribution-ShareAlike
  * Lizenz: (http://creativecommons.org/licenses/by-sa/2.5/) (abgekürzt „cc-by-sa“) in der Version 2.5 veröffentlicht.
  *************************************************************************/
 function addPersData() {
     StaatsAdj = new Array("deutsche", "britische", "französische", "polnische", "dänische", "US-amerikanische", "schweizer", "österreichische", "spanische", "japanische", "italienische", "russische", "türkische", "niederländische", "italienische", "griechische", "chinesische", "tschechische", "slowakische", "ungarische");
     KatBez =    new Array("Deutscher", "Brite", "Franzose", "Pole", "Däne", "US-Amerikaner", "Schweizer", "Österreicher", "Spanier", "Japaner", "Italiener", "Russe", "Türke", "Niederländer", "Italiener", "Grieche", "Chinese", "Tscheche", "Slowake", "Ungar");
     // Memo: Abschnitt "Kategorie zur Staatsangehörigkeit schon drin?" updaten

     //regExVollstDatum = /\d\d\.?\ ?(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember|(?:[012]\d|3[01]\.))\ ?(?:\d+)/;
     //regExDatum  = /(?:\d\d\.?\ ?)?(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember|(?:[012]\d|3[01]\.))?\ ?(?:\d+)/;
     
     /* name: der Name, Vorname für Personendaten, kann Umlaute und Sonderzeichen enthalten
        nameSort: nur für {{SORTIERUNG, ohne Umlaute und Sonderzeichen    */
     geschlecht = name = nameSort = alias = beschreibung = gebDatum = gebOrt = sterbeDatum = sterbeOrt = staat = '';
     // entsprechende Aufgabe erledigt oder schon im Artikel
     geschlKatErl = gebKatErl = sterbeKatErl = defaultSortErl = persDatenErl = staatsKatErl = false;
     
     // quellTextRein ist der gesäuberte Quelltext; quellText das Original
     quellTextRein = quellText = document.editform.wpTextbox1.value;
     quellTextRein = quellTextRein.replace(/\n/g, " ");                      // keine Umbrüche
     quellTextRein = quellTextRein.replace(/\<\!\-\-.*?\-\-\>/g, "")         // alle Kommentare entfernen
     quellTextRein = quellTextRein.replace(/\{\|.*?\|\}/g, "")               // alle Tabellen entfernen
     quellTextRein = quellTextRein.replace(/(\[\[([^\|\]]*?\|)?|\]\])/g, "") // alle [[Link|Links]] entfernen
     
     // suche möglichen Anfang
     offsetBeschreibung = quellTextRein.indexOf("'''"+mw.config.get('wgTitle')+"'''");    // korrekt formatierter Name und gleiches Lemma
     offsetBeschreibung = (offsetBeschreibung == -1 ? quellTextRein.search(/\'\'\'([^']*?)\'\'\'/) : offsetBeschreibung); // erstes fette Wort
     offsetBeschreibung = (offsetBeschreibung == -1 ? quellTextRein.indexOf(mw.config.get('wgTitle')) : offsetBeschreibung); // nur Lemma
     offsetBeschreibung = (offsetBeschreibung == -1 ? 0 : offsetBeschreibung); // nichts gefunden
     quellTextRein = quellTextRein.slice(offsetBeschreibung, quellTextRein.length);  // den ersten Teil abschneiden

     // suche Geschlecht wenn nötig
     geschlKatErl = (quellText.search(/\[\[(Kategorie|Category)\:(Mann|Frau)(\|[^\]]*)?\]\]/gi) != -1); // Geschlechtskategorie schon drin?
     
     if (!geschlKatErl && (quellTextRein.search(/((ist|war)\ eine|\]\]in)\ /) < 250) && (quellTextRein.search(/((ist|war)\ eine|\]\]in)\ /) != -1))
          geschlecht = 'w';

     // Namen, Vornamen bestimmen
     nameArray = mw.config.get('wgTitle').replace(/\ \(.*\)$/, "").split(" "); // " (Sportler)" aus [[Max Muster (Sportler)]] entfernen
     name = (nameArray.length == 1 ? nameArray[0] : nameArray[nameArray.length -1] + ",");
     for (i = 0; i < nameArray.length -1; ++i)
         name += " " + nameArray[i];
     // Umlaute und andere Zeichen in lateinische umwandeln
     nameSort = name.replace(/ö/g,"o").replace(/Ö/g,"O").replace(/ä/g,"a").replace(/Ä/g,"A").replace(/ü/g,"u").replace(/Ü/g,"U")
                    .replace(/ß/g,"s").replace(/ñ/g,"n").replace(/Ø/g,"O").replace(/ø/g,"o").replace(/õ/g,"o").replace(/ç/g,"c")
                    .replace(/Ç/g,"C").replace(/É/g,"E").replace(/é/g,"e").replace(/Ó/g,"O").replace(/ó/g,"o").replace(/Í/g,"I")
                    .replace(/í/g,"i").replace(/Ú/g,"U").replace(/ú/g,"u").replace(/Á/g,"A").replace(/á/g,"a").replace(/È/g,"e")
                    .replace(/è/g,"e").replace(/Ò/g,"O").replace(/ò/g,"o").replace(/Ì/g,"I").replace(/ì/g,"i").replace(/Ù/g,"U")
                    .replace(/ù/g,"u").replace(/À/g,"A").replace(/à/g,"a").replace(/č/g,"c").replace(/ő/g,"o").replace(/ń/g,"n")
                    .replace(/ź/g,"z");

     // {{Personendaten}} schon drin?
     persDatenErl = (quellText.search((/\{\{Personendaten/gi)) != -1);
     if (persDatenErl) {
        // nutze vorhandene Daten
         //beschreibung = extrahiere(/\|KURZBESCHREIBUNG\=([^|]*?)\ \|GEBURTSDATUM\=/, quellTextRein);
        gebDatum = extrahiere(/\|GEBURTSDATUM\=\ ?([^|]*?)\ \|GEBURTSORT\=/, quellTextRein);
         //gebOrt = extrahiere(/\|GEBURTSORT\=\ ?(.*?)\ \|STERBEDATUM\=/, quellTextRein);
        sterbeDatum = extrahiere(/\|STERBEDATUM\=\ ?([^|]*?)\ \|STERBEORT\=/, quellTextRein);
         //sterbeOrt = extrahiere(/\|STERBEORT\=\ ?(.*?)\ ?\}\}\=/, quellTextRein);
     }
     gebKatErl    = (quellText.search(/\[\[(?:Kategorie|Category)\:Geboren\ \d{1,4}[^\]]*\]\]/gi) != -1);
     sterbeKatErl = (quellText.search(/\[\[(?:Kategorie|Category)\:Gestorben\ \d{1,4}[^\]]*\]\]/gi) != -1);
     
     // {{SORTIERUNG:...}}-Baustein schon drin?
     defaultSortErl = (quellText.search(/\{\{(DEFAULTSORT|SORTIERUNG)\:/i) != -1);
     
     // Kategorie zur Staatsangehörigkeit schon drin?
     staatsKatErl = (quellText.search(/\[\[(?:Kategorie|Category)\:(?:Deutscher|Brite|Franzose|Pole|Däne|US\-Amerikaner|Schweizer|Österreicher|Spanier|Japaner|Italiener|Russe|Türke|Niederländer|Italiener|Grieche|Chinese|Tscheche|Slowake|Ungar)[^\]]*\]\]/gi) != -1);
     
     // Beschreibung suchen
     beschreibung = extrahiere(/(?:(?:ist|war)|gilt\ als)\ (?:eine*|die|der)*\ *(.*?)\./, quellTextRein);  // Satz beim Punkt abschneiden
     
     // Alias suchen
     alias = extrahiere(/(?:bürgerlicher\ Name|gebürtig|geboren\ als|bürgerlich|alias|bekannt\ als|Pseudonym\:?|eigentlich)\ *?\'\'\'?(.*?)\'\'\'?/i, quellTextRein);
     
     // Staatsangehörigkeit suchen
     for (i = 0; !staatsKatErl && i < StaatsAdj.length; ++i)
          if (beschreibung.indexOf(StaatsAdj[i]) != -1) {
            staat = KatBez[i];
            break;
          }

     // Geburtsdaten suchen wenn nötig
     if ((!persDatenErl) || (persDatenErl && !gebKatErl)) {
	     gebDatenPos = quellTextRein.search(/(\*|geb\.\ |geboren\ |von\ )*/);
	     if ((gebDatenPos < 300) && (gebDatenPos != -1)) {
	         tmp = quellTextRein.slice(gebDatenPos, 450);
	         if (gebDatum.search(/\d\d\.?\ ?(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember|(?:[012]\d|3[01]\.))\ ?(?:\d+)/) == -1) // bisheriges Datum ok?
	            gebDatum = extrahiere(/(?:\(\ ?\*|geb\.|geboren|von)\ ?(\d[^;\-]*?\d\d)[ .,:;)†]/, tmp);                       // Datum finden
	         if (gebDatum == "") // zweiter Versuch, Datum komplett
	            gebDatum = extrahiere(/(?:\*|geb\.|geboren|von).{0,25}?((?:[0123]?\d)?\.?\ ?(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember)\ ?(?:\d+))[ .,:;)†]/, tmp);   // Datum finden
	         if (gebDatum == "") // dritter Versuch, Jahr vor Christi suchen
	            gebDatum = extrahiere(/(?:\*|geb\.|geboren|von).{0,15}?(\d+\ (?:v\.\ Chr\.|v\.\ u\.\ Z\.))[ .,:;)†]/, tmp);   // Datum finden
	         if (gebDatum == "") // vierter Versuch, nur Jahr (n. Chr.) suchen
	            gebDatum = extrahiere(/(?:\*|geb\.|geboren|von).{0,15}?(\d+)[ .,:;)†]/, tmp);   // Datum finden
	         if (gebOrt == "")
	            gebOrt = extrahiere(/(?:\*|geb\.|geboren|von)\ ?\d[^;\-†]*\d\d\ (?:i[nm]|\;|\,)\ ([^\.;)]*?)[.;)†]\ ./, tmp);  // Ort finden
	     }
	 }

     // Sterbedaten suchen wenn nötig
     if ((!persDatenErl) || (persDatenErl && !sterbeKatErl)) {
         strDatenPos = quellTextRein.search(/(\-\ ?\d\d+|\†|gestorben\ |starb\ |bis\ )/);
         if ((strDatenPos < 365) && (strDatenPos != -1)) {
             tmp = quellTextRein.slice(strDatenPos, 450);
             if (sterbeDatum.search(/\d\d\.?\ ?(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember|(?:[012]\d|3[01]\.))\ ?(?:\d+)/) == -1) // bisheriges Datum ok?
                 sterbeDatum = extrahiere(/(?:\-|\†|\&dagger;|gestorben\ |starb\ |bis\ )\ ?(\d[^;\-]*?\d\d)[ .,:;)]/, tmp);     // Datum finden
             if (tmp.search(/(?:\†|\&dagger;|gestorben\ |starb\ |bis\ )\ *.*?ebenda.*?(?:\)[,;. ]|[,;. ]\ )/) != -1) // TODO: begrenzung der suche
                 sterbeOrt = gebOrt;   // "ebenda"
             else
                 sterbeOrt = extrahiere(/(?:\-|\†|\&dagger;|gestorben\ |starb\ |bis\ )\ *?.*?\d\d[,; \)]?\ i[nm]\ ([^,;\.\)]*?)(?:\)[,;. ]|[,;. ]\ )/, tmp);  // Ort finden
         }
     }

     // Cursor vor erste "[[Kategorie:", vor {{SORTIERUNG}} bzw. ersten Interwikilink setzen, sonst Ende
     tmpPos = document.editform.wpTextbox1.value.search(/\[\[(?:Kategorie|Category)\:/);
     if (tmpPos == -1) {
     	 tmpPos = document.editform.wpTextbox1.value.search(/\{\{(DEFAULTSORT|SORTIERUNG)\:/);
     	 if (tmpPos == -1)
     	    tmpPos = document.editform.wpTextbox1.value.search(/\[\[(ab|af|als|ar|cs|da|el|en|es|fi|fr|fy|he|hsb|hu|it|ja|ksh|la|lb|nds|nl|no|pl|pt|ru|sk|sl|sv|tr|zh)\:/);
     	 tmpPos = (tmpPos == -1 ? quellText.length : tmpPos);
     }
     document.editform.wpTextbox1.selectionStart = tmpPos;

     // in Artikel einfügen
     if (!defaultSortErl && (nameSort != mw.config.get('wgTitle')))
         insertTags('\n{{SORTIERUNG:'+ nameSort +'}}\n','','');
     if (staat != '')       // Angehörigkeit ist klar
        insertTags('[[Kategorie:' + staat + ']]\n', '', '');
     if ((!gebKatErl) && (gebDatum != ''))
         insertTags('[[Kategorie:Geboren '+ extrahiere(/(\d+)$/, gebDatum) +']]\n','','');
     if ((!sterbeKatErl) && (sterbeDatum != ''))
        insertTags('[[Kategorie:Gestorben '+ extrahiere(/(\d+)$/, sterbeDatum) +']]\n','','');
     if (!geschlKatErl) {
         if (geschlecht == "w")
             insertTags('[[Kategorie:Frau]]\n','','');
         else  // auch wenn es kein Mann ist, ist die Wahrscheinlichkeit hoch, dass es trotzdem stimmt
             insertTags('[[Kategorie:Mann]]\n','','');
     }

     if (!persDatenErl) {
     	  // Cursor vor Interwikilinks setzen
     	  tmpPos = document.editform.wpTextbox1.value.search(/\[\[(ab|af|als|ar|cs|da|el|en|es|fi|fr|fy|he|hsb|hu|it|ja|ksh|la|lb|nds|nl|no|pl|pt|ru|sk|sl|sv|tr|zh)\:/);
     	  if (tmpPos != -1)
              document.editform.wpTextbox1.selectionStart = tmpPos;
          insertTags('\n{{Personendaten\n'+
                 '|NAME=' + name + '\n'+
                 '|ALTERNATIVNAMEN='+ alias +'\n'+
                 '|KURZBESCHREIBUNG=' + beschreibung + '\n'+
                 '|GEBURTSDATUM=' + gebDatum + '\n'+
                 '|GEBURTSORT=' + gebOrt + '\n'+
                 '|STERBEDATUM=' + sterbeDatum + '\n'+
                 '|STERBEORT=' + sterbeOrt + '\n}}\n','','');
     }

     //andere Kategorieangaben bereinigen da {{SORTIERUNG drin ist, kann die klassische Sortiervorgabe entfernt werden
     quellText = document.editform.wpTextbox1.value;
     tmp = quellText.replace(/\[\[(?:Kategorie|Category)\:([^|\]]*?)\|[^\]]*\]\]/gi, "[[Kategorie:$1]]");
     if (quellText != tmp)
         // nur zuweisen bei Aenderungen, da der Fokus verloren geht
         document.editform.wpTextbox1.value = tmp;
     document.editform.wpSummary.value += " +Personendaten";
     document.editform.wpTextbox1.focus();
 }
  
  /*
   * gibt die erste zu speichernde Klammer des regulaeren Ausdrucks aus also "$1"
   */
  function extrahiere(regEx, text) {
      return (regEx.exec(text) == null ? "" : regEx.exec(text)[1]);
  }
 // </nowiki>