Benutzer:TMg/filterContributions.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
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
/**
 * Blendet zusätzliche Filter auf Spezialseiten ein, u. a. zum Ausblenden von Benutzerbeiträgen, bei denen der
 * jüngste noch/nicht mehr „aktuell“ ist. Eine ausführliche Beschreibung ist auf der Diskussionsseite zu finden.
 */
var filterContributionsTimeout;
( function ( mw ) {
	var page = mw.config.get( 'wgPageName' );
	if ( !mw.config.get( 'wgIsArticle' ) ) {
		page = mw.config.get( 'wgCanonicalSpecialPageName' ) || mw.config.get( 'wgAction' );
	} else if ( page !== 'Global_sysops/Speedy_delete_requests' ) {
		return;
	}

	var content = document.getElementById( 'mw-content-text' );
	var list = content.getElementsByTagName( 'LI' );
	var e = content.getElementsByClassName( 'mw-pager-navigation-bar' )[ 0 ];

	/**
	 * @param {string} s
	 * @return {string}
	 */
	function escapeRE( s ) {
		return s.replace( /([$()*+\-.?[\\\]^{|}])/g, '\\$1' );
	}

	/**
	 * @param {string} s
	 * @return {boolean}
	 */
	function containsRegExpSymbols( s ) {
		return escapeRE( s ) !== s;
	}

	/**
	 * @param {Element} e
	 * @param {string} text
	 * @param {Function} [fn]
	 * @param {string} [value]
	 * @param {string} [title]
	 * @return {Element}
	 */
	function appendCheckbox( e, text, fn, value, title ) {
		var a = document.createElement( 'INPUT' );
		a.type = 'checkbox';
		a.checked = true;
		if ( fn ) {
			a.onclick = function () {
				fn( list, this.checked ? '' : 'none', this.value );
			};
		}
		a.value = value || '';
		var b = document.createElement( 'LABEL' );
		b.style.cursor = 'pointer';
		b.style.whiteSpace = 'nowrap';
		b.appendChild( a );
		b.appendChild( document.createTextNode( ' ' + text ) );
		b.title = title || '';
		e.appendChild( document.createTextNode( e.nodeName === 'FIELDSET' ? ' | ' : ' ' ) );
		e.appendChild( b );
		return a;
	}

	/**
	 * @param {Element} e
	 * @param {Function} [fn]
	 */
	function appendFilter( e, fn ) {
		var a = document.createElement( 'INPUT' );
		a.size = 10;
		a.placeholder = 'Filter';
		a.id = 'filterContributionsFilter';
		a.className = 'noime';
		a.onkeyup = function () {
			if ( filterContributionsTimeout ) {
				window.clearTimeout( filterContributionsTimeout );
			}

			filterContributionsTimeout = window.setTimeout( function () {
				var b = document.getElementById( 'filterContributionsFilter' ), v = b.value, re;
				try {
					re = new RegExp( v, containsRegExpSymbols( v ) ? '' : 'i' );
				} catch ( ex ) {
					re = new RegExp( escapeRE( v ), 'i' );
				}
				var min = v.charAt() === '>' ? v.replace( /k/i, '000' ).replace( /\D+/g, '' ) | 0 : 0;
				var max = v.charAt() === '<' ? v.replace( /k/i, '000' ).replace( /\D+/g, '' ) | 0 : 0;
				var n = 0, top, e = list;
				if ( !e || !e.length ) {
					e = content.getElementsByTagName( 'TR' );
				}
				for ( var i = e.length; i--; ) {
					var links = e[ i ].getElementsByTagName( 'A' );
					var d = ( links.length && re.test( links[ 0 ].title ) ) ||
						( fn && fn( e[ i ], re, min, max ) );
					if ( d && e[ i ].nodeName === 'TR' ) {
						var a = e[ i ].getElementsByTagName( 'TD' );
						if ( a.length > 2 && /\bmw-enhanced-rc-nested\b/.test( a[ 2 ].className ) ) {
							top = e[ i ].previousSibling;
							while ( top.previousSibling ) {
								top = top.previousSibling;
							}
						}
					}
					e[ i ].style.display = d || e[ i ] === top ? '' : 'none';
					if ( d ) {
						n++;
					}
				}
				b.title = n + '/' + e.length;
			}, 200 );
		};
		var b = document.createElement( 'LABEL' );
		b.style.whiteSpace = 'nowrap';
		b.appendChild( document.createTextNode( 'Filter: ' ) );
		b.title = 'Suchbegriff, regulärer Ausdruck oder Zahlenbereich wie z.B. <10';
		b.appendChild( a );
		e.appendChild( document.createTextNode( ' ' ) );
		e.appendChild( b );
	}

	/**
	 * @param {Element} e
	 * @param {RegExp} [re]
	 * @param {number} [min]]
	 * @param {number} [max]
	 */
	function changeslistFilter( e, re, min, max ) {
		var c = e.getElementsByClassName( 'mw-userlink' );
		if ( c.length && re.test( c[ 0 ].textContent || c[ 0 ].innerText ) ) {
			return true;
		}
		c = e.getElementsByClassName( 'comment' );
		if ( c.length && re.test( c[ 0 ].textContent || c[ 0 ].innerText ) ) {
			return true;
		}
		if ( min || max ) {
			c = e.getElementsByClassName( 'mw-plusminus-pos' );
			if ( !c.length ) {
				c = e.getElementsByClassName( 'mw-plusminus-neg' );
			}
			if ( c.length ) {
				var plusminus = c[ 0 ].firstChild.data.replace( /\D+/g, '' ) | 0;
				return ( min && plusminus > min ) || plusminus < max;
			}
		}
		return false;
	}

	switch ( page ) {
		case 'Contributions':
			if ( list.length <= 1 ) {
				return;
			}

			appendFilter( e, changeslistFilter );
			var fn = function ( e, d, v ) {
				for ( var i = 0; i < e.length; i++ ) {
					var abbrs = e[ i ].getElementsByTagName( 'ABBR' );
					if ( abbrs.length && abbrs[ 0 ].className === v ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'K', fn, 'minoredit', 'Kleine Änderungen anzeigen' );
			appendCheckbox( e, 'N', fn, 'newpage', 'Neue Seiten anzeigen' );
			fn = function ( e, d, v ) {
				var top = [], val = !v;
				for ( var i = 0; i < e.length; i++ ) {
					var t = e[ i ].getElementsByTagName( 'A' )[ 0 ].title;
					if ( e[ i ].getElementsByClassName( 'mw-uctop' ).length ) {
						top[ t ] = true;
					}
					if ( val === !top[ t ] ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Aktuell', fn, '1', 'Aktuelle Beiträge anzeigen' );
			appendCheckbox( e, 'Geänderte Beiträge anzeigen', fn, '', 'Inzwischen weiter bearbeitete Beiträge anzeigen' );
			break;

		case 'history':
			e = content.getElementsByTagName( 'FIELDSET' );
			if ( !e.length ) {
				return;
			}

			list = document.getElementById( 'pagehistory' ).getElementsByTagName( 'LI' );
			appendFilter( e[e.length - 1], changeslistFilter );
			break;

		case 'Log':
			if ( list.length <= 1 ) {
				return;
			}
			e = content.getElementsByTagName( 'FORM' );
			if ( !e.length ) {
				return;
			}

			fn = function ( e, d, v ) {
				var re = new RegExp( v );
				for ( var i = e.length; i--; ) {
					if ( re.test( e[ i ].lastChild.data ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e[e.length - 1], 'Lokale Benutzerkonten', fn, '^ *(\\w+ ){2} *$' );
			appendCheckbox( e[e.length - 1], 'SUL-Benutzerkonten', fn, '^ *(\\w+ ){1,2}a' );
			break;

		case 'Longpages':
			appendCheckbox( e, 'Listen anzeigen', function ( e, d ) {
				var re = /\bListe_/;
				for ( var i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].href ) ) {
						e[ i ].style.display = d;
					}
				}
			} );
			break;

		case 'Mostlinked':
			appendFilter( e );
			fn = function ( e, d, v ) {
				var ns = mw.config.get( 'wgFormattedNamespaces' ), re = '';
				for ( var i in ns ) {
					if ( i ) {
						re += ( re ? '|' : '' ) + ns[ i ];
					}
				}
				re = new RegExp( '^(?' + v + '(?:' + re + '):)' );
				for ( i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].title ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Artikel anzeigen', fn, '!' );
			appendCheckbox( e, 'Projektnamensräume anzeigen', fn, '=' );
			break;

		case 'Mostlinkedtemplates':
		case 'Wantedpages':
		case 'Wantedtemplates':
			appendFilter( e );
			fn = function ( e, d, v ) {
				re = new RegExp( '^' + v + ':' );
				for ( i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].title ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Vorlagen anzeigen', fn, 'Vorlage' );
			appendCheckbox( e, 'Module anzeigen', fn, 'Modul' );
			break;

		case 'Prefixindex':
			e = content.getElementsByTagName( 'FORM' );
			if ( !e.length ) {
				return;
			}

			appendCheckbox( e[e.length - 1], 'Unterseiten anzeigen' ).onclick = function () {
				var e = document.getElementsByClassName( 'mw-prefixindex-list' )[ 0 ].getElementsByTagName( 'LI' );
				var d = this.checked ? '' : 'none';
				for ( var i = e.length; i--; ) {
					if ( e[ i ].getElementsByTagName( 'A' )[ 0 ].title.indexOf( '/' ) > 0 ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e[e.length - 1], 'Alles außer Weiterleitungen' ).onclick = function () {
				var e = document.getElementsByClassName( 'mw-prefixindex-list' )[ 0 ].getElementsByTagName( 'LI' );
				var d = this.checked ? '' : 'none';
				for ( var i = e.length; i--; ) {
					if ( !e[ i ].getElementsByClassName( 'allpagesredirect' ).length ) {
						e[ i ].style.display = d;
					}
				}
			};
			break;

		case 'Global_sysops/Speedy_delete_requests':
			e = document.getElementsByClassName( 'mw-heading' )[ 0 ];
			list = document.getElementsByClassName( 'wikitable' )[ 0 ];
			appendFilter( e, function ( e, re, min, max ) {
				var cells = e.getElementsByTagName( 'TD' );
				if ( cells.length < 2 || re.test( cells[ 0 ].textContent ) ) {
					return true;
				}
				if ( min || max ) {
					var sysops = cells[ 1 ].textContent.replace( /\D+/g, '' ) | 0;
					return ( min && sysops > min ) || sysops < max;
				}
				return false;
			} );
			break;

		case 'Unusedtemplates':
			appendFilter( e );
			fn = function ( e, d, v ) {
				var re = new RegExp( '\\bVorlage:[^/]*/' + v );
				for ( var i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].href ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Unterseiten anzeigen', fn );
			appendCheckbox( e, 'Doku-Unterseiten anzeigen', fn,
				'(?:Doku|Editnotice|Meta|Test|Wartung|XML)\\b',
				'Einschließlich /Editnotice, /Meta, /Test, /Wartung und /XML' );
			break;

		case 'Wantedfiles':
			appendCheckbox( e, 'Commons-Dateien anzeigen', function ( e, d ) {
				for ( var i = e.length; i--; ) {
					if ( e[ i ].getElementsByTagName( 'DEL' ).length ) {
						e[ i ].style.display = d;
					}
				}
			} );
			fn = function ( e, d, v ) {
				var re = new RegExp( '\\.(?:' + v + ')$', 'i' );
				for ( var i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].href ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Pixelgrafiken anzeigen', fn, 'gif|jpe?g|png', 'JPG/JPEG, PNG und GIF' );
			appendCheckbox( e, 'Vektorgrafiken anzeigen', fn, 'svg', 'SVG' );
			break;

		case 'Watchlist':
			e = document.getElementById( 'mw-watchlist-options' );
			if ( !e ) {
				return;
			}

			appendFilter( e, changeslistFilter );
			fn = function ( e, d ) {
				var re = new RegExp( '(Bezeichnung|Beschreibung|Alias).* \\[(?!' + mw.config.get( 'wgUserLanguage' ) + '\\])' );

				for ( var i = e.length; i--; ) {
					if ( /\bmw-changeslist-src-mw-wikibase(\s|$)/.test( e[ i ].className ) ) {
						var comment = e[ i ].getElementsByClassName( 'comment' ),
							autoComment = e[ i ].getElementsByClassName( 'autocomment' );

						if ( autoComment.length && re.test( autoComment[ 0 ].firstChild.data )
							|| comment.length && /^\(Sprachlink/.test( comment[ 0 ].firstChild.data )
						) {
							e[ i ].style.display = d;
						}
					}
				}
			};
			if ( content.getElementsByClassName( 'mw-changeslist' )[ 0 ].getElementsByClassName( 'mw-changeslist-src-mw-wikibase' ).length ) {
				appendCheckbox( e, 'Fremdsprachen', fn );
			}
			break;

		case 'Whatlinkshere':
			e = document.getElementById( 'mw-htmlform-whatlinkshere-filter' );
			if ( !e ) {
				return;
			}

			fn = function ( e, d, v ) {
				var ns = mw.config.get( 'wgFormattedNamespaces' ), re = '/(';
				for ( var i in ns ) {
					if ( i > 0 && i % 2 ) {
						re += ( i > 1 ? '|' : '' ) + mw.util.wikiUrlencode( ns[ i ] );
					}
				}
				re = new RegExp( v || ( re + '):' ) );
				e = document.getElementById( 'mw-whatlinkshere-list' ).getElementsByTagName( 'LI' );
				for ( i = e.length; i--; ) {
					if ( re.test( e[ i ].getElementsByTagName( 'A' )[ 0 ].href ) ) {
						e[ i ].style.display = d;
					}
				}
			};
			appendCheckbox( e, 'Diskussionsseiten anzeigen', fn, null, 'Diskussionsseiten in allen Namensräumen' );
			appendCheckbox( e, 'Unterseiten anzeigen', fn, '(?:/wiki/|title=)[^/&]*/' );
			appendCheckbox( e, 'CSS/JS', fn, '\\.(?:css|js)\\b', 'Seiten mit der Endung .css oder .js' );
			break;
	}
} )( mediaWiki );