Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js: Difference between revisions

MediaWiki interface page
Export button only on tables with caption (numeric data tables), not descriptive ones
Fix: use .children(caption) not .find(> caption) for correct detection
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
/* ================================================================
/* ================================================================
   CSV Export Button — injects "⬇ Export CSV" only above wikitables
   CSV Export Button — injects "⬇ Export CSV" only above wikitables
   that have a <caption> element (data tables with |+ in wikitext).
   that have a <caption> as direct child (numeric/calculable tables).
  These are the numeric/calculable tables (costs, times, power…).
   Descriptive tables without a caption are left untouched.
   Descriptive tables (Building/Function, Strengths/Weaknesses…)
  have no caption and are left untouched.
   ================================================================ */
   ================================================================ */
mw.hook('wikipage.content').add(function ($content) {
$(function () {
     var pageName = mw.config.get('wgTitle') || 'export';
     var pageName = mw.config.get('wgTitle') || 'export';
     var safeTitle = pageName.replace(/ /g, '_');
     var safeTitle = pageName.replace(/ /g, '_');
     var exportIndex = 0;
     var exportIndex = 0;


     $content.find('table.wikitable').each(function () {
     $('#mw-content-text table.wikitable').each(function () {
         var $table = $(this);
         var $table = $(this);


         // Only add button if the table has a <caption>
         // Use .children() to check for direct caption child only
         if ($table.find('caption').length === 0) return;
         if ($table.children('caption').length === 0) return;


         exportIndex++;
         exportIndex++;
        var idx = exportIndex;
         var $btn = $('<button>')
         var $btn = $('<button>')
             .text('⬇ Export CSV')
             .text('⬇ Export CSV')
Line 51: Line 51:
                 var blob = new Blob([csv.join('\n')], { type: 'text/csv;charset=utf-8;' });
                 var blob = new Blob([csv.join('\n')], { type: 'text/csv;charset=utf-8;' });
                 var url = URL.createObjectURL(blob);
                 var url = URL.createObjectURL(blob);
                 var suffix = exportIndex > 1 ? '_' + exportIndex : '';
                 var suffix = idx > 1 ? '_' + idx : '';
                 var $a = $('<a>').attr('href', url).attr('download', safeTitle + suffix + '.csv').css('display','none');
                 var $a = $('<a>').attr('href', url).attr('download', safeTitle + suffix + '.csv').css('display', 'none');
                 $('body').append($a);
                 $('body').append($a);
                 $a[0].click();
                 $a[0].click();

Latest revision as of 20:50, 17 May 2026

/* ================================================================
   CSV Export Button — injects "⬇ Export CSV" only above wikitables
   that have a <caption> as direct child (numeric/calculable tables).
   Descriptive tables without a caption are left untouched.
   ================================================================ */
$(function () {
    var pageName = mw.config.get('wgTitle') || 'export';
    var safeTitle = pageName.replace(/ /g, '_');
    var exportIndex = 0;

    $('#mw-content-text table.wikitable').each(function () {
        var $table = $(this);

        // Use .children() to check for direct caption child only
        if ($table.children('caption').length === 0) return;

        exportIndex++;
        var idx = exportIndex;

        var $btn = $('<button>')
            .text('⬇ Export CSV')
            .attr('title', 'Download this table as a CSV file')
            .css({
                cursor: 'pointer',
                background: '#1e1e1e',
                color: '#e07000',
                border: '1px solid #e07000',
                borderRadius: '4px',
                padding: '3px 12px',
                fontSize: '0.82em',
                fontWeight: 'bold',
                marginBottom: '4px',
                display: 'inline-block'
            })
            .on('click', function () {
                var rows = $table.find('tr');
                var csv = [];
                rows.each(function () {
                    var cells = $(this).find('th, td');
                    var line = [];
                    cells.each(function () {
                        var txt = $(this).text().replace(/\s+/g, ' ').trim();
                        if (txt.indexOf(',') !== -1 || txt.indexOf('"') !== -1) {
                            txt = '"' + txt.replace(/"/g, '""') + '"';
                        }
                        line.push(txt);
                    });
                    if (line.length > 0) csv.push(line.join(','));
                });

                var blob = new Blob([csv.join('\n')], { type: 'text/csv;charset=utf-8;' });
                var url = URL.createObjectURL(blob);
                var suffix = idx > 1 ? '_' + idx : '';
                var $a = $('<a>').attr('href', url).attr('download', safeTitle + suffix + '.csv').css('display', 'none');
                $('body').append($a);
                $a[0].click();
                $a.remove();
                setTimeout(function () { URL.revokeObjectURL(url); }, 1000);
            });

        $table.before($('<div>').css('margin', '0 0 2px 0').append($btn));
    });
});