3939 [ 'menu_refreshCorrection' , '刷新不返回根目录' , '刷新不返回根目录' , true ] ,
4040 [ 'menu_rightClickMenu' , '右键文件显示菜单' , '右键文件显示菜单' , true ] ,
4141 [ 'menu_directDownload' , '点击直接下载文件 (分享链接列表页)' , '点击直接下载文件' , true ] ,
42- [ 'menu_folderDescdesMenu' , '调整描述(话说)编辑框大小' , '调整描述(话说)编辑框大小' , true ]
42+ [ 'menu_folderDescdesMenu' , '调整描述(话说)编辑框大小' , '调整描述(话说)编辑框大小' , true ] ,
43+ [ 'menu_fileSort' , '文件排序' , '文件排序' , true ]
4344 ] , menu_ID = [ ] , lastFolderID ;
4445 for ( let i = 0 ; i < menu_ALL . length ; i ++ ) { // 如果读取到的值为 null 就写入默认值
4546 if ( GM_getValue ( menu_ALL [ i ] [ 0 ] ) == null ) { GM_setValue ( menu_ALL [ i ] [ 0 ] , menu_ALL [ i ] [ 3 ] ) } ;
133134 dragEnter ( ) ; // 拖入文件自动显示上传框
134135 setTimeout ( viewTop , 1000 ) ; // 监听并修改右键菜单 [外链分享地址] 为 [复制并打开分享链接] / [复制分享链接] / [打开分享链接] 之一
135136 setTimeout ( copyAllfileSha , 500 ) ; // 一键复制所有分享链接
137+
138+ setTimeout ( filesSort , 300 ) ; // 文件排序
136139 }
137140 }
138141
572575 const observer = new MutationObserver ( callback ) ;
573576 observer . observe ( mainframe . document , { childList : true , subtree : true } ) ;
574577 }
578+
579+ // 文件排序
580+ function filesSort ( ) {
581+ const frame = mainframe ;
582+ const frameDoc = frame . document ;
583+
584+ const currentStatus = {
585+ by : 'name' ,
586+ order : 'asc' ,
587+ }
588+
589+ let allButtons = undefined ;
590+
591+ // 文件名排序
592+ function sortByName ( name1 , name2 ) {
593+ function sort ( a , b ) {
594+ const strA = a . toLocaleLowerCase ( ) . split ( '' ) ;
595+ const strB = b . toLocaleLowerCase ( ) . split ( '' ) ;
596+ for ( let i = 0 ; i < strA . length ; i ++ ) {
597+ if ( strA [ i ] === strB [ i ] ) {
598+ continue ;
599+ }
600+ if ( strB [ i ] === undefined ) return 1 ;
601+ if ( notChinese ( strA [ i ] ) && notChinese ( strB [ i ] ) ) {
602+ return strA [ i ] < strB [ i ] ? - 1 : 1 ;
603+ } else if ( notChinese ( strA [ i ] ) ) {
604+ return - 1 ;
605+ } else if ( notChinese ( strB [ i ] ) ) {
606+ return 1 ;
607+ } else {
608+ return strA [ i ] . localeCompare ( strB [ i ] ) ;
609+ }
610+ }
611+ if ( strA . length === strB . length ) {
612+ return 0 ;
613+ } else if ( strA . length < strB . length ) {
614+ return - 1 ;
615+ }
616+ return 1 ;
617+ }
618+ function notChinese ( char ) {
619+ const charCode = char . charCodeAt ( 0 )
620+ return charCode >= 0 && charCode <= 128
621+ }
622+ return sort ( name1 , name2 ) ;
623+ }
624+
625+ // 创建排序按鈕
626+ function createAllButtons ( ) {
627+ const tabTitle = frameDoc . querySelector ( '#container > div.n1 > div.f_th' ) ;
628+ const name = tabTitle . querySelector ( 'div.f_name' ) ;
629+ const size = tabTitle . querySelector ( 'div.f_size' ) ;
630+ const time = tabTitle . querySelector ( 'div.f_time' ) ;
631+ const down = tabTitle . querySelector ( 'div.f_down' ) ; // 下载量
632+ return {
633+ name : {
634+ el : createButton ( name , 'name' ) ,
635+ order : 'asc' ,
636+ } ,
637+ size : {
638+ el : createButton ( size , 'size' ) ,
639+ order : 'asc' ,
640+ } ,
641+ time : {
642+ el : createButton ( time , 'time' ) ,
643+ order : 'asc' ,
644+ } ,
645+ down : {
646+ el : createButton ( down , 'down' ) ,
647+ order : 'asc' ,
648+ }
649+ } ;
650+ }
651+ function createButton ( element , by ) {
652+ // element.insertAdjacentHTML('beforeend', '<a class="col_sort_btn" href="javascript: void;" style="font-size: 16px; float: right;">⇧</a>');
653+ let button = frameDoc . createElement ( 'a' ) ;
654+ button . className = 'col_sort_btn' ;
655+ button . href = 'javascript: void(0);' ;
656+ button . style . fontSize = '16px' ;
657+ button . style . float = 'right' ;
658+ button . textContent = '⇧' ;
659+ button . onclick = ( ) => clickSortButton ( by , button ) ;
660+ element . appendChild ( button ) ;
661+ return button ;
662+ }
663+
664+
665+ function getFiles ( ) {
666+ const list = frameDoc . querySelector ( '#filelist' ) ;
667+ const files = list . childNodes ;
668+ const filesInfo = [ ] ;
669+ const now = new Date ( ) ;
670+ for ( const file of files ) {
671+ const name = file . querySelector ( '.f_name > span.aspanlink > .f_name_title' ) . textContent ;
672+ const size = parseByteSize ( file . querySelector ( '.f_size' ) . textContent ) ;
673+ const time = file . querySelector ( '.f_time' ) . textContent ;
674+ const down = parseInt ( file . querySelector ( '.f_down' ) . textContent ) ;
675+ filesInfo . push ( {
676+ info : {
677+ name : name ,
678+ size : size ,
679+ time : parseTime ( now , time ) ,
680+ down : down
681+ } ,
682+ node : file
683+ } )
684+ }
685+ return filesInfo ;
686+ }
687+
688+ function getFolders ( ) {
689+ const list = frameDoc . querySelector ( '#sub_folder_list' ) ;
690+ const folders = list . childNodes ;
691+ const foldersInfo = [ ] ;
692+ for ( const folder of folders ) {
693+ const name = folder . querySelector ( '.f_tb > .f_name2 > span.follink > span' ) . textContent ;
694+ foldersInfo . push ( {
695+ info : {
696+ name : name ,
697+ } ,
698+ node : folder
699+ } )
700+ }
701+ return foldersInfo ;
702+ }
703+ // 转换文件大小
704+ function parseByteSize ( text ) {
705+ const unit = [ 'B' , 'K' , 'M' , 'G' , 'T' ] ;
706+ let size = 0 ;
707+ for ( let i = 0 ; i < unit . length ; i ++ ) {
708+ if ( text . indexOf ( unit [ i ] ) > - 1 ) {
709+ size = parseFloat ( text . replace ( unit [ i ] , '' ) ) * Math . pow ( 1024 , i ) ;
710+ break ;
711+ }
712+ }
713+ return size ;
714+ }
715+ // 转换时间格式
716+ function parseTime ( now , text ) {
717+ if ( text . indexOf ( '秒前' ) > - 1 ) {
718+ return now - parseInt ( text . replace ( '秒前' , '' ) ) * 1000 ;
719+ } else if ( text . indexOf ( '分钟前' ) > - 1 ) {
720+ return now - parseInt ( text . replace ( '分钟前' , '' ) ) * 60 * 1000 ;
721+ } else if ( text . indexOf ( '小时前' ) > - 1 ) {
722+ return now - parseInt ( text . replace ( '小时前' , '' ) ) * 60 * 60 * 1000 ;
723+ } else if ( text . indexOf ( '天前' ) > - 1 ) {
724+ return now - parseInt ( text . replace ( '天前' , '' ) ) * 24 * 60 * 60 * 1000 ; // 我不知道有没有以下几种情况,暂时先写上
725+ } else if ( text . indexOf ( '月前' ) > - 1 ) {
726+ return now - parseInt ( text . replace ( '月前' , '' ) ) * 30 * 24 * 60 * 60 * 1000 ;
727+ } else if ( text . indexOf ( '年前' ) > - 1 ) {
728+ return now - parseInt ( text . replace ( '年前' , '' ) ) * 365 * 24 * 60 * 60 * 1000 ;
729+ }
730+ return Date . parse ( text ) ;
731+ }
732+
733+ // 排序
734+ function sortItems ( files , by , order ) {
735+ let compareFunc ;
736+ if ( by === 'name' ) {
737+ compareFunc = ( a , b ) => {
738+ return ( order === 'asc' ? 1 : - 1 ) * sortByName ( a . info . name , b . info . name ) ;
739+ }
740+ } else {
741+ compareFunc = ( a , b ) => {
742+ const result = a . info [ by ] > b . info [ by ] ? 1 : - 1 ;
743+ return ( order === 'asc' ? 1 : - 1 ) * result ;
744+ }
745+ }
746+ files . sort ( compareFunc ) ;
747+ }
748+
749+ function sortFileList ( ) {
750+ const files = getFiles ( ) ;
751+ if ( files . length > 0 ) {
752+ sortItems ( files , currentStatus . by , currentStatus . order ) ;
753+ // console.log(files)
754+ const fileList = frameDoc . querySelector ( '#filelist' ) ;
755+ for ( let i = 0 ; i < files . length ; i ++ ) {
756+ fileList . appendChild ( files [ i ] . node ) ;
757+ }
758+ }
759+ }
760+
761+ function sortFolderList ( ) {
762+ const folders = getFolders ( ) ;
763+ // console.log(folders);
764+ if ( folders . length > 0 ) {
765+ // 文件夹只能按名称排序
766+ if ( currentStatus . by === 'name' ) {
767+ sortItems ( folders , 'name' , currentStatus . order ) ;
768+ } else {
769+ sortItems ( folders , 'name' , 'asc' ) ; // 其他情况,皆按名称升序
770+ }
771+ const folderList = frameDoc . querySelector ( '#sub_folder_list' ) ;
772+ for ( let i = 0 ; i < folders . length ; i ++ ) {
773+ folderList . appendChild ( folders [ i ] . node ) ;
774+ }
775+ }
776+ }
777+
778+ function fileListCallback ( records ) {
779+ if ( ! menu_value ( 'menu_fileSort' ) ) return ;
780+ for ( const event of records ) {
781+ // 自己修改的时候不排序
782+ if ( event . removedNodes . length > 0 ) return ;
783+ }
784+ sortFileList ( ) ;
785+ }
786+
787+ function folderListCallback ( records ) {
788+ if ( ! menu_value ( 'menu_fileSort' ) ) return ;
789+ for ( const event of records ) {
790+ // 自己修改的时候不排序
791+ if ( event . removedNodes . length > 0 ) return ;
792+ }
793+ sortFolderList ( ) ;
794+ }
795+
796+ function clickSortButton ( by , button ) {
797+ if ( currentStatus . by === by ) {
798+ // 当前选项,点击时,反转排序
799+ currentStatus . order = button . textContent === '⬆' ? 'desc' : 'asc' ;
800+ } else {
801+ // 非当前选项,点击时,以图标所示的顺序排序
802+ currentStatus . order = button . textContent === '⇧' ? 'asc' : 'desc' ;
803+ // 修改非当前选项按钮的图标
804+ for ( const key in allButtons ) {
805+ if ( key === by ) continue ;
806+ if ( Object . hasOwnProperty . call ( allButtons , key ) ) {
807+ const btnItem = allButtons [ key ] ;
808+ if ( btnItem . el . textContent === '⬆' ) {
809+ btnItem . el . textContent = '⇧' ;
810+ } else if ( btnItem . el . textContent === '⬇' ) {
811+ btnItem . el . textContent = '⇩' ;
812+ }
813+ }
814+ }
815+ }
816+ button . textContent = currentStatus . order === 'asc' ? '⬆' : '⬇' ;
817+ currentStatus . by = by ;
818+ sortFileList ( ) ;
819+ sortFolderList ( ) ;
820+
821+ }
822+
823+ // create buttons
824+ setTimeout ( ( ) => {
825+ if ( allButtons === undefined && menu_value ( 'menu_fileSort' ) ) {
826+ allButtons = createAllButtons ( ) ;
827+ // console.log(allButtons);
828+ allButtons [ currentStatus . by ] . el . textContent = '⬆' ;
829+ }
830+ } , 500 ) ;
831+
832+ // sort files
833+ const fileList = frameDoc . querySelector ( '#filelist' ) ;
834+ const fileObserver = new MutationObserver ( fileListCallback ) ;
835+ fileObserver . observe ( fileList , { childList : true , attributes : false } ) ;
836+
837+ // sort folders
838+ const folderList = frameDoc . querySelector ( '#sub_folder_list' ) ; ;
839+ const folderObserver = new MutationObserver ( folderListCallback ) ;
840+ folderObserver . observe ( folderList , { childList : true , attributes : false } ) ;
841+
842+
843+ }
575844} ) ( ) ;
0 commit comments