您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enhance the experience of viewing local files on Edge.
- // ==UserScript==
- // @name Edge Local File Enhancer
- // @namespace http://tampermonkey.net/
- // @version 0.1.5
- // @description Enhance the experience of viewing local files on Edge.
- // @author PRO
- // @match file:///*/
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABt0lEQVR42oxStZoWQRCs2cXdHTLcHZ6EjAwnQWIkJyQlRt4Cd3d3d1n5d7q7ju1zv/q+mh6taQsk8fn29kPDRo87SDMQcNAUJgIQkBjdAoRKdXjm2mOH0AqS+PlkP8sfp0h93iu/PDji9s2FzSSJVg5ykZqWgfGRr9rAAAQiDFoB1OfyESZEB7iAI0lHwLREQBcQQKqo8p+gNUCguwCNAAUQAcFOb0NNGjT+BbUC2YsHZpWLhC6/m0chqIoM1LKbQIIBwlTQE1xAo9QDGDPYf6rkTpPc92gCUYVJAZjhyZltJ95f3zuvLYRGWWCUNkDL2333McBh4kaLlxg+aTmyL7c2xTjkN4Bt7oE3DBP/3SRz65R/bkmBRPGzcRNHYuzMjaj+fdnaFoJUEdTSXfaHbe7XNnMPyqryPcmfY+zURaAB7SHk9cXSH4fQ5rojgCAVIuqCNWgRhLYLhJB4k3iZfIPtnQiCpjAzeBIRXMA6emAqoEbQSoDdGxFUrxS1AYcpaNbBgyQBGJEOnYOeENKR/iAd1npusI4C75/c3539+nbUjOgZV5CkAU27df40lH+agUdIuA/EAgDmZnwZlhDc0wAAAABJRU5ErkJggg==
- // @grant none
- // @run-at document-end
- // @license gpl-3.0
- // ==/UserScript==
- (function() {
- 'use strict';
- // Helper functions
- const path = location.href;
- if (!path.startsWith("file:///") || !path.endsWith("/")) return;
- const debug = false;
- const log = debug ? console.log.bind(console, "[ELFE]") : () => {};
- const $ = document.querySelector.bind(document);
- const $$ = document.querySelectorAll.bind(document);
- const getModifier = (e) => (e.ctrlKey << 2 | e.shiftKey << 1 | e.altKey);
- const hasModifier = (e, test = 0b111) => Boolean(getModifier(e) & test);
- const modifierDict = (e) => {
- return {
- "button": e.button || 0,
- "ctrlKey": e.ctrlKey,
- "shiftKey": e.shiftKey,
- "altKey": e.altKey,
- "bubble": false,
- }
- };
- // CSS
- const header = $("h1#header");
- const css = document.createElement("style");
- css.id = "elfe-css";
- css.textContent = `
- html { scroll-behavior: smooth; }
- h1#header > a { color: initial; text-decoration: none; transition: color 0.2s ease-in-out; }
- h1#header > a:hover { color: -webkit-link; }
- table { margin: 0.5rem 0; width: auto; }
- table td, table th { padding: 0.3rem 0.5rem; vertical-align: middle; }
- div#parentDirLinkBox { display: none !important; }
- #parentDir { padding: 0 0.5em 0; }
- thead th { border-left: 1px solid gray; border-right: 1px solid gray; }
- thead th, tbody tr { transition: background-color 0.2s ease-in-out; cursor: pointer; }
- thead th:hover, tbody tr:hover { background-color: #333333; }
- tbody tr.selected { background-color: #4d4d4d; }
- `;
- $("head").appendChild(css);
- // Navigation
- const delimeter = header.textContent.includes("\\") ? "\\" : "/";
- const split = header.textContent.split(delimeter);
- log(split);
- const parts = split.slice(0, -1);
- header.innerHTML = '<a href="../" id="parentDir">↑</a>'
- + parts.map((part, i) =>
- `<a href="${parts.slice(0, i + 1).join(delimeter)}${delimeter}">${part}</a>`
- ).join(delimeter) + delimeter + split.slice(-1)[0];
- // Table
- const rows = $$("tbody tr");
- rows.forEach(row => {
- row.addEventListener("click", e => {
- if (e.button != 0) return true;
- log(e);
- e.preventDefault();
- row.querySelector("a").dispatchEvent(new MouseEvent("click", modifierDict(e)));
- return true;
- });
- });
- $$("td").forEach(td => {
- td.title = td.getAttribute("data-value") || td.textContent;
- });
- // Shortcuts
- const parentDir = $("#parentDir");
- const count = rows.length;
- var selected = 0;
- function select(i) {
- rows[selected].classList.remove("selected");
- selected = i;
- rows[selected].classList.add("selected");
- rows[selected].scrollIntoView({ block: "center" });
- }
- function delta(d) {
- select((selected + d + count) % count);
- }
- document.addEventListener("keydown", e => {
- switch (e.key) {
- case "ArrowUp":
- e.preventDefault();
- if (e.altKey && parentDir) { // Go to parent directory
- parentDir.click();
- break;
- }
- if (e.ctrlKey) { // Scroll up
- window.scrollBy({ top: -window.innerHeight / 2});
- break;
- }
- if (count == 0) break;
- if (e.shiftKey) { // Select top
- select(0);
- break;
- }
- // Select previous
- delta(-1);
- break;
- case "ArrowDown":
- e.preventDefault();
- if (e.ctrlKey) { // Scroll down
- window.scrollBy({ top: window.innerHeight / 2});
- break;
- }
- if (count == 0) break;
- if (e.shiftKey) { // Select bottom
- select(count - 1);
- break;
- }
- // Select next
- delta(1);
- break;
- case "ArrowLeft":
- if (hasModifier(e)) break; // Try to be none-intrusive
- history.back(); break;
- case "ArrowRight":
- if (hasModifier(e)) break;
- history.forward(); break;
- case "Enter": {
- if (count == 0) break;
- e.preventDefault();
- const link = rows[selected].querySelector("a");
- link.dispatchEvent(new MouseEvent("click", modifierDict(e)));
- break;
- }
- default: break;
- }
- });
- })();