Open all unique URLs found in the selected text using Ctrl + Escape.
当前为
// ==UserScript==
// @name OpenAnySelectedURL
// @version 25.5.7
// @description Open all unique URLs found in the selected text using Ctrl + Escape.
// @author 8TM (https://github.com/8tm/Tampermonkey-OpenAnySelectedURL)
// @license CC-BY-NC-4.0
// @icon https://raw.githubusercontent.com/8tm/Tampermonkey-OpenAnySelectedURL/4cf59b8545017d6358ffb7e02a933e3d2929f346/icon.png
// @match *://*/*
// @compatible firefox
// @grant GM_openInTab
// @namespace https://greasyfork.org/users/1386567
// ==/UserScript==
(() => {
'use strict';
// Simple regex for detecting URLs (used only in normalizeUrl)
const urlPattern = /^(https?:\/\/[\S]+)|(www\.[^\s]+)/i;
// Check if URL is valid
function isValidUrl(string) {
try {
new URL(string);
return true;
} catch (_) {
return false;
}
}
// Normalizes and auto-completes the protocol if missing (www → http://www)
function normalizeUrl(str) {
let url = str.trim();
if (!/^https?:\/\//i.test(url)) {
if (/^www\./i.test(url)) {
url = 'http://' + url;
} else {
return null;
}
}
return url;
}
// Common function for handling the current selection
function handleOpen() {
const sel = window.getSelection().toString().trim();
if (!sel) return;
// Locate all URLs in the text, excluding surrounding parentheses, quotes or angle brackets
const matches = sel.match(/(https?:\/\/[^\s\(\)'\"<>]+|www\.[^\s\(\)'\"<>]+)/ig);
if (!matches) return;
// Normalize, filter out invalid and dedupe
const urls = Array.from(new Set(
matches
.map(raw => {
// 1) remove all BBCode tags [/<tagname>]
const cleaned = raw.replace(/(\[\/[^\]]+\])+$/gi, '');
// 2) normalize
const normalized = normalizeUrl(cleaned);
if (!normalized) return null;
// 3) Czeck if it's real URL
if (!isValidUrl(normalized)) {
alert(`Invalid URL: ${normalized}`);
return null;
}
return normalized;
})
.filter(u => u)
));
// Open each URL in the background
urls.forEach(u => {
GM_openInTab(u, true);
});
}
// Keyboard shortcut: Ctrl + Escape
document.addEventListener('keydown', e => {
if (e.ctrlKey && e.key === 'Escape') {
e.preventDefault();
handleOpen();
}
});
})();