Author: fa12345
Description:
Examples:
These examples are in wikipedia on the http://en.wikipedia.org/wiki/User_talk:Ephdot page. sm=n is suppose to make a column sort numeric when in the first sortable row.
{|class="wikitable sortable" <!-- | style="width:100%;" -->
! Summary{{smn}}
- |
1.4 L{{smn}} |
- |
2 L{{smn}} |
- |
19 L{{smn}} |
- |
1 L{{smn}} |
} |
{|class="wikitable sortable"
! Summary
- |
1.4L sm=n |
- |
2L sm=n |
- |
19L sm=n |
- |
1L sm=n |
} |
When you press the sort button on the table, it orders the numbers: 1L, 1.4L, 19L, 2L. It may be new math, but it should be: 1L, 1.4L, 2L, 19L. (I used the sm=n flag, BTW)
I'm using Firefox, but I don't think it matters...
It seems the sort functions are in this file: http://en.wikipedia.org/skins-1.5/common/wikibits.js
The part that is missing should be in here:
<code><nowiki>
function ts_resortTable(lnk) {
// get the span var span = lnk.getElementsByTagName('span')[0]; var td = lnk.parentNode; var tr = td.parentNode; var column = td.cellIndex; var table = tr.parentNode; while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) table = table.parentNode; if (!table) return; // Work out a type for the column if (table.rows.length <= 1) return; // Skip the first row if that's where the headings are var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); var itm = ""; for (var i = rowStart; i < table.rows.length; i++) { if (table.rows[i].cells.length > column) { itm = ts_getInnerText(table.rows[i].cells[column]); itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); if (itm != "") break; } } sortfn = ts_sort_caseinsensitive; if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^[\u00a3$\u20ac]/)) // pound dollar euro sortfn = ts_sort_currency; if (itm.match(/^[\d.,]+\%?$/)) sortfn = ts_sort_numeric;
// INSERT HERE
var reverse = (span.getAttribute("sortdir") == 'down'); var newRows = new Array(); for (var j = rowStart; j < table.rows.length; j++) { var row = table.rows[j]; var keyText = ts_getInnerText(row.cells[column]); var oldIndex = (reverse ? -j : j); newRows[newRows.length] = new Array(row, keyText, oldIndex); } newRows.sort(sortfn); var arrowHTML; if (reverse) { arrowHTML = '<img src="'+ ts_image_path + ts_image_down + '" alt="↓"/>'; newRows.reverse(); span.setAttribute('sortdir','up'); } else { arrowHTML = '<img src="'+ ts_image_path + ts_image_up + '" alt="↑"/>'; span.setAttribute('sortdir','down'); } // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // don't do sortbottom rows for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) table.tBodies[0].appendChild(newRows[i][0]); } // do sortbottom rows only for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) table.tBodies[0].appendChild(newRows[i][0]); } // Delete any other arrows there may be showing var spans = getElementsByClassName(tr, "span", "sortarrow"); for (var i = 0; i < spans.length; i++) { spans[i].innerHTML = '<img src="'+ ts_image_path + ts_image_none + '" alt="↓"/>'; } span.innerHTML = arrowHTML; ts_alternate(table);
}
</nowiki></code>
A line like:
if (itm.match(/^.*sm=n.*$/)) sortfn = ts_sort_numeric;
Needs to be inserted where at //INSERT HERE
Tested it and it works. Don't know if it breaks anything else (shouldn't).
I think the other "sm=" switches need to be included too.
Thanks,
Frank
Version: unspecified
Severity: enhancement