Benutzer:Theway-source/wikidata.js
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
Debug ("---- wikidata ----");
// var gxPosTT;
/*
api documentation: https://www.wikidata.org/w/api.php?action=help&modules=wbgetentities
example: https://www.wikidata.org/w/api.php?action=wbgetentities&titles=fresno&normalize=&props=sitelinks&sites=enwikivoyage&sitefilter=enwiki|dewiki
functioning:
1. if mouse over link:
- timer for visibility is started
2. if mouse over visible tooltip:
- movement of tooltip is stopped
3. if mouse outside of link or tooltip:
- visibility of tooltip is off
*/
if (!mw.loader.getState("theway.utilities"))
mw.loader.implement("theway.utilities", ["//de.wikivoyage.org/w/index.php?title=Benutzer:Theway-source/utilities.js&action=raw&ctype=text/javascript"], null, null);
//---- global vars ----
var goIWTT; // = document.getElementById("IWtooltip")
var goIWTTI; // = document.getElementById("IWtooltipInner")
var goPosElement, giElementHeight, gbIWTTFocus;
var ghTimer;
var gxSiteAlias = [
{site: "wiki", gename: "Wikipedia", url: "https://{lang}.wikipedia.org/wiki/{title}"},
{site: "wikivoyage", gename: "Wikivoyage", url: "https://{lang}.wikivoyage.org/wiki/{title}"},
];
// query like https://www.wikidata.org/w/api.php?action=wbgetentities&titles=fresno&normalize=&props=sitelinks&sites=enwikivoyage&sitefilter=enwiki|dewiki|&format=json
mw.loader.using(["theway.utilities"], function () {
Debug ("-- wikidata main () --");
// insert the style and the hidden tooltip element
jQuery("style:last").after(' \
<style> \
#IWtooltip { \
position: absolute; \
display1: none; \
padding: 10px; \
min-width: 55px; \
border-width: 1px; \
border-style: solid; \
border-color1: #000000; \
z-index: 9999; \
} \
#IWtooltipInner { \
display1: none; \
background-color: #efefef; \
border-width: 1px; \
border-style: solid; \
border-color: #888; \
font-size: 0.75em; \
padding: 2px 5px; \
margin1: 5px; \
} \
</style>'
);
// the tooltip definition
// jQuery("#n-mainpage").append(' \
jQuery("body").prepend(' \
<div id="IWtooltip" class="portal body" onmouseover="IWTTover(this)" onmouseout="IWTTout(this)">\
<div id="IWtooltipInner" class="portal">Der Tooltip <a>xxxxxxxxxxxxxxx.</a>\
</div></div>'
);
// gxPosTT = jQuery("#n-mainpage").offset();
goIWTT = document.getElementById("IWtooltip");
goIWTTI = document.getElementById("IWtooltipInner");
SetEventTag ();
Debug ("-- wikidata main () 2");
// GetInterwiki ("fresno", ToolTipText);
Debug ("-- wikidata main () 3");
});
//---- create the tooltip html ----
function ToolTipText(oInterwiki) {
Debug ("-- ToolTipText --");
Debug ("-- ToolTipText goPreferences.iwtooltip_lang: " + goPreferences.iwtooltip_lang);
var i1, i2, sWiki, sLang, sTitleLang, sUrl1, sUrl2, sHtml1 = "", sHtml2, iSlash = -1;
i1 = 0;
for (sWiki in oInterwiki) {
if (sWiki == "wiki" || sWiki == "wikivoyage") {
i1++;
sHtml2 = AliasName (gxSiteAlias, "site", sWiki, "gename") + ":<br />";
sUrl1 = AliasName (gxSiteAlias, "site", sWiki, "url");
i2 = 0;
loop1:
for (sLang in oInterwiki[sWiki]) { // sLang: de, en, fr, ...
if (i2 > 12) {
sHtml2 += ", ...";
break loop1;
}
if (goPreferences.iwtooltip_lang.indexOf(sLang) != -1) { // if preferred language
i2++;
sHtml2 += (i2 > 1 ? ", " : "")
+ ToolTipTextSub(oInterwiki, sUrl1, sWiki, sLang);
}
}
loop2:
for (sLang in oInterwiki[sWiki]) { // sLang: de, en, fr, ...
if (i2 > 12) {
sHtml2 += ", ...";
break loop2;
}
if (goPreferences.iwtooltip_lang.indexOf(sLang) == -1) { // all other languages
i2++;
if (i2 > 1 && iSlash == -1) {
sHtml2 += " / ";
iSlash = i2;
}
sHtml2 += (i2 > 1 && i2 > iSlash ? ", " : "")
+ ToolTipTextSub(oInterwiki, sUrl1, sWiki, sLang);
}
}
sHtml1 = sHtml2 + "<br />" + sHtml1;
}
}
goIWTTI.innerHTML = sHtml1;
}
//---- ----
function ToolTipTextSub(oInterwiki, sUrl1, sWiki, sLang) {
var sTitleLang, sUrl2;
sTitleLang = oInterwiki[sWiki][sLang].title;
sUrl2 = sUrl1.replace("{lang}", sLang).replace("{title}", sTitleLang);
return '<a title="' + sTitleLang
+ '" href="' + sUrl2
+ '">' + sLang + '</a>'
+ (sLang == gsUserLang ? "" : TranslateTag (sLang, sUrl2, 1));
}
//---- get the wikidata informations of sTitle ----
function GetInterwiki (sTitle, ProcessingFunction) {
var i=-55, oItem, sProp1, sProp2, sWiki, sLang, sTitleLang, oInterwiki = {};
Debug ("-- GetInterwiki -- sTitle: " + sTitle);
jQuery.ajax ({
url: '//www.wikidata.org/w/api.php', // core url
data: { // params of url
"action": "wbgetentities",
// "titles": sTitle.replace(/_/g, " ").replace(/%C3%BC/g, "ü"),
"titles": decodeURIComponent(sTitle), //decode %C3%BC to ü and so on, I don't know why required
// "normalize": "",
"sites": "dewikivoyage|dewiki|enwikivoyage|enwiki|", // sTitle will be searched in dewikivoyage
"props": "sitelinks",
"format": "json",
},
dataType: "jsonp",
success: function (oGet) { // processing of data
Debug ("-- GetInterwiki, success");
if (oGet.success) {
for (sProp1 in oGet.entities) {
Debug ("-- GetInterwiki, sProp1: " + sProp1);
if (sProp1 == -1 && i == -55) // 1st sProp should not be -1
Debug ("GetInterwiki() error: " + JSON.stringify(oGet, null, 2));
if (sProp1 != -1) { // common: "Qxxxx"
oItem = oGet.entities[sProp1];
i=0;
for (sProp2 in oItem.sitelinks) { // informations of "sitelinks"
//Debug ("-- GetInterwiki, sProp2: " + sProp2);
/*
oInterwiki[i] = {};
oInterwiki[i].lang = oItem.sitelinks[sProp2].site.slice(0, 2); // site is enwiki, nlwikivoyage, ...
oInterwiki[i].site = oItem.sitelinks[sProp2].site.slice(2, 55);
oInterwiki[i].title = oItem.sitelinks[sProp2].title;
*/
sLang = oItem.sitelinks[sProp2].site.slice(0, 2); // site is enwiki, nlwikivoyage, ...
sWiki = oItem.sitelinks[sProp2].site.slice(2, 55);
sTitleLang = oItem.sitelinks[sProp2].title;
if (oInterwiki[sWiki] === undefined)
oInterwiki[sWiki] = {};
if (oInterwiki[sWiki][sLang] === undefined)
oInterwiki[sWiki][sLang] = {};
oInterwiki[sWiki][sLang].title = sTitleLang;
//Debug ("-- GetInterwiki, oInterwiki[i].site: " + sWiki);
i++;
}
/*
oInterwiki.sort(SortCompare);
for (i=0; i<oInterwiki.length; i++) {
Debug (oInterwiki[i].site + ", " + oInterwiki[i].lang + ", " + oInterwiki[i].title);
}
*/
}
}
}
ProcessingFunction (oInterwiki);
},
error: function() {
Debug ("GetInterwiki (): query error");
return undefined;
}
});
}
//---- set to every oInterwiki link the events for visibility on/off ----
function SetEventTag () {
var oLink;
//Debug("SetEventTag()");
oLink = jQuery("#firstHeading, div#content a:not(\
#top,[rel],\
.external,.internal,.image,.mw-changeslist-date,\
[title^='Abschnitt'],[title^='Spezial'],[title^='Hilfe'],[title^='Wikivo'],[title^='Benutzer'],[title^='Kategorie'],[title^='Macht le'],[title='Brauchbarer Artikel'],\
[href^='#'],[href^='Wikimania'],[href^='/wiki/Vorlage:'],[href^='/wiki/Wikivoyage:'],[href^='/wiki/Welterbe:'],[href^='/w/index.php?'],[href^='javascript:'],\
[onclick^='insert'])");
//oLink.after("eeee");
oLink.attr({
// onmouseover: "ShowIWTT(this, '" + $this.attr("title") + "')",
// onmouseover: "ShowIWTT(this)",
onmouseover: "ShowIWTT(this, true)",
onmouseout: "HideIWTT(this)"
});
oLink.removeAttr("title");
}
//---- ----
function SortCompare (a, b) {
var ret;
if (a.site != b.site)
return a.site < b.site;
else
return a.lang > b.lang;
}
//---- hover the tooltip----
function IWTTover (oElement) {
Debug("-- IWTTover --");
gbIWTTFocus = true;
ShowIWTT (oElement, false);
}
//---- show the tooltip ----
// oElement: oInterwiki link object
function ShowIWTT (oElement, bIsLink) {
var sHref, iEnd;
//Debug("-- ShowIWTT --, gbIWTTFocus: " + gbIWTTFocus + ", oElement: " + oElement);
/*
var x = oElement.offsetLeft;
var y = oElement.offsetTop;
*/
goPosElement = jQuery(oElement).offset();
giElementHeight = oElement.offsetHeight;
document.onmousemove = MousePos;
// goIWTT.style.left = (x - 10) + "px";
// goIWTT.style.top = (y + 11) + "px";
//Debug ('goIWTT.style.display: ' + goIWTT.style.display);
if(goIWTT.style.display != "block") {
if (!gbIWTTFocus) { // mouse over the tooltip
ghTimer = setTimeout (function () { // delay to visibility of tooltip
goIWTT.style.display = "block";
goIWTTI.style.display = "block";
}, 700); // milliseconds until visibility
} else { // visibility without delay
goIWTT.style.display = "block";
goIWTTI.style.display = "block";
}
if (bIsLink) {
Debug("-- ShowIWTT oElement: " + GetInnerText(oElement));
sHref = oElement.getAttribute("href");
Debug("-- ShowIWTT sHref: " + sHref);
if (sHref !== null) {
// GetInterwiki (GetInnerText(oElement), ToolTipText);
if (sHref.indexOf("&") == -1)
GetInterwiki (sHref.slice(sHref.lastIndexOf("/") + 1), ToolTipText);
else
GetInterwiki (sHref.slice(sHref.indexOf("title=") + 6, sHref.indexOf("&")), ToolTipText);
}
else { // it is the article head title
Debug("-- ShowIWTT GetInnerText(oElement): " + GetInnerText(oElement));
Debug("-- ShowIWTT GetInnerText(oElement): " + GetInnerText(oElement.firstChild));
//Debug("-- ShowIWTT GetInnerText(oElement): " + GetInnerText(oElement.firstElementChild));
GetInterwiki (GetInnerText(oElement.firstChild), ToolTipText);
}
}
}
}
var gTmpE;
//---- leave the tooltip----
function IWTTout (oToolTip) {
//Debug("---- IWTTout ----");
gbIWTTFocus = false;
HideIWTT (oToolTip);
}
//---- hide the tooltip ----
function HideIWTT (oElement) {
//Debug("---- HideIWTT ----");
gTmpE = oElement;
if (!gbIWTTFocus) {
goIWTT.style.display = "none";
// document.onmousemove = null;
clearTimeout (ghTimer);
gbIWTTFocus = false;
}
}
//---- set the tooltip position ----
// e: event
function MousePos (e) {
if (!e)
e = window.event;
// mouse position
var body = (document.compatMode && document.compatMode == "CSS1Compat") ? document.documentElement : document.body;
var x = e.pageX ? e.pageX : e.clientX + body.scrollLeft - body.clientLeft;
var y = e.pageY ? e.pageY : e.clientY + body.scrollTop - body.clientTop;
// var y2 = goPosElement.top - gxPosTT.top + giElementHeight - 5; // bottom position of element, e.g 150 + 16
var y2 = goPosElement.top + giElementHeight - 7; // bottom position of element, e.g 150 + 16
//Debug("MousePos, goPosElement.top: " + goPosElement.top + ", giElementHeight: " + giElementHeight + ", y: " + y);
//Debug("MousePos, y: " + y + ", y2: " + y2);
//goIWTTI.innerHTML = "MousePos, x: " + x + ", y: " + y + ", y2: " + y2 + ", gTmpE: " + gTmpE + ", gbIWTTFocus: " + gbIWTTFocus;
if (y < y2) { // mouse (305) > (lower) bottom (300) ? -> stop; only horizontal movement when mouse over bottom of element
// y = y2; // position is mouse position
//Debug("MousePos, y: " + y);
goIWTT.style.top = (y + 5) + "px"; // + ..: tooltip coordinates in relation to the mouse
goIWTT.style.left = (x - 50) + "px";
}
// goIWTT.style.top = (y2 + 15) + "px";
}