@@ -1700,6 +1700,23 @@ fn document_stability(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item)
1700
1700
Ok ( ( ) )
1701
1701
}
1702
1702
1703
+ fn name_key ( name : & str ) -> ( & str , u64 , usize ) {
1704
+ // find number at end
1705
+ let split = name. bytes ( ) . rposition ( |b| b < b'0' || b'9' < b) . map_or ( 0 , |s| s + 1 ) ;
1706
+
1707
+ // count leading zeroes
1708
+ let after_zeroes =
1709
+ name[ split..] . bytes ( ) . position ( |b| b != b'0' ) . map_or ( name. len ( ) , |extra| split + extra) ;
1710
+
1711
+ // sort leading zeroes last
1712
+ let num_zeroes = after_zeroes - split;
1713
+
1714
+ match name[ split..] . parse ( ) {
1715
+ Ok ( n) => ( & name[ ..split] , n, num_zeroes) ,
1716
+ Err ( _) => ( name, 0 , num_zeroes) ,
1717
+ }
1718
+ }
1719
+
1703
1720
fn item_module ( w : & mut fmt:: Formatter , cx : & Context ,
1704
1721
item : & clean:: Item , items : & [ clean:: Item ] ) -> fmt:: Result {
1705
1722
document ( w, cx, item) ?;
@@ -1744,7 +1761,9 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context,
1744
1761
( Some ( stability:: Stable ) , Some ( stability:: Unstable ) ) => return Ordering :: Less ,
1745
1762
_ => { }
1746
1763
}
1747
- i1. name . cmp ( & i2. name )
1764
+ let lhs = i1. name . as_ref ( ) . map_or ( "" , |s| & * * s) ;
1765
+ let rhs = i2. name . as_ref ( ) . map_or ( "" , |s| & * * s) ;
1766
+ name_key ( lhs) . cmp ( & name_key ( rhs) )
1748
1767
}
1749
1768
1750
1769
indices. sort_by ( |& i1, & i2| cmp ( & items[ i1] , & items[ i2] , i1, i2) ) ;
@@ -3198,3 +3217,32 @@ fn test_unique_id() {
3198
3217
reset_ids ( true ) ;
3199
3218
test ( ) ;
3200
3219
}
3220
+
3221
+ #[ cfg( test) ]
3222
+ #[ test]
3223
+ fn test_name_key ( ) {
3224
+ assert_eq ! ( name_key( "0" ) , ( "" , 0 , 1 ) ) ;
3225
+ assert_eq ! ( name_key( "123" ) , ( "" , 123 , 0 ) ) ;
3226
+ assert_eq ! ( name_key( "Fruit" ) , ( "Fruit" , 0 , 0 ) ) ;
3227
+ assert_eq ! ( name_key( "Fruit0" ) , ( "Fruit" , 0 , 1 ) ) ;
3228
+ assert_eq ! ( name_key( "Fruit0000" ) , ( "Fruit" , 0 , 4 ) ) ;
3229
+ assert_eq ! ( name_key( "Fruit01" ) , ( "Fruit" , 1 , 1 ) ) ;
3230
+ assert_eq ! ( name_key( "Fruit10" ) , ( "Fruit" , 10 , 0 ) ) ;
3231
+ assert_eq ! ( name_key( "Fruit123" ) , ( "Fruit" , 123 , 0 ) ) ;
3232
+ }
3233
+
3234
+ #[ cfg( test) ]
3235
+ #[ test]
3236
+ fn test_name_sorting ( ) {
3237
+ let names = [ "Apple" ,
3238
+ "Banana" ,
3239
+ "Fruit" , "Fruit0" , "Fruit00" ,
3240
+ "Fruit1" , "Fruit01" ,
3241
+ "Fruit2" , "Fruit02" ,
3242
+ "Fruit20" ,
3243
+ "Fruit100" ,
3244
+ "Pear" ] ;
3245
+ let mut sorted = names. to_owned ( ) ;
3246
+ sorted. sort_by_key ( |& s| name_key ( s) ) ;
3247
+ assert_eq ! ( names, sorted) ;
3248
+ }
0 commit comments