Link Wrapper

Wraps links with specified protocols in <a> tags.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

Advertisement:

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

Advertisement:

// ==UserScript==
// @name              Link Wrapper
// @author             TM
// @namespace    https://trap.jp/
// @version           0.1
// @description     Wraps links with specified protocols in <a> tags.
// @match             *://*/*
// @grant               none
// @license           MIT
// ==/UserScript==

(function() {
    'use strict';

    var regexp_url = /((h?)(ttps?:\/\/[a-zA-Z0-9.\-_@:/~?%&;=+#',()*!]+))/g;

    var wrapLink = function(all, url, h, href) {
        return '<a href="h' + href + '" target="_blank">' + url + '</a><br/>';
    }

    /**
     * 渡されるコンテンツ:
     *   - <div>hoge<div>...<div>fuga</div>
     *  <div>hogefuga</div>
     */
    function wrapLinks(element) {
        var textContent = "";
        if(element.nodeType === 3) {
            textContent = element.textContent;
        }
        else{
            for(var elem of element.childNodes){
                console.log(elem);
                console.log(elem.nodeType);
                if(elem.nodeType === 3) {
                    textContent += elem.textContent;
                }
            }
        }
        if (textContent) {
            var newTextContent = textContent.replace(regexp_url, wrapLink);
            if (newTextContent !== textContent) {
                element.innerHTML = newTextContent;
            }
        }
    }

    function traverseAndWrap(element) {
        if(element.tagName === "A" || element.tagName === "STYLE" || element.tagName === "SCRIPT"){
            return;
        }
        if (element.childNodes.length === 1) {
            console.log(element);
            wrapLinks(element);
        }

        for (var i = 0; i < element.childNodes.length; i++) {
            var childNode = element.childNodes[i];
            if (childNode.nodeType === 1) {
                traverseAndWrap(childNode);
            }
        }

    }

    window.addEventListener('load', function() {
        traverseAndWrap(document.body);
    });
})();