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
// <nowiki> /******************************************************************************  * DeleteRequestsTally  * Zählt für Abstimmungen zu Löschenanträgen die Stimmen aus.  *  * Maintainer: Nw520  ******************************************************************************/  mw.hook( 'wikipage.content' ).add( function ( $container ) {  	/** 	 * Selector, which determines whether the script is to be executed. 	 * 	 * @type {string} 	 */ 	var PAGE_WHITELIST = 'body.rootpage-Wikivoyage_Löschanträge';  	/** 	 * If a section's text matches this Regex, this section is considered as starting a new vote. 	 * 	 * @type {RegExp} 	 */ 	var SECTION_TITLE_REGEX = /^Löschantrag vom /;  	/** 	 * Selector of container of the deletion request. 	 * 	 * @type {string} 	 */ 	var TALLY_DELETION_REQUEST_SELECTOR = '.voy-deletion-request';  	/** 	 * Selector of output element for delete-votes. 	 * 	 * @type {string} 	 */ 	var TALLY_DELETE_SELECTOR = '.voy-deletion-request-voting-result-pro';  	/** 	 * Selector of output element for keep-votes. 	 * 	 * @type {string} 	 */ 	var TALLY_KEEP_SELECTOR = '.voy-deletion-request-voting-result-contra';  	/** 	 * Selector of delete-vote. 	 * 	 * @type {string} 	 */ 	var VOTE_DELETE_SELECTOR = '.voy-voting-deletion-delete';  	/** 	 * Selector of keep-vote. 	 * 	 * @type {string} 	 */ 	var VOTE_KEEP_SELECTOR = '.voy-voting-deletion-keep';  	function main() { 		// Page whitelisted? 		if ( !document.body.matches( PAGE_WHITELIST ) ) { 			return; 		}  		// Count per section 		/** @type {HTMLElement} */ 		var container = null; 		/** @type {number} */ 		var countDelete = null; 		/** @type {number} */ 		var countDeleteRetracted = null; 		/** @type {number} */ 		var countKeep = null; 		/** @type {number} */ 		var countKeepRetracted = null; 		/** @type {HTMLElement} */ 		var tallyDelete = null; 		/** @type {HTMLElement} */ 		var tallyKeep = null;  		var elements = $container[ 0 ].querySelectorAll( [ 'h2', 'h3', TALLY_DELETION_REQUEST_SELECTOR, TALLY_DELETE_SELECTOR, TALLY_KEEP_SELECTOR, VOTE_DELETE_SELECTOR, VOTE_KEEP_SELECTOR ].join( ',' ) );  		for ( var i = 0; i < elements.length; i++ ) { 			var element = elements[ i ]; 			if ( element.matches( 'h2, h3' ) && SECTION_TITLE_REGEX.test( element.innerText ) ) { 				// Start of section, emit… 				emitTally( countDelete, countKeep, countDeleteRetracted, countKeepRetracted, container, tallyDelete, tallyKeep ); 				// …and reset 				countDelete = 0; 				countDeleteRetracted = 0; 				countKeep = 0; 				countKeepRetracted = 0; 				tallyDelete = null; 				tallyKeep = null; 			} else if ( element.matches( TALLY_DELETION_REQUEST_SELECTOR ) ) { 				// Deletion request container 				container = element; 			} else if ( element.matches( TALLY_DELETE_SELECTOR ) ) { 				// Tally delete 				tallyDelete = element; 			} else if ( element.matches( TALLY_KEEP_SELECTOR ) ) { 				// Tally keep 				tallyKeep = element; 			} else if ( element.matches( VOTE_DELETE_SELECTOR ) ) { 				// Vote delete 				if ( countDelete === null ) { 					throw new Error( 'Found vote before start of section' ); 				} 				if ( element.closest( 'del, s' ) === null ) { 					countDelete++; 				} else { 					countDeleteRetracted++; 				} 			} else if ( element.matches( VOTE_KEEP_SELECTOR ) ) { 				// Vote keep 				if ( countKeep === null ) { 					throw new Error( 'Found vote before start of section' ); 				} 				if ( element.closest( 'del, s' ) === null ) { 					countKeep++; 				} else { 					countKeepRetracted++; 				} 			} 		}  		// No votes and sections left, final emit 		emitTally( countDelete, countKeep, countDeleteRetracted, countKeepRetracted, container, tallyDelete, tallyKeep ); 	}  	/** 	 * Outputs the tally result. 	 * 	 * @param {number} countDelete Number of delete votes. 	 * @param {number} countKeep Number of keep votes. 	 * @param {number} countDeleteRetracted Number of retracted delete votes. 	 * @param {number} countKeepRetracted Number of retracted keep votes. 	 * @param {HTMLElement} container Container of the deletion request. 	 * @param {HTMLElement} tallyDelete Element whose value is to be set to the number of delete-votes. 	 * @param {HTMLElement} tallyKeep Element whose value is to be set to the number of keep-votes. 	 * @return {boolean} 	 */ 	function emitTally( countDelete, countKeep, countDeleteRetracted, countKeepRetracted, container, tallyDelete, tallyKeep ) { 		if ( countDelete === null && countKeep === null ) { 			// Didn't encounter first section yet 			return false; 		} 		if ( tallyDelete === null || tallyKeep === null ) { 			// Illegal state: Found votes but not elements for tally output 			throw new Error( 'No tally output elements found.' ); 		}  		tallyDelete.dataset.tally = String( countDelete ); 		tallyDelete.dataset.tallyRetracted = String( countDeleteRetracted ); 		tallyDelete.innerText = String( countDelete );  		tallyKeep.dataset.tally = String( countKeep ); 		tallyKeep.dataset.tallyRetracted = String( countKeepRetracted ); 		tallyKeep.innerText = String( countKeep ); 		 		if ( container !== null ) { 			container.dataset.tallyDelete = String( countDelete ); 			container.dataset.tallyDeleteRetracted = String( countDeleteRetracted ); 			container.dataset.tallyKeep = String( countKeep ); 			container.dataset.tallyKeepRetracted = String( countKeepRetracted ); 			container.dataset.tallyTotal = String( countDelete + countKeep ); 			container.dataset.tallyRetracted = String( countDeleteRetracted + countKeepRetracted ); 			container.dataset.tallyTotalPlusRetracted = String( countDelete + countKeep + countDeleteRetracted + countKeepRetracted ); 			container.dataset.tallyMajority = countDelete === countKeep ? 'tie' : ( countDelete > countKeep ? 'delete' : 'keep' ); 		}  		return true; 	}  	main(); } ); // </nowiki>