Benutzer:Schnark/js/linkUnlinked.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
 //Dokumentation unter [[Benutzer:Schnark/js/linkUnlinked]] <nowiki>
 /*global mediaWiki*/

 (function($,mw,libs){
 "use strict";
 varstyle='color: inherit !important; text-decoration: inherit !important; font: inherit !important;',
 cssClass='schnark-linkUnlinked-link',
 /* "Applications are free to use any of these noncharacter code points internally but should
 	''never'' attempt to exchange them." (Unicode Standard, 16.7 Noncharacters) */
 uniqueChar='\uFDD0',
 uniqueRe=newRegExp(uniqueChar+'(\\d+)'+uniqueChar,'g'),
 protoRe=newRegExp('^(?:'+mw.config.get('wgUrlProtocols')+')'),
 linkRe;

 functiongetProtos(tags,rel){
 varprotos=mw.config.get('wgUrlProtocols').split('|'),relPos,i;
 functioninsertUnique(c){
 returnc+tags;
 }
 if(!rel){
 relPos=protos.indexOf('\\/\\/');
 if(relPos!==-1){
 protos.splice(relPos,1);
 }
 }
 for(i=0;i<protos.length;i++){
 protos[i]=protos[i].replace(/[^\\]|\\./g,insertUnique);//]/// <- dumme Syntaxhervorhebung
 }
 returnprotos.join('|');
 }

 functionmakeLinkRe(){
 varpZs='\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000',
 tags='(?:'+uniqueChar+'\\d+'+uniqueChar+')*',
 wikilinkChar='[^\\[\\]\\|\\n\\{\\}]',
 extlinkChar='[^\\[\\]"\u0000-\u0020\u007F'+pZs+']',
 wikilink='\\['+tags+'\\[('+wikilinkChar+'+)(?:\\|[^\\[\\]\\n]*)?(?:\\]'+tags+'\\]|\\|)',
 extlink='\\['+tags+'((?:'+getProtos(tags,true)+')'+extlinkChar+'+)'+
 '(?:['+pZs+']*[^\\]\u0000-\u0008\u000a-\u001F]*)?\\]',
 extlink2='\\b((?:'+getProtos(tags)+')'+extlinkChar+'+)',
 isbn='\\bI'+tags+'S'+tags+'B'+tags+'N'+tags+'\\s+'+tags+
 '((?:9'+tags+'7'+tags+'[89]'+tags+'[ -]?'+tags+')?'+
 '(?:[0-9]'+tags+'[ -]?'+tags+'){9}[0-9Xx]'+tags+')\\b';
 returnnewRegExp(wikilink+'|'+extlink+'|'+extlink2+'|'+isbn,'gi');
 }

 functionrel2abs(rel,base){
 if(rel.charAt(0)==='/'){
 returnbase+rel.replace(/\/(#|$)/,'1ドル');
 }
 if(rel.indexOf('../')!==0){
 returnrel.replace(/^:/,'');
 }
 while(rel.indexOf('../')===0&&base.indexOf('/')!==-1){
 rel=rel.slice(3);
 base=base.replace(/\/[^\/]*$/,'');
 }
 returnbase+'/'+rel.replace(/\/(#|$)/,'1ドル');
 }

 functionwikilinkToUrl(link){
 try{
 link=decodeURIComponent(link);
 }catch(e){}
 link=rel2abs(link,mw.config.get('wgPageName'));
 if(/[<>]|\.\.\//.test(link)){
 returnfalse;
 }
 if(link.indexOf('&')>-1){//fix HTML entities
 //NOTE this is safe because link can't contain <>
 link=$('<span>').html(link).text();
 }
 if(link.charAt(0)==='#'){
 return'#'+mw.util.escapeIdForLink(link.slice(1));
 }
 returnmw.util.getUrl(link);
 }

 functionnormalize(link){
 link=link.replace(uniqueRe,'');
 link=link.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"').replace(/&amp;/g,'&');
 link=link.replace(/<!--.*?-->/g,'');
 link=link.replace(/<!--.*$/,'');
 returnlink;
 }

 functionstrip(html){
 vartags=[],
 stripped=html.replace(/<\/?\w+(?:\s+\w+(?:="[^<>"\n]*")?)*(?:\s*\/)?>|<!--.*?-->/g,function(tag){
 tags.push(tag);
 returnuniqueChar+String(tags.length-1)+uniqueChar;
 });
 return[stripped,tags];
 }

 functionunstrip(stripped,tags){
 returnstripped.replace(uniqueRe,function(all,n){
 returntags[Number(n)];
 });
 }

 functionchange(html,changeF){
 if(/<a\b/.test(html)){
 returnfalse;
 }
 if(html.indexOf(uniqueChar)>-1){
 returnfalse;
 }
 varstripped,tags,ret=strip(html);
 stripped=ret[0];
 tags=ret[1];
 if(/[<>]/.test(stripped)){//" kann vorkommen!
 returnfalse;
 }
 stripped=changeF(stripped);
 html=unstrip(stripped,tags);
 if(html.indexOf(uniqueChar)>-1){
 returnfalse;
 }
 returnhtml;
 }

 functionreplaceLinks(text){
 returntext.replace(linkRe,function(all,wikilink,extlink,extlink2,isbn){
 varlink,open,close,pre='',post='',result;
 if(wikilink){
 link=normalize(wikilink);
 if(protoRe.test(link)){//externer Link in doppelten eckigen Klammern
 pre='[';
 all=all.slice(1);
 result=linkRe.exec(all);
 if(result&&result[2]){
 post=all.slice(result[0].length);
 all=result[0];
 link=normalize(result[2]);
 link=link.replace(/[<>].*$/,'');
 }else{
 link=false;
 }
 }else{
 link=wikilinkToUrl(link);
 }
 }elseif(extlink){
 link=normalize(extlink);
 link=link.replace(/[<>].*$/,'');
 }elseif(extlink2){
 link=normalize(extlink2);
 link=link.replace(/[<>].*$/,'');
 if(link.indexOf('(')===-1){
 link=link.replace(/[,;.:!?)]+$/,'');
 post=(/[,.:!?)]*$/).exec(all)[0];//FIXME müsste auch Ersetzungen von normalize beachten und ; entfernen
 }else{
 link=link.replace(/[,;.:!?]+$/,'');
 post=(/[,.:!?]*$/).exec(all)[0];//FIXME müsste auch Ersetzungen von normalize beachten und ; entfernen
 }
 if(post.length){
 all=all.slice(0,-post.length);
 }
 }else{
 link=normalize(isbn).replace(/[ \-]/g,'').replace(/x/,'X');
 link=wikilinkToUrl('Special:Booksources/'+link);
 }
 if(!link){
 returnpre+all+post;
 }
 open='<a href="'+mw.html.escape(link)+'" class="'+cssClass+'">';
 close='</a>';
 return(pre+open+all.replace(uniqueRe,function(unique){
 returnclose+unique+open;
 })+close+post).replace(/<a [^>]+>(\s*)<\/a>/g,'1ドル');
 });
 }

 functionchangeHtml(html){
 html=html.replace(/<a name="([^"]*)"><\/a>/g,'<span id="1ドル"></span>');//Den Mist von [[phab:T182292]] korrigieren
 returnchange(html,replaceLinks);
 }

 functionchangeElements($el){
 $el.each(function(){
 varoldHtml=this.innerHTML,newHtml=changeHtml(oldHtml);
 if(newHtml&&oldHtml!==newHtml){
 this.innerHTML=newHtml;
 }
 });
 }

 functionlinkDiff($diff){
 changeElements($diff.find('td.diff-context, td.diff-addedline, td.diff-deletedline'));
 }

 functionlinkSyntax($content){
 changeElements($content.find('.mw-highlight pre, pre.source-javascript, pre.source-css'));
 }

 functionlinkSchnarkDiff($diff){
 changeElements($diff.find('ins, del, span'));
 }

 functioninit(){
 linkRe=makeLinkRe();
 mw.util.addCSS('.'+cssClass+'{'+style+'}');
 mw.hook('wikipage.diff').add(linkDiff);
 if(/\.(?:js|css)$/.test(mw.config.get('wgTitle'))&&[2,8].indexOf(mw.config.get('wgNamespaceNumber'))>-1){
 mw.hook('wikipage.content').add(linkSyntax);
 }
 mw.hook('userjs.schnark-diff').add(linkSchnarkDiff);
 if(libs.qunit){
 libs.qunit.rel2abs=rel2abs;
 libs.qunit.wikilinkToUrl=wikilinkToUrl;
 libs.qunit.strip=strip;
 libs.qunit.unstrip=unstrip;
 libs.qunit.changeHtml=changeHtml;
 libs.qunit.changeElements=changeElements;
 }
 }

 mw.loader.using('mediawiki.util').then(init);

 })(jQuery,mediaWiki,mediaWiki.libs);
 //</nowiki>
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Benutzer:Schnark/js/linkUnlinked.js&oldid=182969326"