CSDN文章导出Markdown

将csdn的文章直接导出为markdown格式,直接拷贝到剪切板中,不需要登录(不可用)

  1. // ==UserScript==
  2. // @name CSDN文章导出Markdown
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description 将csdn的文章直接导出为markdown格式,直接拷贝到剪切板中,不需要登录(不可用)
  6. // @author You
  7. // @match https://blog.csdn.net/*/article/details/*
  8. // @match https://*.blog.csdn.net/article/details/*
  9. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  10. // @require https://unpkg.com/turndown/dist/turndown.js
  11. // @require https://cdn.jsdelivr.net/npm/msg-alert@1.0.0-beta.2/dist/msg-alert.min.js
  12. // @grant GM_setClipboard
  13. // @grant GM_addStyle
  14. // @license MIT
  15. // ==/UserScript==
  16.  
  17. // 添加复制按钮样式
  18. GM_addStyle(`
  19. .copy-btns { display: block; }
  20.  
  21. .copy-btns > button {
  22. margin-left: 10px;
  23. vertical-align: middle;
  24. font-size: 16px;
  25. background: transparent;
  26. border: 1px solid #ccc;
  27. padding: 3px 5px;
  28. border-radius: 3px;
  29. box-shadow: inset 0px 0px 0px 1px rgba(var(--dsw-green-standard-rgb), 1);
  30. color: rgba(var(--dsw-green-standard-rgb), 1);
  31. cursor: pointer;
  32. outline: none;
  33. }`);
  34.  
  35. const turndownService = new TurndownService({
  36. emDelimiter: "*",
  37. bulletListMarker: "-",
  38. });
  39. turndownService.addRule("strikethrough", {
  40. filter: ["pre"],
  41. replacement: (content, node) =>
  42. "\n```txt\n" + node.innerText.trim() + "\n```\n",
  43. });
  44. turndownService.addRule("strikethrough", {
  45. filter: ["sup"],
  46. replacement: (content) => "^" + content,
  47. });
  48.  
  49. // 接收HTML字符串转成Markdown格式
  50. const htmlToMd = (htmlStr) => {
  51. return turndownService.turndown(htmlStr.replace(/<p>&nbsp;<\/p>/g, "<br>"));
  52. };
  53.  
  54. const copyHandler = () => {
  55. const title = document.querySelector("h1.title-article");
  56. const article = document.querySelector("article");
  57. if (article) {
  58. let content = htmlToMd(article.innerHTML);
  59. let t = `# ${title.innerText}`;
  60. content = t + content;
  61. console.log(content);
  62. GM_setClipboard(content, "text");
  63. message.success({
  64. text: "文章复制成功",
  65. duration: 1000,
  66. });
  67. }
  68. };
  69.  
  70. const copyTitleBtn = document.createElement("button");
  71. copyTitleBtn.innerText = "复制文章";
  72. copyTitleBtn.addEventListener("click", copyHandler);
  73. const copyBtnsEle = document.createElement("div");
  74. copyBtnsEle.className = "copy-btns";
  75. copyBtnsEle.appendChild(copyTitleBtn);
  76.  
  77. const init = () => {
  78. console.log("好好好,你这么搞是吧!");
  79. // 初始化元素
  80. document.querySelector(".article-title-box").appendChild(copyBtnsEle);
  81. };
  82.  
  83. (function () {
  84. "use strict";
  85. window.addEventListener("load", init);
  86. // Your code here...
  87. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址