MediaWiki:Gadget-term-num.js

Z Wikisłownika – wolnego słownika wielojęzycznego

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.
/**
 * Zamiana łącznika na półpauzę w zakresach i owijanie w <span class="term-num">.
 * 
 * Zmierzony narzut czasowy na stronie [[Uganda]] (FF 75.0): ~16 ms. Dwukrotnie
 * wydajniejsze rozwiązanie od iterowania po węzłach za pomocą pętli.
 */

// https://regex101.com/r/v7tm5S/2/
var reNum = /\((?:(?:\d+|\d+-\d+|\d+\.\d+(?:-\d+)?)(?:, *)?)+\)/,
	reDash = /([0-9])-([0-9])/g;

mw.hook( 'wikipage.content' ).add( function ( $content ) {
	var num, text, span, index,
		walker = document.createTreeWalker(
			$content.find( '.mw-parser-output' )[ 0 ],
			NodeFilter.SHOW_TEXT,
			function ( node ) {
				return reNum.test( node.nodeValue )
					? NodeFilter.FILTER_ACCEPT
					: NodeFilter.FILTER_REJECT;
			}
		);

	while ( walker.nextNode() ) {
		num = walker.currentNode.nodeValue.match( reNum )[ 0 ];
		
		text = document.createTextNode( num.replace( reDash, '$1–$2' ) );
		span = document.createElement( 'span' );
		span.className = 'term-num';
		span.appendChild( text );
		
		if ( walker.currentNode.nodeValue !== num ) {
			index = walker.currentNode.nodeValue.indexOf( num );
			
			if ( index !== 0 ) {
				walker.currentNode = walker.currentNode.splitText( index );
			}
			
			walker.currentNode.splitText( num.length );
		}
		
		walker.currentNode.parentNode.replaceChild( span, walker.currentNode );
		walker.currentNode = text;
	}
} );