Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Find all header rows in a thead-less table and put them in a <thead> tag.
- * This only treats a row as a header row if it contains only <th>s (no <td>s)
- * and if it is preceded entirely by header rows. The algorithm stops when
- * it encounters the first non-header row.
- *
- * After this, it will look at all rows at the bottom for footer rows
- * And place these in a tfoot using similar rules.
- *
- * If the footer is an exact duplicate of the header, it will be hidden.
- *
- * This function was copied from MediaWiki's jquery.tablesorter module
- * @param {jQuery} $table object for a <table>
- */
- function emulateTHeadAndFoot( $table ) {
- var $thead, $tfoot, i, len,
- $rows = $table.find( '> tbody > tr' );
- if ( !$table.get( 0 ).tHead ) {
- $thead = $( '<thead>' );
- // T289817
- $thead.addClass('mw-sticky-header-element');
- $rows.each( function () {
- if ( $( this ).children( 'td' ).length ) {
- // This row contains a <td>, so it's not a header row
- // Stop here
- return false;
- }
- $thead.append( this );
- } );
- $table.find( ' > tbody:first' ).before( $thead );
- }
- if ( !$table.get( 0 ).tFoot ) {
- $tfoot = $( '<tfoot>' );
- len = $rows.length;
- for ( i = len - 1; i >= 0; i-- ) {
- if ( $( $rows[ i ] ).children( 'td' ).length ) {
- break;
- }
- $tfoot.prepend( $( $rows[ i ] ) );
- }
- $table.append( $tfoot );
- // Check if footer is duplicate of header and hide if so
- hideDuplicateFooter( $table );
- }
- }
- /**
- * Hide the table footer if it's an exact duplicate of the header
- * @param {jQuery} $table object for a <table>
- */
- function hideDuplicateFooter( $table ) {
- var $thead = $table.find( '> thead' );
- var $tfoot = $table.find( '> tfoot' );
- // Only proceed if both thead and tfoot exist
- if ( !$thead.length || !$tfoot.length ) {
- return;
- }
- var $headerRows = $thead.find( 'tr' );
- var $footerRows = $tfoot.find( 'tr' );
- // Must have same number of rows
- if ( $headerRows.length !== $footerRows.length ) {
- return;
- }
- // Compare each row
- var isDuplicate = true;
- $headerRows.each( function( index ) {
- var $headerRow = $( this );
- var $footerRow = $( $footerRows[ index ] );
- // Compare number of cells
- var $headerCells = $headerRow.find( 'th, td' );
- var $footerCells = $footerRow.find( 'th, td' );
- if ( $headerCells.length !== $footerCells.length ) {
- isDuplicate = false;
- return false; // Break out of each loop
- }
- // Compare each cell's text content and tag name
- $headerCells.each( function( cellIndex ) {
- var $headerCell = $( this );
- var $footerCell = $( $footerCells[ cellIndex ] );
- // Compare tag names (th vs td)
- if ( $headerCell.prop( 'tagName' ) !== $footerCell.prop( 'tagName' ) ) {
- isDuplicate = false;
- return false;
- }
- // Compare text content (trimmed to ignore whitespace differences)
- if ( $.trim( $headerCell.text() ) !== $.trim( $footerCell.text() ) ) {
- isDuplicate = false;
- return false;
- }
- } );
- if ( !isDuplicate ) {
- return false; // Break out of row loop
- }
- } );
- // Hide the footer if it's a duplicate
- if ( isDuplicate ) {
- $tfoot.hide();
- // Optionally add a class or data attribute to indicate it was hidden
- $tfoot.attr( 'data-duplicate-hidden', 'true' );
- }
- }
- mw.hook('wikipage.content').add( function( $content ) {
- // Do this for wikitable, but sortable does it on it's own already
- $content.find('.wikitable:not(.sortable) ').each( function ( i, table ) {
- if ( table.tBodies && !table.tHead ) {
- // No thead found. Look for rows with <th>s and
- // move them into a <thead> tag or a <tfoot> tag
- emulateTHeadAndFoot( $(table).addClass('mw-sticky-header') );
- }
- } );
- } );
Advertisement
Add Comment
Please, Sign In to add comment