您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Sort directories before files in repository tree view
当前为
// ==UserScript== // @name Sort directories before files // @description Sort directories before files in repository tree view // @author anhkhoakz // @version 1.0.0 // @match *://git.sr.ht/*/tree(?:/*)? // @namespace anhkhoakz // @icon https://git.sr.ht/static/logo.png // @license GPL-3.0; https://www.gnu.org/licenses/gpl-3.0.html // ==/UserScript== (() => { "use strict"; /** * The container element for the tree list. * @type {HTMLElement|null} */ const tree_list = document.querySelector(".tree-list"); if (!tree_list) { // Exit if the tree list is not found. return; } /** * Indices of directory rows. * @type {number[]} */ const trees = []; /** * Indices of file rows. * @type {number[]} */ const blobs = []; /** * List of name elements in the tree list. * @type {NodeListOf<HTMLElement>} */ const names = tree_list.querySelectorAll(".name"); for (let index = 0; index < names.length; index++) { const name = names[index]; if (name.classList.contains("tree")) { trees.push(index); } else if (name.classList.contains("blob")) { blobs.push(index); } } /** * Total number of cells in the tree list. * @type {number} */ const num_cells = tree_list.children.length; /** * Total number of rows in the tree list. * @type {number} */ const num_rows = names.length; /** * Number of columns in the tree list. * @type {number} */ const num_columns = num_cells / num_rows; if (num_columns * num_rows !== num_cells) { return; } /** * Sorted list of tree list children. * @type {Element[]} */ const tree_list_sorted = Array.from(tree_list.children).sort((a, b) => { /** * Index of element `a` in the tree list. * @type {number} */ const index_a = Array.prototype.indexOf.call(tree_list.children, a); /** * Index of element `b` in the tree list. * @type {number} */ const index_b = Array.prototype.indexOf.call(tree_list.children, b); /** * Row index of element `a`. * @type {number} */ const row_a = Math.trunc(index_a / num_columns); /** * Row index of element `b`. * @type {number} */ const row_b = Math.trunc(index_b / num_columns); /** * Whether row `a` is a directory. * @type {boolean} */ const row_a_is_dir = trees.indexOf(row_a) !== -1; /** * Whether row `b` is a directory. * @type {boolean} */ const row_b_is_dir = trees.indexOf(row_b) !== -1; if (row_a_is_dir !== row_b_is_dir) { return row_a_is_dir ? -1 : 1; } return index_a - index_b; }); for (const child of tree_list_sorted) { tree_list.appendChild(child); } })();