@@ -88,59 +88,28 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
8888 }
8989
9090 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 ,
105101 } ;
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;
117103 for ( let [ i , tr ] of tableRows . entries ( ) ) {
118104 let fileSizeTd = tr
119105 . querySelectorAll ( "td" )
120106 . 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 } ` ) ;
144113 } else {
145114 columnData . push ( `${ fillValue } #${ i } ` ) ;
146115 }
@@ -281,54 +250,24 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
281250 const fileSizeInBytesText = tr
282251 . querySelectorAll ( "td" )
283252 . 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- } ;
291253 // Remove the unique identifyer for duplicate values(#number).
292254 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 ) {
332271 fileSizeInBytesHTML = fileSizeInBytesHTML . replace (
333272 fileSizeInBytesText ,
334273 "NaN"
0 commit comments