csdn_plus

CSDN免登录,保持文本原有格式复制,展开折叠的代码,展开需要关注博主阅读全文的内容

  1. // ==UserScript==
  2. // @name csdn_plus
  3. // @namespace https://github.com/qgning/tampermonkey_csdn_plus
  4. // @version 0.0.5
  5. // @author gning
  6. // @description CSDN免登录,保持文本原有格式复制,展开折叠的代码,展开需要关注博主阅读全文的内容
  7. // @license BSD
  8. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACoElEQVRYR+2UT2hcVRTGf99LTEGki/x5nRmrjTNDpqaUQoKO4kYQQcRFCzaLWIWKhYLYRRctdNNk1xYRSopYFFxokVriJhaLiN2kQgJuQiN2nBknEH3JpCmUYrWYeV950xRsKd1JN++uDufce853fvfcKx7x0iOuTyogJZASSAmkBO4hcHlwsOvGzTgXmKy9dr2ri5WhanXl//yu2wJ+ym/d3hGzFxgFb/pvwXLjioqZzKDxfsslwQ7gcSACmrInLJ1dP7NkWMBcaK3FpxeuXo2K3d0bvaHzPGIjpgfoNsxJPlP7c2VCM/mtbyj2aUMO+F5mzvIlSU9gb36+UTlWyIaXgW2Gc5hf2slgs3Af1reID23GEUXBc8AAMC8HI2tws0Px78A/hsnAumW5fDefZraUvkbsBn9VblRGH4Q7nw1XdUf5uQCmgo7Wj5XF1T+SvYVs30nQAcOeetQ8k/jymXBM4ijWKan1uQl+Fvq1Gi0/m8SLmd6XreBiYmumv+TEiPH4i43K2AMFZPpel7QT2AX0AteNPq5Hy0cK2fCbxN+K9UJjeXnmvgIXbE9IOg/8UIuar94X/1uzz5SmbV7CfFFeuPLOwwaumMn0Qbzb4l1gWPaIpcOJfaujq2dxcfHaHSphgrwf+YAddAp/JJisRs031+NJI4nwec1uKb1l8WUbB9SM5rCrEqWWg/E9/65+QEw3YskmksgDb7eF2nuRjgNhewbwkNAwIpdcVz1qjuRz4SmZ98Gf1aKVfW0C2U3vGX9qe6r9CmafHnjFgZIXUAblDdcEC491tnaO/HXjoB33Iw0BTyF+w8zbVOpLzbFCNpwGnmx3DA1ww+hsPWp+st7td8BrmBO1pWZCi0IuPIQ5Dj6Z/oQpgZRASiAlkBK4DZtvGMy5535NAAAAAElFTkSuQmCC
  9. // @supportURL https://github.com/qgning/tampermonkey_csdn_plus
  10. // @match *://blog.csdn.net/*/article/details/*
  11. // @match *://*.blog.csdn.net/article/details/*
  12. // @grant GM_addStyle
  13. // @grant GM_setClipboard
  14. // ==/UserScript==
  15.  
  16. (function () {
  17. 'use strict';
  18.  
  19. var _GM_addStyle = /* @__PURE__ */ (() => typeof GM_addStyle != "undefined" ? GM_addStyle : void 0)();
  20. var _GM_setClipboard = /* @__PURE__ */ (() => typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0)();
  21. async function main() {
  22. var _a, _b, _c, _d;
  23. function style_selectable(selector) {
  24. return selector + " { -webkit-touch-callout: auto; -webkit-user-select: auto; -khtml-user-select: auto; -moz-user-select: auto; -ms-user-select: auto; user-select: auto; !important; }";
  25. }
  26. _GM_addStyle(
  27. style_selectable("#content_views") + style_selectable("#content_views pre") + style_selectable("#content_views pre code")
  28. );
  29. let contentEl = document.querySelector("main .blog-content-box");
  30. (_a = contentEl == null ? void 0 : contentEl.parentNode) == null ? void 0 : _a.replaceChild(contentEl.cloneNode(true), contentEl);
  31. (_b = document.querySelectorAll(".pre-numbering")) == null ? void 0 : _b.forEach((e) => e.removeAttribute("style"));
  32. document.querySelectorAll(".set-code-hide").forEach((e) => e.classList.replace("set-code-hide", "set-code-show"));
  33. document.querySelectorAll(".hide-preCode-box").forEach((e) => e.remove());
  34. let copy_buttons = document.getElementsByClassName("hljs-button");
  35. for (let i = 0; i < copy_buttons.length; i++) {
  36. copy_buttons[i].setAttribute("data-title", "Copy code");
  37. copy_buttons[i].removeAttribute("onclick");
  38. let timerid = void 0;
  39. copy_buttons[i].addEventListener("click", (event) => {
  40. let button = copy_buttons[i];
  41. clearTimeout(timerid);
  42. event.stopPropagation();
  43. _GM_setClipboard(button.parentNode.innerText, "text");
  44. button.setAttribute("data-title", "Copied!");
  45. timerid = setTimeout(() => {
  46. button.setAttribute("data-title", "Copy code");
  47. }, 1e3);
  48. });
  49. }
  50. (_c = document.getElementById("article_content")) == null ? void 0 : _c.removeAttribute("style");
  51. (_d = document.getElementsByClassName("hide-article-box")[0]) == null ? void 0 : _d.remove();
  52. }
  53. main().catch((err) => {
  54. console.error(err);
  55. });
  56.  
  57. })();