MediaWiki:Gadget-IpaDiff.js

Aus Wiktionary, dem freien Wörterbuch
//<nowiki>
/* Zeigt Differenzen zwischen mehreren IPA-Notierungen
** Link nur einblenden, wenn mindestens zwei Lautschriften auf der Seite existieren
** Differenzen werden gelb markiert, fehlende Zeichen durch ein 'Bullet' gekennzeichnet
*/


// begin namespace: foIpaDiff
(function( _public, $, undefined ) {

var pAusdl = {};
var lsAll = {};
var bullet = '•';
var ipaCount = 0;

_public.init = function ()
{
  lsAll = $("H2,H3,SPAN.ipa");
  for (var i = 0; i < lsAll.length; i++) {
    if (lsAll[i].nodeName == 'SPAN' && lsAll[i].childElementCount == 0) {  // Reimlautschrift nicht mitzählen
     ipaCount++;
    }
  }
  if (ipaCount > 1) {
    var pAus = $("p[title='Phonetik']");
    pAusdl = $(pAus).nextAll("DL");
    if (pAusdl.length > 0) {
      $(pAus).append(' ','<a class="noprint foIpaDiff" href="#" onclick="foIpaDiff.fLinks()'+';return false;">'+'IPA-Δ</a>');
    }
    $.get(buildUrl2("Vorlage:IpaDiff","&action=raw&maxage=0"), handleResponse);
  }
}


_public.fLinks = function () {
  var txt = [];
  var info = [];
  var t = '';
  var maxlen = 0;
  var sprache = '';
  var wortart = '';
  var diff = document.getElementById("IpaDiff");

  var span = document.getElementById("IpaDiffClose");
  span.onclick = function() {
    diff.style.display = "none";
  };
  window.onclick = function(event) {
    if (event.target == diff) {
      diff.style.display = "none";
    }
  };

  for (var i = 0; i < lsAll.length; i++) {
    if (lsAll[i].nodeName == 'H2') {  // [Bearbeiten]-Links entfernen und Wortwiederholung vermeiden
      sprache = lsAll[i].innerText.replace(/\[.*/,'').replace(/.*\(/,'(');
    } else if (lsAll[i].nodeName == 'H3') {
      wortart = lsAll[i].innerText.replace(/\[.*/,'');
    } else if (lsAll[i].childElementCount == 0) {
      var ls = lsAll[i].innerText;
      info.push(sprache + ' ' + wortart);
      txt.push(ls);
      if (ls.length > maxlen) {
        maxlen = ls.length;
      }
    }
  }

  // Alle Strings auf gleiche Länge auffüllen
  for (var i = 0; i < txt.length; i++) {
    while (txt[i].length < maxlen) {
      txt[i] += bullet;
    }
  }

  // ggf. fehlende Zeichen mit Bullet markieren
  for (var i = 1; i < txt.length; i++) {
    for (var s = 0; s < txt[i].length; s++) {
      if (txt[i][s] != txt[i-1][s]) {
        if (s < txt[i].length - 1) {
          if (txt[i][s+1] != txt[i-1][s+1]) {
            if (txt[i][txt[i].length - 1] == bullet) {
              txt[i] = swapEnd(txt[i],s);
            } else if (txt[i-1][txt[i-1].length - 1] == bullet) {
              txt[i-1] = swapEnd(txt[i-1],s);
            }
          }
        }
      }
    }
  }

  // Differenzen anzeigen
  t += makeLine(txt[0], info[0]);
  for (var i = 1; i < txt.length; i++) {
    var tmp = '';
    for (var s = 0; s < txt[i].length; s++) {
      if (txt[i][s] == txt[i-1][s]) {
        tmp += txt[i][s];
      } else {
        tmp += '<span style="background-color:yellow">' + txt[i][s] + '</span>';
      }
    }
    t += makeLine(tmp, info[i]);
  }

  document.getElementById("IpaDiffContent").innerHTML =
     "Anzahl Lautschriften: " + ipaCount + '<br /><br />' + t;
  diff.style.display = "block";

   //  alert("Anzahl: " + lsAll.length + t);
}


function makeLine(txt,info) {
  return '<span style="display:inline-block; min-width:9em">' + txt + '</span> ' + info + '<br />';
}


// i < t.length - 1
function swapEnd(t,i) {
  return t.slice(0, i) + t[t.length - 1] + t.slice(i, t.length - 1);
}


function handleResponse(data){

  //  Layout des Gadgets auf der Seite einblenden
  node = document.createElement("DIV");
  node.innerHTML = data;
  document.getElementById("content").appendChild(node);

}


function addCORS() {
 if (window.location.hostname.indexOf(".m.") >= 0) {  // mobile site
  return "origin=" + window.location.protocol + "//" + window.location.hostname + "&";
 }
 return "";
}

function getServer() {
 var server = mw.config.get("wgServer");
 if (window.location.hostname.indexOf(".m.") >= 0) {  // mobile site
  if (server.indexOf(".m.") < 0) {
   return server.replace(".", ".m.");
  }
 }
 return server;
}

function buildApi(t,p) {
 return getServer() + mw.config.get("wgScriptPath") + "/api.php?" + addCORS() +
        p + mw.util.wikiUrlencode(t);
}

function buildUrl2(t,p) {
 return getServer() + mw.config.get("wgScript") + "?title=" + mw.util.wikiUrlencode(t) + p;
}


// end namespace: foIpaDiff
}( window.foIpaDiff = window.foIpaDiff || {}, jQuery ));

if (mw.config.get("wgAction") == "view") {
  if (mw.config.get("wgNamespaceNumber") == 0) {
    jQuery(document).ready(foIpaDiff.init);
  }
}


//</nowiki>