Gebruiker:Strepulah/kamerledenlijst-sorteerbaar.js

Uit Wikipedia, de vrije encyclopedie

Opmerking: nadat u de wijzigingen hebt gepubliceerd is het wellicht nodig uw browsercache te legen.

  • Firefox / Safari: houd Shift ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
  • Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
  • Internet Explorer / Edge: houd Ctrl ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5
  • Opera: druk op Ctrl-F5.
/**
 * Voor artikelen zoals in [[:Categorie:Lijsten van Tweede Kamerleden naar partij]].
 * Voeg een knop toe aan de wikiteksteditor (onder "Geavanceerde functies")
 * waarmee lijsten van Nederlandse Kamerleden geformatteerd kunnen worden.
 */

// Alleen op "Lijst van"-bewerkingspagina's
if (
	[ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 &&
	mw.config.get( 'wgPageName' ).indexOf( 'Lijst_van' ) === 0
) {
	
	// Voeg knop toe aan toolbar
	mw.hook( 'wikiEditor.toolbarReady' ).add( function ( $textarea ) {
		$textarea.wikiEditor( 'addToToolbar', {
			section: 'advanced',
			group: 'format',
			tools: {
				formatter: {
					label: 'Kamerledentabel',
					type: 'button',
					oouiIcon: 'robot',
					action: {
						type: 'callback',
						execute: formatTable
					}
				}
			}
		} );
	} );
}


/**
 * Formatteer de tabel met Kamerleden. Maak sorteerbaar. Wijzig namen van
 * Kamerleden in artikelnamen. Splits de Periode-kolom op in een Begindatum- en
 * Einddatum-kolom.
 * @param  {object}		context
 * @return {undefined}
 */
var formatTable = function ( context ) {
	var text = context.$textarea.val();
	
	// Maak tabel sorteerbaar
	text = text.replace(/wikitable(?! sortable)( vatop)?/g, 'wikitable sortable');
	
	// Tabelkopjes toevoegen
	text = text.replace(/! *([^!]+?) *!! *Periode/g, '! $1 !! Begindatum !! Einddatum');
	
	// Verwijder witruimte
	text = text.replace(/ +(<ref|<br)/g, '$1');
	text = text.replace(/(<\/ref>) +(\d\d\-)/g, '$1$2');
	text = text.replace(/\n\|\- \n/g, '\n\|\-\n');

	// Wijzig datums in formaat jjjj-mm-dd naar dd-mm-jjjj
	text = text.replace(/([^=] *)(\d\d\d\d)-(\d\d)-(\d\d)/g, '$1$4-$3-$2');
	
	// Verwijder 'vanaf' voor begindatums en plaats er een lege tabelcel achter
	text = text.replace(/vanaf (\d\d?\-.+)(\n\|\-)/g, '$1\n| $2');

	// Vervang <br />'s door nieuwe tabelregel
	text = text.replace(/ *<br *\/?>\s*(\d)/g, '\n|-\n| $1');

	// Vervang newlines door nieuwe tabelregel
	text = text.replace(/(\d\d?\-\d\d?\-\d\d\d\d) *(.*)\n(\d\d?\-\d\d?)/g, '$1$2\n|-\n| $3');

	// Refs niet voor maar na datums
	text = text.replace(/(<ref.+(\/ref>|\/>))(\d\d?\-\d\d?\-\d\d\d\d)/g, '$3$1');

	// Vervang 't/m' door nieuwe tabelcel
	text = text.replace(/(\| *\d\d?\-\d\d?\-\d\d\d\d(<ref.+(\/ref>|\/>))?) *t\/m (\d\d?\-)/g, '$1\n| $4');

	// Spatie voor cel
	text = text.replace(/\n\|([^ }-])/g, '\n| $1');

	// Voeg aaneengesloten perioden samen
	text = mergePeriods(text);
	
	// Voeg rowspans toe aan Naam-kolom
	text = addRowspans(text);
	
	// Wijzig de opmaak van namen van Kamerleden
	text = formatNames(text);

	// Formatteer datums
	text = formatDates(text);
	
	// Pas wijzigingen toe
	context.$textarea.val(text);
};


/**
 * Voeg rowspans toe aan Naam-kolom voor leden met 2 of meer perioden.
 * @param  {string}	text
 * @return {string}
 */
var addRowspans = function ( text ) {
	var memberRows = text.match(/\| *(''')?('')?(\[\[|\{\{)[\s\S]+?((?=\| *(''')?('')?(\[\[|\{\{))|\n\|})/g);
	
	for (var i = 0; i < memberRows.length; i++) {
		// Aantal tabelregels voor datums is aantal periodes
		var periods = (memberRows[i].match(/\n\|[-}]/g) || []).length;
		
		if ((memberRows[i].match(/vanaf \d\d\-/g) || []).length == 1) {
			periods++;
		}
		
		if (periods >= 2) {
			text = text.replace(memberRows[i], '| rowspan="' + periods + '" ' + memberRows[i]);
		}
	}

	return text;
};


/**
 * Wijzig hoe de namen van Kamerleden worden getoond en maak ze sorteerbaar.
 * @param  {string}	text
 * @return {string}
 */
var formatNames = function ( text ) {
	// Namen van zittende Kamerleden niet meer schuin- of dikgedrukt
	text = text.replace(/\| *'''(?:'')?(\[\[[^\]]+\]\])(?:'')?'''/g, '| $1');
	
	// Namen van Kamerleden als artikelnamen
	text = text.replace(/\| *\[\[(?!Bestand:|File:)([^\]|]+[^)])\|[^\]]+\]\]/g, '| [[$1]]');
	text = text.replace(/\| *\[\[(?!Bestand:|File:)([^\]|]+) (\([^)]+\))\|[^\]]+\]\]/g, '| [[$1 $2|$1]]');

	// Maak namen sorteerbaar
	text = text.replace(/\| *\[\[(?!Bestand:|File:)([^\]|( ]+)( [Jv]an| [td]e\w?| van de\w?)? ([^\]|( ]+)\]\]/g, '| {{SortNaam|$1$2|$3}}');
	text = text.replace(/\| *\[\[(?!Bestand:|File:)([^|]+)\|([^\]|( ]+)( [Jv]an| [td]e\w?| van de\w?)? ([^\]|( ]+)\]\]/g, '| {{SortNaam|$2$3|$4|$1}}');
	text = text.replace(/\| *\[\[(?!Bestand:|File:)([^\]|( ]+) ([^\]|( ]+)(-[JVv]an|-[tdTD]e\w?|-[Vv]an de\w?) ([^\]|( ]+)\]\]/g, '| {{SortNaam|$1|$2$3 $4}}');

	return text;
};


/**
 * Voeg aaneengesloten perioden samen.
 * @param  {string}	text
 * @return {string}
 */
var mergePeriods = function ( text ) {
	var memberRows = text.match(/\| *(''')?('')?(\[\[|\{\{)[\s\S]+?((?=\| *(''')?('')?(\[\[|\{\{))|\n\|})/g);

	// Voor elk Kamerlid...
	for (var i = 0; i < memberRows.length; i++) {
		var dates = memberRows[i].match(/\d\d?\-\d\d?\-\d\d\d\d/g) || [];

		// Voor elke einddatum...
		for (var j = 1; j < dates.length; j = j + 2) {
			if (dates[j + 1]) {
				var endParts = dates[j].split('-');
				var startParts = dates[j + 1].split('-');
				var end = new Date(endParts[2], endParts[1] - 1, endParts[0]);
				var start = new Date(startParts[2], startParts[1] - 1, startParts[0]);

				// Als het verschil kleiner is dan 2 dagen, samenvoegen
				if (Math.round(start.getTime() - end.getTime()) / 86400000 <= 2) {
					text = text.replace("\n| " + dates[j] + "\n|-\n| " + dates[j + 1], '');
				}
			}
		}
	}

	return text;
};


/**
 * Formatteer de datums van formaat 01-01-2000 naar 1 januari 2000.
 * @param  {string}	text
 * @return {string}
 */
var formatDates = function ( text ) {
	var options = { day: "numeric", month: "long", year: "numeric" };
	var datesReplacer = function (match, day, month, year) {
		var date = new Date(year + "-" + month + "-" + day);
		return "| " + date.toLocaleDateString('nl', options);
	};
	
	return text.replace(/\| (\d\d?)\-(\d\d?)\-(\d\d\d\d)/g, datesReplacer);
};