Benutzer:PDD/helperFunctions.js

aus Wikisource, der freien Quellensammlung

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
 // helperFunctions.js:
 // enthält obligatorische Hilfsfunktionen für [[Benutzer:PDD/monobook.js]]
 
 // <nowiki>
 
 if (typeof(drawquickbar) == 'undefined')
       var drawquickbar = true;
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // URI-Parameter für fillActionPage(), benutzt in eintragen.js, hinweise.js
 // außerdem in addEditAndRevertLinks.js (nur subjp, minorp, speichernp)
 // nur in [[Benutzer:Euku/markErledigt.js]] : subjaddp
 
 var subjp      = "subj";       // Subject
 var subjaddp   = "subjadd";    // Subject zum Ranhängen
 var textp      = "txt";        // Für Text-Austausch
 var insp       = "ins";        // Vor dem Text einfügen
 var addp       = "add";        // an Text anhängen
 var minorp     = "minor";      // (k)leine Änderung
 var nocreatep  = "nocreate";   // beim Eintragen keine neue Seite generieren
 // für autosave:
 var asuserp    = "asuser";     // usertoken
 var astimep    = "astime";     // timestamptoken
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // URI-Parameter für setReload() und doReload()
 var reloadme   = "neuladen";   // merker für reload
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // absenden()
 // aufgerufen aus fillActionPage() und hinweis() in hinweise.js
 
 function absenden() {
   if (!debugme)
     document.editform.wpSave.click();
   else
     alert ('Speichern');
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // fillActionPage()  (früher aktion(), ganz früher loeschkandidat() )
 // von Littl, ergänzt von Revvar
 //
 // Entnimmt Parameter aus der URI, fügt sie in die Textfelder ein und klickt ggf. auf "Speichern"
 // (die aufgerufene Seite ist dabei immer im Editmodus)
 
 function fillActionPage() {
   // wenn Bausteineinfügung am Anfang:
   // nur einfügen, wenn Seite noch nicht gelöscht
   var pagedeleted = false;
   if (document.getElementById("newarticletext"))
       pagedeleted = true;
 
   // nur einfügen, wenn noch nicht eingetragen
   // der URI-Aktionsparameter ist immer entweder insp oder textp oder addp, daher else
   var doubleinsert = false;
   if (UrlParameters[textp] > "") 
       doubleinsert = findDoubleEntry(UrlParameters[textp], document.editform.wpTextbox1.value);
   else if (UrlParameters[insp] > "") 
       doubleinsert = findDoubleEntry(UrlParameters[insp], document.editform.wpTextbox1.value);
   else if (UrlParameters[addp] > "") 
       doubleinsert = findDoubleEntry(UrlParameters[addp], document.editform.wpTextbox1.value);
 
   // Textfeld ausfüllen
   if (UrlParameters[textp] > "") {
      if (doubleinsert)
         document.editform.wpTextbox1.value = UrlParameters[textp] + document.editform.wpTextbox1.value;
      else
         document.editform.wpTextbox1.value = UrlParameters[textp];
   }
   else if (UrlParameters[insp] > "")
      document.editform.wpTextbox1.value = UrlParameters[insp] + document.editform.wpTextbox1.value;
   else if (UrlParameters[addp] > "")
      document.editform.wpTextbox1.value = document.editform.wpTextbox1.value + UrlParameters[addp];
 
   // weitere Felder ausfüllen
   if (UrlParameters[subjp] > "")
      document.editform.wpSummary.value = UrlParameters[subjp];
   if (UrlParameters[subjaddp] > "")
      document.editform.wpSummary.value += UrlParameters[subjaddp];
   if (UrlParameters[minorp] == "1")
      document.editform.wpMinoredit.checked=true;
 
   // wenn Textbaustein doppelt: Warnung
   if (doubleinsert)
      alert("Artikel enthält den gewählten Baustein bereits!");
   // wenn Seite schon gelöscht: Warnung
   else if (pagedeleted && (UrlParameters[nocreatep] == "1"))
      alert("Artikel wurde bereits gelöscht!");
   // wenn autosave eingeschaltet: Seite speichern
   else if (validate_asuser (UrlParameters[asuserp])) {
      if (validate_astime (UrlParameters[astimep]))
          absenden();
      else alert("Token zur automatischen Speicherung ist abgelaufen.");
   }
 }
 if ((isEdit) && (!isSpecial)) addOnloadHook(fillActionPage);
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // findDoubleEntry()
 // aufgerufen aus fillActionPage()
 
 function findDoubleEntry(baustein, artikeltext) {
   var doublette = false;
 
   // wenn keine Vorlage enthalten: Abbruch
   if (baustein == baustein.split("{{")[0]) return (doublette);
 
   var chkbaustein = baustein.split("{{")[1].split("}}")[0].split("|")[0];
   chkbaustein = "{{" + chkbaustein ;
 
   if (navigator.userAgent.indexOf("Opera") == -1) {
      // checking
            // Zeilen wie die nächste generieren Fehler mit Opera, daher diesen Bereich auskommentiert
            // Fehler: RegExp.prototype.compile: syntax error in pattern or string
            // mit Firefox2 und IE7 geht das problemlos, hmm
      if (artikeltext.search(chkbaustein) != -1)
          doublette = true;
      // Kleinschreibung & SLA & substs
      if (chkbaustein == "{{Löschen") {
          if (artikeltext.search("{{löschen") != -1)
              doublette = true;
          if (artikeltext.search("{{SLA") != -1)
              doublette = true;
      }
      if (chkbaustein == "{{subst:Löschantrag") {
          if (artikeltext.search("{{Löschantragstext") != -1)
              doublette = true;
      }
      if (chkbaustein == "{{subst:Qualitätssicherung") {
          if (artikeltext.search("{{QS-Antrag") != -1)
              doublette = true;
      }
   } // end of Opera hack
   return (doublette);
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // initQuickbar()
 // positioniert den Quickbar
 
 function initQuickbar() {
   // Variables that could be defined in your monobook
   if (typeof(keeplogo) == 'undefined')
       keeplogo = false;
   if (typeof(releasequickbar) == 'undefined')
       releasequickbar = false;
 
   var quickbarpos = "fixed";
   // IE6- kann kein position:fixed und hat demzufolge Pech
   if ( navigator.userAgent.indexOf("MSIE") > -1 )
      quickbarpos = "absolute";
   // IE7 und als MSIE maskiertes Opera 8/9: können position:fixed
   if (( navigator.userAgent.indexOf("MSIE 7") > -1 ) || ( navigator.userAgent.indexOf("Opera") > -1 ))
      quickbarpos = "fixed";
 
   if (!keeplogo) {
      // logo ausblenden (revvar)
      document.getElementById("p-logo").style.visibility = "hidden";
      // padding in column-one (platz für quickbar)
      document.getElementById("column-one").style.paddingTop =
         (10+document.getElementById("p-quickbar").clientHeight)+"px";
   }
 
   if (!releasequickbar) {
      document.getElementById("p-quickbar").style.position = quickbarpos;
   }
 }
 if (drawquickbar) addOnloadHook(initQuickbar);
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // doReload()
 // setzt nach Reload die Reload-Selection wieder
 
 function doReload() {
   if (UrlParameters[reloadme] == "1") {
      document.getElementById('reloadme').checked=true;
      setReload();
   }
 }
 if (!isEdit) addOnloadHook(doReload);
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // extendWpReason()
 // hebt 255-Zeichen-Textfeldbegrenzung auf
 
 function extendWpReason() {
   var loeschgrund;
   if (loeschgrund = document.getElementById('wpReason')) {
      loeschgrund.setAttribute('maxLength',512);
   }
 }
 if (wgAction == "delete") addOnloadHook(extendWpReason);
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // setReload()
 // aufgerufen, wenn im Quickbar die Reload-Selection gesetzt wird
 
 var timeoutaktiv;
 function setReload() {
   if (document.getElementById('reloadme').checked && (UrlParameters[reloadme] != "1")) {
       var uri = (document.URL.indexOf('?') >0) ? ('&' + reloadme + '=1') : ('?' + reloadme + '=1');
       timeoutaktiv = window.setTimeout(location.href=location.href+uri, timeout);
   }
   else if (document.getElementById('reloadme').checked	&& (UrlParameters[reloadme] == "1")) {
       timeoutaktiv=window.setTimeout("location.reload()", timeout);
   }
   else {
       window.clearTimeout(timeoutaktiv); // bizarr, timeoutaktiv ist hier gar nicht belegt?
   }
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // checkAllDeletedVersions()
 // alle Checkboxen auswählen, für Versionenwiederherstellung ([[Spezial:Wiederherstellen]])
 // Idee: Poupou
 // Autoren: BLueFiSH.as, Schwalbe (ursprünglich als "TaggAll()")
 // Neue Version ohne JS-Errors: PDD
 
 function checkAllDeletedVersions() {
   var inputobject = document.getElementsByTagName("input");
   for (var i=3; i<inputobject.length; i++)
      inputobject[i].checked = true;
 }
 
 function revAllDeletedVersions() {
   var inputobject = document.getElementsByTagName("input");
   for (var i=3; i<inputobject.length; i++)
      inputobject[i].checked = !inputobject[i].checked;
 }
 
 // obsolete Version davon!!
 function TaggAll() {
   if (minimalVersionStrong(49) < 49) checkAllDeletedVersions();
   else checkAllDeletedVersions();
 }
 
 /*
  * Stringlänge überprüfen für Zusammenfassungszeile
  */
 
 function EditCommentLength(str) {
   return (199-str.length);
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // undate()
 // von [[Benutzer:D]]
 // entlinkt verlinkte Daten
 
 function undate() {
   var tbvalue = document.editform.wpTextbox1.value;
   tbvalue = tbvalue.replace(/\[\[\s*(\d+(er)?( v. Chr.)?)\s*\]\]/g, "$1");
   tbvalue = tbvalue.replace(/\[\[\s*(\d+\. (Jahrhundert|Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember))\s*\]\]/g, "$1");
   document.editform.wpTextbox1.value = tbvalue;
   document.editform.wpDiff.click();
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // fixDash()
 // von [[Benutzer:PDD]]
 // speziell für BKLs: alle Striche zu endash vereinheitlichen
 // ToDo: nur wenn davor oder danach Ziffer! + bei Leerzeichen (weg)
 
 function fixDashes(s) {
    s = s.replace(/\*([12][0-9]{3})/g, "* $1")
         .replace(/†([12][0-9]{3})/g, "† $1")
         .replace(/([^-0-9][12][0-9]{3})—/g, "$1–")
         .replace(/([^-0-9][12][0-9]{3})-/g, "$1–")
         .replace(/([^-0-9][12][0-9]{3})−/g, "$1–")
         .replace(/([^-0-9][12][0-9]{3}) — /g, "$1–")
         .replace(/([^-0-9][12][0-9]{3}) - /g, "$1–")
         .replace(/([^-0-9][12][0-9]{3}) − /g, "$1–")
         .replace(/([^-0-9][12][0-9]{3}) – /g, "$1–");

    return (s);
 }
 
 function fixDash() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = fixDashes(tb.value);
 
    document.editform.wpDiff.click();
 }

// other fixes
 
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // fixADB()
 // von [[Benutzer:PDD]]
 
 function fixADBs(s) {

   // normalisieren
   s = s.replace(/<[Tt][Tt]>/g, "<tt>");
   s = s.replace(/<\/[Tt][Tt]>/g, "<\/tt>");

   // groß-O in Zahlen -> Null
   s = s.replace(/([0-9])O/g, "$10");


   // keine kleinen Seiten
   s = s.replace(/{{seite/g, "{{Seite");


   // nach : am Zeilenanfang immer Space (für Quellenzeile)
   s = s.replace(/\n:([^ ])/g, "\n: $1");
   // aber nicht wenn mehrere : !
   s = s.replace(/\n: :/g, "\n::");

   // {{ADBAutor: neue Zeile und leerzeile
   s = s.replace(/ {{ADBAutor/g, "\n\n{{ADBAutor");
   s = s.replace(/([^\n])\n{{ADBAutor/g, "$1\n\n{{ADBAutor");

   // small+seite: keine neue zeile
   s = s.replace(/<small>\n{{Seite/g, "<small>{{Seite");
   // und nicht nachm doppelpunkt
   s = s.replace(/\n:\n{{Seite/g, "\n: {{Seite");

   // ruler+small: keine leerzeile
   s = s.replace(/----\n\n<small>/g, "----\n<small>");


   // keine Tabs
   s = s.replace(/\t/g, " ");

   // keine mehrfachen Leerzeichen
   s = s.replace(/ +/g, " ");

   // keine Leerzeichen nach [[ADB:
   s = s.replace(/\[\[ADB: /g, "\[\[ADB:");

   // keine enclosed leerzeichen
   s = s.replace(/ <tt> /g, " <tt>");
   s = s.replace(/ <\/tt> /g, "<\/tt> ");



   // formfix für references: leerzeichen vor tagschließer; leerzeile unnötig
   s = s.replace(/<references\/>/g, "<references \/>");
   s = s.replace(/\n\n<references \/>/g, "\n<references \/>");

   // quarto & co.
   s = s.replace(/º/g, "°");
   s = s.replace(/⁰/g, "°");
   s = s.replace(/<sup>o<\/sup>/g, "°");
   s = s.replace(/<sup><small>0<\/small><\/sup>/g, "°");
   s = s.replace(/<sup>0<\/sup>/g, "°");

   // similar
   s = s.replace(/<small><sup>1<\/sup><\/small>/g, "¹");
   s = s.replace(/<small><sup>2<\/sup><\/small>/g, "²");
   s = s.replace(/<small><sup>3<\/sup><\/small>/g, "³");

   s = s.replace(/<sup>1<\/sup>/g, "¹");
   s = s.replace(/<sup>2<\/sup>/g, "²");
   s = s.replace(/<sup>3<\/sup>/g, "³");

   s = s.replace(/<sup><small>1<\/small><\/sup>/g, "¹");
   s = s.replace(/<sup><small>2<\/small><\/sup>/g, "²");
   s = s.replace(/<sup><small>3<\/small><\/sup>/g, "³");

   // falsche Striche wegmachen
   s = s.replace(/ - /g, " – ")
        .replace(/—/g, "–")
        .replace(/─/g, "–")
        .replace(/––/g, "–")
        .replace(/––/g, "–");

   s = s.replace(/ -,/g, " –,");
   s = s.replace(/ -;/g, " –;");

   // falsche Apostrophe auch
   s = s.replace(/´/g, "’")
        .replace(/`/g, "’")
        .replace(/([A-Za-zß])‘([A-Za-zéî])/g, "$1’$2")  // eingeschränkt wegen sgl. quotes
        .replace(/([A-Za-zß])'([A-Za-zéî])/g, "$1’$2")   // ab hier: eingeschränkt wegen fett/kursiv
        .replace(/([a-zß])' /g, "$1’ ")
        .replace(/([A-Za-zé])\.'s/g, "$1\.’s")
        .replace(/\]\]' /g, "\]\]’ ")
        .replace(/\]\]'s /g, "\]\]’s ");


   // ganz falsche l-quotes
   s = s.replace(/ ,,/g, " „");

   // cleanup
   // am Zeilenanfang: kein Space
   s = s.replace(/\n /g, "\n");

   // am Zeilenende auch nicht
   s = s.replace(/ \n/g, "\n");
 
   return (s);
 }
 
 function fixADB() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = fixADBs(tb.value);
 
    document.editform.wpDiff.click();
 }



 
 ////////////////////////////////////////////////////////////////////////////////////////
 // fixADBmore()
 // von [[Benutzer:PDD]]
 // this includes fixADB()
 
 function fixADBmores(s) {

   // safe guesses für dashfix (Rest: FixDash)
   // nach Jahreszahl: ndash
   s = s.replace(/([^-0-9][12][0-9]{3})-/g, "$1–");
   // zwischen Wörtern: dash
   s = s.replace(/([a-z])–([A-Za-z])/g, "$1-$2");

   // vergröbert: zwischen Ziffern immer ndash!
   s = s.replace(/([0-9])-([0-9])/g, "$1–$2");

   // und bei römischen Zahlen dito!
   // Achtung, C-Dur :-) (s.u.)
   s = s.replace(/([ CLXVI][CLXVI])-([CLXVI])/g, "$1–$2");


   // gesch. space: ausnahmsweise als entity statt unicode (weil sonst nicht erkennbar!)
   s = s.replace(/ /g, "&nbsp;");


   // leading l statt 1
   s = s.replace(/l([0-9]{3})/g, "1$1");

   // 1 statt l
   s = s.replace(/([A-Za-zÄÖUäöü][a-zäöü])1([^0-9])/g, "$1l$2");
   s = s.replace(/([A-Za-zÄÖÜÉäöüâéè])1([a-zäöüâéè])/g, "$1l$2");
   s = s.replace(/ 1([a-zäöü][a-zäöü])/g, " l$1");
   s = s.replace(/ 1([’][^0-9])/g, " l$1");
   // doppel-1
   s = s.replace(/([A-Za-zÄÖÜäöü])11([a-zäöü])/g, "$1ll$2");
   s = s.replace(/([a-zäöü][a-zäöü])11 /g, "$1ll ");


   // ! statt l
   s = s.replace(/([A-Za-zÄÖÜäöü])!([a-zäöü])/g, "$1l$2");

   // I statt l
   s = s.replace(/([a-zäöü])I([a-zäöü])/g, "$1l$2");


   // trailing 8 / S
   s = s.replace(/([a-z][a-z])S /g, "$1s ");
   s = s.replace(/([a-z][a-z])8 /g, "$1’s ");
   s = s.replace(/([a-z][a-z])16 /g, "$1ls ");


   // other occasional OCR-induced typos
   s = s.replace(/ Jm /g, " Im ");
   s = s.replace(/ J-m /g, " Im ");

   s = s.replace(/ Im (1[0-9][0-9][0-9])/g, " Im J\. $1");
   s = s.replace(/ im (1[0-9][0-9][0-9])/g, " im J\. $1");
   s = s.replace(/ Seit dem (1[0-9][0-9][0-9])/g, " Seit dem J\. $1");
   s = s.replace(/ seit dem (1[0-9][0-9][0-9])/g, " seit dem J\. $1");
   s = s.replace(/ Vom (1[0-9][0-9][0-9]) an/g, " Vom J\. $1 an");
   s = s.replace(/ vom (1[0-9][0-9][0-9]) an/g, " vom J\. $1 an");
   s = s.replace(/ Bis zum (1[0-9][0-9][0-9])/g, " Bis zum J\. $1");
   s = s.replace(/ bis zum (1[0-9][0-9][0-9])/g, " bis zum J\. $1");
   // s = s.replace(/ des (1[0-9][0-9][0-9])/g, " des J\. $1");

   s = s.replace(/ dez /g, " des ");
   s = s.replace(/ deZ /g, " des ");
   s = s.replace(/ biz /g, " bis ");
   s = s.replace(/ biZ /g, " bis ");
   s = s.replace(/ alz /g, " als ");
   s = s.replace(/ alS /g, " als ");
   s = s.replace(/ alZ /g, " als ");
   s = s.replace(/ waZ /g, " was ");

   s = s.replace(/ uud /g, " und ");

   // tricky: first generalize, then revert (Umschweife)
   s = s.replace(/weife /g, "weise ");
   s = s.replace(/schweise /g, "schweife ");

   s = s.replace(/ndeu /g, "nden ");
   s = s.replace(/ereu /g, "eren ");
   s = s.replace(/teu /g, "ten ");

   s = s.replace(/u\.f\.w\./g, "u\. s\. w\.");
   s = s.replace(/u\. f\. w\./g, "u\. s\. w\.");
   s = s.replace(/u\.f\.f\./g, "u\. s\. f\.");
   s = s.replace(/u\. f\. f\./g, "u\. s\. f\.");
   s = s.replace(/A\.D\.V\./g, "A\. D\. B\.");
   s = s.replace(/A\. D\. V\./g, "A\. D\. B\.");


   // regular missing markup
   s = s.replace(/ Dr\. med\./g, " <tt>Dr\. med\.<\/tt>");

   s = s.replace(/ Dr\. jur\./g, " <tt>Dr\. jur\.<\/tt>");
   s = s.replace(/ Dr\. iur\./g, " <tt>Dr\. iur\.<\/tt>");
   s = s.replace(/ Dr\. juris/g, " <tt>Dr\. juris<\/tt>");
   s = s.replace(/ Dr\. iuris/g, " <tt>Dr\. iuris<\/tt>");

   s = s.replace(/ Dr\. phil\. et theol\./g, " <tt>Dr\. phil\. et theol\.<\/tt>");
   s = s.replace(/ Dr\. theol\. et phil\./g, " <tt>Dr\. theol\. et phil\.<\/tt>");
   s = s.replace(/ Dr\. philos\./g, " <tt>Dr\. philos\.<\/tt>");
   s = s.replace(/ Dr\. phil\./g, " <tt>Dr\. phil\.<\/tt>");
   s = s.replace(/ Dr\. theol\./g, " <tt>Dr\. theol\.<\/tt>");

   s = s.replace(/ Dr\. /g, " <tt>Dr\.<\/tt> ");
   s = s.replace(/ Dr\.\,/g, " <tt>Dr\.<\/tt>\,");

   s = s.replace(/\|Dr\. /g, "\|<tt>Dr\.<\/tt> ");

   s = s.replace(/<tt>Dr<\/tt>\./g, "<tt>Dr\.<\/tt>");
   s = s.replace(/<tt>M<\/tt>\./g, "<tt>M\.<\/tt>");
   s = s.replace(/<tt>D<\/tt>\./g, "<tt>D\.<\/tt>");
   s = s.replace(/<tt>P<\/tt>\./g, "<tt>P\.<\/tt>");
   s = s.replace(/<tt>op<\/tt>\./g, "<tt>op\.<\/tt>");
   s = s.replace(/<tt>Op<\/tt>\./g, "<tt>Op\.<\/tt>");

   s = s.replace(/<tt>p<\/tt>\./g, "<tt>p\.<\/tt>");
   s = s.replace(/ p<\/tt>\./g, " p\.<\/tt>");

   s = s.replace(/ op\. /g, " <tt>op\.<\/tt> ");
   s = s.replace(/ Op\. /g, " <tt>Op\.<\/tt> ");
   s = s.replace(/\(op\. /g, "\(<tt>op\.<\/tt> ");
   s = s.replace(/\(Op\. /g, "\(<tt>Op\.<\/tt> ");

   s = s.replace(/ s\. v\. /g, " <tt>s\. v\.<\/tt> ");
   s = s.replace(/ s\.v\. /g, " <tt>s\. v\.<\/tt> ");
   s = s.replace(/ s\. v\.\n/g, " <tt>s\. v\.<\/tt>\n");
   s = s.replace(/ s\.v\.\n/g, " <tt>s\. v\.<\/tt>\n");

   s = s.replace(/ l\. c\./g, " <tt>l\. c\.<\/tt>");
   s = s.replace(/ l\.c\./g, " <tt>l\. c\.<\/tt>");

   s = s.replace(/ cm /g, " <tt>cm<\/tt> ");
   s = s.replace(/ km /g, " <tt>km<\/tt> ");
   s = s.replace(/ kg /g, " <tt>kg<\/tt> ");


   // zahlen zusammenfassen
   s = s.replace(/([0-9]) 000/g, "$1&nbsp;000");
   s = s.replace(/([0-9]) 500/g, "$1&nbsp;500");


   // genitiv-apostrophe enclosen
   // erst generic:
   s = s.replace(/([a-z])\]\]´s/g, "$1\]\]’s");
   s = s.replace(/([a-z])\]\]'s/g, "$1\]\]’s");
   // then specific
   s = s.replace(/([a-z])\]\]’schen /g, "$1’schen\]\] ");
   s = s.replace(/([a-z])\]\]’sches /g, "$1’sches\]\] ");
   s = s.replace(/([a-z])\]\]’schem /g, "$1’schem\]\] ");
   s = s.replace(/([a-z])\]\]’scher /g, "$1’scher\]\] ");
   s = s.replace(/([a-z])\]\]’sche /g, "$1’sche\]\] ");

   s = s.replace(/([a-z])\]\]’s /g, "$1’s\]\] ");
   s = s.replace(/([a-z])\]\]’s\./g, "$1’s\]\]\.");
   s = s.replace(/([a-z])\]\]’s,/g, "$1’s\]\],");
   s = s.replace(/([a-z])\]\]’s\n/g, "$1’s\]\]\n");
   s = s.replace(/([a-z])\]\]’ /g, "$1’\]\] ");

   // aküfi: Abkürzungen wie usw. immer mit Leerzeichen dazwischen (extremer: mit &nbsp;)
   s = s.replace(/''A\.D\.B\.''/g, "A\. D\. B\.");
   s = s.replace(/''A\.D\.B''\./g, "A\. D\. B\.");
   s = s.replace(/A\.D\.B\./g, "A\. D\. B\.");

   s = s.replace(/u\.s\.w\./g, "u\. s\. w\.");
   s = s.replace(/u\. s\.w\./g, "u\. s\. w\.");
   s = s.replace(/u\.s\. w\./g, "u\. s\. w\.");

   s = s.replace(/u\.s\.f\./g, "u\. s\. f\.");
   s = s.replace(/u\. s\.f\./g, "u\. s\. f\.");
   s = s.replace(/u\.s\. f\./g, "u\. s\. f\.");

   s = s.replace(/a\.a\.O\./g, "a\. a\. O\.");
   s = s.replace(/d\.h\./g, "d\. h\.");
   s = s.replace(/z\.B\./g, "z\. B\.");
   s = s.replace(/o\.J\./g, "o\. J\.");
   s = s.replace(/ u\.a\.m\./g, " u\. a\. m\.");
   s = s.replace(/ u\.a\./g, " u\. a\.");
   s = s.replace(/ u\.A\./g, " u\. A\.");
   s = s.replace(/a\.u\.a\.O\./g, "a\. u\. a\. O\.");

   // Leerzeichen nach Seitenzahl
   s = s.replace(/ S\.([0-9])/g, " S\. $1");
   // und nach §
   s = s.replace(/§([0-9])/g, "§ $1");
   // und vor f./ff.
   s = s.replace(/([0-9])f\. /g, "$1 f\. ");
   s = s.replace(/([0-9])ff\. /g, "$1 ff\. ");
   s = s.replace(/([0-9])f\.,/g, "$1 f\.,");
   s = s.replace(/([0-9])ff\.,/g, "$1 ff\.,");
   s = s.replace(/([0-9])f\.;/g, "$1 f\.;");
   s = s.replace(/([0-9])ff\.;/g, "$1 ff\.;");
   s = s.replace(/([0-9])f\.\n/g, "$1 f\.\n");
   s = s.replace(/([0-9])ff\.\n/g, "$1 ff\.\n");

   // einheitlich: dur/moll mit Bindestrich
   s = s.replace(/–moll/g, "-moll");
   s = s.replace(/–Moll/g, "-Moll");
   s = s.replace(/–dur/g, "-dur");
   s = s.replace(/–Dur/g, "-Dur");


   return (s);
 }
 
 function fixADBmore() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = fixADBs(tb.value);
    tb.value = fixADBmores(tb.value);
 
    document.editform.wpDiff.click();
 }


 
 ////////////////////////////////////////////////////////////////////////////////////////
 // unQuote()
 // von [[Benutzer:PDD]]
 
 function unQuotes(s) {

   // falsche Quotes (müssen nachgefixt werden)
   s = s.replace(/»/g, "\"");
   s = s.replace(/«/g, "\"");

   // ganz falsche sowieso
   s = s.replace(/´´/g, "\"");
   s = s.replace(/’’/g, "\"");
   s = s.replace(/”/g, "\"");

   // richtige auch
   s = s.replace(/„/g, "\"");
   s = s.replace(/“/g, "\"");

   // cleanup
   // am Zeilenanfang: kein Space
   s = s.replace(/\n /g, "\n");

   // am Zeilenende auch nicht
   s = s.replace(/ \n/g, "\n");
 
   return (s);
 }
 
 function unQuote() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = unQuotes(tb.value);
 
    document.editform.wpDiff.click();
 }



 
 ////////////////////////////////////////////////////////////////////////////////////////
 // moveTTq()
 // von [[Benutzer:PDD]]
 
 function moveTTqs(s) {

   // normalisieren
   s = s.replace(/<[Tt][Tt]>/g, "<tt>");
   s = s.replace(/<\/[Tt][Tt]>/g, "<\/tt>");

   // quotes sind fast immer innerhalb der TTs
   s = s.replace(/„<tt>/g, "<tt>„");
   s = s.replace(/<\/tt>“/g, "“<\/tt>");

   // das Komma gehört danach!
   s = s.replace(/“\,<\/tt>/g, "“<\/tt>\,");

   return (s);
 }
 
 function moveTTq() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = moveTTqs(tb.value);
 
    document.editform.wpDiff.click();
 }



 ////////////////////////////////////////////////////////////////////////////////////////
 // unTT()
 // von [[Benutzer:PDD]]
 
 function unTTs(s) {

   // normalisieren

   s = s.replace(/<TT>/g, "<tt>");
   s = s.replace(/<\/TT>/g, "<\/tt>");

   // römische Zahlen werden nicht mehr tt-t (mit und ohne Punkt!)
   s = s.replace(/<tt>([IVXLCDM]+)\.<\/tt>/g, "$1\.");
   s = s.replace(/<tt>([IVXLCDM]+)<\/tt>/g, "$1");

   return (s);
 }
 
 function unTT() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = unTTs(tb.value);
 
    document.editform.wpDiff.click();
 }




 ////////////////////////////////////////////////////////////////////////////////////////
 // unUL()
 // von [[Benutzer:PDD]]
 
 function unULs(s) {

   // normalisieren

   s = s.replace(/_/g, " ");

   return (s);
 }
 
 function unUL() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = unULs(tb.value);
 
    document.editform.wpDiff.click();
 }




 ////////////////////////////////////////////////////////////////////////////////////////
 // unZeno()
 // von [[Benutzer:PDD]]
 
 function unZenos(s) {

   // returns fixen
   s = s.replace(/\n/g, "\n\n");

   // Seitenzahlen rauskicken, Space zur Sicherheit
   s = s.replace(/\[[0-9]{1,3}\]/g, " ");

   // Verweispfeile raus, wieder Space
   s = s.replace(/⇒/g, " ");

   // entspacen & returns refixen
   s = s.replace(/ +/g, " ");
   s = s.replace(/\n /g, "\n");
   s = s.replace(/(\n){3,}/g, "\n\n");

   return (s);
 }
 
 function unZeno() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = unZenos(tb.value);
 
    document.editform.wpDiff.click();
 }



 
 ////////////////////////////////////////////////////////////////////////////////////////
 // unCRLF()
 //
 // von [[Benutzer:PDD]]
 
 function unCRLFs(s) {

   // replace double CRLF with weirdness
   s = s.replace(/\n\n/g, "るなら");

   // entferne alle CRLFs
   s = s.replace(/\n/g, " ");

   // expunge weirdness again
   s = s.replace(/るなら/g, "\n\n");

   // keine mehrfachen Leerzeichen
   s = s.replace(/ +/g, " ");


   return (s);
 }
 
 function unCRLF() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = unCRLFs(tb.value);
 
    document.editform.wpDiff.click();
 }



 ////////////////////////////////////////////////////////////////////////////////////////
 // doSplit()
 // von [[Benutzer:PDD]]

// TO DO: nicht wenn am Zeilenanfang ein :

 function doSplits(s) {

   // cleanup 1
   // am Zeilenanfang: kein Space
   s = s.replace(/\n /g, "\n");

   // am Zeilenende auch nicht
   s = s.replace(/ \n/g, "\n");


   // keine kleinen Seiten
   s = s.replace(/{{seite/g, "{{Seite");


   // vor {{Seite: neue Zeile
   s = s.replace(/([^\n]){{Seite/g, "$1\n{{Seite");
   // aber nicht nach small:
   s = s.replace(/<small>\n{{Seite/g, "<small>{{Seite");
   // und nicht nachm doppelpunkt
   s = s.replace(/\n:\n{{Seite/g, "\n: {{Seite");
   s = s.replace(/\n: \n{{Seite/g, "\n: {{Seite");

   // Variante 1: danach auch Return (schönerer Quelltext, aber klebt dann leider am nächsten Wort)
   // s = s.replace(/{{Seite\|([0-9]{1,3})}}([^\n])/g, "{{Seite\|$1}}\n$2");
   // Variante 1 a: (datura):
   // s = s.replace(/\{\{Seite\|\d{1,3}\}\}(?!\n)/g, "$&\n");

   // Variante 2: danach Space und Fortsetzung

   s = s.replace(/{{Seite\|([0-9]{1,3})}}\n/g, "{{Seite\|$1}} ");
   s = s.replace(/{{Seite\|([0-9]{1,3})}}([^ ])/g, "{{Seite\|$1}} $2");

   // 448 a-u
   s = s.replace(/{{Seite\|448([a-u])}}\n/g, "{{Seite\|448$1}} ");
   s = s.replace(/{{Seite\|448([a-u])}}([^ ])/g, "{{Seite\|448$1}} $2");

   // cleanup 2
   // am Zeilenanfang: kein Space
   s = s.replace(/\n /g, "\n");

   // am Zeilenende auch nicht
   s = s.replace(/ \n/g, "\n");

   return (s);
 }
 
 function doSplit() {
    // find editor
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = doSplits(tb.value);
 
    document.editform.wpDiff.click();
 }




 ////////////////////////////////////////////////////////////////////////////////////////
 // qFix()
 // von [[Benutzer:PDD]]
 
 function qFixs(s) {

   // TT normalisieren
   s = s.replace(/<TT>/g, "<tt>");
   s = s.replace(/<\/TT>/g, "<\/tt>");


   // keine mehrfachen Leerzeichen (#1)
   s = s.replace(/ +/g, " ");

   // keine enclosed leerzeichen  (erzeugt evtl. mehrfach-spaces, werden danach entfernt)
   s = s.replace(/<tt> /g, " <tt>");
   s = s.replace(/ <\/tt>/g, "<\/tt> ");

   // keine Tabs
   s = s.replace(/\t/g, " ");

   // keine mehrfachen Leerzeichen (#2)
   s = s.replace(/ +/g, " ");


   // am Zeilenanfang: kein Space
   s = s.replace(/\n /g, "\n");

   // am Zeilenende auch nicht
   s = s.replace(/ \n/g, "\n");

   // falsche Striche wegmachen
   s = s.replace(/ - /g, " – ")
        .replace(/ -\n/g, " –\n")
        .replace(/—/g, "–")
        .replace(/─/g, "–")
        .replace(/––/g, "–")
        .replace(/––/g, "–");

   return (s);
 }
 
 function qFix() {
    // quick fix for non-ADB pages
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = qFixs(tb.value);
 
    document.editform.wpDiff.click();
 }





 ////////////////////////////////////////////////////////////////////////////////////////
 // apoFix()
 // von [[Benutzer:PDD]]
 
 function apoFixs(s) {


   s = s.replace(/´/g, "’")
        .replace(/`/g, "’")
        .replace(/([A-Za-zß])‘([A-Za-zéî])/g, "$1’$2")  // eingeschränkt wegen sgl. quotes
        .replace(/([A-Za-zß])'([A-Za-zéî])/g, "$1’$2")   // ab hier: eingeschränkt wegen fett/kursiv
        .replace(/([a-zß])' /g, "$1’ ")
        .replace(/([A-Za-zé])\.'s/g, "$1\.’s")
        .replace(/\]\]' /g, "\]\]’ ")
        .replace(/\]\]'s /g, "\]\]’s ");

   return (s);
 }
 
 function apoFix() {
    // quick apo fix for non-ADB pages
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = apoFixs(tb.value);
 
    document.editform.wpDiff.click();
 }





 ////////////////////////////////////////////////////////////////////////////////////////
 // etcFix()
 // von [[Benutzer:PDD]]
 
 function etcFixs(s) {


   s = s.replace(/ rc\./g, " etc\.")
        .replace(/ ec\./g, " etc\.")
        .replace(/ 1c\./g, " etc\.")
        .replace(/ 2c\./g, " etc\.")
        .replace(/ 2e\./g, " etc\.")
        .replace(/ &c\./g, " etc\.");


   return (s);
 }
 
 function etcFix() {
    // quick etc fix for ADB pages
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = etcFixs(tb.value);
 
    document.editform.wpDiff.click();
 }




 ////////////////////////////////////////////////////////////////////////////////////////
 // GBSRoundRobin()
 // von [[Benutzer:PDD]]
 
 function GBSRoundRobins(s) {

   s = s.replace(/{{GBS\|/g, "{{GBDUMMY\|");
   s = s.replace(/{{GBIA\|/g, "{{GBS\|");
   s = s.replace(/{{GBDUMMY\|/g, "{{GBIA\|");

   return (s);
 }
 
 function GBSRoundRobin() {
    // switch GBS and GBIA
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = GBSRoundRobins(tb.value);
 
    document.editform.wpDiff.click();
 }



 ////////////////////////////////////////////////////////////////////////////////////////
 // ItoS()
 // von [[Benutzer:PDD]]
 
 function ItoSs(s) {

   s = s.replace(/ ''([A-Za-z])/g, " {{SperrSchrift\|$1");
   s = s.replace(/\(''([A-Za-z])/g, "\({{SperrSchrift\|$1");
   s = s.replace(/\n''([A-Za-z])/g, "\n{{SperrSchrift\|$1");
   s = s.replace(/ ''„/g, " {{SperrSchrift\|„");

   s = s.replace(/([A-Za-z])'' /g, "$1}} ");
   s = s.replace(/([A-Za-z])''-/g, "$1}}-");
   s = s.replace(/([A-Za-z])'',/g, "$1}},");
   s = s.replace(/([A-Za-z])''\./g, "$1}}\.");
   s = s.replace(/([A-Za-z])''\)/g, "$1}}\)");
   s = s.replace(/“'' /g, "“}} ");

   return (s);
 }
 
 function ItoS() {
    // kursiv in sperrschrift (erstmal für panizza)
    var form    = document.forms['editform'];
    if (!form)  return;
    var tb      = form.elements['wpTextbox1'];
    if (!tb)    return;
    tb.value    = tb.value;
 
    tb.value = ItoSs(tb.value);
 
    document.editform.wpDiff.click();
 }

 
 ////////////////////////////////////////////////////////////////////////////////////////
 // insertAfter()
 // neuen Node nach einem referenceNode einfügen
 
 function insertAfter(parent, node, referenceNode) {
   parent.insertBefore(node, referenceNode.nextSibling);
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////
 // trim()
 // Leerzeichen am Anfang und Ende entfernen
 
 function trim(str) {
   return str.replace(/^\s*|\s*$/g,"");
 }
 
 
 //
 // Funktion nowcomm()
 // Trägt NowCommons-Baustein ein
 // (aufgerufen aus der monobook.js)
 //
 
 function nowcomm() {
  var lemma = getLemma();
  if (lemma.substring(0, 5) == "Bild:") lemma=lemma.slice(5);
  var lemmaneu = prompt('Neuer Dateiname',lemma);
  if (lemmaneu != null )
      newtext('NowCommons','\{\{NowCommons|' + lemmaneu +'}}',3);
 }
 
 //
 // Helper-Funktion getLemma()
 // extrahiert Lemma, entfernt "Bild:" und "Kategorie:"
 // (aufgerufen von eintragen() aus der eintragen.js, nowcomm() )
 //
 
 function getLemma () { //Littl
   var lemma;
   if ((isContrib) && ( UrlParameters["target"] > "" ))
     lemma = UrlParameters["target"];
   else if ( UrlParameters["title"] > "" )
     lemma = UrlParameters["title"];
   else {
     lemma = decodeURIComponent(location.href.substring(location.href.indexOf("/wiki/") + 6)).split('#')[0];
     // fix linky links (?redirect=no)
     //lemma = lemma.split['\x3F'][0];
     if (lemma.indexOf("redirect=no")!=-1)
         lemma=lemma.substring(0,lemma.indexOf("redirect=no")-1);
   }
   // if (lemma.substring(0, 5) == "Bild:") lemma=lemma.slice(5);
   // if (lemma.substring(0, 10) == "Kategorie:") lemma=lemma.slice(10);
   if (isPHP) lemma=lemma.split('+').join('_');
   return lemma;
 }
 
 // token functions
 function generate_asuser () {
   return encodeURIComponent(wgUserName);
 }

 function validate_asuser (asuser) {
   var retval = false;
   if (encodeURIComponent(asuser) == generate_asuser() )
      retval = true;

   return retval;
 }

 function generate_astime () {
   var arbitrary_datestamp = Date.UTC(2008,10,1,0,0,0,0); // 1.11.2008
   var current_date = new Date();
   var current_timestamp = current_date.getTime();

   return ( Math.floor((current_timestamp - arbitrary_datestamp) / 1000) );
 }

 function validate_astime (astime) {
   var retval = false;
   var timediff = generate_astime() - astime;

   if ((timediff >= 0) && (timediff < 45))
      retval = true;

   return retval;
 }

 // </nowiki>