您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Декодирует все найденные на странице ссылки, похожие на "%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80", в удобочитаемое "привет мир"
当前为
- // ==UserScript==
- // @name Automatic URL Decoder
- // @namespace https://github.com/T1mL3arn
- // @author T1mL3arn
- // @description:ru Декодирует все найденные на странице ссылки, похожие на "%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80", в удобочитаемое "привет мир"
- // @description:en It decodes all cyrillic links on current page.
- // @match *://*/*
- // @version 1.1.1
- // @run-at document-end
- // @license GPLv3
- // @supportURL https://github.com/T1mL3arn/Automatic-URL-Decoder/issues
- // @homepageURL https://github.com/T1mL3arn/Automatic-URL-Decoder
- // @description Декодирует все найденные на странице ссылки, похожие на "%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80", в удобочитаемое "привет мир"
- // ==/UserScript==
- let linkEreg = /(https|http|ftp|file):.+?(?=\s|$)/gi;
- let linkEregLocal = /(https|http|ftp|file):.+?(?=\s|$)/i;
- let obsOptions = { childList: true, subtree: true };
- let underlineStyle = new Map([["border-bottom","2px solid currentColor"], ["margin-bottom", "-2px"]]);
- // set one of style from above to enable
- // custom style for fixed links
- let changedLinkStyle = null;
- let obs = new MutationObserver((changes, obs) => {
- obs.disconnect();
- changes.forEach((change) => change.addedNodes.forEach((node) => fixLinks(node)) );
- obs.observe(document.body, obsOptions);
- });
- function fixLinks(node) {
- if (node.tagName != 'SCRIPT' && node.nodeType === 3) {
- let content = node.textContent;
- if (content && content != '') {
- if (linkEregLocal.test(content)) {
- if (changedLinkStyle)
- replaceAndStyleLink(node);
- else {
- let decoded = content.replace(linkEreg, decodeURIComponent);
- if(decoded.length!=content.length)
- node.textContent = decoded;
- }
- }
- }
- } else if (node.childNodes && node.childNodes.length > 0) {
- node.childNodes.forEach(fixLinks);
- }
- }
- function replaceAndStyleLink(node) {
- let match;
- let offset = 0;
- let sibling = node;
- let content = node.textContent;
- while ((match = linkEreg.exec(content)) != null) {
- let fullMatch = match[0];
- let decoded = decodeURIComponent(fullMatch);
- if (decoded.length != fullMatch.length) {
- let span = document.createElement('span');
- changedLinkStyle.forEach((val, key) => span.style.setProperty(key, val));
- let range = document.createRange();
- range.setStart(sibling, linkEreg.lastIndex - match[0].length);
- range.setEnd(sibling, linkEreg.lastIndex);
- range.surroundContents(span);
- sibling = getNextTextSibling(span);
- content = sibling.textContent;
- span.textContent = decoded;
- linkEreg.lastIndex = 0;
- if (sibling == null)
- break;
- }
- }
- }
- function getNextTextSibling(node) {
- let next = node.nextSibling;
- while (next != null) {
- if (next.nodeType == 3)
- return next;
- else
- next = node.nextSibling;
- }
- return null;
- }
- fixLinks(document.body);
- obs.observe(document.body, obsOptions);