MediaWiki:Gadget-section-links.js: Różnice pomiędzy wersjami

Z Wikisłownika – wolnego słownika wielojęzycznego
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 ( om$Field != om$EXAMPL && cont.indexOf( '' ) >= 0 )
if (
if (
/*cont.indexOf(';')>=0 && om$Field!=om$EXAMPL ||*/
cont.indexOf( '' ) >= 0 || cont.indexOf( '■' ) >= 0
cont.indexOf( '' ) >= 0 &&
cont.indexOf( '•' ) < cont.indexOf( '→' )
)
)
if ( cont.indexOf( '→' ) >= 0 )
om$ArrowPassed = ( Math.max(
om$ArrowPassed = 1;
/*(om$Field!=om$EXAMPL ? cont.indexOf(';'):-1),*/
cont.indexOf( '•' ),
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();