Twitter - 为用户添加备注

为用户添加备注功能,以帮助识别和搜索

当前为 2020-08-28 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Twitter - Add notes to the user
  3. // @name:zh-CN Twitter - 为用户添加备注
  4. // @name:zh-TW Twitter - 為用戶添加備註
  5. // @name:ja Twitter - ユーザーに備考を加える
  6. // @name:ko Twitter - 사용자에 대한 주석 추가
  7. // @namespace https://greasyfork.org/zh-CN/users/193133-pana
  8. // @homepage https://www.sailboatweb.com
  9. // @icon data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWxhYmVsbGVkYnk9Im5ld0ljb25UaXRsZSIgc3Ryb2tlPSJyZ2JhKDI5LDE2MSwyNDIsMS4wMCkiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZmlsbD0ibm9uZSIgY29sb3I9InJnYmEoMjksMTYxLDI0MiwxLjAwKSI+IDx0aXRsZSBpZD0ibmV3SWNvblRpdGxlIj5OZXc8L3RpdGxlPiA8cGF0aCBkPSJNMTkgMTRWMjJIMi45OTk5N1Y0SDEzIi8+IDxwYXRoIGQ9Ik0xNy40NjA4IDQuMDM5MjFDMTguMjQxOCAzLjI1ODE3IDE5LjUwODIgMy4yNTgxNiAyMC4yODkyIDQuMDM5MjFMMjAuOTYwOCA0LjcxMDc5QzIxLjc0MTggNS40OTE4NCAyMS43NDE4IDYuNzU4MTcgMjAuOTYwOCA3LjUzOTIxTDExLjU4NTggMTYuOTE0MkMxMS4yMTA3IDE3LjI4OTMgMTAuNzAyIDE3LjUgMTAuMTcxNiAxNy41TDcuNSAxNy41TDcuNSAxNC44Mjg0QzcuNSAxNC4yOTggNy43MTA3MSAxMy43ODkzIDguMDg1NzkgMTMuNDE0MkwxNy40NjA4IDQuMDM5MjFaIi8+IDxwYXRoIGQ9Ik0xNi4yNSA1LjI1TDE5Ljc1IDguNzUiLz4gPC9zdmc+
  10. // @version 3.0.7
  11. // @description Add a note for users to help identify and search
  12. // @description:zh-CN 为用户添加备注功能,以帮助识别和搜索
  13. // @description:zh-TW 為用戶添加備註功能,以幫助識別和搜尋
  14. // @description:ja ユーザーに備考機能を追加し、識別と検索を助ける
  15. // @description:ko 식별 및 검색에 도움이 되는 사용자에 대한 주석 추가 기능
  16. // @author pana
  17. // @license GNU General Public License v3.0 or later
  18. // @include http*://*twitter.com/*
  19. // @require https://cdn.jsdelivr.net/npm/arrive@2.4.1/minified/arrive.min.js
  20. // @require https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js
  21. // @require https://greasyfork.org/scripts/408454-note-obj/code/Note_Obj.js?version=841515
  22. // @grant GM_info
  23. // @grant GM_getValue
  24. // @grant GM_setValue
  25. // @grant GM_deleteValue
  26. // @grant GM_listValues
  27. // @grant GM_registerMenuCommand
  28. // @grant GM_addValueChangeListener
  29. // ==/UserScript==
  30.  
  31. (function() {
  32. 'use strict';
  33. const TWITTER_ICON = {
  34. 'NOTE_GRAY': 'url(data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWxhYmVsbGVkYnk9Im5ld0ljb25UaXRsZSIgc3Ryb2tlPSJyZ2IoMTAxLCAxMTksIDEzNCkiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZmlsbD0ibm9uZSIgY29sb3I9InJnYigxMDEsIDExOSwgMTM0KSI+IDx0aXRsZSBpZD0ibmV3SWNvblRpdGxlIj5OZXc8L3RpdGxlPiA8cGF0aCBkPSJNMTkgMTRWMjJIMi45OTk5N1Y0SDEzIi8+IDxwYXRoIGQ9Ik0xNy40NjA4IDQuMDM5MjFDMTguMjQxOCAzLjI1ODE3IDE5LjUwODIgMy4yNTgxNiAyMC4yODkyIDQuMDM5MjFMMjAuOTYwOCA0LjcxMDc5QzIxLjc0MTggNS40OTE4NCAyMS43NDE4IDYuNzU4MTcgMjAuOTYwOCA3LjUzOTIxTDExLjU4NTggMTYuOTE0MkMxMS4yMTA3IDE3LjI4OTMgMTAuNzAyIDE3LjUgMTAuMTcxNiAxNy41TDcuNSAxNy41TDcuNSAxNC44Mjg0QzcuNSAxNC4yOTggNy43MTA3MSAxMy43ODkzIDguMDg1NzkgMTMuNDE0MkwxNy40NjA4IDQuMDM5MjFaIi8+IDxwYXRoIGQ9Ik0xNi4yNSA1LjI1TDE5Ljc1IDguNzUiLz4gPC9zdmc+)',
  35. 'NOTE_BLUE': 'url(data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWxhYmVsbGVkYnk9Im5ld0ljb25UaXRsZSIgc3Ryb2tlPSJyZ2JhKDI5LDE2MSwyNDIsMS4wMCkiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZmlsbD0ibm9uZSIgY29sb3I9InJnYmEoMjksMTYxLDI0MiwxLjAwKSI+IDx0aXRsZSBpZD0ibmV3SWNvblRpdGxlIj5OZXc8L3RpdGxlPiA8cGF0aCBkPSJNMTkgMTRWMjJIMi45OTk5N1Y0SDEzIi8+IDxwYXRoIGQ9Ik0xNy40NjA4IDQuMDM5MjFDMTguMjQxOCAzLjI1ODE3IDE5LjUwODIgMy4yNTgxNiAyMC4yODkyIDQuMDM5MjFMMjAuOTYwOCA0LjcxMDc5QzIxLjc0MTggNS40OTE4NCAyMS43NDE4IDYuNzU4MTcgMjAuOTYwOCA3LjUzOTIxTDExLjU4NTggMTYuOTE0MkMxMS4yMTA3IDE3LjI4OTMgMTAuNzAyIDE3LjUgMTAuMTcxNiAxNy41TDcuNSAxNy41TDcuNSAxNC44Mjg0QzcuNSAxNC4yOTggNy43MTA3MSAxMy43ODkzIDguMDg1NzkgMTMuNDE0MkwxNy40NjA4IDQuMDM5MjFaIi8+IDxwYXRoIGQ9Ik0xNi4yNSA1LjI1TDE5Ljc1IDguNzUiLz4gPC9zdmc+)',
  36. 'SEARCH_BLUE': 'url(data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWxhYmVsbGVkYnk9InNlYXJjaEljb25UaXRsZSIgc3Ryb2tlPSJyZ2JhKDI5LDE2MSwyNDIsMS4wMCkiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZmlsbD0ibm9uZSIgY29sb3I9InJnYmEoMjksMTYxLDI0MiwxLjAwKSI+IDx0aXRsZSBpZD0ic2VhcmNoSWNvblRpdGxlIj5TZWFyY2g8L3RpdGxlPiA8cGF0aCBkPSJNMTQuNDEyMTEyMiwxNC40MTIxMTIyIEwyMCwyMCIvPiA8Y2lyY2xlIGN4PSIxMCIgY3k9IjEwIiByPSI2Ii8+IDwvc3ZnPg==)'
  37. };
  38. const TWITTER_STYLE = `
  39. .note-obj-twitter-blue-tag {
  40. background-color: #3c81df;
  41. color: #fff;
  42. display: inline-flex;
  43. align-items: center;
  44. padding: 2px 10px;
  45. white-space: nowrap;
  46. line-height: 100%;
  47. border-radius: 50px;
  48. }
  49. .note-obj-twitter-note-btn {
  50. background-image: ${TWITTER_ICON.NOTE_GRAY};
  51. background-repeat: no-repeat;
  52. background-position: center;
  53. background-color: rgba(0, 0, 0, 0);
  54. border-bottom-left-radius: 9999px;
  55. border-bottom-right-radius: 9999px;
  56. border-top-left-radius: 9999px;
  57. border-top-right-radius: 9999px;
  58. transition-property: background-color, box-shadow;
  59. transition-duration: 0.2s;
  60. }
  61. .note-obj-twitter-note-btn:hover {
  62. background-image: ${TWITTER_ICON.NOTE_BLUE};
  63. background-color: rgba(29, 161, 242, .1);
  64. }
  65. .note-obj-twitter-base-tool-bar-btn {
  66. height: 32px;
  67. width: 32px;
  68. margin: 5px 0px 0px 0px;
  69. background-size: 28px auto;
  70. cursor: pointer !important;
  71. border-radius: 0px;
  72. }
  73. .note-obj-twitter-base-tool-bar-btn-mobile {
  74. height: 18px;
  75. width: 18px;
  76. margin: 0px 20px 0px 0px;
  77. background-size: 18px auto;
  78. border-radius: 0px;
  79. }
  80. .note-obj-twitter-comment-tool-bar-btn-mobile {
  81. height: 24px;
  82. width: 24px;
  83. background-size: 24px auto;
  84. border-radius: 0px;
  85. margin: 10px 0px 0px 0px;
  86. }
  87. .note-obj-twitter-before-follow-note-btn {
  88. height: 38px;
  89. width: 38px;
  90. background-image: ${TWITTER_ICON.NOTE_BLUE};
  91. background-repeat: no-repeat;
  92. background-size: 19px auto;
  93. background-position: center;
  94. margin-bottom: 10px;
  95. margin-right: 10px;
  96. cursor: pointer;
  97. border: 1px solid rgba(29, 161, 242, 1);
  98. border-bottom-left-radius: 9999px;
  99. border-bottom-right-radius: 9999px;
  100. border-top-left-radius: 9999px;
  101. border-top-right-radius: 9999px;
  102. background-color: rgba(0, 0, 0, 0);
  103. transition-property: background-color, box-shadow;
  104. transition-duration: 0.2s;
  105. }
  106. .note-obj-twitter-before-follow-note-btn:hover {
  107. background-color: rgba(29, 161, 242, .1);
  108. }
  109. .note-obj-twitter-before-follow-note-btn-mobile {
  110. margin-bottom: 8px !important;
  111. }
  112. .note-obj-twitter-search-btn-mobile {
  113. background-image: ${TWITTER_ICON.SEARCH_BLUE};
  114. background-size: 28px auto;
  115. background-position: center;
  116. background-repeat: no-repeat;
  117. width: 28px;
  118. height: 28px;
  119. margin: 10px 20px 0px 0px;
  120. }
  121. `;
  122. var selector = {
  123. 'body': 'body',
  124. 'root': '#react-root div .r-13awgt0.r-12vffkv',
  125. 'homepage': {
  126. 'article': 'article',
  127. 'tool_bar': '.css-1dbjc4n.r-18u37iz.r-1wtj0ep.r-1mdbhws',
  128. 'show_name': '.css-901oao.css-bfa6kz.r-1qd0xha.r-vw2c0b.r-ad9z0x.r-bcqeeo.r-3s2u2q.r-qvutc0 > span',
  129. 'id': '.css-901oao.css-bfa6kz.r-18u37iz.r-1qd0xha.r-16dba41.r-ad9z0x.r-bcqeeo.r-qvutc0 > span',
  130. 'reprint_a': '.css-1dbjc4n.r-1habvwh.r-16y2uox a',
  131. 'reprint_name': ':scope > span:first-of-type > span',
  132. 'at': 'a.css-4rbku5.css-18t94o4.css-901oao.css-16my406.r-1loqt21.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0',
  133. 'user_frame': '.css-18t94o4.css-1dbjc4n.r-1ny4l3l.r-1j3t67a.r-1w50u8q.r-o7ynqc.r-6416eg',
  134. 'blockquote': 'div[role="blockquote"]'
  135. },
  136. 'userpage': {
  137. 'main_user_id': '.css-1dbjc4n.r-15d164r.r-1g94qm0 .css-1dbjc4n.r-18u37iz.r-1wbh5a2 > div > span',
  138. 'main': '.css-1dbjc4n.r-ku1wi2.r-1j3t67a.r-m611by',
  139. 'id': '.css-1dbjc4n.r-18u37iz.r-1wbh5a2 > div > span',
  140. 'follow': '.css-1dbjc4n.r-obd0qt.r-18u37iz.r-1w6e6rj.r-1h0z5md.r-dnmrzs',
  141. 'show_name': '.css-901oao.r-1qd0xha.r-1b6yd1w.r-1vr29t4.r-ad9z0x.r-bcqeeo.r-qvutc0 > span'
  142. },
  143. 'comment': {
  144. 'tool_bar': '.css-1dbjc4n.r-1oszu61.r-1efd50x.r-5kkj8d.r-18u37iz.r-a2tzq0'
  145. },
  146. 'mobile': {
  147. 'bootom_bar': ''
  148. },
  149. 'hover': {
  150. 'panel': 'div.css-1dbjc4n.r-1oqcu8e',
  151. 'follow_btn': '.css-1dbjc4n.r-bcqeeo',
  152. 'id': '.css-1dbjc4n.r-18u37iz.r-1wbh5a2',
  153. 'show_name': '.css-901oao.css-bfa6kz.r-1qd0xha.r-a023e6.r-vw2c0b.r-ad9z0x.r-bcqeeo.r-3s2u2q.r-qvutc0 > span'
  154. }
  155. };
  156. var mobile_selector = {
  157. 'body': 'body',
  158. 'root': '#react-root div .r-13awgt0.r-12vffkv',
  159. 'homepage': {
  160. 'article': 'article',
  161. 'tool_bar': '.css-1dbjc4n.r-18u37iz.r-1wtj0ep.r-1mdbhws',
  162. 'show_name': '.css-901oao.css-bfa6kz.r-1qd0xha.r-vw2c0b.r-ad9z0x.r-bcqeeo.r-3s2u2q.r-qvutc0 > span',
  163. 'id': '.css-901oao.css-bfa6kz.r-18u37iz.r-1qd0xha.r-16dba41.r-ad9z0x.r-bcqeeo.r-qvutc0 > span',
  164. 'reprint_a': '.css-1dbjc4n.r-1habvwh.r-1iusvr4.r-16y2uox a',
  165. 'reprint_name': '.css-1dbjc4n.r-1habvwh.r-1iusvr4.r-16y2uox a > span > span',
  166. 'at': 'a.css-4rbku5.css-18t94o4.css-901oao.css-16my406.r-1loqt21.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0',
  167. 'user_frame': '.css-18t94o4.css-1dbjc4n.r-rull8r.r-qklmqi.r-1ny4l3l.r-779j7e.r-1xtiow5.r-o7ynqc.r-6416eg',
  168. 'blockquote': 'div[role="blockquote"]'
  169. },
  170. 'userpage': {
  171. 'main_user_id': '.css-1dbjc4n.r-hxarbt.r-1g94qm0 .css-1dbjc4n.r-18u37iz.r-1wbh5a2 > div > span',
  172. 'main': '.css-1dbjc4n.r-1cad53l.r-779j7e.r-1b9bua6',
  173. 'id': '.css-1dbjc4n.r-18u37iz.r-1wbh5a2 > div > span',
  174. 'follow': '.css-1dbjc4n.r-obd0qt.r-18u37iz.r-1w6e6rj.r-1h0z5md.r-dnmrzs',
  175. 'show_name': '.css-901oao.r-1qd0xha.r-1i10wst.r-1vr29t4.r-ad9z0x.r-bcqeeo.r-qvutc0 > span'
  176. },
  177. 'comment': {
  178. 'tool_bar': '.css-1dbjc4n.r-1oszu61.r-1efd50x.r-5kkj8d.r-18u37iz.r-a2tzq0'
  179. },
  180. 'mobile': {
  181. 'bootom_bar': '.css-1dbjc4n.r-18u37iz.r-drjvcx.r-ripixn.r-13qz1uu'
  182. },
  183. 'hover': {
  184. 'panel': 'div.css-1dbjc4n.r-1oqcu8e',
  185. 'follow_btn': '.css-1dbjc4n.r-bcqeeo',
  186. 'id': '.css-1dbjc4n.r-18u37iz.r-1wbh5a2',
  187. 'show_name': '.css-901oao.css-bfa6kz.r-1qd0xha.r-a023e6.r-vw2c0b.r-ad9z0x.r-bcqeeo.r-3s2u2q.r-qvutc0 > span'
  188. }
  189. };
  190. function change_Event(note_obj, user_id = null) {
  191. for (let ele of document.querySelectorAll(selector.homepage.article)) {
  192. if (ele.querySelector(selector.homepage.id)) {
  193. let ele_id = ele.querySelector(selector.homepage.id).textContent.replace(/^@/, '');
  194. (! user_id || user_id == ele_id) && note_obj.handler(ele_id, ele, selector.homepage.show_name, {
  195. 'add': 'span',
  196. 'classname': 'note-obj-twitter-blue-tag'
  197. });
  198. }
  199. if (ele.querySelector(selector.homepage.reprint_a)) {
  200. let reprint_id = Note_Obj.fn.getUserIdFromLink(ele.querySelector(selector.homepage.reprint_a).href);
  201. (! user_id || user_id == reprint_id) && note_obj.handler(reprint_id, ele, selector.homepage.reprint_name, {
  202. 'add': 'span',
  203. 'classname': 'note-obj-twitter-blue-tag'
  204. });
  205. }
  206. let blockquote_user = ele.querySelector(selector.homepage.blockquote);
  207. if (blockquote_user) {
  208. let blockquote_user_id = blockquote_user.querySelector(selector.homepage.id).textContent.replace(/^@/, '');
  209. if (blockquote_user_id == user_id) {
  210. note_obj.handler(user_id, blockquote_user, selector.homepage.show_name);
  211. }
  212. (! user_id || user_id == blockquote_user_id) && note_obj.handler(blockquote_user_id, blockquote_user, selector.homepage.show_name, {
  213. 'add': 'span',
  214. 'classname': 'note-obj-twitter-blue-tag'
  215. });
  216. }
  217. for (let at_user of ele.querySelectorAll(selector.homepage.at)) {
  218. let at_user_id = Note_Obj.fn.getUserIdFromLink(at_user.href, value => /^[^/]+$/i.test(value));
  219. (! user_id || user_id == at_user_id) && note_obj.judgeUsers(at_user_id) && note_obj.handler(at_user_id, at_user, null, {
  220. 'symbol': {
  221. 'prefix': '@'
  222. }
  223. });
  224. }
  225. }
  226. for (let ele of document.querySelectorAll(selector.userpage.main)) {
  227. let user = ele.querySelector(selector.userpage.id);
  228. if (user) {
  229. let ele_id = user.textContent.replace(/^@/, '');
  230. (! user_id || user_id == ele_id) && note_obj.handler(ele_id, ele, selector.userpage.show_name, {
  231. 'add': 'span',
  232. 'classname': 'note-obj-twitter-blue-tag'
  233. });
  234. }
  235. }
  236. for (let ele of document.querySelectorAll(selector.homepage.user_frame)) {
  237. let user = ele.querySelector(selector.userpage.id);
  238. if (user) {
  239. let ele_id = user.textContent.replace(/^@/, '');
  240. (! user_id || user_id == ele_id) && note_obj.handler(ele_id, ele, selector.homepage.show_name, {
  241. 'add': 'span',
  242. 'class': 'note-obj-twitter-blue-tag'
  243. });
  244. }
  245. }
  246. }
  247. function init() {
  248. let note_obj = new Note_Obj('myTwitterNote', document.documentElement.lang);
  249. let arrive_option = {
  250. 'fireOnAttributesModification': true,
  251. 'existing': true
  252. };
  253. if (Note_Obj.fn.isMobilePage()) {
  254. selector = mobile_selector;
  255. document.querySelector(selector.root).arrive(selector.mobile.bootom_bar, arrive_option, function() {
  256. this.appendChild(note_obj.createSearchButton('note-obj-twitter-search-btn-mobile'));
  257. });
  258. }
  259. note_obj.init({
  260. 'style': selector.homepage.show_name + ' { white-space: normal; }\n' + TWITTER_STYLE,
  261. 'changeEvent': change_Event,
  262. 'script': {
  263. 'author': {
  264. 'name': 'pana',
  265. 'homepage': 'https://www.sailboatweb.com/'
  266. },
  267. 'address': 'https://greasyfork.org/scripts/404587',
  268. 'updated': '2020-8-28',
  269. 'library': [
  270. {
  271. 'name': 'Vue.js',
  272. 'version': '2.6.11',
  273. 'url': 'https://vuejs.org/'
  274. },
  275. {
  276. 'name': 'arrive.js',
  277. 'version': '2.4.1',
  278. 'url': 'https://github.com/uzairfarooq/arrive'
  279. }
  280. ]
  281. },
  282. 'CSP': true
  283. });
  284. document.querySelector(selector.root).arrive(selector.homepage.article, arrive_option, ele => {
  285. if (ele.querySelector(selector.homepage.id)) {
  286. let ele_id = ele.querySelector(selector.homepage.id).textContent.replace(/^@/, '');
  287. let ele_name = ele.querySelector(selector.homepage.show_name).textContent;
  288. if (Note_Obj.fn.isMobilePage()) {
  289. ele.querySelector(selector.homepage.tool_bar) && ele.querySelector(selector.homepage.tool_bar).appendChild(note_obj.createNoteBtn(ele_id, ele_name, ['note-obj-twitter-note-btn', 'note-obj-twitter-base-tool-bar-btn-mobile', 'css-1dbjc4n']));
  290. }
  291. if (Note_Obj.fn.isMobilePage()) {
  292. ele.querySelector(selector.comment.tool_bar) && ele.querySelector(selector.comment.tool_bar).appendChild(note_obj.createNoteBtn(ele_id, ele_name, ['note-obj-twitter-note-btn', 'note-obj-twitter-comment-tool-bar-btn-mobile', 'css-1dbjc4n']));
  293. }
  294. note_obj.judgeUsers(ele_id) && note_obj.handler(ele_id, ele, selector.homepage.show_name, {
  295. 'add': 'span',
  296. 'classname': 'note-obj-twitter-blue-tag'
  297. });
  298. }
  299. let reprint_a = ele.querySelector(selector.homepage.reprint_a);
  300. if (reprint_a) {
  301. let reprint_id = Note_Obj.fn.getUserIdFromLink(reprint_a.href);
  302. note_obj.judgeUsers(reprint_id) && note_obj.handler(reprint_id, reprint_a, selector.homepage.reprint_name, {
  303. 'add': 'span',
  304. 'classname': 'note-obj-twitter-blue-tag'
  305. });
  306. }
  307. let blockquote_user = ele.querySelector(selector.homepage.blockquote);
  308. if (blockquote_user) {
  309. let blockquote_user_id = blockquote_user.querySelector(selector.homepage.id).textContent.replace(/^@/, '');
  310. note_obj.judgeUsers(blockquote_user_id) && note_obj.handler(blockquote_user_id, blockquote_user, selector.homepage.show_name, {
  311. 'add': 'span',
  312. 'classname': 'note-obj-twitter-blue-tag'
  313. });
  314. }
  315. for (let at_user of ele.querySelectorAll(selector.homepage.at)) {
  316. let at_user_id = Note_Obj.fn.getUserIdFromLink(at_user.href, value => /^[^/]+$/i.test(value));
  317. note_obj.judgeUsers(at_user_id) && note_obj.handler(at_user_id, at_user, null, {
  318. 'symbol': {
  319. 'prefix': '@'
  320. }
  321. });
  322. }
  323. });
  324. document.querySelector(selector.root).arrive(selector.userpage.main, arrive_option, ele => {
  325. let ele_id = ele.querySelector(selector.userpage.id).textContent.replace(/^@/, '');
  326. let ele_name = ele.querySelector(selector.userpage.show_name).textContent;
  327. var follow_note_btn;
  328. if (ele.querySelector(selector.userpage.follow)) {
  329. if (Note_Obj.fn.isMobilePage()) {
  330. follow_note_btn = note_obj.createNoteBtn(ele_id, ele_name, ['note-obj-twitter-before-follow-note-btn', 'note-obj-twitter-before-follow-note-btn-mobile', 'css-901oao']);
  331. } else {
  332. follow_note_btn = note_obj.createNoteBtn(ele_id, ele_name, ['note-obj-twitter-before-follow-note-btn', 'css-901oao']);
  333. }
  334. ele.querySelector(selector.userpage.follow).insertAdjacentElement('afterbegin', follow_note_btn);
  335. }
  336. note_obj.judgeUsers(ele_id) && note_obj.handler(ele_id, ele, selector.userpage.show_name, {
  337. 'add': 'span',
  338. 'classname': 'note-obj-twitter-blue-tag'
  339. });
  340. let user_id_change = new MutationObserver(() => {
  341. let new_user_id = ele.querySelector(selector.userpage.id).textContent.replace(/^@/, '');
  342. note_obj.handler('', ele, selector.userpage.show_name, {
  343. 'add': 'span',
  344. 'classname': 'note-obj-twitter-blue-tag'
  345. });
  346. let new_user_name = ele.querySelector(selector.userpage.show_name).textContent;
  347. if (follow_note_btn) {
  348. follow_note_btn.remove();
  349. if (Note_Obj.fn.isMobilePage()) {
  350. follow_note_btn = note_obj.createNoteBtn(new_user_id, new_user_name, ['note-obj-twitter-before-follow-note-btn', 'note-obj-twitter-before-follow-note-btn-mobile', 'css-901oao']);
  351. } else {
  352. follow_note_btn = note_obj.createNoteBtn(new_user_id, new_user_name, ['note-obj-twitter-before-follow-note-btn', 'css-901oao']);
  353. }
  354. ele.querySelector(selector.userpage.follow).insertAdjacentElement('afterbegin', follow_note_btn);
  355. }
  356. note_obj.judgeUsers(new_user_id) && note_obj.handler(new_user_id, ele, selector.userpage.show_name, {
  357. 'add': 'span',
  358. 'classname': 'note-obj-twitter-blue-tag'
  359. });
  360. });
  361. user_id_change.observe(ele.querySelector(selector.userpage.main_user_id), {
  362. 'subtree': true,
  363. 'characterData': true
  364. });
  365. });
  366. document.querySelector(selector.root).arrive(selector.homepage.user_frame, arrive_option, ele => {
  367. let ele_id = ele.querySelector(selector.userpage.id).textContent.replace(/^@/, '');
  368. note_obj.judgeUsers(ele_id) && note_obj.handler(ele_id, ele, selector.homepage.show_name, {
  369. 'add': 'span',
  370. 'class': 'note-obj-twitter-blue-tag'
  371. });
  372. });
  373. document.querySelector(selector.root).arrive(selector.hover.panel, arrive_option, ele => {
  374. let user = ele.querySelector(selector.hover.id);
  375. if (user) {
  376. let ele_id = user.textContent.replace(/^@/, '');
  377. let user_show_name = ele.querySelector(selector.hover.show_name).textContent;
  378. ele.querySelector(selector.hover.follow_btn) && ele.querySelector(selector.hover.follow_btn).insertAdjacentElement('beforebegin', note_obj.createNoteBtn(ele_id, user_show_name, ['note-obj-twitter-note-btn', 'note-obj-twitter-base-tool-bar-btn']));
  379. note_obj.judgeUsers(ele_id) && note_obj.handler(ele_id, ele, selector.hover.show_name, {
  380. 'add': 'span',
  381. 'class': 'note-obj-twitter-blue-tag'
  382. });
  383. }
  384. });
  385. }
  386. init();
  387. })();