复制网址markdown

把当前网站链接生成 markdown 格式的链接形式:[title](url)

// ==UserScript==
// @name         复制网址markdown
// @namespace    https://greasyfork.org/users/1171320
// @version      1.01
// @description  把当前网站链接生成 markdown 格式的链接形式:[title](url)
// @author       chatgpt 辅助
// @icon         https://g.csdnimg.cn/static/logo/favicon32.ico
// @run-at       document-end
// @match        *://*/*
// @exclude      *://*/*.ipynb
// @grant        GM_addStyle
// @noframes
// @license MIT
// ==/UserScript==

// 立即执行函数避免污染全局
(function () {
    "use strict";

    addStyle();
    addBtn();

    let isClicking = false; // 防止过快重复点击
    document.getElementById("copyBtn").addEventListener("click", function () {
        if (!isClicking) {
            copy();
            isClicking = true;
            setTimeout(() => {
                isClicking = false;
            }, 3000);
        }
    });

    const result = {
        flag: true,  // 标志位
        url: document.URL, // 当前网页链接
        title: document.title, // 当前网页标题
        text: "", // 生成的 markdown 链接
    };

    const removeParamPattern = /\?.*/;  // 用于移除URL中的参数
    function removeParam(url) {
        return url.replace(removeParamPattern, "");
    }

    const urlMap = {
        "mp.weixin.qq.com": function (result) {
            const name = document.querySelector("#profileBt a")?.textContent.trim(); 
            result.title = `${result.title}_${name}_微信公众号`;
        },

        "blog.csdn.net/": function (result) {
            result.title = result.title.replace(/\(.*?\)/, "").trim();  // 去掉CSDN的提示
            result.title = result.title.replace(/CSDN博客.*/, "CSDN博客"); 
            if (result.url.match(/blog.csdn.net\/.*?\/category_*/)) {
                result.title = `==分类专栏==: ${result.title}`;
            } else {
                result.url = result.url.split("?")[0]; // 去掉查询参数
            }
        },

        "toutiao.com/article/": function (result) {
            const author = document.querySelector("a.user-name")?.textContent;
            result.title = `${result.title}-【${author}】-文章`;
        },

        "bilibili.com/video/": function (result) {
            result.flag = false; 
            const author = document.querySelector(".up-name")?.textContent.trim();
            result.title = `${result.title}-【${author}】`;
        },

        // 添加更多网址处理...
    };

    function copy() {
        let isFound = false;
        for (let urlPattern in urlMap) {
            const reg = new RegExp(urlPattern, "i");
            if (reg.test(result.url)) {
                const handler = urlMap[urlPattern];
                if (handler) {
                    handler(result);
                }
                isFound = true;
                break;
            }
        }

        if (result.flag) {
            result.url = removeParam(result.url);
        }

        result.text = `【${result.title} (${result.url} )】`;

        // 复制到剪贴板
        handleCopy(result.text);

        // 修改按钮样式
        const copyBtn = document.getElementById("copyBtn");
        copyBtn.style.background = "red";
        copyBtn.textContent = "success";
        setTimeout(() => {
            copyBtn.style.background = "green";
            copyBtn.textContent = "copy";
        }, 3000);
    }

    function addStyle() {
        const buttonStyle = `
            .layui-btn {
                display: inline-block;
                height: 38px;
                line-height: 38px;
                padding: 0 18px;
                background-color: #009688;
                color: #fff;
                border-radius: 2px;
                cursor: pointer;
                font-size: 14px;
            }
            .layui-btn-sm {
                height: 30px;
                line-height: 30px;
                padding: 0 10px;
                font-size: 12px;
            }
        `;
        GM_addStyle(buttonStyle);
    }

    function addBtn() {
        const button = document.createElement("button");
        button.id = "copyBtn";
        button.textContent = "copy";
        button.style.cssText = "top: 150px; right: 0px; position: fixed; z-index: 1000; cursor: pointer; background: green; width: auto;";
        button.classList.add("layui-btn", "layui-btn-sm");

        document.body.appendChild(button);
    }

    function handleCopy(text) {
        const inputNode = document.createElement("input");
        inputNode.value = text;
        document.body.appendChild(inputNode);
        inputNode.select();
        document.execCommand("copy");
        inputNode.remove();
    }
})();