SegmentFaultNock

BlogNock系列,思否文章的标识优化

2024-05-08 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

  1. // ==UserScript==
  2. // @name SegmentFaultNock
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.0.2
  5. // @description BlogNock系列,思否文章的标识优化
  6. // @author Exisi
  7. // @license MIT License
  8. // @match segmentfault.com/a/*
  9. // @supportURL https://github.com/Exisi/BlogNock/issues/
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_setValue
  12. // @grant GM_getValue
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. "use strict";
  17. const features = {
  18. mark: {
  19. datetime: {
  20. enabled: GM_getValue("datetime", true),
  21. selector: ["time[itemprop='datePublished']"],
  22. icon: "data:image/png;base64,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",
  23. },
  24. adjust_position: {
  25. enabled: GM_getValue("adjust_position", true),
  26. selector: ["time[itemprop='datePublished']"],
  27. icon: "data:image/png;base64,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",
  28. },
  29. readtime: {
  30. enabled: GM_getValue("readtime", true),
  31. selector: ["time[itemprop='datePublished']", "article"],
  32. icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAFCUlEQVRoge1YWU8bVxQ+nrFnxuMVs5iyLy4GK0AILQ1QaCqBVBLx0ERtUiEUIar2F+UxQjwgdVFQk1ZVFaFEbSpKaEExiwsB0pYQGiiLsT1je2bsqc4E0pJAwdcW6cN8yEKyfO79vrPdcy/o0KFDhw4dOgAMJD5QVRXGf54uowyGpIGikhnxo6qCrCSYfHf207KyQtFgSI2akWTPL7787lzg10c+jmOuGch8cSBkRQELb+65crnrMwBIyUFEQoLbIWduTtY1k4nI/FBgpCMRcWhzKzgCAOup2FIkG9pslpAgRPsoKnPRwFSSZQX/92ZlObZStifZFD13Y/j220+e/HWP4xiSJV4CppWZY7tbWhpGq73lW6nWCFFEEL4aTyAWi2uiMgEpLkNujmsdRZAsRyyEogxJk4nOiAjYjbKJMSrEfEgNHQ5biGWZDxKJzHRfRUmA3W4NkdoTC8nPz0larZZIIpEgXeI5kskkGI3GXnde9lPSNYiFIAoL81awTlItzBeB3crptAUrK4sjpGukJaTaWz5H03SvohCntuYEUYz1VVQUPUqHS5oRcSuve0oehsNiH0lU0AYjarGYxXPvvBlIh0taQhDd3e+O8zwrRqOxlFMMG0UkEu1vbj49mi6PtIUgOjqaRyRJvhqXpGOLwXa7sxPqq6urmmo841tJl0NGhFR7K7Y6O1puy5LcIwjR/xSjjSKKAsFguK+mpnLuwvn2XzLBgXhEOQhLS8vWH+5NtAeDYSfPc0MvCtqticu465kG32RrS8PiocRSTNOMCtnDT2P+iomJ2SWjkQaK+ifoWNhFRe62i+93/ngksZOatQ7Dysoas70dctE0/ZKf8Lt4XGJmZhbyMr1vRiNy5+79U37/fB2AOmSx8FpX2jv50cMMY4R4XNbOjeJi9/JHVy7cOZTYq0qtb779vml2ZtFnt1sHMJ0EQQSWZfCM0EhJcQnCEQFYlgWGMcHOTuSqzcaHPv3kw6/+N0IwEuPj000ul+M6RiEWjYG3uhxqT1WB252t/UYUojD/8HeYmAwATgI8b4adnXAvDp8f91+69cqFLC4t24eHRy7abJYBvDFGIiK0tjbA2bfqD7RdXV2HW1/fBUmSgec52NgM9tfVeqfOd7Xta8MnXuyjow9aTCbjAHaoUEiA+jrvoSIQBQV50PVem1Y/OCw67LbrgcCS7/HjP9O6aqYlZG7+N9fa2kYeehZbq8vlgPb2N460Ky0tgNraKhxP4NnlTB30++dPp8MlLSELC394KIoexOJGIfX1VVohHweNjT7gLZyWYmYzByur60WvTMja+mY+y5q0FLHZLFBZWXJs2yynHUqKXtPaMaZlJCxYZ2YXic8XYiHLy6tcVIxxeMihV7OznRq5VID1AuqzwlZVdXBzI+g6cSGCEOMlSf4cOxVeVVMVgcjOcTzvmxgVQRStpHyInwrjksShANhtlXuvjnvfHQWsK+1DU1o7NxiwziSOlA/ROTI9vZA3NvbgrKQoN400rZE3m1nAsURNqoB/RwHtYnjahwXNEbiGqsIlj6dksbOjeepEHrHvj081BUORm067FZKqqg2DghCD7e2w5prjUEA7FMNxrBaR3Vq7MTkZ6KsoL8T7e0oPEURCEomE0UhTIMn7Hx2O23r/DXnfGqr28BeXZO5EhHg8pYt+/3wPRRlihNl5AFSQJJXJz8/d8tVUbmRoUR06dOjQoeNoAMDfddMStWBVXeEAAAAASUVORK5CYII=",
  33. },
  34. },
  35. };
  36.  
  37. const setModal = `<div class="modal-dialog"> <div class="modal-setting" onClick="event.cancelBubble = true"> <div class="modal-header"> <h3>功能设置</h3> <span class="btn-dialog-close">×</span> </div> <div class="modal-body"> <div class="setting-item"> <span> 文章显示时间优化 </span> <span> <input type="checkbox" id="feature-mark-datetime" aria-nock="datetime" /> <label for="feature-mark-datetime"></label> </span> </div> <div class="setting-item"> <span> 定位文字调整 </span> <span> <input type="checkbox" id="feature-mark-adjust-position" aria-nock="adjust_position" /> <label for="feature-mark-adjust-position"></label> </span> </div> <div class="setting-item"> <span> 点击文章阅读时长跳转文章底部 </span> <span> <input type="checkbox" id="feature-mark-readtime" aria-nock="readtime" /> <label for="feature-mark-readtime"></label> </span> </div> </div> </div> </div>`;
  38. const setStyle = `@keyframes fall { 0% { transform: translate(0%, -100%); opacity: 0; } 100% { transform: translate(0%, 0%); opacity: 1; } } .setting-item input[type=checkbox] { height: 0; width: 0; display: none; } .setting-item label { cursor: pointer; text-indent: -9999px; width: 40px; height: 20px; background: pink; display: block; border-radius: 100px; position: relative; } .setting-item label:after { content: ''; position: absolute; top: 2px; left: 2px; width: 15px; height: 15px; background: #fff; border-radius: 90px; transition: 0.2s; } .setting-item input:checked+label { background: #57a; } .setting-item input:checked+label:after { left: calc(100% - 2px); transform: translateX(-100%); } .setting-item label:active:after { width: 28px; } .modal-dialog { pointer-events: auto !important; display:none; border: none; position: fixed; z-index: 9999; left: 0; top: 0; width: 100%; min-width: 100vw; min-height: 100vh; height: 100%; background-color: rgba(0, 0, 0, 0.4); } .modal-setting { width: 450px; margin: auto; background-color: #ffffff; border-radius: 5px; padding: 20px; margin-top: 40px; position: relative; box-sizing: border-box; animation: fall 0.5s ease-in-out; } .modal-header { border-bottom: 1px solid #000000; } .modal-header h3 { padding: 10px 0; margin: 0; } .modal-header span { font-size: 24px; color: #ccc; position: absolute; right: 5px; top: 0; cursor: pointer; } .setting-item { margin: 10px 0; display: flex; justify-content: space-between; }`;
  39.  
  40. const dStyle = document.createElement("style");
  41. dStyle.innerHTML = setStyle;
  42. document.head.appendChild(dStyle);
  43. const modal = document.createElement("div");
  44. modal.innerHTML = setModal;
  45. document.body.appendChild(modal);
  46.  
  47. const checkboxList = document.querySelectorAll(".setting-item input");
  48. Array.from(checkboxList).forEach((checkbox) => {
  49. const nock = checkbox.getAttribute("aria-nock");
  50. checkbox.checked = GM_getValue(nock, true);
  51. });
  52.  
  53. const showSetting = () => (document.querySelector(".modal-dialog").style.display = "block");
  54. const closeSetting = () => (document.querySelector(".modal-dialog").style.display = "none");
  55.  
  56. document.querySelector(".modal-dialog").addEventListener("click", closeSetting);
  57. document.querySelector(".modal-setting").addEventListener("click", (e) => e.stopPropagation());
  58. document.querySelector(".btn-dialog-close").addEventListener("click", closeSetting);
  59. document.querySelector(".modal-body").addEventListener("click", (e) => {
  60. if (e.target.type !== "checkbox") {
  61. return;
  62. }
  63. const nock = e.target.getAttribute("aria-nock");
  64. const flag = GM_getValue(nock) == null ? false : !GM_getValue(nock);
  65. GM_setValue(nock, flag);
  66. });
  67. GM_registerMenuCommand("功能设置", showSetting);
  68.  
  69. if (features.mark.datetime.enabled) {
  70. const datePublished = document.querySelector(features.mark.datetime.selector[0]);
  71. const rawPublishedTime = datePublished.getAttribute("datetime");
  72.  
  73. const postTimeAgo = calculateTimeAgo(rawPublishedTime);
  74. const postTime = new Date(rawPublishedTime).toLocaleString().replaceAll("/", "-");
  75.  
  76. const formattedPostTime = `${postTime}(${postTimeAgo})`;
  77. datePublished.style.textDecoration = "underline";
  78. datePublished.innerText = formattedPostTime;
  79.  
  80. const icon = document.createElement("img");
  81. icon.src = features.mark.datetime.icon;
  82. icon.style.width = "15px";
  83. icon.style.marginRight = "3px";
  84. datePublished.before(icon);
  85. datePublished.parentNode.style.display = "flex";
  86. datePublished.parentNode.style.alignItems = "center";
  87. }
  88.  
  89. if (
  90. features.mark.adjust_position.enabled &&
  91. document.querySelector(features.mark.adjust_position.selector[0]).nextSibling
  92. ) {
  93. const time = document.querySelector(features.mark.adjust_position.selector[0]);
  94. const position = time.nextSibling;
  95. const positionBox = document.createElement("a");
  96.  
  97. const icon = document.createElement("img");
  98. icon.src = features.mark.adjust_position.icon;
  99. icon.style.width = "14px";
  100.  
  101. positionBox.style.display = "flex";
  102. positionBox.style.alignItems = "center";
  103. positionBox.style.marginLeft = "10px";
  104. positionBox.style.color = "rgba(108, 117, 125)";
  105. positionBox.appendChild(icon);
  106. positionBox.appendChild(position);
  107. time.parentNode.after(positionBox);
  108. }
  109.  
  110. if (features.mark.readtime.enabled) {
  111. const time = document.querySelector(features.mark.readtime.selector[0]);
  112. const article = document.querySelector(features.mark.readtime.selector[1]);
  113. const readtime = time.closest("div").lastChild;
  114. readtime.style.textDecoration = "underline";
  115. readtime.style.cursor = "pointer";
  116. readtime.addEventListener("click", () => article.scrollIntoView(false));
  117. }
  118.  
  119. function calculateTimeAgo(datetime) {
  120. const SECOND = 1000;
  121. const MINUTE = 60 * SECOND;
  122. const HOUR = 60 * MINUTE;
  123. const DAY = 24 * HOUR;
  124. const MONTH = 30 * DAY;
  125. const YEAR = 12 * MONTH;
  126.  
  127. const postDate = new Date(datetime);
  128. const currentDate = new Date();
  129. const timeDiff = currentDate - postDate;
  130.  
  131. if (timeDiff >= YEAR) {
  132. return Math.floor(timeDiff / YEAR) + " 年前";
  133. }
  134. if (timeDiff >= MONTH) {
  135. return Math.floor(timeDiff / MONTH) + " 个月前";
  136. }
  137. if (timeDiff >= DAY) {
  138. return Math.floor(timeDiff / DAY) + " 天前";
  139. }
  140. if (timeDiff >= HOUR) {
  141. return Math.floor(timeDiff / HOUR) + " 小时前";
  142. }
  143. if (timeDiff >= MINUTE) {
  144. return Math.floor(timeDiff / MINUTE) + " 分钟前";
  145. }
  146. return Math.floor(timeDiff / SECOND) + " 秒前";
  147. }
  148. })();