@@ -1700,6 +1700,23 @@ fn document_stability(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item)
17001700 Ok ( ( ) )
17011701}
17021702
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+
17031720fn item_module ( w : & mut fmt:: Formatter , cx : & Context ,
17041721 item : & clean:: Item , items : & [ clean:: Item ] ) -> fmt:: Result {
17051722 document ( w, cx, item) ?;
@@ -1744,7 +1761,9 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context,
17441761 ( Some ( stability:: Stable ) , Some ( stability:: Unstable ) ) => return Ordering :: Less ,
17451762 _ => { }
17461763 }
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) )
17481767 }
17491768
17501769 indices. sort_by ( |& i1, & i2| cmp ( & items[ i1] , & items[ i2] , i1, i2) ) ;
@@ -3198,3 +3217,32 @@ fn test_unique_id() {
31983217 reset_ids ( true ) ;
31993218 test ( ) ;
32003219}
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