Gebruiker:Strepulah/kamerledenlijst-sorteerbaar.js
Uiterlijk
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);
};