生成md链接

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

当前为 2023-09-11 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         生成md链接
// @namespace    http://tampermonkey.net/
// @version      0.4.3
// @description  把当前网站链接生成markdown格式的链接形式:[title](url)
// @author       myaijarvis
// @icon         https://g.csdnimg.cn/static/logo/favicon32.ico
// @run-at       document-end
// @match        *://*/*
// @exclude      *://*/*.ipynb
// @exclude      https://www.kaggle.com/code/*/edit
// @exclude      https://editor.csdn.net/*
// @exclude      https://www.bilibili.com/bangumi/play/*
// @exclude      https://aistudio.baidu.com/*/user/*
// @require      http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js
// @grant        GM_getResourceURL
// @grant        GM_getResourceText
// @grant        GM_addStyle
// @grant        unsafeWindow
// @noframes
// @license MIT
// ==/UserScript==

// 全局变量最好都初始化在匿名函数(function () {})();之前

(function () {
  "use strict";

  //console.log(layui);
  addStyle();
  addBtn();
  let isclick = false; // 防止过快重复点击
  $("#copyBtn").click(function () {
    if (!isclick) {
      copy();
      isclick = true;
      setTimeout(() => {
        isclick = false;
      }, 3000);
    }
  });
})();

// 公共变量
let result = {
  // 是否需要去掉?后面的参数,默认true,如果需要为false请到urlMap添加网址,
  // 然后需要自定义去除?后面的参数请到urlMap的函数中自己操作
  flag: true,
  url: document.URL, // 处理后的url
  title: document.title, // 处理后的标题
  text: "", // 复制到剪贴板的内容
};

const removeParamPattern = /\?.*/; // 去掉问号后面的参数
function removeParam(url) {
  return url.replace(removeParamPattern, "");
}

// 对象映射
// url(支持正则,特殊字符需要自己转义):function(){ 处理title;}
// 每个url要留一个样例
const urlMap = {
  "mp.weixin.qq.com": function (result) {
    // https://mp.weixin.qq.com/s/vlLEEqhGHocUIU78Hq_Tug
    const name = $("#profileBt a").text().trim(); // 公众号名称
    result.title = `${result.title}_${name}_微信公众号`;
  },

  "blog.csdn.net/": function (result) {
    result.title = result.title.replace(/\(.*?\)/, "").trim(); // 去掉CSDN "(1条消息)title"  再去掉前后空格
    result.title = result.title.replace(/CSDN博客.*/, "CSDN博客"); // title_author-CSDN博客_keyword 去掉keyword
    const url=result.url;
    if (url.match(/blog.csdn.net\/.*?\/category_*/)) {
      // 匹配分类专栏链接
      result.title = `==分类专栏==: ${result.title}`;
    } else {
      //https://blog.csdn.net/ljw_study_in_CSDN/article/details/121512562?spm=1001.2101.3001.6650.4
      result.url = result.url.split("?")[0]; // 去掉?后面的参数
    }
  },
  "toutiao.com/article/": function (result) {
    // https://www.toutiao.com/article/7205128234114023969/?app=news_article_lite
    result.flag = true;
    const author = $("a.user-name").text();
    result.title = `${result.title}-【${author}】-文章`;
  },
  "toutiao.com/w/": function (result) {
    // https://www.toutiao.com/w/1764132707047428/?log_from=b3f6898d5ce3e_1682696312708
    result.flag = true;
    const author = $("a.name").text();
    result.title = `${result.title}-【${author}】-微头条`;
  },
  "toutiao.com/video/": function (result) {
    // https://www.toutiao.com/video/7225244935484604980/?from_scene=video&log_from=a9ec249ec59a7_1682696455912
    result.flag = true;
    const author = $("a.user-name").text();
    result.title = `${result.title}-【${author}】`;
  },
  "ixigua\.com/\\d+/": function (result) {
    // https://www.ixigua.com/7225244935484604980/?from_scene=video&log_from=a9ec249ec59a7_1682696455912
    result.flag = true;
    const author = $("span.user__name").text();
    result.title = `${result.title}-【${author}】`;
  },

  // 设置flag为false,不需要自定义title的直接返回空字符串
  "bilibili.com/video/": "", // https://www.bilibili.com/video/BV1dU4y1C7so?p=3
};

// 复制操作
function copy() {
  const url = document.URL;
  const title = document.title;
  // 变量重置
  result.flag = true;
  result.url = url;
  result.title = title;
  result.text = "";

  let is_find = false;
  for (let urlPattern in urlMap) {
    // 遍历urlMap中的所有网址
    const reg = new RegExp(urlPattern, "i"); //生成正则表达式 会自动生成'/urlPattern/i',特殊字符需要自己转义
    if (reg.test(url)) {
      result.flag = false; // 这里先改为false
      // 匹配网址
      const handler = urlMap[urlPattern]; // 返回一个函数
      if (handler) {
        handler(result); // 如果需要removeParam,请在handler中设置result.flag为true
      }

      is_find = true;
    }
    if (is_find) break;
  }

  if (result.flag) {
    // 去掉 url 中的参数
    result.url = removeParam(result.url);
  }
  // 这里右边加一个空格是因为微信中识别md链接有bug,会把右括号也识别为链接地址的一部分
  result.text = `【参考:[${result.title}](${result.url} )】`;

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

  // 修改复制按钮的样式
  const copyBtn = $("#copyBtn");
  copyBtn.css("background", "red").text("复制成功");
  setTimeout(() => {
    copyBtn.css("background", "green").text("复制");
  }, 3000);
}

function addStyle() {
  //debugger;
  let layui_css = `.layui-btn{display: inline-block; vertical-align: middle; height: 38px; line-height: 38px; border: 1px solid transparent; padding: 0 18px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center; font-size: 14px; border-radius: 2px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
                   .layui-btn-sm{height: 30px; line-height: 30px; padding: 0 10px; font-size: 12px;}`;
  GM_addStyle(layui_css);
}

//创建复制按钮
function addBtn() {
  let element = $(
    `<button style="top: 150px;right:0px; position: fixed;z-index:1000;cursor:pointer;background:green;width:auto;" class="layui-btn layui-btn-sm" id="copyBtn">复制</button>`
  );
  $("body").append(element);
}

// 复制函数
function handleCopy(text) {
  let inputNode = document.createElement("input"); // 创建input
  inputNode.value = text; // 赋值给 input 值
  document.body.appendChild(inputNode); // 插入进去
  inputNode.select(); // 选择对象
  document.execCommand("Copy"); // 原生调用执行浏览器复制命令
  inputNode.className = "oInput";
  inputNode.style.display = "none"; // 隐藏
  console.log("复制:", text);
}