Skip to content

Commit 245e148

Browse files
authored
Merge pull request #267 from ywxt/master
新增 [文件排序] 功能
2 parents 97621c5 + 2804523 commit 245e148

1 file changed

Lines changed: 270 additions & 1 deletion

File tree

Lanzou-Enhanced.user.js

Lines changed: 270 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
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])};
@@ -133,6 +134,8 @@
133134
dragEnter(); // 拖入文件自动显示上传框
134135
setTimeout(viewTop,1000); // 监听并修改右键菜单 [外链分享地址] 为 [复制并打开分享链接] / [复制分享链接] / [打开分享链接] 之一
135136
setTimeout(copyAllfileSha, 500); // 一键复制所有分享链接
137+
138+
setTimeout(filesSort, 300); // 文件排序
136139
}
137140
}
138141

@@ -572,4 +575,270 @@
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

Comments
 (0)