Add support for sorting fractions in jquery.tablesorter
authorDerk-Jan Hartman <hartman@users.mediawiki.org>
Sun, 19 Feb 2012 19:56:56 +0000 (19:56 +0000)
committerDerk-Jan Hartman <hartman@users.mediawiki.org>
Sun, 19 Feb 2012 19:56:56 +0000 (19:56 +0000)
Fixes bug 15404

RELEASE-NOTES-1.20
resources/jquery/jquery.tablesorter.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js

index 1889c55..65317f3 100644 (file)
@@ -21,6 +21,7 @@ production.
   contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
 * (bug 34475) Add support for IP/CIDR notation to tablesorter
 * (bug 27619) Remove preference option to display broken links as link?
+* (bug 15404) Add support for sorting fractions in jquery.tablesorter
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
index ca9971b..6ffddf2 100644 (file)
                                digits.push( $.escapeRE( localised[i] ) );
                        }
                }
-               var digitClass = '[' + digits.join( '', digits ) + ']';
+               ts.digitClass = '[' + digits.join( '', digits ) + ']';
 
                // We allow a trailing percent sign, which we just strip. This works fine
                // if percents and regular numbers aren't being mixed.
                ts.numberRegex = new RegExp("^(" + "[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?" + // Fortran-style scientific
-               "|" + "[-+\u2212]?" + digitClass + "+[\\s\\xa0]*%?" + // Generic localised
+               "|" + "[-+\u2212]?" + ts.digitClass + "+[\\s\\xa0]*%?" + // Generic localised
+               "|([-+\u2212]?" + ts.digitClass + "+[\\s\\xa0]+)*" + ts.digitClass + "+[\\s\\xa0]*[\\/][\\s\\xa0]*" + ts.digitClass + "+" + // Fractions
                ")$", "i");
        }
 
                        ],
                        time: [
                                new RegExp( /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/)
+                       ],
+                       fractions: [
+                               new RegExp( "^(?:([-+\u2212]?" + ts.digitClass + "+)[\\s\\xa0]+)*(" + ts.digitClass + "+)[\\s\\xa0]*[\\/][\\s\\xa0]*(" + ts.digitClass + "+)" )
                        ]
                };
        }
                        return $.tablesorter.numberRegex.test( $.trim( s ));
                },
                format: function( s ) {
+                       var values = ts.rgx.fractions[0].exec($.trim(s));
+                       if( values != null ) {
+                               // A fraction
+                               var retVal = 0;
+                               var decimal = $.tablesorter.formatDigit(values[2]) / $.tablesorter.formatDigit(values[3]);
+                               if( values[1] != undefined ) {
+                                       retVal = $.tablesorter.formatDigit(values[1]);
+                               }
+                               if( !isNaN(decimal) && isFinite(decimal) ) {
+                                       retVal += decimal;
+                               }
+                               return retVal;
+                       }
                        return $.tablesorter.formatDigit(s);
                },
                type: 'numeric'
index ec34102..a76af5e 100644 (file)
@@ -575,6 +575,47 @@ tableTest( 'bug 8115: sort numbers with commas (descending)',
 );
 // TODO add numbers sorting tests for bug 8115 with a different language
 
+var fractions = [
+       [ '56'           ],
+       [ '1 3/8'        ],
+       [ '4 7/8'        ],
+       [ '2,000 1/6'    ],
+       [ '4 1/8'        ],
+       [ '-4 1/8'       ],
+       [ '−5 1/8'   ],
+       [ '56 45/500'    ],
+       [ '56 100/500'   ],
+       [ '100 / 500'    ]
+];
+var fractionsAsc = [
+       [ '−5 1/8'   ],
+       [ '-4 1/8'       ],
+       [ '100 / 500'    ],
+       [ '1 3/8'        ],
+       [ '4 1/8'        ],
+       [ '4 7/8'        ],
+       [ '56'           ],
+       [ '56 45/500'    ],
+       [ '56 100/500'   ],
+       [ '2,000 1/6'    ]
+];
+
+tableTest( 'sort fractional numbers in all sorts and forms (ascending)',
+        ['Fractional numbers'], fractions, fractionsAsc,
+        function( $table ) {
+                $table.tablesorter();
+                $table.find( '.headerSort:eq(0)' ).click();
+        }
+);
+
+tableTest( 'sort fractional numbers in all sorts and forms (descending)',
+        ['Fractional numbers'], fractions, reversed(fractionsAsc),
+        function( $table ) {
+                $table.tablesorter();
+                $table.find( '.headerSort:eq(0)' ).click().click();
+        }
+);
+
 test( 'bug 32888 - Tables inside a tableheader cell', function() {
        expect(2);