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>