// <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>