@@ -88,59 +88,28 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
88
88
}
89
89
90
90
function sortFileSize ( tableRows , columnData ) {
91
- const numberWithUnitType =
92
- / [ . 0 - 9 ] + ( \s ? B | \s ? K B | \s ? K i B | \s ? M B | \s ? M i B | \s ? G B | \s ? G i B | T \s ? B | \s ? T i B ) / i;
93
- const unitType =
94
- / ( \s ? B | \s ? K B | \s ? K i B | \s ? M B | \s ? M i B | \s ? G B | G \s ? i B | \s ? T B | \s ? T i B ) / i;
95
- const fileSizes = {
96
- Kibibyte : 1024 ,
97
- Mebibyte : 1.049e6 ,
98
- Gibibyte : 1.074e9 ,
99
- Tebibyte : 1.1e12 ,
100
- Pebibyte : 1.126e15 ,
101
- Kilobyte : 1000 ,
102
- Megabyte : 1e6 ,
103
- Gigabyte : 1e9 ,
104
- Terabyte : 1e12 ,
91
+ let unitToMultiplier = {
92
+ b : 1 ,
93
+ kb : 1000 ,
94
+ kib : 2 ** 10 ,
95
+ mb : 1e6 ,
96
+ mib : 2 ** 20 ,
97
+ gb : 1e9 ,
98
+ gib : 2 ** 30 ,
99
+ tb : 1e12 ,
100
+ tib : 2 ** 40 ,
105
101
} ;
106
- function removeUnitTypeConvertToBytes ( fileSizeTd , _replace , i ) {
107
- fileSizeTd = fileSizeTd . replace ( unitType , "" ) ;
108
- fileSizeTd = fileSizeTd . replace (
109
- fileSizeTd ,
110
- fileSizeTd * fileSizes [ _replace ]
111
- ) ;
112
- if ( i ) {
113
- columnData . push ( `${ fileSizeTd } #${ i } ` ) ;
114
- }
115
- return fileSizeTd ;
116
- }
102
+ const numberWithUnitType = / ( [ . 0 - 9 ] + ) \s ? ( B | K B | K i B | M B | M i B | G B | G i B | T B | T i B ) / i;
117
103
for ( let [ i , tr ] of tableRows . entries ( ) ) {
118
104
let fileSizeTd = tr
119
105
. querySelectorAll ( "td" )
120
106
. item ( columnIndex ) . textContent ;
121
- if ( fileSizeTd . match ( numberWithUnitType ) ) {
122
- if ( fileSizeTd . match ( / \s ? K B / i) ) {
123
- removeUnitTypeConvertToBytes ( fileSizeTd , "Kilobyte" , i ) ;
124
- } else if ( fileSizeTd . match ( / \s ? K i B / i) ) {
125
- removeUnitTypeConvertToBytes ( fileSizeTd , "Kibibyte" , i ) ;
126
- } else if ( fileSizeTd . match ( / \s ? M B / i) ) {
127
- // TODO: figure out why refactoring this line breaks test.
128
- fileSizeTd = removeUnitTypeConvertToBytes ( fileSizeTd , "Megabyte" ) ;
129
- columnData . push ( `${ fileSizeTd } #${ i } ` ) ;
130
- } else if ( fileSizeTd . match ( / \s ? M i B / i) ) {
131
- removeUnitTypeConvertToBytes ( fileSizeTd , "Mebibyte" , i ) ;
132
- } else if ( fileSizeTd . match ( / \s ? G B / i) ) {
133
- removeUnitTypeConvertToBytes ( fileSizeTd , "Gigabyte" , i ) ;
134
- } else if ( fileSizeTd . match ( / \s ? G i B / i) ) {
135
- removeUnitTypeConvertToBytes ( fileSizeTd , "Gibibyte" , i ) ;
136
- } else if ( fileSizeTd . match ( / \s ? T B / i) ) {
137
- removeUnitTypeConvertToBytes ( fileSizeTd , "Terabyte" , i ) ;
138
- } else if ( fileSizeTd . match ( / \s ? T i B / i) ) {
139
- removeUnitTypeConvertToBytes ( fileSizeTd , "Tebibyte" , i ) ;
140
- } else if ( fileSizeTd . match ( / \s ? B / i) ) {
141
- fileSizeTd = fileSizeTd . replace ( unitType , "" ) ;
142
- columnData . push ( `${ fileSizeTd } #${ i } ` ) ;
143
- }
107
+ let match = fileSizeTd . match ( numberWithUnitType ) ;
108
+ if ( match ) {
109
+ let number = parseFloat ( match [ 1 ] ) ;
110
+ let unit = match [ 2 ] . toLowerCase ( ) ;
111
+ let multiplier = unitToMultiplier [ unit ] ;
112
+ columnData . push ( `${ number * multiplier } #${ i } ` ) ;
144
113
} else {
145
114
columnData . push ( `${ fillValue } #${ i } ` ) ;
146
115
}
@@ -281,54 +250,24 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
281
250
const fileSizeInBytesText = tr
282
251
. querySelectorAll ( "td" )
283
252
. item ( columnIndex ) . textContent ;
284
- const fileSizes = {
285
- Kibibyte : 1024 ,
286
- Mebibyte : 1.049e6 ,
287
- Gibibyte : 1.074e9 ,
288
- Tebibyte : 1.1e12 ,
289
- Pebibyte : 1.126e15 ,
290
- } ;
291
253
// Remove the unique identifyer for duplicate values(#number).
292
254
columnData [ i ] = columnData [ i ] . replace ( / # [ 0 - 9 ] * / , "" ) ;
293
- const fileSize = columnData [ i ] ;
294
- if ( fileSize < fileSizes . Kibibyte ) {
295
- fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
296
- fileSizeInBytesText ,
297
- `${ parseFloat ( fileSize ) . toFixed ( 2 ) } B`
298
- ) ;
299
- } else if (
300
- fileSize >= fileSizes . Kibibyte &&
301
- fileSize < fileSizes . Mebibyte
302
- ) {
303
- fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
304
- fileSizeInBytesText ,
305
- `${ ( fileSize / fileSizes . Kibibyte ) . toFixed ( 2 ) } KiB`
306
- ) ;
307
- } else if (
308
- fileSize >= fileSizes . Mebibyte &&
309
- fileSize < fileSizes . Gibibyte
310
- ) {
311
- fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
312
- fileSizeInBytesText ,
313
- `${ ( fileSize / fileSizes . Mebibyte ) . toFixed ( 2 ) } MiB`
314
- ) ;
315
- } else if (
316
- fileSize >= fileSizes . Gibibyte &&
317
- fileSize < fileSizes . Tebibyte
318
- ) {
319
- fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
320
- fileSizeInBytesText ,
321
- `${ ( fileSize / fileSizes . Gibibyte ) . toFixed ( 2 ) } GiB`
322
- ) ;
323
- } else if (
324
- fileSize >= fileSizes . Tebibyte &&
325
- fileSize < fileSizes . Pebibyte
326
- ) {
327
- fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
328
- fileSizeInBytesText ,
329
- `${ ( fileSize / fileSizes . Tebibyte ) . toFixed ( 2 ) } TiB`
330
- ) ;
331
- } else {
255
+ const fileSize = parseFloat ( columnData [ i ] ) ;
256
+ let prefixes = [ "" , "Ki" , "Mi" , "Gi" , "Ti" , "Pi" ] ;
257
+ let replaced = false ;
258
+ for ( let i = 0 ; i < prefixes . length ; ++ i ) {
259
+ let nextPrefixMultiplier = 2 ** ( 10 * ( i + 1 ) ) ;
260
+ if ( fileSize < nextPrefixMultiplier ) {
261
+ let prefixMultiplier = 2 ** ( 10 * i ) ;
262
+ fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
263
+ fileSizeInBytesText ,
264
+ `${ ( fileSize / prefixMultiplier ) . toFixed ( 2 ) } ${ prefixes [ i ] } B`
265
+ ) ;
266
+ replaced = true ;
267
+ break ;
268
+ }
269
+ }
270
+ if ( ! replaced ) {
332
271
fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
333
272
fileSizeInBytesText ,
334
273
"NaN"
0 commit comments