MediaWiki:Gadget-section-links.js: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
om$Dasher: wylaczam |
(test) Specjalna:Niezmienny link/4879177#Wiersz jako przykład: niech punktor ("•") nie oddziela strony polskiej od innojezycznej w polu 'przyklady'; usuwam obsluge znaku '■', zostal calkowicie zastapiony przez punktor |
||
Linia 535: | Linia 535: | ||
om$ExpliciteBlock = 2; |
om$ExpliciteBlock = 2; |
||
⚫ | |||
if ( |
if ( |
||
/*cont.indexOf(';')>=0 && om$Field!=om$EXAMPL ||*/ |
|||
cont.indexOf( ' |
cont.indexOf( '→' ) >= 0 && |
||
⚫ | |||
) |
) |
||
if ( cont.indexOf( '→' ) >= 0 ) |
|||
om$ArrowPassed = |
om$ArrowPassed = 1; |
||
⚫ | |||
⚫ | |||
cont.indexOf( '■' ) |
|||
) < cont.indexOf( '→' ) ) ? 1 : 0; |
|||
else |
else |
||
om$ArrowPassed = 0; |
om$ArrowPassed = 0; |
Wersja z 00:06, 7 gru 2015
// Kod przeniesiony z Common.js: [[Specjalna:Niezmienny link/4475173]]
if ( typeof String.prototype.endsWith !== 'function' ) {
String.prototype.endsWith = function( suffix ) {
return this.indexOf( suffix, this.length - suffix.length ) !== -1;
};
}
/*
Funkcje skryptu:
* zmiana linka w polu {{odmiana}} w zależności od języka sekcji
* obsługa szablonu {{język linków}}
* dodanie kodów języka do linków w artykułach i w kategoriach
* czarne self-linki tylko jeśli prowadzą do tej samej sekcji językowej
* klasy CSS dla sekcji językowych i pól
* zamiana łącznika na półpauzę w zakresach, np. (1.1-2) na (1.1–2)
* justowanie indeksu a tergo do prawej
* równe szerokości kolumn w kategoriach
Przetestowane pod IE 7, IE 8, FF 3.6, Opera 10.50, Google Chrome 4.1.249.1036, Opera Mini, Nokia OSS
Autor: [[user:Olaf]]. Zmierzony narzut czasowy: 0.1-0.3 s
*/
//Ustawienie tej zmiennej na 1 w [[user:XXX/monobook.js]] blokuje zmiany linku z sekcji {{odmiana}}
var om$BlockChangeOfInflectionLink = 0;
//Ustawienie tej zmiennej na 1 w [[user:XXX/monobook.js]] blokuje zmiany linków do sekcji językowych
var om$BlockChangeSectionLinks = 0;
//Ustawienie tej zmiennej na 1 w [[user:XXX/monobook.js]] blokuje nadawanie klas CSS.
//Uwaga: może to wówczas uniemożliwić pracę innych gadżetów.
var om$BlockCSSClasses = 0;
//var time0=new Date().getTime();
//podział sekcji
var om$START = 0; //początek sekcji językowej
var om$KEEP = 1; //nie zmieniamy linków
var om$PL = 2; //linkujemy do języka polskiego
var om$EXAMPL = 3; //linkujemy do języka obcego przed strzałką i polskiego po strzałce
var om$FOREIGN = 4; //linkujemy do języka obcego
var om$TRANSL = 5; //linkujemy w zależności od nazwy języka
var om$SET = 6; //ustawione za pomocą szablonu {{język linków}}
var om$TABLE = 7; //linkujemy w zależności od kolumny
var om$ESPERANTO = 8; //linkujemy do sekcji esperanto
var om$ChangeInflection = false;
var om$CurLanguageId = '';
var om$CurSectionName = '';
var om$CurField = '';
var om$Field = om$KEEP;
var om$ArrowPassed = 0;
var om$ExpliciteBlock = 0;
var om$TransSection = 'other';
var om$LastNodeName = '';
var om$NewClasses = null;
var om$SectNum = 0;
var om$LocationUrl = null;
var om$LangOfColumn = null;
var om$Column = 0;
var om$Row = 0;
var om$aTergo = 0;
var om$CatContent = 0;
var om$Lang2Code = mw.config.get( 'lang2code' );
var om$ChangeInflectionList = [ 'cs', 'cu', 'da', 'de', 'dsb', 'en', 'fr', 'is',
'la', 'nb', 'nl', 'nn', 'pl', 'ru', 'sk', 'sv' ];
// http://stackoverflow.com/questions/14947307
var om$RegexpHref = /^(\d+)?[^\d]/;
// [[Specjalna:Niezmienny link/4318644#Typografia nazw stron (półpauza)]]
// WYŁĄCZONE, zob. wątek w Barze
var om$Dasher = function( $node, isLink, replace ) {
var check = isLink
? $node.attr( 'href' )
: $node.text();
if (
replace ||
check.indexOf( 'Kategoria:' ) != -1 ||
check.indexOf( 'Indeks:' ) != -1 ||
check.indexOf( 'Aneks:' ) != -1
) {
$node.html(
$node.html().replace( / - /g, ' – ' )
);
}
};
function om$ChangeLinks( node ) {
for( var j = 0; j < node.childNodes.length; j++) {
var subNode = node.childNodes[ j ];
var nodeName = subNode.nodeName.toLowerCase();
if (
subNode.nodeType == 1 &&
!$( subNode ).hasClass( 'mw-editTools' ) &&
!$( subNode ).hasClass( 'portlet' ) &&
nodeName != 'textarea'
) {
if (
//rozpoznanie końca artykułu
$( subNode ).hasClass( 'printfooter' ) ||
subNode.id && subNode.id == 'toolbar'
) {
om$Field = om$START;
om$ExpliciteBlock = 0;
om$CurSectionName = '';
om$CurField = '';
om$CurLanguageId = '';
om$NewClasses = null;
om$ChangeInflection = false;
}
if ( nodeName == 'span' ) {
//znacznik szablonu {{język linków}}
if ( subNode.id == 'linkLanguage' ) {
var title = subNode.getAttribute( 'title' );
var iso;
if ( ( title + ' ' ).substring( 0, 1 ) == '#' )
iso = title.substring( 1 );
else
iso = om$Lang2Code[ title ];
if ( iso )
om$CurLanguageId = iso;
if ( subNode.getAttribute( 'title' ) == '' )
om$Field = om$START;
else
om$Field = om$SET;
}
//rozpoznanie sekcji językowej
if (
$( subNode ).hasClass( 'mw-headline' ) &&
!$( om$LastNodeName ).hasClass( 'mw-headline' ) &&
om$Field != om$SET
) {
om$Field = om$START;
om$ExpliciteBlock = 0;
om$CurSectionName = subNode.id;
om$CurField = 'header';
om$CurLanguageId = '';
om$NewClasses = null;
om$ArrowPassed = 0;
for ( var k = 0; k < subNode.childNodes.length; k++) {
var subSubNode = subNode.childNodes[ k ];
if ( $( subSubNode ).hasClass( 'primary-lang-code' ) ) {
om$SectNum++;
om$CurLanguageId = subSubNode.id.replace( '-foreign', '' );
om$NewClasses = 'lang-' + om$CurLanguageId + ' fldt-header';
if ( $.inArray( subSubNode.id, om$ChangeInflectionList ) > -1 ) {
om$ChangeInflection = true;
$( subSubNode ).addClass( 'change-inflection' );
} else {
om$ChangeInflection = false;
}
if ( !$( subSubNode ).hasClass( 'no-headline-links' ) ) {
om$Field = om$FOREIGN;
}
break;
}
}
}
if (
$( subNode ).hasClass( 'field' ) &&
!$( om$LastNodeName ).hasClass( 'field' ) &&
om$Field != om$SET
) {
om$SectNum++;
var start = (' ' + subNode.className ).indexOf( ' fld-' );
if ( start >= 0 ) {
var end = ( subNode.className + ' ' ).indexOf( ' ', start );
om$CurField = subNode.className.substring( start + 4, end );
}
om$NewClasses = 'lang-' +
( om$CurLanguageId != ''
? om$CurLanguageId
: 'other' ) +
' fldn-' +
om$SectNum +
( om$CurField != ''
? ' fldt-' + om$CurField
: '' );
if ( $( subNode ).hasClass( 'field-keep' ) )
om$Field = om$KEEP;
else if ( $( subNode ).hasClass( 'field-pl' ) )
om$Field = om$PL;
else if ( $( subNode ).hasClass( 'field-foreign' ) )
om$Field = om$FOREIGN;
else if ( $( subNode ).hasClass( 'field-exampl' ) )
om$Field = om$EXAMPL;
else if ( $( subNode ).hasClass( 'field-transl' ) )
om$Field = om$TRANSL;
else if ( $( subNode ).hasClass( 'field-esperanto' ) )
om$Field = om$ESPERANTO;
}
}
//rozpoznanie self-linka
if (
om$BlockChangeSectionLinks == 0 && //użytkownik nie zablokował
$( subNode ).hasClass( 'selflink' ) &&
om$CurLanguageId != ''
) {
var linkElem = document.createElement('a');
linkElem.className = subNode.className;
try {
linkElem.setAttribute( 'href', om$LocationUrl );
} catch ( err1 ) {
var hrefAttr = document.createAttribute( 'href' );
linkElem.setAttribute( hrefAttr, om$LocationUrl );
}
try {
linkElem.innerHTML = subNode.innerHTML;
} catch ( err ) {
linkElem.innerText = subNode.innerText;
}
subNode.parentNode.replaceChild( linkElem, subNode );
subNode = linkElem;
nodeName = 'a';
}
if ( nodeName == 'a' ) {
var href = subNode.getAttribute( 'href' );
if ( href != null ) {
var startTitle = href.lastIndexOf( '/' ) + 1;
//var firstChar=href.charAt(startTitle).toLowerCase();
//użytkownik nie zablokował usługi
if (
om$BlockChangeSectionLinks == 0 &&
//wykluczenie innych przestrzeni nazw oraz linków zewnętrznych
( href.indexOf( ':' ) < 0 ||
href.substring( 0, mw.config.get( 'wgServer' ).length )
== mw.config.get( 'wgServer' ) &&
href.substring( mw.config.get( 'wgServer' ).length )
.indexOf( ':' ) < 0
) &&
// wykluczenie linków do siostrzanych projektów
subNode.className.indexOf( 'extiw' ) === -1 &&
href.indexOf( '/S%C5%82ownik_' ) < 0 && //nie jest to link np. do Słownika języka pol.
href.indexOf( '#' ) < 0 && //sekcja nie jest podana w linku
//!$( subNode ).hasClass( 'new' ) && //nie jest to czerwony link
( href.indexOf( '?' ) < 0 || href.indexOf( '&action=edit' ) >= 0 ) && //np. link pod polem edycji
//'0123456789'.indexOf( firstChar ) < 0 && //nie jest to liczba
om$RegexpHref.test( href.substring( startTitle ) ) &&
( om$Field == om$SET || om$Field == om$TABLE ||
om$CurField != '' && om$CurLanguageId != '')
) {
var newLang = null;
if (
(
om$Field == om$PL &&
//nie jest to rozwinięcie skrótu
om$ExpliciteBlock == 0
) ||
//przykłady za strzałką
om$ArrowPassed == 1
)
newLang = 'pl';
if ( om$Field == om$ESPERANTO )
newLang = 'eo';
if (
(
om$Field == om$FOREIGN ||
om$Field == om$EXAMPL ||
om$Field == om$SET ||
om$ExpliciteBlock > 0
) &&
om$ArrowPassed == 0
)
newLang = om$CurLanguageId;
if ( om$Field == om$TRANSL )
newLang = om$TransSection;
if ( om$Field == om$TABLE )
newLang = om$LangOfColumn[ om$Column ];
if ( newLang == 'pl' ) {
var nhref = decodeURI( href );
if ( nhref.substring( nhref.length - 1 ) >= '\u0250' )
newLang = null;
}
if ( newLang != null ) {
href = href + '#' + newLang;
subNode.setAttribute( 'href', href );
}
}/* else if ( href.indexOf( ':' ) > 0 ) {
om$Dasher( $( subNode ), true );
}*/
var i = href.indexOf( '#' );
if (
i >= 0 &&
(
href.substring( i ) == '#' + om$CurLanguageId ||
href.substring( i ) == '#' + om$CurSectionName
) &&
( om$LocationUrl + '#' ).indexOf( href.substring( 0, i + 1 ) ) >= 0
) {
subNode.style.color = 'black';
subNode.style.fontWeight = 'bold';
subNode.style.textDecoration = 'none';
}
//wyłączenie boldów w self-linkach w niektórych językach
if (
href.endsWith( '#zh' ) ||
href.endsWith( '#zh-char' ) ||
href.endsWith( '#zh-min-nan' ) ||
href.endsWith( '#ja' ) ||
href.endsWith( '#ko' )
)
subNode.style.fontWeight = 'normal';
//rozpoznanie linku z szablonu odmiany
if (
href.indexOf( '/wiki/Wikis%C5%82ownik:Zasady_tworzenia_hase%C5%82/Odmiana' ) >= 0 &&
om$Field != om$SET
) {
om$Field = om$FOREIGN;
if ( om$BlockChangeOfInflectionLink == 0 && om$ChangeInflection ) {
subNode.setAttribute(
'href',
'/wiki/Wikis%C5%82ownik:Zasady_tworzenia_hase%C5%82/Odmiana/' + om$CurLanguageId
);
subNode.setAttribute(
'title',
'Wikisłownik:Zasady tworzenia haseł/Odmiana/' + om$CurLanguageId
);
}
}
}
}
if ( nodeName == 'dd' || nodeName == 'li') {
om$ExpliciteBlock = 0;
om$ArrowPassed = 0;
om$TransSection = 'other';
}
if ( nodeName == 'tr' ) {
om$Column = 0;
om$Row++;
}
if ( nodeName == 'th' || nodeName == 'td')
om$Column++;
/*if ( om$aTergo && om$CatContent && ( nodeName == 'ul' || nodeName == 'h3' ) )
subNode.style.textAlign = 'right';*/
// test - begin
/*if (
om$aTergo && om$CatContent && nodeName == 'table' &&
(
mw.config.get( 'wgPageName' ) == 'Kategoria:jidysz_(indeks)' ||
mw.config.get( 'wgPageName' ) == 'Kategoria:hebrajski_(indeks)'
)
)
subNode.style.direction = 'rtl';*/
if (
om$aTergo &&
om$CatContent &&
nodeName == 'div' &&
subNode.parentNode.id == 'mw-pages'
)
subNode.className += ' a-tergo';
// rozwala całość if (om$aTergo && om$CatContent && nodeName=='ul' && (mw.config.get('wgPageName')=="Kategoria:jidysz_(indeks)" || mw.config.get('wgPageName')=="Kategoria:hebrajski_(indeks)"))
// subNode.style.marginLeft = '0';
// subNode.style.marginRight = '1.5em';
// test - end
if ( subNode.id == 'mw-pages' && mw.config.get( 'wgNamespaceNumber' ) == 14 )
om$CatContent = 1;
if (
nodeName == 'p' &&
mw.config.get( 'wgNamespaceNumber' ) == 14 &&
subNode.parentNode.id == 'mw-content-text' &&
subNode.previousSibling === null &&
subNode.childNodes.length === 1 &&
subNode.childNodes[ 0 ].nodeName === 'BR'
) {
subNode.parentNode.removeChild( subNode );
j--;
continue;
}
// [[Specjalna:Niezmienny link/4318644#Typografia nazw stron (półpauza)]]
/*if (
om$CatContent &&
nodeName == 'h2' &&
subNode.innerHTML.indexOf( '„' + mw.config.get( 'wgTitle' ) + '”' ) > 0
) {
om$Dasher( $( subNode ), false, true );
}*/
if ( nodeName == 'td' && om$CatContent )
subNode.style.width = '30%';
if ( om$Field == om$TABLE && om$Row == 1 && !om$LangOfColumn[ om$Column ] ) {
var text = subNode.innerHTML;
if ( text == null)
text = subNode.innerText;
if ( text != null ) {
var i = text.indexOf( ' ' );
if ( i >= 0 )
text = text.substring( 0, i );
var iso = om$Lang2Code[ text.toLowerCase() ];
if ( iso )
om$LangOfColumn[ om$Column ] = iso;
}
}
om$LastNodeName = nodeName;
if ( nodeName == 'table' && om$Field != om$SET ) {
var field = om$Field;
var column = om$Column;
var row = om$Row;
var lang = om$LangOfColumn;
om$Field = om$TABLE;
om$Column = 0;
om$Row = 0;
om$LangOfColumn = {};
om$ChangeLinks( subNode );
om$Field = field;
om$Column = column;
om$Row = row;
om$LangOfColumn = lang;
} else if ( nodeName == 'span' && $( subNode ).hasClass( 'set-foreign' ) ) {
//obsługa linków z szablonów zobacz
var field = om$Field;
var arrow = om$ArrowPassed;
var expl = om$ExpliciteBlock;
om$Field = om$FOREIGN;
om$ArrowPassed = 0;
om$ExpliciteBlock = 0;
//rekurencyjne przeszukanie podwęzłów
om$ChangeLinks( subNode );
om$Field = field;
om$ArrowPassed = arrow;
om$ExpliciteBlock = expl;
} else if ( nodeName == 'span' && $( subNode ).hasClass( 'colLanguage' ) ) {
//obsługa szablonu {{język kolumny}}
var text = subNode.getAttribute( 'title' );
if ( ( text + ' ' ).substring( 0, 1 ) == '#' )
om$LangOfColumn[ om$Column ] = text.substring( 1 );
else if ( text != null ) {
var i = text.indexOf( ' ' );
if ( i >= 0 )
text = text.substring( 0, i );
var iso = om$Lang2Code[ text.toLowerCase() ];
if ( iso )
om$LangOfColumn[ om$Column ] = iso;
}
//rekurencyjne przeszukanie podwęzłów
om$ChangeLinks( subNode );
} else if (
nodeName == 'span' &&
$( subNode ).hasClass( 'setRTL' ) &&
!om$sectionLinksProcessed &&
mw.config.get( 'wgCanonicalNamespace' ) == 'Category'
) {
om$aTergo = !om$aTergo;
} else {
//rekurencyjne przeszukanie podwęzłów
om$ChangeLinks( subNode );
}
if (
om$NewClasses &&
om$BlockCSSClasses == 0 &&
nodeName != 'div' &&
nodeName != 'dl' &&
!$( subNode ).hasClass( 'editsection' )
)
$( subNode ).addClass( om$NewClasses );
}
var cont = subNode.nodeValue;
if ( cont != null && nodeName != 'textarea' ) {
var pos = cont.lastIndexOf( '(=' );
if ( pos < 0 )
pos = cont.lastIndexOf( '( =' );
if ( om$ExpliciteBlock == 0 && pos >= 0 && cont.indexOf( ')', pos ) < 0 )
om$ExpliciteBlock = 1;
else if ( om$ExpliciteBlock == 1 && cont.indexOf( ')' ) >= 0 )
om$ExpliciteBlock = 0;
if ( pos < 0 && om$ExpliciteBlock == 0 && cont.indexOf( '=' ) >= 0 )
om$ExpliciteBlock = 2;
if ( subNode.nodeType == 1 )
if ( subNode.getAttribute( 'title' ) == 'zobacz' )
om$ExpliciteBlock = 2;
if ( om$Field != om$EXAMPL && cont.indexOf( '•' ) >= 0 )
if (
cont.indexOf( '→' ) >= 0 &&
cont.indexOf( '•' ) < cont.indexOf( '→' )
)
om$ArrowPassed = 1;
else
om$ArrowPassed = 0;
else if ( cont.indexOf( '→' ) >= 0 )
om$ArrowPassed = 1;
if ( om$Field == om$TRANSL ) {
var i = cont.indexOf( ':' );
if ( i > 0 ) {
var lang = om$Lang2Code[ cont.substring(
cont.charAt( 0 ) === ' ' ? 1 : 0,
i
) ];
if ( lang )
om$TransSection = lang;
}
}
var cont2 = cont.replace( /([0-9])-([0-9])/g, '$1–$2' );
if ( cont2 != cont )
subNode.nodeValue = cont2;
}
}
};
var om$sectionLinksProcessed = false;
function om$sectionLinks() {
om$aTergo = ( ( '----------------' + mw.config.get( 'wgPageName' ) ).substring(
mw.config.get( 'wgPageName' ).length
) == '(indeks_a_tergo)' );
if (
!om$sectionLinksProcessed &&
mw.config.get( 'wgNamespaceNumber' ) >= 0 &&
( ';;;' + mw.config.get( 'wgPageName' ) ).substring( mw.config.get( 'wgPageName' ).length) != '.js' &&
mw.config.get( 'wgNamespaceNumber' ) != 8 && //MediaWiki
(
om$BlockChangeOfInflectionLink == 0 ||
om$BlockChangeSectionLinks == 0 ||
om$BlockCSSClasses == 0
)
) {
om$LocationUrl = mw.format(
mw.config.get( 'wgArticlePath' ),
encodeURIComponent( mw.config.get( 'wgPageName' ).replace( / /g, '_' ) )
.replace( /%2F/ig, '/' )
.replace( /%3A/ig,':' )
);
mw.hook( 'wikipage.content' ).add( function( $content ) {
var om$dbgstart, om$dbgend, om$dbgend2;
try {
om$dbgstart = mw.now();
om$ChangeLinks( $content[ 0 ] );
om$dbgend = mw.now();
/*om$Dasher( $( '#firstHeading' ), false );
$( '.catlinks' ).find( 'a[href*="Kategoria:"]' ).each( function() {
om$Dasher( $( this ), true, true );
} );*/
om$dbgend2 = mw.now();
window.om$dbg1 = om$dbgend - om$dbgstart;
window.om$dbg2 = om$dbgend2 - om$dbgstart;
mw.hook( 'sectionLinks.ready' ).fire( $content );
// prowizorka dla gadżetu enhanced-categories
// TODO: reset wszystkich zmiennych
om$CatContent = 0;
} catch ( e ) {}
om$sectionLinksProcessed = true;
} );
}
};
om$sectionLinks();