Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
271 changes: 270 additions & 1 deletion Lanzou-Enhanced.user.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
['menu_refreshCorrection', '刷新不返回根目录', '刷新不返回根目录', true],
['menu_rightClickMenu', '右键文件显示菜单', '右键文件显示菜单', true],
['menu_directDownload', '点击直接下载文件 (分享链接列表页)', '点击直接下载文件', true],
['menu_folderDescdesMenu', '调整描述(话说)编辑框大小', '调整描述(话说)编辑框大小', true]
['menu_folderDescdesMenu', '调整描述(话说)编辑框大小', '调整描述(话说)编辑框大小', true],
['menu_fileSort', '文件排序', '文件排序', true]
], menu_ID = [], lastFolderID;
for (let i=0;i<menu_ALL.length;i++){ // 如果读取到的值为 null 就写入默认值
if (GM_getValue(menu_ALL[i][0]) == null){GM_setValue(menu_ALL[i][0], menu_ALL[i][3])};
Expand Down Expand Up @@ -133,6 +134,8 @@
dragEnter(); // 拖入文件自动显示上传框
setTimeout(viewTop,1000); // 监听并修改右键菜单 [外链分享地址] 为 [复制并打开分享链接] / [复制分享链接] / [打开分享链接] 之一
setTimeout(copyAllfileSha, 500); // 一键复制所有分享链接

setTimeout(filesSort, 300); // 文件排序
}
}

Expand Down Expand Up @@ -572,4 +575,270 @@
const observer = new MutationObserver(callback);
observer.observe(mainframe.document, { childList: true, subtree: true });
}

// 文件排序
function filesSort() {
const frame = mainframe;
const frameDoc = frame.document;

const currentStatus = {
by: 'name',
order: 'asc',
}

let allButtons = undefined;

// 文件名排序
function sortByName(name1, name2) {
function sort(a, b) {
const strA = a.toLocaleLowerCase().split('');
const strB = b.toLocaleLowerCase().split('');
for (let i = 0; i < strA.length; i++) {
if (strA[i] === strB[i]) {
continue;
}
if (strB[i] === undefined) return 1;
if (notChinese(strA[i]) && notChinese(strB[i])) {
return strA[i] < strB[i] ? -1 : 1;
} else if (notChinese(strA[i])) {
return -1;
} else if (notChinese(strB[i])) {
return 1;
} else {
return strA[i].localeCompare(strB[i]);
}
}
if (strA.length === strB.length) {
return 0;
} else if (strA.length < strB.length) {
return -1;
}
return 1;
}
function notChinese(char) {
const charCode = char.charCodeAt(0)
return charCode >= 0 && charCode <= 128
}
return sort(name1, name2);
}

// 创建排序按鈕
function createAllButtons() {
const tabTitle = frameDoc.querySelector('#container > div.n1 > div.f_th');
const name = tabTitle.querySelector('div.f_name');
const size = tabTitle.querySelector('div.f_size');
const time = tabTitle.querySelector('div.f_time');
const down = tabTitle.querySelector('div.f_down'); // 下载量
return {
name: {
el: createButton(name, 'name'),
order: 'asc',
},
size: {
el: createButton(size, 'size'),
order: 'asc',
},
time: {
el: createButton(time, 'time'),
order: 'asc',
},
down: {
el: createButton(down, 'down'),
order: 'asc',
}
};
}
function createButton(element, by) {
// element.insertAdjacentHTML('beforeend', '<a class="col_sort_btn" href="javascript: void;" style="font-size: 16px; float: right;">⇧</a>');
let button = frameDoc.createElement('a');
button.className = 'col_sort_btn';
button.href = 'javascript: void(0);';
button.style.fontSize = '16px';
button.style.float = 'right';
button.textContent = '⇧';
button.onclick = () => clickSortButton(by, button);
element.appendChild(button);
return button;
}


function getFiles() {
const list = frameDoc.querySelector('#filelist');
const files = list.childNodes;
const filesInfo = [];
const now = new Date();
for (const file of files) {
const name = file.querySelector('.f_name > span.aspanlink > .f_name_title').textContent;
const size = parseByteSize(file.querySelector('.f_size').textContent);
const time = file.querySelector('.f_time').textContent;
const down = parseInt(file.querySelector('.f_down').textContent);
filesInfo.push({
info: {
name: name,
size: size,
time: parseTime(now, time),
down: down
},
node: file
})
}
return filesInfo;
}

function getFolders() {
const list = frameDoc.querySelector('#sub_folder_list');
const folders = list.childNodes;
const foldersInfo = [];
for (const folder of folders) {
const name = folder.querySelector('.f_tb > .f_name2 > span.follink > span').textContent;
foldersInfo.push({
info: {
name: name,
},
node: folder
})
}
return foldersInfo;
}
// 转换文件大小
function parseByteSize(text) {
const unit = ['B', 'K', 'M', 'G', 'T'];
let size = 0;
for (let i = 0; i < unit.length; i++) {
if (text.indexOf(unit[i]) > -1) {
size = parseFloat(text.replace(unit[i], '')) * Math.pow(1024, i);
break;
}
}
return size;
}
// 转换时间格式
function parseTime(now, text) {
if (text.indexOf('秒前') > -1) {
return now - parseInt(text.replace('秒前', '')) * 1000;
} else if (text.indexOf('分钟前') > -1) {
return now - parseInt(text.replace('分钟前', '')) * 60 * 1000;
} else if (text.indexOf('小时前') > -1) {
return now - parseInt(text.replace('小时前', '')) * 60 * 60 * 1000;
} else if (text.indexOf('天前') > -1) {
return now - parseInt(text.replace('天前', '')) * 24 * 60 * 60 * 1000; // 我不知道有没有以下几种情况,暂时先写上
} else if (text.indexOf('月前') > -1) {
return now - parseInt(text.replace('月前', '')) * 30 * 24 * 60 * 60 * 1000;
} else if (text.indexOf('年前') > -1) {
return now - parseInt(text.replace('年前', '')) * 365 * 24 * 60 * 60 * 1000;
}
return Date.parse(text);
}

// 排序
function sortItems(files, by, order) {
let compareFunc;
if (by === 'name') {
compareFunc = (a, b) => {
return (order === 'asc' ? 1 : -1) * sortByName(a.info.name, b.info.name);
}
} else {
compareFunc = (a, b) => {
const result = a.info[by] > b.info[by] ? 1 : -1;
return (order === 'asc' ? 1 : -1) * result;
}
}
files.sort(compareFunc);
}

function sortFileList() {
const files = getFiles();
if (files.length > 0) {
sortItems(files, currentStatus.by, currentStatus.order);
// console.log(files)
const fileList = frameDoc.querySelector('#filelist');
for (let i = 0; i < files.length; i++) {
fileList.appendChild(files[i].node);
}
}
}

function sortFolderList() {
const folders = getFolders();
// console.log(folders);
if (folders.length > 0) {
// 文件夹只能按名称排序
if (currentStatus.by === 'name') {
sortItems(folders, 'name', currentStatus.order);
} else {
sortItems(folders, 'name', 'asc'); // 其他情况,皆按名称升序
}
const folderList = frameDoc.querySelector('#sub_folder_list');
for (let i = 0; i < folders.length; i++) {
folderList.appendChild(folders[i].node);
}
}
}

function fileListCallback(records) {
if (!menu_value('menu_fileSort')) return;
for (const event of records) {
// 自己修改的时候不排序
if (event.removedNodes.length > 0) return;
}
sortFileList();
}

function folderListCallback(records) {
if (!menu_value('menu_fileSort')) return;
for (const event of records) {
// 自己修改的时候不排序
if (event.removedNodes.length > 0) return;
}
sortFolderList();
}

function clickSortButton(by, button) {
if (currentStatus.by === by) {
// 当前选项,点击时,反转排序
currentStatus.order = button.textContent === '⬆' ? 'desc' : 'asc';
} else {
// 非当前选项,点击时,以图标所示的顺序排序
currentStatus.order = button.textContent === '⇧' ? 'asc' : 'desc';
// 修改非当前选项按钮的图标
for (const key in allButtons) {
if (key === by) continue;
if (Object.hasOwnProperty.call(allButtons, key)) {
const btnItem = allButtons[key];
if (btnItem.el.textContent === '⬆') {
btnItem.el.textContent = '⇧';
} else if (btnItem.el.textContent === '⬇') {
btnItem.el.textContent = '⇩';
}
}
}
}
button.textContent = currentStatus.order === 'asc' ? '⬆' : '⬇';
currentStatus.by = by;
sortFileList();
sortFolderList();

}

// create buttons
setTimeout(() => {
if (allButtons === undefined && menu_value('menu_fileSort')) {
allButtons = createAllButtons();
// console.log(allButtons);
allButtons[currentStatus.by].el.textContent = '⬆';
}
}, 500);

// sort files
const fileList = frameDoc.querySelector('#filelist');
const fileObserver = new MutationObserver(fileListCallback);
fileObserver.observe(fileList, { childList: true, attributes: false });

// sort folders
const folderList = frameDoc.querySelector('#sub_folder_list');;
const folderObserver = new MutationObserver(folderListCallback);
folderObserver.observe(folderList, { childList: true, attributes: false });


}
})();