MediaWiki:Gadget-TranslationLookahead.js

Aus Wiktionary, dem freien Wörterbuch
// <nowiki>
/* TranslationLookahead.js
** Prüft bei Übersetzungen, die aus einer Wortverbindung (mehrere durch Leerzeichen getrennte Wörter)
** bestehen, ob die Wortverbindung im Zielwiki existiert. Wenn nicht, wird eine Auswahlbox angezeigt,
** aus der verzweigt werden kann.
*/

(function( _public, $, undefined ) {

 var pagename = '';
 var pagenamee = '';
 var translation_ = '';
 var words = [];
 var url = '';
 var url_dec = '';
 var that = {};

_public.init = function () {
  var a = $("a > sup.dewikttm").parent();
  var i = 0;

  for (i = 0; i < a.length; i++) {
   if (!a[i].href.includes('_')) { continue;}

   // this function is called if external wiki-link is clicked
   a[i].onclick = function () {
    url = this.href;
    url_dec = decodeURIComponent (this.href);
    var pos = url_dec.search("Special:Search/");
    var s = '';
    if (pos >= 0) {
     s = url_dec.substr(pos+15);  // 15 = "Special:Search/".length()
    }
    pos = s.search(/[&#]/);
    if (pos >= 0) {
     s = s.slice(0,pos);
    }
    translation_ = s;
    words1 = s.split('_');
    words2 = concatWords(words1, words1.length);
    specialCharInWords(words1, "’");
    specialCharInWords(words1, "'");
    words = words1.concat(words2);

    pagename = mw.config.get( 'wgPageName' );
    that = this;
    var iw = url_dec.match(/\/\/[^.]+/);
    var exturl = mw.config.get("wgServer").replace(/\/\/[^.]+/,iw[0]) +
      mw.config.get("wgScriptPath") + "/api.php";

    $.ajax( {
      url: exturl,
      data: {
        action: 'query',
        prop: 'info',
        format: 'json',
        origin: window.location.protocol + "//" + window.location.hostname,
        titles: words.join('|') + '|' + s + '|' + pagename
      },
      xhrFields: {
        withCredentials: true
      },
      dataType: 'json'
    } ).done( handleResponse );

    if (typeof event !== 'undefined') {
     if (event.stopPropagation) {
      event.stopPropagation();
     }
     event.cancelBubble = true;
     event.preventDefault ? event.preventDefault() : event.returnValue = false;
    }
    return false;
   }
  }
}


// zweier Wortkombinationen bei mehreren Leerzeichen bilden
// (ping pong table) -> (ping pong) + (pong table)
function concatWords(wtab, cnt) {
  neu = [];
  if (cnt > 2) {
    for (i = 0; i < cnt - 1; i++) {
      kombi = wtab[i] + " " + wtab[i+1];
      neu.push(kombi);
    }
  }
  return neu;
}


// Wörter bei bestimmten Zeichen aufsplitten
function specialCharInWords(wtab, special) {
  var j,k;
  j = 0;
  while (j < wtab.length) {
    var pos = j;
    var wordsa = wtab[j].split(special);
      if (wordsa.length > 1) {  // special dem kürzeren Wort zuordnen
        for (k = 0; k < wordsa.length - 1; k++) {
          if (wordsa[k].length > wordsa[k+1].length) {
            wordsa[k+1] = special + wordsa[k+1];
          } else {
            wordsa[k] = wordsa[k] + special;
          }
        }
        for (k = wordsa.length - 1; k >= 0; k--) {
          wtab.splice(pos+1,0,wordsa[k]);
          j++;
        }
      }
    j++;
  }

}


function handleResponse(data) {
 var exists = {};
 var translation = translation_.replace(/_/g," ");

 // check which links exist in external wiki
 if (data.query !== undefined && data.query.pages !== undefined) {
  var dqp = data.query.pages;
  for (var t in dqp) {
   if (dqp[t].hasOwnProperty("title")) {
    if (dqp[t].hasOwnProperty("pageid")) {
     // exists
     if (dqp[t]["title"] == translation) {
      window.location = url;
      return;
     }
     exists[dqp[t]["title"]] = "blue";
    } else {
     exists[dqp[t]["title"]] = "red";
    }
   }
  }
 }

 var vi = '';
 var i = 0;
 var sep = '';
 var extlink = '';

 for (i = 0; i < words.length; i++) {
  vi += sep + '<a style="color:' + exists[words[i]] + '" href="' + 
    url_dec.replace("Special:Search/" + translation_, "Special:Search/" + words[i]) + '">' +
    words[i] + '</a>';
  sep = ', ';
 }
 pagenamee = mw.util.wikiUrlencode( pagename );
 pagenamee = url_dec.replace("Special:Search/" + translation_, "Special:Search/" + pagenamee);
 var pagename_ob = pagename.replace(/_/g," ");
 var nbsp5 = String.fromCharCode(160,160,160,160,160);

 if (exists[pagename_ob] != "blue") {
  extlink = '<p>oder suche dort nach<br /><a style="color:red"';
 } else {
  extlink = '<p>oder den dortigen Eintrag<br /><a style="color:blue"';
 }
 extlink += ' href="' + pagenamee + '">' + pagename_ob + '</a></p>';

 var popup = new OO.ui.PopupWidget( {
  $content: $( '<div style="padding-left: 1em; font-size: 13px; line-height: 1.2em;">' +
    'Wähle trotzdem diese Wortverbindung<br />' +
    '<a style="color:red" href="' + url + '">' + translation + 
    '</a><p>oder ein einzelnes Wort oder eine Wortverbindung daraus<br />' + vi +
    '<br /></p>' + extlink + '</div>' ),
  $floatableContainer: $(that),
    padded: true,
//    height: null, 
    width: null,
    head: true,
    label: 'Das Verweisziel ist im externen Wiki nicht vorhanden!' + nbsp5,
    autoFlip: true,
    hideWhenOutOfView: false

 } );
 
 $( 'body' ).append( popup.$element );
 popup.toggle( true );
}


}( window.TranslationLookahead = window.TranslationLookahead || {}, jQuery ));


if (mw.config.get("wgNamespaceNumber") == 0) { // Einträge
 jQuery(document).ready(TranslationLookahead.init);
}

// </nowiki>