Benutzer:MatthiasDD/ts diagnosis.js
aus Wikipedia, der freien Enzyklopädie
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
// Diagnose sortierbarer Tabellen
//
// Nach rechts-Klick auf den Tabellenkopf wird die Sortierfunktion und alle Sortierschlüssel angezeigt,
// wenn angegeben erscheint oben das Attribut 'data-sort-type' mit Wert.
// Danach wird als Tooltip für jede Zelle einzeln die Sortierfunktion und der daraus folgende Sortierschlüssel angezeigt.
// This script uses code from MediaWiki 1.34.0-wmf.13
// https://phabricator.wikimedia.org/source/mediawiki/browse/master/resources/src/jquery.tablesorter/jquery.tablesorter.js
// last change: 2019-07-05 Update eslint-config-wikimedia to 0.13.0
//
( function () {
// Nachdem der tablesorter geladen ist, müssen alle sortierbaren Tabellen noch initialisiert werden (mediawiki.page.ready.js)
// deshalb startet diese Initialisierung hier verzögert.
mw.loader.using( "jquery.tablesorter", function(){ setTimeout( ts_diagnosis_init, 500 ); } );
function ts_diagnosis_init() {
if( $('table.sortable').length ){
//tablesorter.construct() muss vorher ausgeführt sein!
if( $('table.jquery-tablesorter').length ){
//jede sortierbare Tabelle bearbeiten
construct( $('table.sortable') );
}else{
console.log("ts_diagnosis.js not initialised.");
}
}
}
function getElementSortKey( node ) {
// Get data-sort-value attribute. Uses jQuery to allow live value
// changes from other code paths via data(), which reside only in jQuery.
// Must use $().data() instead of $.data(), as the latter *only*
// accesses the live values, without reading HTML5 attribs first (T40152).
var data = $( node ).data( 'sortValue' );
if ( data !== null && data !== undefined ) {
// Cast any numbers or other stuff to a string, methods
// like charAt, toLowerCase and split are expected.
return String( data );
}
if ( node.tagName.toLowerCase() === 'img' ) {
return node.alt;
}
// Iterate the NodeList (not an array).
// Also uses null-return as filter in the same pass.
// eslint-disable-next-line no-jquery/no-map-util
return $.map( node.childNodes, function ( elem ) {
if ( elem.nodeType === Node.ELEMENT_NODE ) {
// eslint-disable-next-line no-jquery/no-class-state
if ( $( elem ).hasClass( 'reference' ) ) {
return null;
}
return getElementSortKey( elem );
}
if ( elem.nodeType === Node.TEXT_NODE ) {
return elem.textContent;
}
// Ignore other node types, such as HTML comments.
return null;
} ).join( '' );
}
//neu: ähnlich wie detectParserForColumn()
function detectParserForCell(table, rows, rowIndex, cellIndex){
var parsers = $.tablesorter.getParsers(),
l = parsers.length,
nodeValue,
i = 1;
if ( rows[ rowIndex ] && rows[ rowIndex ].cells[ cellIndex ] ) {
nodeValue = $.trim( getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ) );
} else {
nodeValue = '';
}
while ( i < l ){
if ( nodeValue !== '' ){
if ( parsers[i].is( nodeValue, table ) ){
return parsers[i]; // Confirmed the parser, let's return it
} else {
i++; // Check next parser
}
}
else { return parsers[0]; } // Empty cell
}
// 0 is always the generic parser (text)
return parsers[0];
}
//neu: ähnlich wie buildCache()
function addTitleTags( table ) {
var i, j, $row,
totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length) || 0,
cellsInRow,
config = $( table ).data( 'tablesorter' ).config,
$node, out, data, cellParser; // extra Variable
for ( i = 0; i < totalRows; ++i ) {
$row = $( table.tBodies[0].rows[i] ) ;
// if this is a child row, add it to the last row's children and
// continue to the next row
if ( $row.hasClass( config.cssChildRow ) ) {
continue;
}
cellsInRow = ( $row.cells.length ) || 0; //all cells in this row
for ( j = 0; j < cellsInRow; ++j ) {
$node = $row.cells[j];
// wenn vorhanden, für jede Zelle das Attribut data-sort-value anzeigen
data = $node.attr( 'data-sort-value' );
if ( data !== undefined ) {
out = "data-sort-value = \"" +data +"\"\n";
} else {
out = "";
}
// für jede Zelle den Parser ermitteln
cellParser = detectParserForCell( table, table.tBodies[0].rows, i, j );
// die Parser.id und den vom Parser ermittelten Sortiertext anzeigen
out += cellParser.id+": "+cellParser.format( getElementSortKey( row.cells[j] ) );
//von explodeRowspans() angelegter Index
//if ( $node.data( 'tablesorter' ) ) {
// out += ", realCellIndex: " +$node.data( 'tablesorter' ).realCellIndex;
//}
// dem Attribut title zuordnen
$node.attr( 'title', out );
}
}
}
//end neu geschrieben
/* Other utility functions */
function buildCache( table ) {
var i, j, $row, cols,
totalRows = ( table.tBodies[ 0 ] && table.tBodies[ 0 ].rows.length ) || 0,
config = $( table ).data( 'tablesorter' ).config,
parsers = config.parsers,
len = parsers.length,
cellIndex,
cache = {
row: [],
normalized: []
};
for ( i = 0; i < totalRows; i++ ) {
// Add the table data to main data array
$row = $( table.tBodies[ 0 ].rows[ i ] );
cols = [];
// if this is a child row, add it to the last row's children and
// continue to the next row
// eslint-disable-next-line no-jquery/no-class-state
if ( $row.hasClass( config.cssChildRow ) ) {
cache.row[ cache.row.length - 1 ] = cache.row[ cache.row.length - 1 ].add( $row );
// go to the next for loop
continue;
}
cache.row.push( $row );
for ( j = 0; j < len; j++ ) {
cellIndex = $row.data( 'columnToCell' )[ j ];
cols.push( parsers[ j ].format( getElementSortKey( $row[ 0 ].cells[ cellIndex ] ) ) );
}
cols.push( cache.normalized.length ); // add position for rowCache
cache.normalized.push( cols );
cols = null;
}
return cache;
}
//
//...
//
//neu: Initialisierung der Diagnose
/**
* @param {jQuery} $tables
*/
function construct( $tables ) {
return $tables.each( function ( i, table ) {
// Declare and cache.
var cache, config,
$table = $( table ),
firstTime = true;
// Quit if no tbody
if ( !table.tBodies ) {
return
}
// Read the settings from tablesorter
config = $.data( table, 'tablesorter').config;
//Erweitere Event 'mousedown' für sortierbare header
$table.find( '.' + config.cssHeader ).on( 'mousedown', function (e) {
// Rechtsklick:
if ( e.button==2 ) {
//Beim ersten Klick muß 'config.parsers' ermittelt werden
if ( firstTime ) {
firstTime = false;
if ( !config.parsers.length ) {
//Diagnose is started before sorting.
//sort() without sortList does noting, but call tablesorter's
//setupForFirstSort() and config.parsers = buildParserCache()
$table.data( 'tablesorter' ).sort();
}
addTitleTags(table);
}
//Für diese Spalte die Parser.id und die Sortierwerte im alert()-Fenster anzeigen
var cell = this,
$cell = $( cell ),
j = config.headerToColumns[ $cell.data( 'headerIndex' ) ],
//j = $cell.data( 'headerIndex' ),
// Index of first column belonging to this header
//j = columns[0],
out = "", k,
//aus BuildParserCache() (hier j)
parser = false,
sortType = $cell.data('sortType');
if ( sortType !== undefined ) {
out += "data-sort-type = \"" +sortType +"\"\n";
}
//erst wenn TH.'click' setupForFirstSort() aufgerufen hat ist parsers gefüllt
if ( config.parsers.length ) {
out += "Parser: " + config.parsers[ j[0] ].id;
for ( k = 1; k < j.length; k++ ) {
out += " | " + config.parsers[ j[k] ].id;
}
out += "\n\n";
cache = buildCache( table, config.parsers );
var totalRows = cache.normalized.length;
for ( i = 0; i < totalRows; i++ ) {
out += cache.normalized[ i ][ j[0] ];
for ( k = 1; k < j.length; k++ ) {
out += "\t" + cache.normalized[ i ][ j[k] ];
}
out += "\n"
}
} else {
out += 'setupForFirstSort() has config.parsers not set.';
}
alert(out);
}
}); //.on
});
} //end construct
//
//...
//
}() );