Wikipedysta:Persino/Gadget-StronicowyParser.js/DymkiSubst.js
Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
- Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
- Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
- Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
- Opera: Naciśnij klawisze Ctrl+F5.
mw.loader.using('ext.gadget.gConfig', function(){
let globalne_zmienne=this;
StronicowyParser.GadgetDymkiSubst=function(){
let dymkisubst_dymki_nad_linkami=undefined;
let dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych=undefined;
if((globalne_zmienne.gConfig!==undefined)&&(globalne_zmienne.gConfig.register!==undefined)&&(globalne_zmienne.gConfig.get!==undefined)){
mw.messages.set({
'DymkiSubst-name': 'Dymki nad linkami inteligentymi',
'DymkiSubst-description-page': 'Wikibooks:StronicowyParser/DymkiSubst',
'DymkiSubst-dymki_nad_linkami_dla_linkow_inteligentnych' : "Ustawia dymki, nad linkami, dla linków inteligentnych.",
'DymkiSubst-dymki_nad_linkami' : "Ustawia dymki, nad linkami, dla innych linków, tworząc je inteligentnymi.",
});
gConfig.register('DymkiSubst', {name: mw.msg('DymkiSubst-name'), descriptionPage: mw.msg('DymkiSubst-description-page')}, [
{
name: 'dymki_nad_linkami_dla_linkow_inteligentnych',
desc: mw.msg('DymkiSubst-dymki_nad_linkami_dla_linkow_inteligentnych'),
type: 'boolean',
deflt: true,
legacy: [window, 'wb_dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych']
},
{
name: 'dymki_nad_linkami',
desc: mw.msg('DymkiSubst-dymki_nad_linkami'),
type: 'boolean',
deflt: true,
legacy: [window, 'wb_dymkisubst_dymki_nad_linkami']
},
]);
dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych = gConfig.get('DymkiSubst', 'dymki_nad_linkami_dla_linkow_inteligentnych');
dymkisubst_dymki_nad_linkami = gConfig.get('DymkiSubst', 'dymki_nad_linkami');
}
dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych=((dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych!==undefined)?dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych:true);
dymkisubst_dymki_nad_linkami=((dymkisubst_dymki_nad_linkami!==undefined)?dymkisubst_dymki_nad_linkami:true);
let zmienna_this=this;
this.lineHeight=function(id){
let lineheight=window.getComputedStyle(id, null).getPropertyValue("line-height");
if(lineheight=="normal"){
let fontSize=window.getComputedStyle(id, null).getPropertyValue("font-size");
let liczba=parseFloat(fontSize);
return liczba*1.2;
}
let re=/^[0-9]*\.?[0-9]*$/;
let test=re.test(lineheight);
if(test){
let lineheight_float=parseFloat(lineheight);
let fontSize=window.getComputedStyle(id, null).getPropertyValue("font-size");
fontSize=parseFloat(fontSize);
return lineheight_float*fontSize;
}
re=/^[0-9]*\.?[0-9]*[a-zA-Z]+$/;
test=re.test(lineheight);
if(test){
let liczba=parseFloat(lineheight.match(/[0-9]*\.?[0-9]*/).toString());
let jed=lineheight.match(/[a-zA-Z]+$/).toString();
if(jed=="cm"){return liczba*96/2.54;}
if(jed=="mm"){return liczba*96/25.4;}
if(jed=="Q"){return liczba/25.4*96/4;}
if(jed=="in"){return liczba*96;}
if(jed=="pt"){return liczba*4/3;}
if(jed=="pc"){return liczba*16;}
if(jed=="px"){return liczba;}
return null;
}
return null;
}
/*Funkcja do wyświetlania komunikatów do [[Szablon:Link wewnętrzny]]*/
var dymki_muteks=new StronicowyParser.Muteks();
this.WyswietlKomunikatInfoKombajn=async function(id,event,komunikat){
await dymki_muteks.zablokuj();
let body=document.querySelector('body');
if(body==null){dymki_muteks.odblokuj();return;}
let bodycontent = document.querySelector('#bodyContent');
if(bodycontent==null){dymki_muteks.odblokuj();return;}
this.UsunKomunikatInfo();
let div=document.createElement('div');
div.position="absolute";
let element_id=id.getBoundingClientRect();
let left_real=event.clientX+window.scrollX;
let top_real=element_id.top+window.scrollY;
let wysokosclinii=this.lineHeight(id);
if((wysokosclinii==null)||(wysokosclinii<=0)){dymki_muteks.odblokuj();return;};
let eY=event.clientY;
for (let i=0;;++i){
let top_real_dolny=top_real+(id.offsetHeight-i*wysokosclinii);
let top_real_gorny=top_real+(id.offsetHeight-(i+1)*wysokosclinii);
if((top_real_dolny<0)||(top_real_gorny<0)){break;}
if((eY<=top_real_dolny)&&(eY>top_real_gorny)){
top_real=top_real_gorny;
break;
}
if(top_real_gorny<=top_real){
top_real=top_real_gorny;
break;
}
}
div.style.left=(parseInt(left_real)).toString()+'px';
div.classList.add("dymkisubst_link_wewnętrzny_komunikatów");
div.setAttribute("id","dymkisubst_id_animacja_komunikatów");
div.innerHTML=komunikat;
let div_element=body.appendChild(div);
let top=parseInt(top_real-div_element.offsetHeight);
if(top<0){top=0;}
div.style.top=top.toString()+'px';
let rectbodycontent=bodycontent.getBoundingClientRect();
let leftbodycontent=rectbodycontent.left+window.scrollX;
let widthbodycontent=bodycontent.offsetWidth;
let id_komunikat_right=left_real+div_element.offsetWidth;
let marginesRight=1;
if(widthbodycontent+leftbodycontent<id_komunikat_right+marginesRight){
let roznica_offsetow=id_komunikat_right-widthbodycontent-leftbodycontent;
div_element.style.left=(parseInt(left_real-(roznica_offsetow)-marginesRight)).toString()+'px';
}
//if((StronicowyParser.szablony)&&(StronicowyParser.szablony.LadujSzablon)){
// let tab_promise=new Array(true);
// StronicowyParser.szablony.LadujSzablon(div_element,null,null,tab_promise).then((result) => {}).catch((error) => {});
//}
dymki_muteks.odblokuj();
}
this.UsunKomunikatInfo=function(id){
let body=document.querySelector('body');
if(body==null){return;}
let id_animation=document.getElementById('dymkisubst_id_animacja_komunikatów');
if(id_animation!==null){
body.removeChild(id_animation);
if(id){id.dymkisubst_poprawnie=true;}
}else{
let link_wewnetrzny_komunikatow=document.getElementsByClassName('dymkisubst_link_wewnętrzny_komunikatów');
if((link_wewnetrzny_komunikatow!==null)&&(link_wewnetrzny_komunikatow.length>0)){
let tab_komunikat=new Array();
for(let s=0;s<link_wewnetrzny_komunikatow.length;++s){tab_komunikat[s]=link_wewnetrzny_komunikatow[s];}
for(let s=0;s<tab_komunikat.length;++s){
body.removeChild(tab_komunikat[s]);
}
if(id){id.dymkisubst_poprawnie=true;}
}else{
if(id){id.dymkisubst_poprawnie=false;}
}
}
}
this.PobierzKodElementuRodzicaA=function(element_a){
let parent_element_a=element_a.parentNode;
if((parent_element_a.tagName.toUpperCase()!="SPAN")||(!$(parent_element_a).hasClass("link"))){return null;}
let element_link=parent_element_a.classList;
if((element_link!==null)&&(element_link.length>0)){
for(let a=0;a<element_link.length;++a){
let kod=element_link[a];
if(kod!="link"){
return kod;
}
}
}
return null;
}
this.WyswietlKomunikatInfo=async function(id,event){
await dymki_muteks.zablokuj();
id.dymkisubst_poprawnie=true;
async function Komunikat(id,event,tekst_komunikat){
await dymki_muteks.zablokuj();
if(!id.dymkisubst_poprawnie){
zmienna_this.UsunKomunikatInfo();
dymki_muteks.odblokuj();
return;
}
let div=document.createElement('div');
div.innerHTML=tekst_komunikat;
function P(element){
let tekst_komunikat=element.innerHTML;
let czy_tekst_komunikat=tekst_komunikat.match(/^\s*<p\s*>/g,"")
if(!czy_tekst_komunikat){
czy_tekst_komunikat=tekst_komunikat.match(/^\s*<p\s+[^<>]*>/g,"")
}
if(czy_tekst_komunikat){
let p=div.getElementsByTagName('p');
if((p!==null)&&(p.length>0)){
p[0].style.marginTop="0";
}
}
czy_tekst_komunikat=tekst_komunikat.match(/<\/p>\s*$/g)
if(czy_tekst_komunikat){
let p=div.getElementsByTagName('p');
if((p!==null)&&(p.length>0)){
p[p.length-1].style.marginBottom="0";
}
}
}
P(div);
tekst_komunikat=div.innerHTML;
zmienna_this.WyswietlKomunikatInfoKombajn(id,event,tekst_komunikat);
dymki_muteks.odblokuj();
}
this.UsunKomunikatInfo();
let kod=this.PobierzKodElementuRodzicaA(id);
if(kod===null){dymki_muteks.odblokuj();return;}
let old_href=id.getAttribute('old_href');
let href=id.getAttribute('href');
let tab_href_znaki_specjalne={
"=" : "{{=}}",
"|" : "{{!}}",
"{" : "{{(}}",
"}" : "{{)}}",
"[" : "{{!(}}",
"]" : "{{)!}}",
}
function fun_zamien_nawiasy(ciag){
return tab_href_znaki_specjalne[ciag] || ciag;
}
if(href===null){
href="";
}else{
href=StronicowyParser.kodowanie.DecodeHtml(href);
href=href.replace(/(.)/g,fun_zamien_nawiasy)
}
if(old_href){
old_href=StronicowyParser.kodowanie.DecodeHtml(old_href);
old_href=old_href.replace(/(.)/g,fun_zamien_nawiasy);
}
let strona=StronicowyParser.pageinfo.fullname;
StronicowyParser.api.ZadaniaApi({
action: 'expandtemplates',
format: 'json',
prop: 'wikitext',
title: strona,
text: ((old_href!==null)?('{{#invoke:Brudnopis/Persino/Dymki|UzyskajOpisOdParametrówLinku|'+kod+'|'+href+'|'+old_href+'}}'):('{{#invoke:Brudnopis/Persino/Dymki|UzyskajOpisOdParametrówLinku|'+kod+'|'+href+'}}')),
smaxage: 600,
maxage: 600,
}).then(async function(data){
await dymki_muteks.zablokuj();
let tekst_komunikat=data.expandtemplates.wikitext;
Komunikat(id,event,tekst_komunikat);
dymki_muteks.odblokuj();
}).catch((error) => {});
dymki_muteks.odblokuj();
}
this.UstawZdarzeniaKomunikatuInfo=async function(rodzic,tab_promise){
if(!dymkisubst_dymki_nad_linkami_dla_linkow_inteligentnych){if(tab_promise){tab_promise.zwolnij();};return;}
await StronicowyParser.muteks.zablokuj();
let klasa_link_wewnetrzny=rodzic.getElementsByClassName('link');
for(let s=0;s<klasa_link_wewnetrzny.length;++s){
let poszczegolna_klasa=klasa_link_wewnetrzny[s];
if(poszczegolna_klasa.tagName.toUpperCase()=="SPAN"){
zmienna_this.UstawZdarzeniaKomunikatuElementuInfo(poszczegolna_klasa);
}
}
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
}
this.UstawZdarzeniaKomunikatuElementuInfo=function(poszczegolna_klasa){
let element_link=poszczegolna_klasa.classList;
if((element_link!==null)&&(element_link.length>0)){
for(let a=0;a<element_link.length;++a){
let kod=element_link[a];
if(kod!="link"){
let a_tag=poszczegolna_klasa.querySelector('a');
if(a_tag!==null){
$(a_tag).on("mouseover",function(){StronicowyParser.gadgetdymkisubst.WyswietlKomunikatInfo(this,event);});
$(a_tag).on("mouseout",function(){StronicowyParser.gadgetdymkisubst.UsunKomunikatInfo(this);});
break;
}
}
}
}
}
this.UstawTagiIKlasyKomunikatuInfo=async function(rodzic,tab_promise){
if(!dymkisubst_dymki_nad_linkami){if(tab_promise){tab_promise.zwolnij();};return;}
await StronicowyParser.muteks.zablokuj();
let tablemenu=undefined;
let dokumentacja=undefined;
function Czy_w_toc(element){
let rodzic2=(((rodzic==document)||(rodzic==null))?document:rodzic);
let toc=new Array("toc","toc_spis","toc_wykaz");
for(let a=0;a<toc.length;++a){
let toc_pos=rodzic2.getElementsByClassName(toc[a]);
if((toc_pos!==null)&&(toc_pos.length>0)){
for(let b=0;b<toc_pos.length;++b){
let element_toc=toc_pos[b];
let el=$(element_toc).find(element)
if((el!==null)&&(el.length>0)){
return false;
}
}
}
}
return true;
}
function TableMenu(element){
if(rodzic==document){
if(tablemenu===undefined){
tablemenu=$("body #content #bodyContent table.tablemenu");
}
}else{
tablemenu=$(rodzic).find("table.tablemenu");
}
if((tablemenu!==null)&&(tablemenu.length>0)){
for(let s=0;s<tablemenu.length;++s){
let el=$(tablemenu[s]).find(element);
if((el!==null)&&(el.length>0)){
return false;
}
}
}
return true;
}
function NaglowekDokumentacji(element){
if(rodzic==document){
if(dokumentacja===undefined){
dokumentacja=$("body #content #bodyContent #mw-content-text .mw-parser-output .template-documentation #doc_editlinks, body #content #bodyContent #mw-content-text .mw-parser-output #documentation-meta-data");
}
}else{
dokumentacja=$(rodzic).find(".template-documentation #doc_editlinks, #documentation-meta-data");
}
if((dokumentacja!==null)&&(dokumentacja.length>0)){
for(let s=0;s<dokumentacja.length;++s){
let el=$(dokumentacja[s]).find(element);
if((el!==null)&&(el.length>0)){
return false;
}
}
}
return true;
}
function CategoryTree(element){
let a_element=$('.CategoryTreeTag').find(element);
if((a_element!==null)&&(a_element.length>0)){
return false;
}
return true;
}
function TrybCiemny(element){
let elem1=$('.uruchom_tryb_ciemny').find(element);
let elem2=$('.uruchom_tryb_jasny').find(element);
if(((elem1!==null)&&(elem1.length>0))||((elem2!==null)&&(elem2.length>0))){
return false;
}
return true;
}
function BezSzablonSubst(element){
if(!rodzic){
rodzic2=$("body #content #bodyContent #mw-content-text .mw-parser-output");
}else{
rodzic2=$(rodzic);
}
let element_tag=rodzic2.find('.rodzic_szablon_subst_js, .szablon_subst_js').find(element);
if((element_tag!==null)&&(element_tag.length>0)){return false;}
return true;
}
function Thumb(element){
let thumb=$(".thumb").find(element);
if((thumb!==null)&&(thumb.length>0)){
let caption=$('.thumb .thumbcaption').find(element);
if((caption===null)||(caption.length==0)){
return false;
}
}
return true;
}
function Audio(element){
let thumb=$(".audio").find(element);
if((thumb!==null)&&(thumb.length>0)){
return false;
}
return true;
}
let rodzic2;
if((rodzic==document)||(rodzic==null)){
let body_content=$("body #content #bodyContent #mw-content-text .mw-parser-output");
if((body_content!==null)&&(body_content.length>0)){
rodzic2=body_content[0];
}else{
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();};
return;
}
}else{
rodzic2=rodzic;
}
let elementy_a=rodzic2.getElementsByTagName('a');
let tab_outer_a=new Array();
let wywolanie=new Array();
if((elementy_a!==null)&&(elementy_a.length>0)){
for(let a=0;a<elementy_a.length;++a){
let element_a=elementy_a[a];
let href=element_a.getAttribute('old_href')||element_a.getAttribute('href');
if((((href!==null)&&(href!=""))||(($(element_a).hasClass('selflink'))&&($(element_a).hasClass('mw-selflink'))))&&(href!="#")&&(element_a.innerHTML!="")&&(!$(element_a).hasClass('image'))){
if(!((href)&&(href.match(/^javascript:/g)))){
let linenos=$(element_a).find("span.linenos");
let tak=(((linenos===null)||(linenos.length==0))
&&(Thumb(element_a))
&&(Audio(element_a))
&&(NaglowekDokumentacji(element_a))
&&(Czy_w_toc(element_a))
&&(TableMenu(element_a))
&&(CategoryTree(element_a))
&&(TrybCiemny(element_a))
&&(BezSzablonSubst(element_a))
);
if(tak){
let parent_a=element_a.parentNode;
if(parent_a.tagName.toUpperCase()=="SPAN"){
if($(parent_a).hasClass("link")){
tak=false;
}else{
tak=true;
}
}else{
tak=true;
}
}
if(tak){
tab_outer_a.push(element_a);
}
}
}
}
}
for(let a=0;a<tab_outer_a.length;++a){
let element_a=tab_outer_a[a];
async function LinkURL(wynik_link_wewnetrzny,tab_outer_a){
await StronicowyParser.muteks.zablokuj();
let div=document.createElement('div');
div.innerHTML=wynik_link_wewnetrzny;
let numer=div.getElementsByClassName("dymkisubst_numer");
if((numer===null)||(numer.length==0)||(numer.length>1)||(numer[0].parentNode!=div)){
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
return;
}
let klasy=numer[0].classList;
let numer_wywolania=undefined;
for(let d=0;d<klasy.length;++d){
let klasa=klasy[d];
if(klasa.match(/^dymkisubst_\d+$/)){
numer_wywolania=parseInt(klasa.replace(/^dymkisubst_/g,""));
if(isNaN(numer_wywolania)){
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
return;
}
break;
}
}
if(numer_wywolania==undefined){StronicowyParser.muteks.odblokuj();if(tab_promise){tab_promise.zwolnij();};return;};
if(numer_wywolania<0){StronicowyParser.muteks.odblokuj();if(tab_promise){tab_promise.zwolnij();};return;};
let scribunto_error=div.getElementsByClassName('scribunto-error');
if((scribunto_error!==null)&&(scribunto_error.length>0)){
console.log("----------------------------------------");
console.log("Uzyskano następujący błąd: "+wynik_link_wewnetrzny);
console.log("Wywołanie: "+wywolanie[numer_wywolania]);
console.log('+++++++++++++++++++++++++++++++++++++++');
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
return;
}
let element_outer_a=tab_outer_a[numer_wywolania];
let poszczegolna_klasa=$(element_outer_a).wrap(function() {
return "<span class='"+numer[0].innerHTML+" link'></span>";
});
let element_span_a=poszczegolna_klasa.parent().first();
if((element_span_a!==null)&&(element_span_a.length>0)){
zmienna_this.UstawZdarzeniaKomunikatuElementuInfo(element_span_a[0]);
}
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
}
let strona_href=element_a.getAttribute('old_href')||element_a.getAttribute('href');
strona_href=(((strona_href)&&(strona_href!=""))?strona_href:"")
if(strona_href!==null){
let dalsze_parametry_URL;
let replace_wikikod=function(s){
const tab_s={"{":"{{(}}","}":"{{)}}","|":"{{!}}"};
let mikroszablon=tab_s[s];
if(mikroszablon==null){return s;}else{return mikroszablon;}
};
strona_href=strona_href.replace(/[{}\|]/g,replace_wikikod).replace(/[_\s]+/g,"_");
let strona=mw.config.get('wgPageName');
wywolanie.push("{{#invoke:Linki|UzyskajKodWikiLinku|strona="+strona_href+"|wyspecjalizowana=tak}}");
if(tab_promise){tab_promise.wygeneruj(1);}
StronicowyParser.api.ZadaniaApi({
action: 'expandtemplates',
format: 'json',
prop: 'wikitext',
title: strona,
text: "<div class=\"dymkisubst_"+a+" dymkisubst_numer\">{{#invoke:Linki|UzyskajKodWikiLinku|strona="+strona_href+"|wyspecjalizowana=tak}}</div>",
smaxage: 600,
maxage: 600,
}).then(async function(data){
await StronicowyParser.muteks.zablokuj();
let wynik_linkURL=data.expandtemplates.wikitext;
if(tab_promise){tab_promise.wygeneruj(1);};
LinkURL(wynik_linkURL,tab_outer_a);
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
}).catch((error) => {if(tab_promise){tab_promise.zwolnij();}});
}
}
StronicowyParser.muteks.odblokuj();
if(tab_promise){tab_promise.zwolnij();}
}
}
StronicowyParser.gadgetdymkisubst=new StronicowyParser.GadgetDymkiSubst();
$(window).on("mouseout",function(){StronicowyParser.gadgetdymkisubst.UsunKomunikatInfo(this);});
$(window).on("mouseover",function(){StronicowyParser.gadgetdymkisubst.UsunKomunikatInfo(this);});
});