GreasyFork优化

自动登录账号、快捷寻找自己库被其他脚本引用、更新自己的脚本列表、库、优化图片浏览、美化页面、Markdown复制按钮

当前为 2024-12-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name GreasyFork优化
  3. // @name:en-US GreasyFork Optimization
  4. // @namespace https://github.com/WhiteSevs/TamperMonkeyScript
  5. // @version 2024.12.17.15
  6. // @author WhiteSevs
  7. // @description 自动登录账号、快捷寻找自己库被其他脚本引用、更新自己的脚本列表、库、优化图片浏览、美化页面、Markdown复制按钮
  8. // @description:en-US Automatically log in to the account, quickly find your own library referenced by other scripts, update your own script list, library, optimize image browsing, beautify the page, Markdown copy button
  9. // @license GPL-3.0-only
  10. // @icon data:image/png;base64,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
  11. // @supportURL https://github.com/WhiteSevs/TamperMonkeyScript/issues
  12. // @match *://greasyfork.org/*
  13. // @require https://update.greasyfork.org/scripts/494167/1413255/CoverUMD.js
  14. // @require https://fastly.jsdelivr.net/npm/@whitesev/utils@2.5.5/dist/index.umd.js
  15. // @require https://fastly.jsdelivr.net/npm/@whitesev/domutils@1.4.8/dist/index.umd.js
  16. // @require https://fastly.jsdelivr.net/npm/@whitesev/pops@1.9.5/dist/index.umd.js
  17. // @require https://fastly.jsdelivr.net/npm/qmsg@1.2.8/dist/index.umd.js
  18. // @require https://fastly.jsdelivr.net/npm/viewerjs@1.11.7/dist/viewer.min.js
  19. // @require https://fastly.jsdelivr.net/npm/i18next@24.1.0/i18next.min.js
  20. // @resource ViewerCSS https://fastly.jsdelivr.net/npm/viewerjs@1.11.7/dist/viewer.min.css
  21. // @connect greasyfork.org
  22. // @grant GM_addStyle
  23. // @grant GM_deleteValue
  24. // @grant GM_getResourceText
  25. // @grant GM_getValue
  26. // @grant GM_info
  27. // @grant GM_registerMenuCommand
  28. // @grant GM_setValue
  29. // @grant GM_unregisterMenuCommand
  30. // @grant GM_xmlhttpRequest
  31. // @grant unsafeWindow
  32. // @run-at document-start
  33. // ==/UserScript==
  34.  
  35. (t=>{function d(n){if(typeof n!="string")throw new TypeError("cssText must be a string");let e=document.createElement("style");return e.setAttribute("type","text/css"),e.innerHTML=n,document.head?document.head.appendChild(e):document.body?document.body.appendChild(e):document.documentElement.childNodes.length===0?document.documentElement.appendChild(e):document.documentElement.insertBefore(e,document.documentElement.childNodes[0]),e}if(typeof GM_addStyle=="function"){GM_addStyle(t);return}d(t)})(" .whitesev-hide{display:none}.whitesev-hide-important{display:none!important} ");
  36.  
  37. (function (Qmsg, DOMUtils, Utils, i18next, pops, Viewer) {
  38. 'use strict';
  39.  
  40. var __defProp = Object.defineProperty;
  41. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  42. var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  43. var _a;
  44. var _GM_deleteValue = /* @__PURE__ */ (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)();
  45. var _GM_getResourceText = /* @__PURE__ */ (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)();
  46. var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  47. var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)();
  48. var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
  49. var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  50. var _GM_unregisterMenuCommand = /* @__PURE__ */ (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)();
  51. var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  52. var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
  53. var _monkeyWindow = /* @__PURE__ */ (() => window)();
  54. const zh_CN_language = {
  55. GreasyFork优化: "GreasyFork优化",
  56. 请求取消: "请求取消",
  57. 请求超时: "请求超时",
  58. 请求异常: "请求异常",
  59. 通用: "通用",
  60. 账号: "账号",
  61. 密码: "密码",
  62. 语言: "语言",
  63. "账号/密码": "账号/密码",
  64. 请输入账号: "请输入账号",
  65. 请输入密码: "请输入密码",
  66. 自动登录: "自动登录",
  67. 自动登录当前保存的账号: "自动登录当前保存的账号",
  68. "清空账号/密码": "清空账号/密码",
  69. 点击清空: "点击清空",
  70. "确定清空账号和密码?": "确定清空账号和密码?",
  71. "已清空账号/密码": "已清空账号/密码",
  72. "源代码同步【脚本列表】": "源代码同步【脚本列表】",
  73. 一键同步: "一键同步",
  74. 前往用户主页: "前往用户主页",
  75. 获取当前已登录的用户主页失败: "获取当前已登录的用户主页失败",
  76. "源代码同步【未上架的脚本】": "源代码同步【未上架的脚本】",
  77. "源代码同步【库】": "源代码同步【库】",
  78. 论坛: "论坛",
  79. 功能: "功能",
  80. 过滤重复的评论: "过滤重复的评论",
  81. "过滤掉重复的评论数量(≥2)": "过滤掉重复的评论数量(≥2)",
  82. "过滤脚本(id)": "过滤脚本(id)",
  83. "请输入脚本id,每行一个": "请输入脚本id,每行一个",
  84. "过滤发布的用户(id)": "过滤发布的用户(id)",
  85. "请输入用户id,每行一个": "请输入用户id,每行一个",
  86. "过滤回复的用户(id)": "过滤回复的用户(id)",
  87. 优化: "优化",
  88. 固定当前语言: "固定当前语言",
  89. 无: "无",
  90. "如button、input、textarea": "如button、input、textarea",
  91. 更直观的查看版本迭代: "更直观的查看版本迭代",
  92. 美化上传图片按钮: "美化上传图片按钮",
  93. 放大上传区域: "放大上传区域",
  94. 优化图片浏览: "优化图片浏览",
  95. 使用Viewer浏览图片: "使用Viewer浏览图片",
  96. 覆盖图床图片跳转: "覆盖图床图片跳转",
  97. "配合上面的【优化图片浏览】更优雅浏览图片": "配合上面的【优化图片浏览】更优雅浏览图片",
  98. '需安装Greasyfork Beautify脚本,<a href="https://greasyfork.org/zh-CN/scripts/446849-greasyfork-beautify" target="_blank">🖐点我安装</a>': '需安装Greasyfork Beautify脚本,<a href="https://greasyfork.org/zh-CN/scripts/446849-greasyfork-beautify" target="_blank">🖐点我安装</a>',
  99. 代码: "代码",
  100. 添加复制代码按钮: "添加复制代码按钮",
  101. 更优雅的复制: "更优雅的复制",
  102. 快捷键: "快捷键",
  103. "【F】键全屏、【Alt+Shift+F】键宽屏": "【F】键全屏、【Alt+Shift+F】键宽屏",
  104. 库: "库",
  105. 脚本列表: "脚本列表",
  106. "请输入屏蔽规则,每行一个": "请输入屏蔽规则,每行一个",
  107. 请求admin内容失败: "请求admin内容失败",
  108. 解析admin的源代码同步表单失败: "解析admin的源代码同步表单失败",
  109. 源代码同步失败: "源代码同步失败",
  110. 获取用户信息失败: "获取用户信息失败",
  111. 获取用户的收藏集失败: "获取用户的收藏集失败",
  112. "解析Script Sets失败": "解析Script Sets失败",
  113. "获取收藏集{{setsId}}失败": "获取收藏集{{setsId}}失败",
  114. "获取表单元素#edit_script_set失败": "获取表单元素#edit_script_set失败",
  115. 更新收藏集表单请求失败: "更新收藏集表单请求失败",
  116. 请先在菜单中录入账号: "请先在菜单中录入账号",
  117. 请先在菜单中录入密码: "请先在菜单中录入密码",
  118. "获取csrf-token失败": "获取csrf-token失败",
  119. "正在登录中...": "正在登录中...",
  120. "登录失败,请在控制台查看原因": "登录失败,请在控制台查看原因",
  121. "登录成功,1s后自动跳转": "登录成功,1s后自动跳转",
  122. "登录失败,可能是账号/密码错误,请在控制台查看原因": "登录失败,可能是账号/密码错误,请在控制台查看原因",
  123. "美化 历史版本 页面": "美化 历史版本 页面",
  124. 未找到history_versions元素列表: "未找到history_versions元素列表",
  125. "yyyy年MM月dd日 HH:mm:ss": "yyyy-MM-dd HH:mm:ss",
  126. "美化 Greasyfork Beautify脚本": "美化 Greasyfork Beautify脚本",
  127. "❌ 最多同时长传5张图": "❌ 最多同时长传5张图片",
  128. "❌ 图片:{{name}} 大小:{{size}}": "❌ 图片:{{name}} 大小:{{size}}",
  129. "已过滤:{{oldCount}}": "已过滤:{{oldCount}}",
  130. 寻找引用: "寻找引用",
  131. 获取脚本id失败: "获取脚本id失败",
  132. 收藏: "收藏",
  133. 请先登录账号: "请先登录账号",
  134. 获取用户id失败: "获取用户id失败",
  135. "获取收藏夹中...": "获取收藏夹中...",
  136. 收藏集: "收藏集",
  137. "添加中...": "添加中...",
  138. "添加失败,{{selector}}元素不存在": "添加失败,{{selector}}元素不存在",
  139. "未找到{{selector}}元素": "未找到{{selector}}元素",
  140. 添加失败: "添加失败",
  141. 添加成功: "添加成功",
  142. "删除中...": "删除中...",
  143. 删除成功: "删除成功",
  144. 添加: "添加",
  145. 刪除: "刪除",
  146. "拦截跳转:": "拦截跳转:",
  147. 今日检查: "今日检查",
  148. 复制代码: "复制代码",
  149. "加载文件中...": "加载文件中...",
  150. 复制成功: "复制成功",
  151. "✅ 复制成功!": "✅ 复制成功!",
  152. "当前语言:{{currentLocaleLanguage}},,3秒后切换至:{{localeLanguage}}": "当前语言:{{currentLocaleLanguage}},,3秒后切换至:{{localeLanguage}}",
  153. "导航至:": "导航至:",
  154. "请先登录账号!": "请先登录账号!",
  155. "获取信息中,请稍后...": "获取信息中,请稍后...",
  156. "获取成功,共 {{count}} 个": "获取成功,共 {{count}} 个",
  157. "评分:": "评分:",
  158. "语言:": "语言:",
  159. "版本:": "版本:",
  160. "更新:": "更新:",
  161. 同步代码: "同步代码",
  162. "同步中...": "同步中...",
  163. 手动: "手动",
  164. 自动: "自动",
  165. "同步方式:{{syncMode}}": "同步方式:{{syncMode}}",
  166. 同步成功: "同步成功",
  167. 同步失败: "同步失败",
  168. 该脚本未设置同步信息: "该脚本未设置同步信息",
  169. "上次重载时间 {{time}},{{timeout}}秒内拒绝反复重载": "上次重载时间 {{time}},{{timeout}}秒内拒绝反复重载",
  170. "名称:": "名称:",
  171. "进度:": "进度:",
  172. "未获取到【脚本列表】": "未获取到【脚本列表】",
  173. "源代码同步成功,3秒后更新下一个": "源代码同步成功,3秒后更新下一个",
  174. 全部更新失败: "全部更新失败",
  175. "全部更新完毕<br >成功:{{successNums}}<br >失败:{{failedNums}}<br >总计:{{scriptUrlListLength}}": "全部更新完毕<br >成功:{{successNums}}<br >失败:{{failedNums}}<br >总计:{{scriptUrlListLength}}",
  176. "⚙ 设置": "⚙ 设置",
  177. "{{SCRIPT_NAME}}-设置": "{{SCRIPT_NAME}}-设置",
  178. 美化页面元素: "美化页面元素",
  179. 美化历史版本页面: "美化历史版本页面",
  180. "美化Greasyfork Beautify脚本": "美化Greasyfork Beautify脚本",
  181. 获取表单csrfToken失败: "获取表单csrfToken失败",
  182. Toast配置: "Toast配置",
  183. Toast位置: "Toast位置",
  184. 左上角: "左上角",
  185. 顶部: "顶部",
  186. 右上角: "右上角",
  187. 左边: "左边",
  188. 中间: "中间",
  189. 右边: "右边",
  190. 左下角: "左下角",
  191. 底部: "底部",
  192. 右下角: "右下角",
  193. Toast显示在页面九宫格的位置: "Toast显示在页面九宫格的位置",
  194. 最多显示的数量: "最多显示的数量",
  195. 限制Toast显示的数量: "限制Toast显示的数量",
  196. 逆序弹出: "逆序弹出",
  197. 修改Toast弹出的顺序: "修改Toast弹出的顺序",
  198. 该脚本已经在该收藏集中: "该脚本已经在该收藏集中",
  199. 其它错误: "其它错误",
  200. 启用: "启用",
  201. 开启后下面的过滤功能才会生效: "开启后下面的功能才会生效",
  202. 屏蔽脚本: "屏蔽脚本",
  203. 点击查看规则: "点击查看规则",
  204. 过滤: "过滤",
  205. 代码同步: "代码同步",
  206. 美化: "美化",
  207. 修复代码行号显示: "修复代码行号显示",
  208. 修复代码行数超过1k行号显示不全问题: "修复代码行数超过1k行号显示不全问题",
  209. "添加【寻找引用】按钮": "添加【寻找引用】按钮",
  210. "在脚本栏添加按钮,一般用于搜索引用该库的相关脚本": "在脚本栏添加按钮,一般用于搜索引用该库的相关脚本",
  211. "添加【收藏】按钮": "添加【收藏】按钮",
  212. "在脚本栏添加按钮,一般用于快捷收藏该脚本/库": "在脚本栏添加按钮,一般用于快捷收藏该脚本/库",
  213. 修复图片宽度显示问题: "修复图片宽度显示问题",
  214. 修复图片在移动端宽度超出浏览器宽度问题: "修复图片在移动端宽度超出浏览器宽度问题",
  215. "添加【今日检查】信息块": "添加【今日检查】信息块",
  216. "在脚本信息栏添加【今日检查】信息块": "在脚本信息栏添加【今日检查】信息块",
  217. "给Markdown添加【复制】按钮": "给Markdown添加【复制】按钮",
  218. "在Markdown内容右上角添加【复制】按钮,点击一键复制Markdown内容": "在Markdown内容右上角添加【复制】按钮,点击一键复制Markdown内容",
  219. 开启后下面的功能才会生效: "开启后下面的功能才会生效",
  220. 检测页面加载: "检测页面加载",
  221. "检测Greasyfork页面是否正常加载,如加载失败则自动刷新页面": "检测Greasyfork页面是否正常加载,如加载失败则自动刷新页面",
  222. 检测间隔: "检测间隔",
  223. "设置检测上次刷新页面的间隔时间,当距离上次刷新页面的时间超过设置的值,将不再刷新页面": "设置检测上次刷新页面的间隔时间,当距离上次刷新页面的时间超过设置的值,将不再刷新页面",
  224. 美化顶部导航栏: "美化顶部导航栏",
  225. "可能会跟Greasyfork Beautify脚本有冲突": "可能会跟Greasyfork Beautify脚本有冲突",
  226. 美化脚本列表: "美化脚本列表",
  227. "双列显示且添加脚本卡片操作项(安装、收藏)": "双列显示且添加脚本卡片操作项(安装、收藏)",
  228. 操作面板: "操作面板",
  229. "添加【操作面板】按钮": "添加【操作面板】按钮",
  230. "在脚本列表页面时为顶部导航栏添加【操作面板】按钮": "在脚本列表页面时为顶部导航栏添加【操作面板】按钮",
  231. 操作: "操作",
  232. 安装此脚本: "安装此脚本",
  233. 脚本: "脚本",
  234. 历史版本: "历史版本",
  235. 自定义已读颜色: "自定义已读颜色",
  236. 在讨论内生效: "在讨论内生效",
  237. 用户: "用户",
  238. 控制台: "控制台",
  239. "迁移【控制台】到顶部导航栏": "迁移【控制台】到顶部导航栏",
  240. "将【控制台】按钮移动到顶部导航栏,节省空间": "将【控制台】按钮移动到顶部导航栏,节省空间",
  241. "在版本下面添加【安装】、【查看代码】按钮": "在版本下面添加【安装】、【查看代码】按钮",
  242. 查看代码: "查看代码",
  243. 添加快捷操作按钮: "添加快捷操作按钮",
  244. "在每一行讨论的最后面添加【过滤】按钮,需开启过滤功能才会生效": "在每一行讨论的最后面添加【过滤】按钮,需开启过滤功能才会生效",
  245. 选择需要过滤的选项: "选择需要过滤的选项",
  246. "确定{{type}}:{{filterId}}?": "确定{{type}}:{{filterId}}?",
  247. "已删除:{{scriptId}}": "已删除:{{scriptId}}",
  248. 帮助文档: "帮助文档",
  249. "请输入规则,每行一个": "请输入规则,每行一个",
  250. 选择过滤的选项: "选择过滤的选项",
  251. "脚本id:{{text}}": "脚本id:{{text}}",
  252. "脚本名:{{text}}": "脚本名:{{text}}",
  253. "作者id:{{text}}": "作者id:{{text}}",
  254. "作者名:{{text}}": "作者名:{{text}}",
  255. "作用域:脚本、脚本搜索、用户主页": "作用域:脚本、脚本搜索、用户主页",
  256. "更新到 {{version}} 版本": "更新到 {{version}} 版本",
  257. "降级到 {{version}} 版本": "降级到 {{version}} 版本",
  258. "重新安装 {{version}} 版本": "重新安装 {{version}} 版本",
  259. "发布的用户id:{{text}}": "发布的用户id:{{text}}",
  260. 自定义快捷键: "自定义快捷键",
  261. 点击录入快捷键: "点击录入快捷键",
  262. 快捷键发表回复: "快捷键发表回复",
  263. "在输入框内按下快捷发表回复,例如:{{key}}": "在输入框内按下快捷发表回复,例如:{{key}}",
  264. 请先执行当前的录入操作: "请先执行当前的录入操作",
  265. 清空快捷键: "清空快捷键",
  266. "请按下快捷键...": "请按下快捷键...",
  267. 成功录入: "成功录入",
  268. "快捷键 {{key}} 已被 {{isUsedKey}} 占用": "快捷键 {{key}} 已被 {{isUsedKey}} 占用",
  269. 私聊: "私聊",
  270. 美化私信页面: "美化私信页面",
  271. 美化为左右对话模式: "美化为左右对话模式",
  272. "最后回复:": "最后回复:",
  273. 进入: "进入",
  274. 记住回复内容: "记住回复内容",
  275. "监听表单内的textarea内容改变并存储到indexDB中,提交表单将清除保存的数据,误刷新页面时可动态恢复": "监听表单内的textarea内容改变并存储到indexDB中,提交表单将清除保存的数据,误刷新页面时可动态恢复",
  276. 表单: "表单",
  277. 自动清理空间: "自动清理空间",
  278. 不清理: "不清理",
  279. "{{value}} 天": "{{value}} 天",
  280. "{{value}} 周": "{{value}} 周",
  281. "{{value}} 个月": "{{value}} 个月",
  282. 半年: "半年",
  283. 计算中: "计算中",
  284. 根据设置的间隔时间自动清理保存的回复内容: "根据设置的间隔时间自动清理保存的回复内容",
  285. "数据占用空间:{{size}}": "数据占用空间:{{size}}",
  286. 当前存储的数据所占用的空间大小: "当前存储的数据所占用的空间大小",
  287. 清空: "清空",
  288. 清理成功: "清理成功",
  289. 清理失败: "清理失败",
  290. "Url To WebhookUrl": "Url 转 WebhookUrl",
  291. 关闭: "关闭",
  292. "例如:": "例如:",
  293. "结果:": "结果:",
  294. 转换前: "转换前",
  295. 转换后: "转换后",
  296. 使用namespace查询脚本信息: "使用namespace查询脚本信息",
  297. 脚本管理: "脚本管理",
  298. "开启后检测已安装的脚本信息更准确,但是速度会更慢": "开启后检测已安装的脚本信息更准确,但是速度会更慢",
  299. 美化私信列表: "美化私信列表",
  300. 搜索: "搜索"
  301. };
  302. const en_US_language = {
  303. GreasyFork优化: "GreasyFork Optimization",
  304. 请求取消: "http request cancel",
  305. 请求超时: "http request timeout",
  306. 请求异常: "http request error",
  307. 通用: "General",
  308. 账号: "Account",
  309. 密码: "Password",
  310. 语言: "Language",
  311. "账号/密码": "Account/Password",
  312. 请输入账号: "Please enter your account number",
  313. 请输入密码: "Please enter password",
  314. 自动登录: "Auto Login",
  315. 自动登录当前保存的账号: "Automatically log in to the currently saved account",
  316. "清空账号/密码": "Clear account/password",
  317. 点击清空: "Clear",
  318. "确定清空账号和密码?": "Are you sure to clear your account and password?",
  319. "已清空账号/密码": "Account/password cleared",
  320. "源代码同步【脚本列表】": "Source Code Synchronization [Script List]",
  321. 一键同步: "Sync All",
  322. 前往用户主页: "Go to the user's homepage",
  323. 获取当前已登录的用户主页失败: "Failed to retrieve the currently logged in user's homepage",
  324. "源代码同步【未上架的脚本】": "Source code synchronization [Script not listed]",
  325. "源代码同步【库】": "Source code synchronization [Library]",
  326. 论坛: "Forum",
  327. 功能: "Features",
  328. 过滤重复的评论: "Filter duplicate comments",
  329. "过滤掉重复的评论数量(≥2)": "Filter out duplicate comments (≥ 2)",
  330. "过滤脚本(id)": "Filter script (id)",
  331. "请输入脚本id,每行一个": "Please enter the script ID, one per line",
  332. "过滤发布的用户(id)": "Filter published users (id)",
  333. "请输入用户id,每行一个": "Please enter the user ID, one per line",
  334. "过滤回复的用户(id)": "User (ID) who filters replies",
  335. 优化: "Optimization",
  336. 固定当前语言: "Fix current language",
  337. 无: "nothing",
  338. "如button、input、textarea": "For example button、input、textarea",
  339. 更直观的查看版本迭代: "More intuitive viewing of version iterations",
  340. 美化上传图片按钮: "Beautify upload image button",
  341. 放大上传区域: "Enlarge the upload area",
  342. 优化图片浏览: "Optimize image browsing",
  343. 使用Viewer浏览图片: "Using Viewer to browse images",
  344. 覆盖图床图片跳转: "Overlay bed image jump",
  345. "配合上面的【优化图片浏览】更优雅浏览图片": "Collaborate with the optimization of image browsing above to browse images more elegantly",
  346. '需安装Greasyfork Beautify脚本,<a href="https://greasyfork.org/zh-CN/scripts/446849-greasyfork-beautify" target="_blank">🖐点我安装</a>': 'Greasyfork Beauty script needs to be installed,<a href="https://greasyfork.org/zh-CN/scripts/446849-greasyfork-beautify" target="_blank">🖐 Click me to install</a>',
  347. 代码: "Code",
  348. 添加复制代码按钮: "Add Copy Code Button",
  349. 更优雅的复制: "More elegant replication",
  350. 快捷键: "Shortcut keys",
  351. "【F】键全屏、【Alt+Shift+F】键宽屏": "【F】 Key full screen, [Alt+Shift+F] key wide screen",
  352. 库: "Library",
  353. 脚本列表: "Script List",
  354. "请输入屏蔽规则,每行一个": "Please enter a blocking rule, one per line",
  355. 请求admin内容失败: "Request for admin content failed",
  356. 解析admin的源代码同步表单失败: "Failed to parse the source code of admin and synchronize the form",
  357. 源代码同步失败: "Source code synchronization failed",
  358. 获取用户信息失败: "Failed to obtain user information",
  359. 获取用户的收藏集失败: "Failed to retrieve user's collection",
  360. "解析Script Sets失败": "Parsing Script Sets failed",
  361. "获取收藏集{{setsId}}失败": "Failed to retrieve collection {{setsId}}",
  362. "获取表单元素#edit_script_set失败": "Failed to retrieve form element #edit_script_set",
  363. 更新收藏集表单请求失败: "Update collection form request failed",
  364. 请先在菜单中录入账号: "Please enter your account in the menu first",
  365. 请先在菜单中录入密码: "Please enter your password in the menu first",
  366. "获取csrf-token失败": "Failed to obtain csrf token",
  367. "正在登录中...": "Logging in...",
  368. "登录失败,请在控制台查看原因": "Login failed, please check the reason in the console",
  369. "登录成功,1s后自动跳转": "Login successful, automatically redirect after 1 second",
  370. "登录失败,可能是账号/密码错误,请在控制台查看原因": "Login failed, possibly due to incorrect account/password. Please check the reason in the console",
  371. "美化 历史版本 页面": "Beautify the historical version page",
  372. 未找到history_versions元素列表: "History_versions element list not found",
  373. "yyyy年MM月dd日 HH:mm:ss": "yyyy-MM-dd HH:mm:ss",
  374. "美化 Greasyfork Beautify脚本": "Beautify Greasyfork Beauty Script",
  375. "❌ 最多同时长传5张图": "❌ Upload up to 5 images simultaneously",
  376. "❌ 图片:{{name}} 大小:{{size}}": "❌ Image:{{name}} Size:{{size}}",
  377. "已过滤:{{oldCount}}": "Filtered:{{oldCount}}",
  378. 寻找引用: "Find references",
  379. 获取脚本id失败: "Failed to obtain script ID",
  380. 收藏: "Collection",
  381. 请先登录账号: "Please log in to your account first",
  382. 获取用户id失败: "Failed to obtain user ID",
  383. "获取收藏夹中...": "Get in favorites...",
  384. 收藏集: "Collection",
  385. "添加中...": "Adding...",
  386. "添加失败,{{selector}}元素不存在": "Add failed, {{selector}} element does not exist",
  387. "未找到{{selector}}元素": "{{selector}} element not found",
  388. 添加失败: "Add failed",
  389. 添加成功: "Successfully added",
  390. "删除中...": "Deleting...",
  391. 删除成功: "Delete successful",
  392. 添加: "Add in deletion",
  393. 刪除: "Delete",
  394. "拦截跳转:": "Intercept jump:",
  395. 今日检查: "Today's inspection",
  396. 复制代码: "Copy Code",
  397. "加载文件中...": "Loading files...",
  398. 复制成功: "Copy successful",
  399. "✅ 复制成功!": "✅ Copy successful!",
  400. "当前语言:{{currentLocaleLanguage}},,3秒后切换至:{{localeLanguage}}": "Current language: {{currentLocaleLanguage}}, switch to {{localeLanguage}} in 3 seconds",
  401. "导航至:": "Navigation to:",
  402. "请先登录账号!": "Please log in to your account first!",
  403. "获取信息中,请稍后...": "Obtaining information, please wait...",
  404. "获取成功,共 {{count}} 个": "Successfully obtained, a total of {{count}}",
  405. "评分:": "Rating:",
  406. "语言:": "Language:",
  407. "版本:": "Version:",
  408. "更新:": "Update:",
  409. 同步代码: "Synchronize Code",
  410. "同步中...": "Synchronizing...",
  411. 手动: "Manual",
  412. 自动: "Automatic",
  413. "同步方式:{{syncMode}}": "Synchronization method: {{syncMode}}",
  414. 同步成功: "Sync successful",
  415. 同步失败: "Sync failed",
  416. 该脚本未设置同步信息: "The script has not set synchronization information",
  417. "上次重载时间 {{time}},{{timeout}}秒内拒绝反复重载": "Last reload time {{time}}, rejected repeated reloads within {{timeout}} seconds",
  418. "名称:": "Name:",
  419. "进度:": "Progress:",
  420. "未获取到【脚本列表】": "Unable to obtain [Script List]",
  421. "源代码同步成功,3秒后更新下一个": "Source code synchronization successful, update next one in 3 seconds",
  422. 全部更新失败: "All updates failed",
  423. "全部更新完毕<br >成功:{{successNums}}<br >失败:{{failedNums}}<br >总计:{{scriptUrlListLength}}": "All updates completed<br>Success: {{successNums}}<br>Failure: {{failed Nums}}<br>Total: {{scriptUrlListLength}}",
  424. "⚙ 设置": "⚙ Setting",
  425. "{{SCRIPT_NAME}}-设置": "{{SCRIPT_NAME}}-Setting",
  426. 美化页面元素: "Beautify page elements",
  427. 美化历史版本页面: "Beautify the historical version page",
  428. "美化Greasyfork Beautify脚本": "Beautify Greasyfork Beauty Script",
  429. 获取表单csrfToken失败: "Failed to obtain form csrfToken",
  430. Toast配置: "Toast Config",
  431. Toast位置: "Toast position",
  432. 左上角: "Top left",
  433. 顶部: "Top",
  434. 右上角: "Top right",
  435. 左边: "Left",
  436. 中间: "Center",
  437. 右边: "Right",
  438. 左下角: "Bottom left",
  439. 底部: "Bottom",
  440. 右下角: "Bottom right",
  441. Toast显示在页面九宫格的位置: "Toast is displayed in the nine grid position on the page",
  442. 最多显示的数量: "Maximum number of displays",
  443. 限制Toast显示的数量: "Limit the number of Toast displays",
  444. 逆序弹出: "Reverse pop-up",
  445. 修改Toast弹出的顺序: "Modify the order in which Toast pops up",
  446. 该脚本已经在该收藏集中: "The script is already in this collection",
  447. 其它错误: "Ohter Error",
  448. 启用: "Enable",
  449. 开启后下面的过滤功能才会生效: "The following filtering features will only take effect after it is enabled",
  450. 屏蔽脚本: "Block script",
  451. 点击查看规则: "Click to view rules",
  452. 过滤: "Filter",
  453. 代码同步: "Code synchronization",
  454. 美化: "Beautify",
  455. 修复代码行号显示: "Fix code line number display",
  456. 修复代码行数超过1k行号显示不全问题: "Fix the problem that the code line number display is not complete when the number of lines exceeds 1k",
  457. "添加【寻找引用】按钮": "Add the button to find references",
  458. "在脚本栏添加按钮,一般用于搜索引用该库的相关脚本": "Add a button to the script bar, generally used to search for scripts that reference this library",
  459. "添加【收藏】按钮": "Add the button to collect",
  460. "在脚本栏添加按钮,一般用于快捷收藏该脚本/库": "Add a button to the script bar, generally used to quickly collect this script / library",
  461. 修复图片宽度显示问题: " Fix the problem that the picture width display is not complete",
  462. 修复图片在移动端宽度超出浏览器宽度问题: "Fix the problem that the picture width exceeds the browser width on mobile",
  463. "添加【今日检查】信息块": "Add the block of information of today's inspection",
  464. "在脚本信息栏添加【今日检查】信息块": "Add the block of information of today's inspection to the script information bar",
  465. "给Markdown添加【复制】按钮": "Add the button to copy to Markdown",
  466. "在Markdown内容右上角添加【复制】按钮,点击一键复制Markdown内容": "Add the button to copy to the top right corner of the Markdown content, click to copy the Markdown content in one click",
  467. 开启后下面的功能才会生效: "The following features will only take effect after it is enabled",
  468. 检测页面加载: "Detect page loading",
  469. "检测Greasyfork页面是否正常加载,如加载失败则自动刷新页面": "Detect whether the Greasyfork page is loaded normally. If the loading fails, the page will be automatically refreshed",
  470. 检测间隔: "Detection interval",
  471. "设置检测上次刷新页面的间隔时间,当距离上次刷新页面的时间超过设置的值,将不再刷新页面": "Set the interval time for detecting the last refresh page. If the time since the last refresh page exceeds the set value, the page will no longer be refreshed",
  472. 美化顶部导航栏: "Beautify the top navigation bar",
  473. "可能会跟Greasyfork Beautify脚本有冲突": "Possible conflict with Greasymfork Beautify script",
  474. 美化脚本列表: "Beautify Script List",
  475. "双列显示且添加脚本卡片操作项(安装、收藏)": "Double column display and add script card operation items (installation, bookmarking)",
  476. 操作面板: "Operation Panel",
  477. "添加【操作面板】按钮": "Add [Operation Panel] button",
  478. "在脚本列表页面时为顶部导航栏添加【操作面板】按钮": "Add an 'Operation Panel' button to the top navigation bar on the script list page",
  479. 操作: "Operation",
  480. 安装此脚本: "Install this script",
  481. 脚本: "Scripts",
  482. 历史版本: "Historical version",
  483. 自定义已读颜色: "Customize read colors",
  484. 在讨论内生效: "Effective within the discussion",
  485. 用户: "Users",
  486. 控制台: "Console",
  487. "迁移【控制台】到顶部导航栏": "Migration of Console to Top Navigation Bar",
  488. "将【控制台】按钮移动到顶部导航栏,节省空间": "Move the 'Console' button to the top navigation bar to save space",
  489. 添加额外的标签按钮: "Add additional label button",
  490. "在版本下面添加【安装】、【查看代码】按钮": "Add 【 Install 】 and 【 View Code 】 buttons under the version",
  491. 查看代码: "View Code",
  492. "添加【过滤】按钮": "Add [Filter] button",
  493. "添加【举报】按钮": "Add [Report] button",
  494. "在每一行讨论的最后面添加【过滤】按钮,需开启过滤功能才会生效": "Add a 'Filter' button at the end of each discussion line. The filtering features needs to be enabled for it to take effect",
  495. "在每一行讨论的最后面添加【举报】按钮": "Add a Report button at the end of each line of discussion",
  496. 选择需要过滤的选项: "Select the options that need to be filtered",
  497. "确定{{type}}:{{filterId}}?": "Are you sure {{type}}:{{filterId}}?",
  498. "已删除:{{scriptId}}": "Deleted: {{scriptId}}",
  499. 帮助文档: "Help document",
  500. "请输入规则,每行一个": "Please enter a rule, one per line",
  501. 选择过滤的选项: "Select filtering options",
  502. "脚本id:{{text}}": "Script Id: {{text}}",
  503. "脚本名:{{text}}": "Script Name: {{text}}",
  504. "作者id:{{text}}": "Author Id: {{text}}",
  505. "作者名:{{text}}": "Author Name: {{text}}",
  506. "作用域:脚本、脚本搜索、用户主页": "Scope: Script, Script Search, User Homepage",
  507. "更新到 {{version}} 版本": "Update To {{version}} Version",
  508. "降级到 {{version}} 版本": "Downgrade to {{version}} Version",
  509. "重新安装 {{version}} 版本": "Reinstall {{version}} Version",
  510. "发布的用户id:{{text}}": "Published user ID: {{text}}",
  511. 自定义快捷键: "Customize shortcut keys",
  512. 点击录入快捷键: "Click on the input shortcut key",
  513. 快捷键发表回复: "Shortcut key to post reply",
  514. "在输入框内按下快捷发表回复,例如:{{key}}": "Press the shortcut to post a reply in the input box, for example: {{key}}",
  515. 请先执行当前的录入操作: "Please perform the current input operation first",
  516. 清空快捷键: "Clear shortcut keys",
  517. "请按下快捷键...": "Please press the shortcut key...",
  518. 成功录入: "Successful entry",
  519. "快捷键 {{key}} 已被 {{isUsedKey}} 占用": "The shortcut key {{key}} is already used by {{isUsedKey}}",
  520. 私聊: "Private Chat",
  521. 美化私信页面: "Beautify the private message page",
  522. 美化为左右对话模式: "Beautify as a left-right dialogue mode",
  523. "最后回复:": "Final response:",
  524. 进入: "Enter",
  525. 记住回复内容: "Remember the reply content",
  526. "监听表单内的textarea内容改变并存储到indexDB中,提交表单将清除保存的数据,误刷新页面时可动态恢复": "Monitor changes to the textarea content in the form and store it in the index database. Submitting the form will clear the saved data, and dynamic recovery can be achieved when the page is accidentally refreshed",
  527. 表单: "Forms",
  528. 自动清理空间: "Automatically clear space",
  529. 不清理: "Not cleaning",
  530. "{{value}} 天": "{{value}} day",
  531. "{{value}} 周": "{{value}} weeks",
  532. "{{value}} 个月": "{{value}} months",
  533. 半年: "half a year",
  534. 计算中: "In the process of calculation",
  535. 根据设置的间隔时间自动清理保存的回复内容: "Automatically clean up saved reply content according to the set interval time",
  536. "数据占用空间:{{size}}": "Data occupancy space: {{size}}",
  537. 当前存储的数据所占用的空间大小: "The size of the space occupied by the currently stored data",
  538. 清空: "Clear",
  539. 清理成功: "Cleanup successful",
  540. 清理失败: "Cleaning failed",
  541. "Url To WebhookUrl": "Url To WebhookUrl",
  542. 关闭: "Clsoe",
  543. "例如:": "Example: ",
  544. "结果:": "Result: ",
  545. 转换前: "Before Parse",
  546. 转换后: "Parse Result",
  547. 使用namespace查询脚本信息: "Use a namespace to query script information",
  548. 脚本管理: "Script management",
  549. "开启后检测已安装的脚本信息更准确,但是速度会更慢": "Detecting the installed script information is more accurate, but slower",
  550. 美化私信列表: "Beautify the private message list",
  551. 搜索: "Search",
  552. "新增【{{buttonText}}】按钮": "Added [{{buttonText}}] button",
  553. "该Checkbox按钮开启后,自动过滤出包含搜索关键词的脚本": "When the Checkbox button is turned on, it automatically filters out scripts that contain search terms",
  554. 名称: "Name",
  555. 描述: "Description",
  556. 作者名称: "Author name",
  557. 获取举报表单信息失败: "Failed to obtain report form information. Procedure",
  558. 发送举报表单失败: "Failed to send the report form. Procedure",
  559. 举报: "Report",
  560. "举报讨论:": "Report discussion:",
  561. "举报脚本:": "Report script:",
  562. "举报用户:": "Report user:",
  563. "添加失败,表单数据中不包含该脚本": "Failed to add, script id not included in form data",
  564. "删除失败,表单数据中仍包含该脚本": "The deletion failed and the script is still included in the form data",
  565. "删除失败,{{selector}}元素不存在": "Failed to delete. {{selector}} el名称ement does not exist",
  566. "对比选中版本差异(monacoEditor)": "Compare the differences between selected versions (monacoEditor)",
  567. "正在加载monaco中...": "Loading monaco...",
  568. "正在获取对比文本中...": "Retrieving comparison text...",
  569. 代码对比: "Code Comparison",
  570. 添加代码对比按钮: "Add code comparison button",
  571. "版本号相同,不需要比较源码": "The version numbers are the same, no need to compare source code",
  572. 使用Monaco编辑器: "Use Monaco Editor",
  573. 全词匹配: "Full word match",
  574. 获取搜索关键词失败: "Failed to obtain search keyword",
  575. "名称/描述": "Name/Description",
  576. 任一全词匹配: "Any full word match"
  577. };
  578. const KEY = "GM_Panel";
  579. const ATTRIBUTE_INIT = "data-init";
  580. const ATTRIBUTE_KEY = "data-key";
  581. const ATTRIBUTE_DEFAULT_VALUE = "data-default-value";
  582. const ATTRIBUTE_INIT_MORE_VALUE = "data-init-more-value";
  583. const PROPS_STORAGE_API = "data-storage-api";
  584. const LanguageInit = function() {
  585. let settingPanel = _GM_getValue(KEY, {});
  586. let lng = settingPanel["setting-language"] || "zh-CN";
  587. i18next.init({
  588. lng,
  589. // lng: "zh-CN",
  590. fallbackLng: "zh-CN",
  591. resources: {
  592. "zh-CN": {
  593. translation: { ...zh_CN_language }
  594. },
  595. "en-US": {
  596. translation: { ...en_US_language }
  597. }
  598. }
  599. });
  600. };
  601. const CommonUtil = {
  602. /**
  603. * 添加屏蔽CSS
  604. * @param args
  605. * @example
  606. * addBlockCSS("")
  607. * addBlockCSS("","")
  608. * addBlockCSS(["",""])
  609. */
  610. addBlockCSS(...args) {
  611. let selectorList = [];
  612. if (args.length === 0) {
  613. return;
  614. }
  615. if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") {
  616. return;
  617. }
  618. args.forEach((selector) => {
  619. if (Array.isArray(selector)) {
  620. selectorList = selectorList.concat(selector);
  621. } else {
  622. selectorList.push(selector);
  623. }
  624. });
  625. return addStyle(`${selectorList.join(",\n")}{display: none !important;}`);
  626. },
  627. /**
  628. * 设置GM_getResourceText的style内容
  629. * @param resourceMapData 资源数据
  630. * @example
  631. * setGMResourceCSS({
  632. * keyName: "ViewerCSS",
  633. * url: "https://example.com/example.css",
  634. * })
  635. */
  636. setGMResourceCSS(resourceMapData) {
  637. let cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : "";
  638. if (typeof cssText === "string" && cssText) {
  639. addStyle(cssText);
  640. } else {
  641. CommonUtil.loadStyleLink(resourceMapData.url);
  642. }
  643. },
  644. /**
  645. * 添加<link>标签
  646. * @param url
  647. * @example
  648. * loadStyleLink("https://example.com/example.css")
  649. */
  650. async loadStyleLink(url) {
  651. let $link = document.createElement("link");
  652. $link.rel = "stylesheet";
  653. $link.type = "text/css";
  654. $link.href = url;
  655. domUtils.ready(() => {
  656. document.head.appendChild($link);
  657. });
  658. },
  659. /**
  660. * 添加<script>标签
  661. * @param url
  662. * @example
  663. * loadStyleLink("https://example.com/example.js")
  664. */
  665. async loadScript(url) {
  666. let $script = document.createElement("script");
  667. $script.src = url;
  668. return new Promise((resolve) => {
  669. $script.onload = () => {
  670. resolve(null);
  671. };
  672. (document.head || document.documentElement).appendChild($script);
  673. });
  674. },
  675. /**
  676. * 将url修复,例如只有search的链接修复为完整的链接
  677. *
  678. * 注意:不包括http转https
  679. * @param url 需要修复的链接
  680. * @example
  681. * 修复前:`/xxx/xxx?ss=ssss`
  682. * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss`
  683. * @example
  684. * 修复前:`//xxx/xxx?ss=ssss`
  685. * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss`
  686. * @example
  687. * 修复前:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss`
  688. * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss`
  689. * @example
  690. * 修复前:`xxx/xxx?ss=ssss`
  691. * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss`
  692. */
  693. fixUrl(url) {
  694. url = url.trim();
  695. if (url.match(/^http(s|):\/\//i)) {
  696. return url;
  697. } else {
  698. if (!url.startsWith("/")) {
  699. url += "/";
  700. }
  701. url = window.location.origin + url;
  702. return url;
  703. }
  704. },
  705. /**
  706. * http转https
  707. * @param url 需要修复的链接
  708. * @example
  709. * 修复前:
  710. * 修复后:
  711. * @example
  712. * 修复前:
  713. * 修复后:
  714. */
  715. fixHttps(url) {
  716. if (url.startsWith("https://")) {
  717. return url;
  718. }
  719. if (!url.startsWith("http://")) {
  720. return url;
  721. }
  722. let urlObj = new URL(url);
  723. urlObj.protocol = "https:";
  724. return urlObj.toString();
  725. },
  726. /**
  727. * 禁止页面滚动,默认锁定html和body
  728. * @example
  729. * lockScroll();
  730. * @example
  731. * lockScroll(document.body);
  732. */
  733. lockScroll(...args) {
  734. let $hidden = document.createElement("style");
  735. $hidden.innerHTML = /*css*/
  736. `
  737. .pops-overflow-hidden-important {
  738. overflow: hidden !important;
  739. }
  740. `;
  741. let $elList = [document.documentElement, document.body].concat(
  742. ...args || []
  743. );
  744. $elList.forEach(($el) => {
  745. $el.classList.add("pops-overflow-hidden-important");
  746. });
  747. (document.head || document.documentElement).appendChild($hidden);
  748. return {
  749. /**
  750. * 解除锁定
  751. */
  752. recovery() {
  753. $elList.forEach(($el) => {
  754. $el.classList.remove("pops-overflow-hidden-important");
  755. });
  756. $hidden.remove();
  757. }
  758. };
  759. }
  760. };
  761. LanguageInit();
  762. _GM_getValue(KEY, {});
  763. const _SCRIPT_NAME_ = i18next.t("GreasyFork优化");
  764. const utils = Utils.noConflict();
  765. const domUtils = DOMUtils.noConflict();
  766. const __pops = pops;
  767. const log = new utils.Log(
  768. _GM_info,
  769. _unsafeWindow.console || _monkeyWindow.console
  770. );
  771. const SCRIPT_NAME = ((_a = _GM_info == null ? void 0 : _GM_info.script) == null ? void 0 : _a.name) || _SCRIPT_NAME_;
  772. const DEBUG = false;
  773. log.config({
  774. debug: DEBUG,
  775. logMaxCount: 1e3,
  776. autoClearConsole: true,
  777. tag: true
  778. });
  779. Qmsg.config(
  780. Object.defineProperties(
  781. {
  782. html: true,
  783. autoClose: true,
  784. showClose: false
  785. },
  786. {
  787. position: {
  788. get() {
  789. return PopsPanel.getValue("qmsg-config-position", "bottom");
  790. }
  791. },
  792. maxNums: {
  793. get() {
  794. return PopsPanel.getValue("qmsg-config-maxnums", 5);
  795. }
  796. },
  797. showReverse: {
  798. get() {
  799. return PopsPanel.getValue("qmsg-config-showreverse", true);
  800. }
  801. },
  802. zIndex: {
  803. get() {
  804. let maxZIndex = Utils.getMaxZIndex();
  805. let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
  806. return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
  807. }
  808. }
  809. }
  810. )
  811. );
  812. const GM_Menu = new utils.GM_Menu({
  813. GM_getValue: _GM_getValue,
  814. GM_setValue: _GM_setValue,
  815. GM_registerMenuCommand: _GM_registerMenuCommand,
  816. GM_unregisterMenuCommand: _GM_unregisterMenuCommand
  817. });
  818. const httpx = new utils.Httpx(_GM_xmlhttpRequest);
  819. httpx.interceptors.response.use(void 0, (data) => {
  820. log.error("拦截器-请求错误", data);
  821. if (data.type === "onabort") {
  822. Qmsg.warning(i18next.t("请求取消"));
  823. } else if (data.type === "onerror") {
  824. Qmsg.error(i18next.t("请求异常"));
  825. } else if (data.type === "ontimeout") {
  826. Qmsg.error(i18next.t("请求超时"));
  827. } else {
  828. Qmsg.error(i18next.t("其它错误"));
  829. }
  830. return data;
  831. });
  832. httpx.config({
  833. logDetails: DEBUG
  834. });
  835. ({
  836. Object: {
  837. defineProperty: _unsafeWindow.Object.defineProperty
  838. },
  839. Function: {
  840. apply: _unsafeWindow.Function.prototype.apply,
  841. call: _unsafeWindow.Function.prototype.call
  842. },
  843. Element: {
  844. appendChild: _unsafeWindow.Element.prototype.appendChild
  845. },
  846. setTimeout: _unsafeWindow.setTimeout
  847. });
  848. const addStyle = utils.addStyle.bind(utils);
  849. const $ = document.querySelector.bind(document);
  850. const $$ = document.querySelectorAll.bind(document);
  851. const UIButton = function(text, description, buttonText, buttonIcon, buttonIsRightIcon, buttonIconIsLoading, buttonType, clickCallBack, afterAddToUListCallBack) {
  852. let result = {
  853. text,
  854. type: "button",
  855. description,
  856. buttonIcon,
  857. buttonIsRightIcon,
  858. buttonIconIsLoading,
  859. buttonType,
  860. buttonText,
  861. callback(event) {
  862. if (typeof clickCallBack === "function") {
  863. clickCallBack(event);
  864. }
  865. },
  866. afterAddToUListCallBack
  867. };
  868. return result;
  869. };
  870. const UIInput = function(text, key, defaultValue, description, changeCallBack, placeholder = "", isNumber, isPassword) {
  871. let result = {
  872. text,
  873. type: "input",
  874. isNumber: Boolean(isNumber),
  875. isPassword: Boolean(isPassword),
  876. props: {},
  877. attributes: {},
  878. description,
  879. getValue() {
  880. return this.props[PROPS_STORAGE_API].get(key, defaultValue);
  881. },
  882. callback(event, value) {
  883. this.props[PROPS_STORAGE_API].set(key, value);
  884. },
  885. placeholder
  886. };
  887. Reflect.set(result.attributes, ATTRIBUTE_KEY, key);
  888. Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue);
  889. Reflect.set(result.props, PROPS_STORAGE_API, {
  890. get(key2, defaultValue2) {
  891. return PopsPanel.getValue(key2, defaultValue2);
  892. },
  893. set(key2, value) {
  894. PopsPanel.setValue(key2, value);
  895. }
  896. });
  897. return result;
  898. };
  899. const UISwitch = function(text, key, defaultValue, clickCallBack, description, afterAddToUListCallBack) {
  900. let result = {
  901. text,
  902. type: "switch",
  903. description,
  904. attributes: {},
  905. props: {},
  906. getValue() {
  907. return Boolean(
  908. this.props[PROPS_STORAGE_API].get(key, defaultValue)
  909. );
  910. },
  911. callback(event, __value) {
  912. let value = Boolean(__value);
  913. log.success(`${value ? "开启" : "关闭"} ${text}`);
  914. this.props[PROPS_STORAGE_API].set(key, value);
  915. },
  916. afterAddToUListCallBack
  917. };
  918. Reflect.set(result.attributes, ATTRIBUTE_KEY, key);
  919. Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue);
  920. Reflect.set(result.props, PROPS_STORAGE_API, {
  921. get(key2, defaultValue2) {
  922. return PopsPanel.getValue(key2, defaultValue2);
  923. },
  924. set(key2, value) {
  925. PopsPanel.setValue(key2, value);
  926. }
  927. });
  928. return result;
  929. };
  930. const GreasyforkApi = {
  931. /**
  932. * 获取脚本统计数据
  933. * @param scriptId
  934. */
  935. async getScriptStats(scriptId) {
  936. let response = await httpx.get(`/scripts/${scriptId}/stats.json`, {
  937. fetch: true,
  938. allowInterceptConfig: false
  939. });
  940. log.info(response);
  941. if (!response.status) {
  942. log.error(i18next.t("获取脚本统计数据失败"));
  943. return;
  944. }
  945. let scriptStatsJSON = utils.toJSON(response.data.responseText);
  946. return scriptStatsJSON;
  947. },
  948. /**
  949. * 解析并获取admin内的源代码同步的配置表单
  950. * @param scriptId
  951. */
  952. async getSourceCodeSyncFormData(scriptId) {
  953. let response = await httpx.get(`/scripts/${scriptId}/admin`, {
  954. fetch: true,
  955. allowInterceptConfig: false
  956. });
  957. log.info(response);
  958. if (!response.status) {
  959. Qmsg.error(i18next.t("请求admin内容失败"));
  960. return;
  961. }
  962. let adminHTML = response.data.responseText;
  963. let adminHTMLElement = domUtils.parseHTML(adminHTML, false, true);
  964. let formElement = adminHTMLElement.querySelector("form.edit_script");
  965. if (!formElement) {
  966. Qmsg.error(i18next.t("解析admin的源代码同步表单失败"));
  967. return;
  968. }
  969. let formData = new FormData(formElement);
  970. return formData;
  971. },
  972. /**
  973. * 进行源代码同步,要求先getSourceCodeSyncFormData
  974. * @param scriptId
  975. * @param data
  976. */
  977. async sourceCodeSync(scriptId, data) {
  978. let response = await httpx.post(`/scripts/${scriptId}/sync_update`, {
  979. fetch: true,
  980. data,
  981. allowInterceptConfig: false
  982. });
  983. log.info(response);
  984. if (!response.status) {
  985. Qmsg.error(i18next.t("源代码同步失败"));
  986. return;
  987. }
  988. return response;
  989. },
  990. /**
  991. * 获取用户的信息,包括脚本列表、未上架的脚本、库
  992. */
  993. async getUserInfo(userId) {
  994. let response = await httpx.get(`/users/${userId}.json`, {
  995. fetch: true,
  996. allowInterceptConfig: false
  997. });
  998. log.success(response);
  999. if (!response.status) {
  1000. Qmsg.error(i18next.t("获取用户信息失败"));
  1001. return;
  1002. }
  1003. let data = utils.toJSON(response.data.responseText);
  1004. data["scriptList"] = [];
  1005. data["scriptLibraryList"] = [];
  1006. data["scripts"].forEach((scriptInfo) => {
  1007. if (scriptInfo["code_url"].endsWith(".user.js")) {
  1008. data["scriptList"].push(scriptInfo);
  1009. } else {
  1010. data["scriptLibraryList"].push(scriptInfo);
  1011. }
  1012. });
  1013. return data;
  1014. },
  1015. /**
  1016. * 获取用户的收藏集
  1017. * @param userId
  1018. */
  1019. async getUserCollection(userId) {
  1020. let response = await httpx.get(`/users/${userId}`, {
  1021. fetch: true,
  1022. allowInterceptConfig: false
  1023. });
  1024. log.info("获取用户的收藏集", response);
  1025. if (!response.status) {
  1026. Qmsg.error(i18next.t("获取用户的收藏集失败"));
  1027. return;
  1028. }
  1029. let respText = response.data.responseText;
  1030. let respDocument = domUtils.parseHTML(respText, true, true);
  1031. let userScriptSets = respDocument.querySelector("#user-script-sets");
  1032. if (!userScriptSets) {
  1033. log.error("解析Script Sets失败");
  1034. return;
  1035. }
  1036. let scriptSetsIdList = [];
  1037. userScriptSets.querySelectorAll("li").forEach((liElement) => {
  1038. var _a2;
  1039. let $ele = liElement.querySelector("a:last-child");
  1040. if (!$ele) {
  1041. return;
  1042. }
  1043. let setsUrl = $ele.href;
  1044. if (setsUrl.includes("?fav=1")) {
  1045. return;
  1046. }
  1047. let setsName = liElement.querySelector("a").innerText;
  1048. let setsId = (_a2 = setsUrl.match(/\/sets\/([\d]+)\//)) == null ? void 0 : _a2[1];
  1049. scriptSetsIdList.push({
  1050. id: setsId,
  1051. name: setsName
  1052. });
  1053. });
  1054. return scriptSetsIdList;
  1055. },
  1056. /**
  1057. * 获取某个收藏集的信息
  1058. * @param userId 用户id
  1059. * @param setsId 收藏集id
  1060. */
  1061. async getUserCollectionInfo(userId, setsId) {
  1062. let response = await httpx.get(`/users/${userId}/sets/${setsId}/edit`, {
  1063. fetch: true,
  1064. allowInterceptConfig: false
  1065. });
  1066. log.info(response);
  1067. if (!response.status) {
  1068. Qmsg.error(i18next.t("获取收藏集{{setsId}}失败", { setsId }));
  1069. return;
  1070. }
  1071. let respText = response.data.responseText;
  1072. let respDocument = domUtils.parseHTML(respText, true, true);
  1073. let $edit_script_set_form = respDocument.querySelector(
  1074. 'form[id^="edit_script_set"]'
  1075. );
  1076. if (!$edit_script_set_form) {
  1077. Qmsg.error(i18next.t("获取表单元素#edit_script_set失败"));
  1078. return;
  1079. }
  1080. let formData = new FormData($edit_script_set_form);
  1081. let csrfToken = respDocument.querySelector(
  1082. 'meta[name="csrf-token"]'
  1083. );
  1084. if (!csrfToken) {
  1085. Qmsg.error(i18next.t("获取表单csrfToken失败"));
  1086. return;
  1087. }
  1088. if (csrfToken.hasAttribute("content")) {
  1089. let authenticity_token = csrfToken.getAttribute("content");
  1090. if (authenticity_token) {
  1091. formData.set("authenticity_token", authenticity_token);
  1092. }
  1093. }
  1094. return formData;
  1095. },
  1096. /**
  1097. * 更新用户的某个收藏集的表单信息
  1098. * @param userId 用户id
  1099. * @param setsId 收藏集id
  1100. * @param data
  1101. */
  1102. async updateUserSetsInfo(userId, setsId, data) {
  1103. let response = await httpx.post(`/users/${userId}/sets/${setsId}`, {
  1104. fetch: true,
  1105. allowInterceptConfig: false,
  1106. headers: {
  1107. Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
  1108. "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
  1109. "Cache-Control": "no-cache",
  1110. "Content-Type": "application/x-www-form-urlencoded",
  1111. Pragma: "no-cache"
  1112. },
  1113. fetchInit: {
  1114. referrerPolicy: "strict-origin-when-cross-origin"
  1115. },
  1116. data
  1117. });
  1118. log.info(response);
  1119. if (!response.status) {
  1120. Qmsg.error(i18next.t("更新收藏集表单请求失败"));
  1121. return;
  1122. }
  1123. let respText = response.data.responseText;
  1124. let respDocument = domUtils.parseHTML(respText, true, true);
  1125. return respDocument;
  1126. },
  1127. /**
  1128. * 切换语言
  1129. * @param url
  1130. */
  1131. async switchLanguage(url) {
  1132. let response = await httpx.get(url, {
  1133. fetch: true,
  1134. headers: {
  1135. "Upgrade-Insecure-Requests": "1"
  1136. }
  1137. });
  1138. log.info(response);
  1139. if (!response.status) {
  1140. return;
  1141. }
  1142. }
  1143. };
  1144. const GreasyforkRouter = {
  1145. /**
  1146. * 主页
  1147. *
  1148. * + /zh-CN
  1149. */
  1150. isHome() {
  1151. return window.location.pathname.split("/").length <= 2 && window.location.search === "";
  1152. },
  1153. /**
  1154. * 代码页面
  1155. *
  1156. * + /code...
  1157. */
  1158. isCode() {
  1159. var _a2;
  1160. return Boolean((_a2 = window.location.pathname.split("/")) == null ? void 0 : _a2.includes("code"));
  1161. },
  1162. /**
  1163. * 代码页面
  1164. *
  1165. * (严格比较)
  1166. *
  1167. * + /code
  1168. * + /code/
  1169. */
  1170. isCodeStrict() {
  1171. return Boolean(window.location.pathname.match(/\/code(\/|)$/));
  1172. },
  1173. /**
  1174. * 版本页面
  1175. *
  1176. * (严格比较)
  1177. *
  1178. * + /version
  1179. * + /version/
  1180. */
  1181. isVersion() {
  1182. return Boolean(window.location.pathname.match(/\/versions(\/|)$/));
  1183. },
  1184. /**
  1185. * 用户
  1186. *
  1187. * + /users/...
  1188. */
  1189. isUsers() {
  1190. return Boolean(window.location.pathname.match(/\/.+\/users\/.+/gi));
  1191. },
  1192. /**
  1193. * 私聊用户页面,可能是全部私信页面,也可能是某个用户的私信页面
  1194. *
  1195. * + /conversations...
  1196. */
  1197. isUsersConversations() {
  1198. return this.isUsers() && Boolean(window.location.pathname.includes("/conversations"));
  1199. },
  1200. /**
  1201. * 私聊xxx用户页面
  1202. *
  1203. * + /conversations/111...
  1204. */
  1205. isUsersConversationsWithSomeUser() {
  1206. return this.isUsersConversations() && Boolean(window.location.pathname.match(/\/conversations\/[\d]+/));
  1207. },
  1208. /**
  1209. * 脚本页面(单个脚本的页面)
  1210. *
  1211. * + /scripts/111...
  1212. */
  1213. isScript() {
  1214. return Boolean(window.location.pathname.match(/\/scripts\/[\d+]/));
  1215. },
  1216. /**
  1217. * 脚本管理页面
  1218. *
  1219. * + /scripts/.../admin
  1220. */
  1221. isScriptAdmin() {
  1222. return Boolean(window.location.pathname.endsWith("/admin"));
  1223. },
  1224. /**
  1225. * 脚本列表页面
  1226. *
  1227. * (严格比较)
  1228. *
  1229. * + /scripts
  1230. * + /scripts/
  1231. */
  1232. isScriptList() {
  1233. return Boolean(window.location.pathname.match(/\/scripts(\/|)$/));
  1234. },
  1235. /**
  1236. * 脚本列表-按域名
  1237. *
  1238. * + /scripts/by-site...
  1239. */
  1240. isScriptsBySite() {
  1241. return Boolean(window.location.pathname.match("/scripts/by-site"));
  1242. },
  1243. /**
  1244. * 脚本反馈
  1245. *
  1246. * + /scripts/xxxx/feedback
  1247. */
  1248. isScriptsFeedback() {
  1249. return this.isScript() && window.location.pathname.match(/\/feedback(\/|)$/i);
  1250. },
  1251. /**
  1252. * 库列表页面
  1253. *
  1254. * (严格比较)
  1255. *
  1256. * + /libraries
  1257. * + /libraries/
  1258. */
  1259. isScriptLibraryList() {
  1260. return Boolean(window.location.pathname.match(/\/libraries(\/|)$/));
  1261. },
  1262. /**
  1263. * 脚本搜索结果页面
  1264. *
  1265. * + /scripts?q=
  1266. */
  1267. isScriptSearch() {
  1268. let searchParams = new URLSearchParams(window.location.search);
  1269. return this.isScriptList() && searchParams.has("q");
  1270. },
  1271. /**
  1272. * 脚本代码搜索页面
  1273. *
  1274. * (严格比较)
  1275. *
  1276. * + /code-search
  1277. * + /code-search/
  1278. */
  1279. isScriptCodeSearch() {
  1280. return Boolean(window.location.pathname.match(/\/code-search(\/|)$/));
  1281. },
  1282. /**
  1283. * 库列表搜索
  1284. *
  1285. * + /scripts/libraries?q=
  1286. */
  1287. isScriptLibraryListSearch() {
  1288. let searchParams = new URLSearchParams(window.location.search);
  1289. return this.isScriptLibraryList() && searchParams.has("q");
  1290. },
  1291. /**
  1292. * 讨论页面
  1293. *
  1294. * (严格比较)
  1295. *
  1296. * + /discussions
  1297. * + /discussions/
  1298. */
  1299. isDiscuessions() {
  1300. return Boolean(window.location.pathname.match(/\/discussions(\/|)$/));
  1301. },
  1302. /**
  1303. * 图片资源页面
  1304. */
  1305. isImageSource() {
  1306. return window.location.pathname.startsWith("/vite/assets");
  1307. }
  1308. };
  1309. const GreasyforkUrlUtils = {
  1310. /**
  1311. * 获取脚本安装的链接
  1312. * @param scriptId
  1313. * @param scriptVersion
  1314. * @param scriptName
  1315. * @returns
  1316. */
  1317. getInstallUrl(scriptId, scriptVersion, scriptName) {
  1318. if (utils.isNotNull(scriptName)) {
  1319. scriptName = "/" + scriptName;
  1320. } else {
  1321. scriptName = "";
  1322. }
  1323. return `https://update.greasyfork.org/scripts/${scriptId}/${scriptVersion}${scriptName}.user.js`;
  1324. },
  1325. /**
  1326. * 获取脚本的代码页面链接
  1327. * @param scriptId
  1328. * @param scriptVersion
  1329. * @returns
  1330. */
  1331. getCodeUrl(scriptId, scriptVersion) {
  1332. if (utils.isNull(scriptVersion)) {
  1333. scriptVersion = "";
  1334. }
  1335. return `https://greasyfork.org/scripts/${scriptId}/code?version=${scriptVersion}`;
  1336. },
  1337. /**
  1338. * 获取代码搜索地址
  1339. * @param url
  1340. */
  1341. getCodeSearchUrl(url) {
  1342. return "https://greasyfork.org/zh-CN/scripts/code-search?c=" + url;
  1343. },
  1344. /**
  1345. * 获取脚本的信息
  1346. * @param scriptId 脚本id
  1347. */
  1348. getScriptInfoUrl(scriptId) {
  1349. return `https://greasyfork.org/scripts/${scriptId}.json`;
  1350. },
  1351. /**
  1352. * 获取管理地址
  1353. * @param url
  1354. */
  1355. getAdminUrl(url) {
  1356. return url + "/admin";
  1357. },
  1358. /**
  1359. * 从字符串中提取Id
  1360. * @param text
  1361. * @default window.location.pathname
  1362. */
  1363. getScriptId(text) {
  1364. var _a2, _b;
  1365. return (_b = (_a2 = text || window.location.pathname) == null ? void 0 : _a2.match(
  1366. /\/scripts\/([\d]+)/i
  1367. )) == null ? void 0 : _b[1];
  1368. },
  1369. /**
  1370. * 从字符串中提取用户id
  1371. * @param text
  1372. * @default window.location.pathname
  1373. */
  1374. getUserId(text) {
  1375. var _a2;
  1376. return (_a2 = (text || window.location.pathname).match(/\/users\/([\d]+)/i)) == null ? void 0 : _a2[1];
  1377. },
  1378. /**
  1379. * 获取举报地址
  1380. */
  1381. getReportUrl(item_class, item_id) {
  1382. return `${window.location.origin}/reports/new?item_class=${item_class}&item_id=${item_id}`;
  1383. },
  1384. /**
  1385. * 从字符串中提取脚本名
  1386. * @param text
  1387. */
  1388. getScriptName(text) {
  1389. let pathname = window.location.pathname;
  1390. if (text != null) {
  1391. pathname = new URL(text).pathname;
  1392. }
  1393. pathname = decodeURIComponent(pathname);
  1394. let pathnameSplit = pathname.split("/");
  1395. for (const name of pathnameSplit) {
  1396. let nameMatch = name.match(/[\d]+/);
  1397. if (nameMatch && nameMatch.length) {
  1398. return nameMatch[1];
  1399. }
  1400. }
  1401. },
  1402. /**
  1403. * 获取需要切换语言的Url
  1404. * @default "zh-CN"
  1405. */
  1406. getSwitchLanguageUrl(localeLanguage = "zh-CN") {
  1407. let url = window.location.origin;
  1408. let urlSplit = window.location.pathname.split("/");
  1409. urlSplit[1] = localeLanguage;
  1410. url = url + urlSplit.join("/");
  1411. url += window.location.search;
  1412. if (window.location.search === "") {
  1413. url += "?locale_override=1";
  1414. } else if (!window.location.search.includes("locale_override=1")) {
  1415. url += "&locale_override=1";
  1416. }
  1417. return url;
  1418. }
  1419. };
  1420. const GreasyforkMenu = {
  1421. /**
  1422. * @class
  1423. */
  1424. menu: GM_Menu,
  1425. /**
  1426. * 当前是否已登录
  1427. */
  1428. isLogin: false,
  1429. /**
  1430. * 初始化环境变量
  1431. */
  1432. initEnv() {
  1433. let userLinkElement = this.getUserLinkElement();
  1434. this.isLogin = Boolean(userLinkElement);
  1435. },
  1436. /**
  1437. * 获取当前登录用户的a标签元素
  1438. */
  1439. getUserLinkElement() {
  1440. return document.querySelector(
  1441. "#nav-user-info span.user-profile-link a"
  1442. );
  1443. },
  1444. /**
  1445. * 更新脚本
  1446. * @param scriptUrlList
  1447. */
  1448. async updateScript(scriptUrlList) {
  1449. let getLoadingHTML = function(scriptName, progress = 1) {
  1450. return `
  1451. <div style="display: flex;flex-direction: column;align-items: flex-start;">
  1452. <div style="height: 30px;line-height: 30px;">${i18next.t(
  1453. "名称:"
  1454. )}${scriptName}</div>
  1455. <div style="height: 30px;line-height: 30px;">${i18next.t(
  1456. "进度:"
  1457. )}${progress}/${scriptUrlList.length}</div>
  1458. </div>`;
  1459. };
  1460. if (utils.isNull(scriptUrlList)) {
  1461. Qmsg.error(i18next.t("未获取到【脚本列表】"));
  1462. } else {
  1463. let loading = Qmsg.loading(
  1464. getLoadingHTML(
  1465. GreasyforkUrlUtils.getScriptName(scriptUrlList[0])
  1466. ),
  1467. {
  1468. html: true
  1469. }
  1470. );
  1471. let successNums = 0;
  1472. let failedNums = 0;
  1473. for (let index = 0; index < scriptUrlList.length; index++) {
  1474. let scriptUrl = scriptUrlList[index];
  1475. let scriptId = GreasyforkUrlUtils.getScriptId(scriptUrl);
  1476. log.success("更新:" + scriptUrl);
  1477. let scriptName = GreasyforkUrlUtils.getScriptName(scriptUrl);
  1478. loading.setHTML(getLoadingHTML(scriptName, index + 1));
  1479. let codeSyncFormData = await GreasyforkApi.getSourceCodeSyncFormData(
  1480. scriptId
  1481. );
  1482. if (codeSyncFormData) {
  1483. let syncUpdateStatus = await GreasyforkApi.sourceCodeSync(
  1484. scriptId,
  1485. codeSyncFormData
  1486. );
  1487. if (syncUpdateStatus) {
  1488. Qmsg.success(i18next.t("源代码同步成功,3秒后更新下一个"));
  1489. await utils.sleep(3e3);
  1490. successNums++;
  1491. } else {
  1492. Qmsg.error(i18next.t("源代码同步失败"));
  1493. failedNums++;
  1494. }
  1495. } else {
  1496. Qmsg.error(i18next.t("源代码同步失败"));
  1497. failedNums++;
  1498. }
  1499. }
  1500. loading.close();
  1501. if (successNums === 0) {
  1502. Qmsg.error(i18next.t("全部更新失败"));
  1503. } else {
  1504. Qmsg.success(
  1505. i18next.t(
  1506. "全部更新完毕<br >成功:{{successNums}}<br >失败:{{failedNums}}<br >总计:{{scriptUrlListLength}}",
  1507. {
  1508. successNums,
  1509. failedNums,
  1510. scriptUrlListLength: scriptUrlList.length
  1511. }
  1512. ),
  1513. {
  1514. html: true
  1515. }
  1516. );
  1517. }
  1518. }
  1519. },
  1520. /**
  1521. * 处理本地的goto事件
  1522. */
  1523. handleLocalGotoCallBack() {
  1524. if (PopsPanel.getValue("goto_updateSettingsAndSynchronize_scriptList")) {
  1525. PopsPanel.deleteValue("goto_updateSettingsAndSynchronize_scriptList");
  1526. if (!GreasyforkRouter.isUsers()) {
  1527. PopsPanel.setValue(
  1528. "goto_updateSettingsAndSynchronize_scriptList",
  1529. true
  1530. );
  1531. if (GreasyforkMenu.getUserLinkElement()) {
  1532. Qmsg.success(i18next.t("前往用户主页"));
  1533. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  1534. } else {
  1535. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  1536. }
  1537. return;
  1538. }
  1539. let scriptUrlList = [];
  1540. document.querySelectorAll(
  1541. "#user-script-list-section li a.script-link"
  1542. ).forEach((item) => {
  1543. scriptUrlList = scriptUrlList.concat(
  1544. GreasyforkUrlUtils.getAdminUrl(item.href)
  1545. );
  1546. });
  1547. GreasyforkMenu.updateScript(scriptUrlList);
  1548. } else if (PopsPanel.getValue("goto_updateSettingsAndSynchronize_unlistedScriptList")) {
  1549. PopsPanel.deleteValue(
  1550. "goto_updateSettingsAndSynchronize_unlistedScriptList"
  1551. );
  1552. if (!GreasyforkRouter.isUsers()) {
  1553. PopsPanel.setValue(
  1554. "goto_updateSettingsAndSynchronize_unlistedScriptList",
  1555. true
  1556. );
  1557. if (GreasyforkMenu.getUserLinkElement()) {
  1558. Qmsg.success(i18next.t("前往用户主页"));
  1559. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  1560. } else {
  1561. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  1562. }
  1563. return;
  1564. }
  1565. let scriptUrlList = [];
  1566. document.querySelectorAll(
  1567. "#user-unlisted-script-list li a.script-link"
  1568. ).forEach((item) => {
  1569. scriptUrlList = scriptUrlList.concat(
  1570. GreasyforkUrlUtils.getAdminUrl(item.href)
  1571. );
  1572. });
  1573. GreasyforkMenu.updateScript(scriptUrlList);
  1574. } else if (PopsPanel.getValue("goto_updateSettingsAndSynchronize_libraryScriptList")) {
  1575. PopsPanel.deleteValue(
  1576. "goto_updateSettingsAndSynchronize_libraryScriptList"
  1577. );
  1578. if (!GreasyforkRouter.isUsers()) {
  1579. PopsPanel.setValue(
  1580. "goto_updateSettingsAndSynchronize_libraryScriptList",
  1581. true
  1582. );
  1583. if (GreasyforkMenu.getUserLinkElement()) {
  1584. Qmsg.success(i18next.t("前往用户主页"));
  1585. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  1586. } else {
  1587. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  1588. }
  1589. return;
  1590. }
  1591. let scriptUrlList = [];
  1592. document.querySelectorAll(
  1593. "#user-library-script-list li a.script-link"
  1594. ).forEach((item) => {
  1595. scriptUrlList = scriptUrlList.concat(
  1596. GreasyforkUrlUtils.getAdminUrl(item.href)
  1597. );
  1598. });
  1599. GreasyforkMenu.updateScript(scriptUrlList);
  1600. }
  1601. }
  1602. };
  1603. const UISelect = function(text, key, defaultValue, data, callback, description) {
  1604. let selectData = [];
  1605. if (typeof data === "function") {
  1606. selectData = data();
  1607. } else {
  1608. selectData = data;
  1609. }
  1610. let result = {
  1611. text,
  1612. type: "select",
  1613. description,
  1614. attributes: {},
  1615. props: {},
  1616. getValue() {
  1617. return this.props[PROPS_STORAGE_API].get(key, defaultValue);
  1618. },
  1619. callback(event, isSelectedValue, isSelectedText) {
  1620. let value = isSelectedValue;
  1621. log.info(`选择:${isSelectedText}`);
  1622. this.props[PROPS_STORAGE_API].set(key, value);
  1623. if (typeof callback === "function") {
  1624. callback(event, value, isSelectedText);
  1625. }
  1626. },
  1627. data: selectData
  1628. };
  1629. Reflect.set(result.attributes, ATTRIBUTE_KEY, key);
  1630. Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue);
  1631. Reflect.set(result.props, PROPS_STORAGE_API, {
  1632. get(key2, defaultValue2) {
  1633. return PopsPanel.getValue(key2, defaultValue2);
  1634. },
  1635. set(key2, value) {
  1636. PopsPanel.setValue(key2, value);
  1637. }
  1638. });
  1639. return result;
  1640. };
  1641. const UIButtonShortCut = function(text, description, key, defaultValue, defaultButtonText, buttonType = "default", shortCut) {
  1642. let __defaultButtonText = typeof defaultButtonText === "function" ? defaultButtonText() : defaultButtonText;
  1643. if (typeof defaultValue === "object") {
  1644. shortCut.initConfig(key, defaultValue);
  1645. }
  1646. let getButtonText = () => {
  1647. return shortCut.getShowText(key, __defaultButtonText);
  1648. };
  1649. let result = UIButton(
  1650. text,
  1651. description,
  1652. getButtonText,
  1653. "keyboard",
  1654. false,
  1655. false,
  1656. buttonType,
  1657. async (event) => {
  1658. var _a2;
  1659. let $click = event.target;
  1660. let $btn = (_a2 = $click.closest(".pops-panel-button")) == null ? void 0 : _a2.querySelector("span");
  1661. if (shortCut.isWaitPress) {
  1662. Qmsg.warning("请先执行当前的录入操作");
  1663. return;
  1664. }
  1665. if (shortCut.hasOptionValue(key)) {
  1666. shortCut.emptyOption(key);
  1667. Qmsg.success("清空快捷键");
  1668. } else {
  1669. let loadingQmsg = Qmsg.loading("请按下快捷键...", {
  1670. showClose: true
  1671. });
  1672. let {
  1673. status,
  1674. option,
  1675. key: isUsedKey
  1676. } = await shortCut.enterShortcutKeys(key);
  1677. loadingQmsg.close();
  1678. if (status) {
  1679. log.success("成功录入快捷键", option);
  1680. Qmsg.success("成功录入");
  1681. } else {
  1682. Qmsg.error(
  1683. `快捷键 ${shortCut.translateKeyboardValueToButtonText(
  1684. option
  1685. )} 已被 ${isUsedKey} 占用`
  1686. );
  1687. }
  1688. }
  1689. $btn.innerHTML = getButtonText();
  1690. }
  1691. );
  1692. result.attributes = {};
  1693. Reflect.set(result.attributes, ATTRIBUTE_INIT, () => {
  1694. return false;
  1695. });
  1696. return result;
  1697. };
  1698. class ShortCut {
  1699. constructor(key) {
  1700. /** 存储的键 */
  1701. __publicField(this, "key", "short-cut");
  1702. /** 是否存在等待按下的按键 */
  1703. __publicField(this, "isWaitPress", false);
  1704. if (typeof key === "string") {
  1705. this.key = key;
  1706. }
  1707. }
  1708. /**
  1709. * 初始化配置默认值
  1710. */
  1711. initConfig(key, option) {
  1712. if (this.hasOption(key)) ;
  1713. else {
  1714. this.setOption(key, option);
  1715. }
  1716. }
  1717. /** 获取存储的键 */
  1718. getStorageKey() {
  1719. return this.key;
  1720. }
  1721. /**
  1722. * 获取本地存储的所有值
  1723. */
  1724. getLocalAllOptions() {
  1725. return _GM_getValue(this.key, []);
  1726. }
  1727. /**
  1728. * 判断是否存在该配置
  1729. * @param key 键
  1730. */
  1731. hasOption(key) {
  1732. let localOptions = this.getLocalAllOptions();
  1733. let findOption = localOptions.find((item) => item.key === key);
  1734. return !!findOption;
  1735. }
  1736. /**
  1737. * 判断是否存在该配置的value值
  1738. * @param key 键
  1739. */
  1740. hasOptionValue(key) {
  1741. if (this.hasOption(key)) {
  1742. let option = this.getOption(key);
  1743. return !((option == null ? void 0 : option.value) == null);
  1744. } else {
  1745. return false;
  1746. }
  1747. }
  1748. /**
  1749. * 获取配置
  1750. * @param key 键
  1751. * @param defaultValue 默认值
  1752. */
  1753. getOption(key, defaultValue) {
  1754. let localOptions = this.getLocalAllOptions();
  1755. let findOption = localOptions.find((item) => item.key === key);
  1756. return findOption ?? defaultValue;
  1757. }
  1758. /**
  1759. * 设置配置
  1760. * @param key 键
  1761. * @param value 配置
  1762. */
  1763. setOption(key, value) {
  1764. let localOptions = this.getLocalAllOptions();
  1765. let findIndex = localOptions.findIndex((item) => item.key === key);
  1766. if (findIndex == -1) {
  1767. localOptions.push({
  1768. key,
  1769. value
  1770. });
  1771. } else {
  1772. Reflect.set(localOptions[findIndex], "value", value);
  1773. }
  1774. _GM_setValue(this.key, localOptions);
  1775. }
  1776. /**
  1777. * 清空当前已有配置录入的值
  1778. * @param key
  1779. */
  1780. emptyOption(key) {
  1781. let result = false;
  1782. let localOptions = this.getLocalAllOptions();
  1783. let findIndex = localOptions.findIndex((item) => item.key === key);
  1784. if (findIndex !== -1) {
  1785. localOptions[findIndex].value = null;
  1786. result = true;
  1787. }
  1788. _GM_setValue(this.key, localOptions);
  1789. return result;
  1790. }
  1791. /**
  1792. * 删除配置
  1793. * @param key 键
  1794. */
  1795. deleteOption(key) {
  1796. let result = false;
  1797. let localValue = this.getLocalAllOptions();
  1798. let findValueIndex = localValue.findIndex((item) => item.key === key);
  1799. if (findValueIndex !== -1) {
  1800. localValue.splice(findValueIndex, 1);
  1801. result = true;
  1802. }
  1803. _GM_setValue(this.key, localValue);
  1804. return result;
  1805. }
  1806. /**
  1807. * 把配置的快捷键转成文字
  1808. * @param keyboardValue
  1809. * @returns
  1810. */
  1811. translateKeyboardValueToButtonText(keyboardValue) {
  1812. let result = "";
  1813. keyboardValue.ohterCodeList.forEach((ohterCodeKey) => {
  1814. result += utils.stringTitleToUpperCase(ohterCodeKey, true) + " + ";
  1815. });
  1816. result += utils.stringTitleToUpperCase(keyboardValue.keyName);
  1817. return result;
  1818. }
  1819. /**
  1820. * 获取快捷键显示的文字
  1821. * @param key 本地存储的快捷键键名
  1822. * @param defaultShowText 默认显示的文字
  1823. */
  1824. getShowText(key, defaultShowText) {
  1825. if (this.hasOption(key)) {
  1826. let localOption = this.getOption(key);
  1827. if (localOption.value == null) {
  1828. return defaultShowText;
  1829. } else {
  1830. return this.translateKeyboardValueToButtonText(localOption.value);
  1831. }
  1832. } else {
  1833. return defaultShowText;
  1834. }
  1835. }
  1836. /**
  1837. * 录入快捷键
  1838. * @param key 本地存储的快捷键键名
  1839. */
  1840. async enterShortcutKeys(key) {
  1841. return new Promise((resolve) => {
  1842. this.isWaitPress = true;
  1843. let keyboardListener = domUtils.listenKeyboard(
  1844. window,
  1845. "keyup",
  1846. (keyName, keyValue, ohterCodeList) => {
  1847. const currentOption = {
  1848. keyName,
  1849. keyValue,
  1850. ohterCodeList
  1851. };
  1852. const shortcutJSONString = JSON.stringify(currentOption);
  1853. const allOptions = this.getLocalAllOptions();
  1854. for (let index = 0; index < allOptions.length; index++) {
  1855. let localValue = allOptions[index];
  1856. if (localValue.key === key) {
  1857. continue;
  1858. }
  1859. const localShortCutJSONString = JSON.stringify(localValue.value);
  1860. let isUsedByOtherOption = false;
  1861. if (localValue.value != null && shortcutJSONString === localShortCutJSONString) {
  1862. isUsedByOtherOption = true;
  1863. }
  1864. if (isUsedByOtherOption) {
  1865. this.isWaitPress = false;
  1866. keyboardListener.removeListen();
  1867. resolve({
  1868. status: false,
  1869. key: localValue.key,
  1870. option: currentOption
  1871. });
  1872. return;
  1873. }
  1874. }
  1875. this.setOption(key, currentOption);
  1876. this.isWaitPress = false;
  1877. keyboardListener.removeListen();
  1878. resolve({
  1879. status: true,
  1880. key,
  1881. option: currentOption
  1882. });
  1883. }
  1884. );
  1885. });
  1886. }
  1887. /**
  1888. * 初始化全局键盘监听
  1889. * @param shortCutOption 快捷键配置 一般是{ "键名": { callback: ()=>{}}},键名是本地存储的自定义快捷键的键名
  1890. */
  1891. initGlobalKeyboardListener(shortCutOption) {
  1892. let localOptions = this.getLocalAllOptions();
  1893. if (!localOptions.length) {
  1894. log.warn("没有设置快捷键");
  1895. return;
  1896. }
  1897. let that = this;
  1898. function setListenKeyboard($ele, option) {
  1899. domUtils.listenKeyboard(
  1900. $ele,
  1901. "keydown",
  1902. (keyName, keyValue, ohterCodeList) => {
  1903. if (that.isWaitPress) {
  1904. return;
  1905. }
  1906. localOptions = that.getLocalAllOptions();
  1907. let findShortcutIndex = localOptions.findIndex((item) => {
  1908. let option2 = item.value;
  1909. let tempOption = {
  1910. keyName,
  1911. keyValue,
  1912. ohterCodeList
  1913. };
  1914. if (JSON.stringify(option2) === JSON.stringify(tempOption)) {
  1915. return item;
  1916. }
  1917. });
  1918. if (findShortcutIndex != -1) {
  1919. let findShortcut = localOptions[findShortcutIndex];
  1920. log.info("调用快捷键", findShortcut);
  1921. if (findShortcut.key in option) {
  1922. option[findShortcut.key].callback();
  1923. }
  1924. }
  1925. }
  1926. );
  1927. }
  1928. let WindowShortCutOption = {};
  1929. let ElementShortCutOption = {};
  1930. Object.keys(shortCutOption).forEach((localKey) => {
  1931. let option = shortCutOption[localKey];
  1932. if (option.target == null || typeof option.target === "string" && option.target === "") {
  1933. option.target = "window";
  1934. }
  1935. if (option.target === "window") {
  1936. Reflect.set(WindowShortCutOption, localKey, option);
  1937. } else {
  1938. Reflect.set(ElementShortCutOption, localKey, option);
  1939. }
  1940. });
  1941. setListenKeyboard(window, WindowShortCutOption);
  1942. domUtils.ready(() => {
  1943. Object.keys(ElementShortCutOption).forEach(async (localKey) => {
  1944. let option = ElementShortCutOption[localKey];
  1945. if (typeof option.target === "string") {
  1946. utils.waitNode(option.target, 1e4).then(($ele) => {
  1947. if (!$ele) {
  1948. return;
  1949. }
  1950. let __option = {};
  1951. Reflect.set(__option, localKey, option);
  1952. setListenKeyboard($ele, __option);
  1953. });
  1954. } else if (typeof option.target === "function") {
  1955. let target = await option.target();
  1956. if (target == null) {
  1957. return;
  1958. }
  1959. let __option = {};
  1960. Reflect.set(__option, localKey, option);
  1961. setListenKeyboard(target, __option);
  1962. } else {
  1963. let __option = {};
  1964. Reflect.set(__option, localKey, option);
  1965. setListenKeyboard(option.target, __option);
  1966. }
  1967. });
  1968. });
  1969. }
  1970. }
  1971. const GreasyforkShortCut = {
  1972. shortCut: new ShortCut(),
  1973. shortOption: {
  1974. "gf-quickReply": {
  1975. target: () => {
  1976. let $commentText = document.querySelector("form textarea");
  1977. let $replyBtn = document.querySelector(
  1978. 'input[name="commit"][type="submit"]'
  1979. );
  1980. if (!$commentText) {
  1981. log.error("页面不存在输入框");
  1982. return;
  1983. } else if (!$replyBtn) {
  1984. log.error("页面不存在【发表回复】按钮");
  1985. return;
  1986. }
  1987. log.success("监听快捷键:gf-quickReply");
  1988. return $commentText;
  1989. },
  1990. callback() {
  1991. if (document.activeElement) {
  1992. let $parentForm = document.activeElement.closest("form");
  1993. if (!$parentForm) {
  1994. log.error("当前activeElement不在表单内,无法触发快捷键");
  1995. return;
  1996. }
  1997. let $replyBtnList = $parentForm.querySelectorAll(
  1998. 'input[name="commit"][type="submit"]'
  1999. );
  2000. if (!$replyBtnList.length) {
  2001. log.error("表单内不存在【发表回复】按钮");
  2002. return;
  2003. }
  2004. if ($replyBtnList.length > 1) {
  2005. log.warn("表单内存在多个【发表回复】按钮,只触发第一个");
  2006. }
  2007. $replyBtnList[0].click();
  2008. } else {
  2009. log.error("当前页面没有激活元素,无法触发快捷键");
  2010. }
  2011. }
  2012. }
  2013. },
  2014. init() {
  2015. this.shortCut.initGlobalKeyboardListener(this.shortOption);
  2016. }
  2017. };
  2018. const GreasyforkRememberFormTextArea = {
  2019. $key: {
  2020. DB_KEY: "data"
  2021. },
  2022. $data: {
  2023. db: null
  2024. },
  2025. init() {
  2026. this.$data.db = this.getDB();
  2027. PopsPanel.execMenuOnce("rememberReplyContent", () => {
  2028. this.rememberReplyContent();
  2029. });
  2030. PopsPanel.execMenu("gf-autoClearRememberReplayContent", (value) => {
  2031. this.autoClearRememberReplayContent(value);
  2032. });
  2033. },
  2034. /**
  2035. * 获取数据库连接对象
  2036. */
  2037. getDB() {
  2038. const dbName = "reply_record";
  2039. const storeName = "textarea_text";
  2040. const dbVersion = 2;
  2041. return new utils.indexedDB(dbName, storeName, dbVersion);
  2042. },
  2043. /**
  2044. * 记住回复内容
  2045. */
  2046. async rememberReplyContent() {
  2047. const TAG = "记住回复内容 -- ";
  2048. let $formList = document.querySelectorAll("form");
  2049. if (!$formList.length) {
  2050. log.warn(TAG + "不存在表单");
  2051. return;
  2052. }
  2053. try {
  2054. await this.clearRelayHistoryRememberContentText();
  2055. } catch (error) {
  2056. log.error(error);
  2057. }
  2058. $formList.forEach(async ($form) => {
  2059. let $textarea = $form.querySelector("textarea");
  2060. let $replySubmit = $form.querySelector(`input[type="submit"]`);
  2061. if (!$textarea) {
  2062. return;
  2063. }
  2064. if (!$replySubmit) {
  2065. return;
  2066. }
  2067. log.success(`开始监听form --- 记住回复内容`, $form);
  2068. this.$data.db.get(this.$key.DB_KEY).then((result) => {
  2069. if (!result.data) {
  2070. return;
  2071. }
  2072. let localDataIndex = result.data.findIndex((item) => {
  2073. return this.checkUrlIsSame(window.location.href, item.url);
  2074. });
  2075. if (localDataIndex == -1) {
  2076. return;
  2077. }
  2078. let historyInputText = result.data[localDataIndex].text;
  2079. log.success("填入历史输入内容:" + historyInputText);
  2080. $textarea.value = historyInputText;
  2081. });
  2082. domUtils.on(
  2083. $textarea,
  2084. ["propertychange", "input"],
  2085. utils.debounce((event) => {
  2086. let data = {
  2087. url: window.location.href,
  2088. text: $textarea.value,
  2089. time: Date.now()
  2090. };
  2091. this.$data.db.get(this.$key.DB_KEY).then((result) => {
  2092. if (!result.success && result.event && result.event.type !== "success") {
  2093. log.warn(result);
  2094. return;
  2095. }
  2096. if (result.data == null) {
  2097. result.data = [];
  2098. }
  2099. let localDataIndex = result.data.findIndex((item) => {
  2100. return this.checkUrlIsSame(window.location.href, item.url);
  2101. });
  2102. if (localDataIndex !== -1) {
  2103. if (utils.isNull(data.text)) {
  2104. result.data.splice(localDataIndex, 1);
  2105. } else {
  2106. result.data[localDataIndex] = utils.assign(
  2107. result.data[localDataIndex],
  2108. data
  2109. );
  2110. }
  2111. } else {
  2112. result.data = result.data.concat(data);
  2113. }
  2114. this.$data.db.save(this.$key.DB_KEY, result.data).then((result2) => {
  2115. if (result2.success) ;
  2116. else {
  2117. log.error("保存失败", result2);
  2118. }
  2119. });
  2120. });
  2121. }, 25)
  2122. );
  2123. domUtils.on(
  2124. $form,
  2125. "submit",
  2126. (event) => {
  2127. log.info(`表单提交,刷新页面后清理内容:` + window.location.href);
  2128. _GM_setValue(
  2129. "delyClear_rememberReplyContent_url",
  2130. window.location.href
  2131. );
  2132. },
  2133. {
  2134. capture: true
  2135. }
  2136. );
  2137. });
  2138. },
  2139. /**
  2140. * 清理历史记住的回复内容
  2141. */
  2142. async clearRelayHistoryRememberContentText() {
  2143. const KEY2 = "delyClear_rememberReplyContent_url";
  2144. let delyClear_rememberReplyContent_url = _GM_getValue(KEY2);
  2145. if (delyClear_rememberReplyContent_url) {
  2146. let result = await this.$data.db.get(
  2147. this.$key.DB_KEY
  2148. );
  2149. if (!result.data) {
  2150. log.info("表单记录:数据库是空的");
  2151. return;
  2152. }
  2153. let localDataIndex = result.data.findIndex((item) => {
  2154. return this.checkUrlIsSame(
  2155. delyClear_rememberReplyContent_url,
  2156. item.url
  2157. );
  2158. });
  2159. if (localDataIndex == -1) {
  2160. log.info("表单记录:已不存在该数据");
  2161. _GM_deleteValue(KEY2);
  2162. return;
  2163. }
  2164. result.data.splice(localDataIndex, 1);
  2165. let saveResult = await this.$data.db.save(this.$key.DB_KEY, result.data);
  2166. if (saveResult.success) {
  2167. log.success("表单记录:成功清除");
  2168. _GM_deleteValue(KEY2);
  2169. } else {
  2170. log.error("表单记录:清除失败", result);
  2171. }
  2172. }
  2173. },
  2174. /**
  2175. * 检测两个url是否相同(不包括hash值)
  2176. * @param url1
  2177. * @param url2
  2178. */
  2179. checkUrlIsSame(url1, url2) {
  2180. let url1Obj = new URL(url1);
  2181. let url2Obj = new URL(url2);
  2182. return url1Obj.origin === url2Obj.origin && url1Obj.pathname === url2Obj.pathname;
  2183. },
  2184. /**
  2185. * 自动清理空间
  2186. * @param intervalDay 间隔天数
  2187. */
  2188. autoClearRememberReplayContent(intervalDay) {
  2189. const KEY2 = "gf-last-time-autoClearRememberReplayContent";
  2190. let lastClearTime = _GM_getValue(KEY2);
  2191. let intervalTime = intervalDay * 24 * 60 * 60 * 1e3;
  2192. if (lastClearTime) {
  2193. if (Date.now() - lastClearTime > intervalTime) {
  2194. _GM_setValue(KEY2, Date.now());
  2195. } else {
  2196. return;
  2197. }
  2198. }
  2199. _GM_setValue(KEY2, Date.now());
  2200. },
  2201. /**
  2202. * 获取所有的记住的回复内容
  2203. */
  2204. async getAllRememberReplyContent() {
  2205. let result = await this.$data.db.get(
  2206. this.$key.DB_KEY
  2207. );
  2208. return result.data ?? [];
  2209. },
  2210. /**
  2211. * 清空所有的记住的回复内容
  2212. */
  2213. async clearAllRememberReplyContent() {
  2214. let result = await this.$data.db.delete(this.$key.DB_KEY);
  2215. return result.success;
  2216. }
  2217. };
  2218. const PopsPanelUISetting = {
  2219. /**
  2220. * 面板-脚本列表|库
  2221. * @param type
  2222. * @param event
  2223. * @param rightHeaderElement
  2224. * @param rightContainerElement
  2225. * @returns
  2226. */
  2227. async UIScriptList(type, rightContainerElement) {
  2228. var _a2, _b, _c;
  2229. if (!GreasyforkMenu.isLogin) {
  2230. Qmsg.error(i18next.t("请先登录账号!"));
  2231. return;
  2232. }
  2233. let userLinkElement = GreasyforkMenu.getUserLinkElement();
  2234. let userLink = userLinkElement.href;
  2235. let userId = (_c = (_b = (_a2 = userLink == null ? void 0 : userLink.split("/")) == null ? void 0 : _a2.pop()) == null ? void 0 : _b.match(/([0-9]+)/)) == null ? void 0 : _c[0];
  2236. let loading = __pops.loading({
  2237. mask: {
  2238. enable: true
  2239. },
  2240. parent: rightContainerElement,
  2241. content: {
  2242. text: i18next.t("获取信息中,请稍后...")
  2243. },
  2244. addIndexCSS: false
  2245. });
  2246. let userInfo = await GreasyforkApi.getUserInfo(userId);
  2247. loading.close();
  2248. if (!userInfo) {
  2249. return;
  2250. }
  2251. log.info(userInfo);
  2252. let scriptList = type === "script-list" ? userInfo["scriptList"] : userInfo["scriptLibraryList"];
  2253. Qmsg.success(
  2254. i18next.t("获取成功,共 {{count}} 个", {
  2255. count: scriptList.length
  2256. })
  2257. );
  2258. for (const scriptInfo of scriptList) {
  2259. let liElement = domUtils.createElement("li", {
  2260. className: "w-script-list-item",
  2261. innerHTML: (
  2262. /*html*/
  2263. `
  2264. <div class="w-script-info">
  2265. <div class="w-script-name">
  2266. <a href="${scriptInfo["url"]}" target="_blank">${scriptInfo["name"]}</a>
  2267. </div>
  2268. <div class="w-script-fan-score">
  2269. <p>${i18next.t("评分:")}${scriptInfo["fan_score"]}</p>
  2270. </div>
  2271. <div class="w-script-locale">
  2272. <p>${i18next.t("语言:")}${scriptInfo["locale"]}</p>
  2273. </div>
  2274. <div class="w-script-version">
  2275. <p>${i18next.t("版本:")}${scriptInfo["version"]}</p>
  2276. </div>
  2277. <div class="w-script-update-time">
  2278. <p>${i18next.t("更新:")}${utils.getDaysDifference(
  2279. new Date(scriptInfo["code_updated_at"]).getTime(),
  2280. void 0,
  2281. "auto"
  2282. )}前</p>
  2283. </div>
  2284. </div>
  2285. `
  2286. )
  2287. });
  2288. let scriptInfoElement = liElement.querySelector(
  2289. ".w-script-info"
  2290. );
  2291. let buttonElement = domUtils.createElement("div", {
  2292. className: "pops-panel-button",
  2293. innerHTML: (
  2294. /*html*/
  2295. `
  2296. <button type="primary" data-icon="" data-righticon="false">
  2297. <span>${i18next.t("同步代码")}</span>
  2298. </button>
  2299. `
  2300. )
  2301. });
  2302. if (scriptInfo["deleted"]) {
  2303. liElement.classList.add("w-script-deleted");
  2304. buttonElement.querySelector("button").setAttribute("disabled", "true");
  2305. }
  2306. domUtils.on(buttonElement, "click", void 0, async function() {
  2307. log.success("同步", scriptInfo);
  2308. let btn = buttonElement.querySelector("button");
  2309. let span = buttonElement.querySelector(
  2310. "button span"
  2311. );
  2312. let iconElement = domUtils.createElement(
  2313. "i",
  2314. {
  2315. className: "pops-bottom-icon",
  2316. innerHTML: __pops.config.iconSVG.loading
  2317. },
  2318. {
  2319. "is-loading": true
  2320. }
  2321. );
  2322. btn.setAttribute("disabled", "true");
  2323. btn.setAttribute("data-icon", "true");
  2324. span.innerText = i18next.t("同步中...");
  2325. domUtils.before(span, iconElement);
  2326. let scriptId = scriptInfo == null ? void 0 : scriptInfo["id"];
  2327. let codeSyncFormData = await GreasyforkApi.getSourceCodeSyncFormData(
  2328. scriptId.toString()
  2329. );
  2330. if (codeSyncFormData) {
  2331. const SCRIPT_SYNC_TYPE_ID_FORMDATA_KEY = "script[script_sync_type_id]";
  2332. if (codeSyncFormData.has(SCRIPT_SYNC_TYPE_ID_FORMDATA_KEY)) {
  2333. let syncTypeId = codeSyncFormData.get(
  2334. SCRIPT_SYNC_TYPE_ID_FORMDATA_KEY
  2335. );
  2336. let syncMode = "";
  2337. if (syncTypeId.toString() === "1") {
  2338. syncMode = i18next.t("手动");
  2339. } else if (syncTypeId.toString() === "2") {
  2340. syncMode = i18next.t("自动");
  2341. } else if (syncTypeId.toString() === "3") {
  2342. syncMode = "webhook";
  2343. }
  2344. let oldSyncTypeElement = liElement.querySelector(
  2345. ".w-script-sync-type"
  2346. );
  2347. if (oldSyncTypeElement) {
  2348. oldSyncTypeElement.querySelector("p").innerText = i18next.t(
  2349. "同步方式:{{syncMode}}",
  2350. { syncMode }
  2351. );
  2352. } else {
  2353. domUtils.append(
  2354. scriptInfoElement,
  2355. /*html*/
  2356. `
  2357. <div class="w-script-sync-type">
  2358. <p>${i18next.t("同步方式:{{syncMode}}", {
  2359. syncMode
  2360. })}
  2361. </p>
  2362. </div>`
  2363. );
  2364. }
  2365. let syncUpdateResponse = await GreasyforkApi.sourceCodeSync(
  2366. scriptInfo["id"].toString(),
  2367. codeSyncFormData
  2368. );
  2369. if (syncUpdateResponse) {
  2370. Qmsg.success(i18next.t("同步成功"));
  2371. } else {
  2372. Qmsg.error(i18next.t("同步失败"));
  2373. }
  2374. } else {
  2375. Qmsg.error(i18next.t("该脚本未设置同步信息"));
  2376. }
  2377. }
  2378. btn.removeAttribute("disabled");
  2379. btn.removeAttribute("data-icon");
  2380. span.innerText = i18next.t("同步代码");
  2381. iconElement.remove();
  2382. });
  2383. liElement.appendChild(buttonElement);
  2384. rightContainerElement.appendChild(liElement);
  2385. }
  2386. }
  2387. };
  2388. const GreasyforkScriptsCode = {
  2389. init() {
  2390. PopsPanel.execMenuOnce("code-repairCodeLineNumber", () => {
  2391. this.repairCodeLineNumber();
  2392. });
  2393. PopsPanel.execMenuOnce("code-use-monaco-editor", () => {
  2394. this.coverEditorWithMonaco();
  2395. });
  2396. },
  2397. /**
  2398. * 修复代码的行号显示不够问题
  2399. * 超过1w行不会高亮代码
  2400. */
  2401. repairCodeLineNumber() {
  2402. log.info("修复代码的行号显示不够问题");
  2403. PopsPanel.execMenuOnce("beautifyGreasyforkBeautify", () => {
  2404. addStyle(
  2405. /*css*/
  2406. `
  2407. .code-container pre code .marker{
  2408. padding-left: 6px;
  2409. }
  2410. `
  2411. );
  2412. });
  2413. utils.waitNode(
  2414. "#script-content div.code-container pre.prettyprint ol"
  2415. ).then(($prettyPrintOL) => {
  2416. if ($prettyPrintOL.childElementCount >= 1e3) {
  2417. log.success(
  2418. `当前代码行数${$prettyPrintOL.childElementCount}行,超过1000行,优化行号显示问题`
  2419. );
  2420. addStyle(
  2421. /*css*/
  2422. `
  2423. pre.prettyprint{
  2424. padding-left: 26px;
  2425. }
  2426. `
  2427. );
  2428. }
  2429. });
  2430. },
  2431. /**
  2432. * 使用monacoEditor替换编辑器
  2433. */
  2434. coverEditorWithMonaco() {
  2435. log.info(`使用monacoEditor替换编辑器`);
  2436. addStyle(
  2437. /*css*/
  2438. `
  2439. @font-face {
  2440. font-family: 'codicon';
  2441. src: url('https://fastly.jsdelivr.net/npm/monaco-editor@0.52.0/min/vs/base/browser/ui/codicons/codicon/codicon.ttf') format('truetype');
  2442. }
  2443. `
  2444. );
  2445. addStyle(
  2446. /*css*/
  2447. `
  2448. .monaco-editor{
  2449. height: calc(100vh - 54px);
  2450. }
  2451. #script-info{
  2452. padding-bottom: 0px !important;
  2453. }
  2454. `
  2455. );
  2456. CommonUtil.addBlockCSS("#script-content .code-container > pre");
  2457. let $monacoScript = domUtils.createElement("script", {
  2458. type: "module",
  2459. innerHTML: `
  2460. import * as monaco from "https://fastly.jsdelivr.net/npm/monaco-editor@0.52.0/+esm";
  2461. window.monaco = monaco;
  2462. window.dispatchEvent(new CustomEvent("monaco-editor-ready"));
  2463. `
  2464. });
  2465. domUtils.append(document.head || document.documentElement, $monacoScript);
  2466. domUtils.append(document.head || document.documentElement, $monacoScript);
  2467. domUtils.on(
  2468. window,
  2469. "monaco-editor-ready",
  2470. async () => {
  2471. let monaco2 = _unsafeWindow.monaco;
  2472. let response = await httpx.get(window.location.href, { fetch: true });
  2473. if (!response.status) {
  2474. return;
  2475. }
  2476. let doc = domUtils.parseHTML(response.data.responseText, true, true);
  2477. let $originCodeContainer = doc.querySelector(
  2478. "#script-content .code-container > pre"
  2479. );
  2480. if (!$originCodeContainer) {
  2481. return;
  2482. }
  2483. let codeText = domUtils.text($originCodeContainer);
  2484. domUtils.ready(async () => {
  2485. let $codeContainer = await utils.waitNode(
  2486. "#script-content .code-container > pre",
  2487. 1e4
  2488. );
  2489. if (!$codeContainer) {
  2490. return;
  2491. }
  2492. let $monacoEditor = domUtils.createElement("div", {
  2493. className: "monaco-editor"
  2494. });
  2495. domUtils.after($codeContainer, $monacoEditor);
  2496. monaco2.editor.create($monacoEditor, {
  2497. value: codeText,
  2498. minimap: { enabled: true },
  2499. // 小地图
  2500. automaticLayout: true,
  2501. // 自动布局,
  2502. codeLens: true,
  2503. colorDecorators: true,
  2504. contextmenu: true,
  2505. readOnly: true,
  2506. //是否只读
  2507. formatOnPaste: true,
  2508. overviewRulerBorder: true,
  2509. // 滚动条的边框
  2510. scrollBeyondLastLine: true,
  2511. theme: "vs-dark",
  2512. // 主题
  2513. fontSize: window.innerWidth > 600 ? 14 : 12,
  2514. // 字体
  2515. wordWrap: "off",
  2516. // 换行
  2517. language: "javascript",
  2518. // 语言
  2519. folding: true,
  2520. // 是否启用代码折叠
  2521. foldingStrategy: "indentation"
  2522. // 代码可分小段折叠
  2523. });
  2524. });
  2525. },
  2526. { once: true }
  2527. );
  2528. }
  2529. };
  2530. const beautifyVersionsPageCSS = 'ul.history_versions,\r\nul.history_versions li {\r\n width: 100%;\r\n}\r\nul.history_versions li {\r\n display: flex;\r\n flex-direction: column;\r\n margin: 25px 0px;\r\n}\r\n.diff-controls input[type="radio"]:nth-child(2) {\r\n margin-left: 5px;\r\n}\r\n.flex-align-item-center {\r\n display: flex;\r\n align-items: center;\r\n}\r\n.script-tag {\r\n margin-bottom: 8px;\r\n}\r\n.script-tag-version a {\r\n color: #656d76;\r\n fill: #656d76;\r\n text-decoration: none;\r\n width: fit-content;\r\n width: -moz-fit-content;\r\n}\r\n.script-tag-version a:hover svg {\r\n color: #00a3f5;\r\n fill: #00a3f5;\r\n}\r\n.script-tag-version a > span {\r\n margin-left: 0.25rem;\r\n}\r\n.script-note-box-body {\r\n border-radius: 0.375rem;\r\n border-style: solid;\r\n border-width: max(1px, 0.0625rem);\r\n border-color: #d0d7de;\r\n color: #1f2328;\r\n padding: 16px;\r\n overflow-wrap: anywhere;\r\n}\r\n.script-note-box-body p {\r\n margin-bottom: unset;\r\n}\r\n\r\n/* 安装按钮 */\r\n.install-link {\r\n border-radius: 0.25rem 0.25rem 0.25rem 0.25rem !important;\r\n}\r\n';
  2531. const GreasyforkVersions = {
  2532. init() {
  2533. PopsPanel.execMenuOnce("beautifyHistoryVersionPage", () => {
  2534. return this.beautifyHistoryVersionPage();
  2535. });
  2536. PopsPanel.execMenuOnce("scripts-versions-addExtraTagButton", () => {
  2537. this.addExtraTagButton();
  2538. });
  2539. PopsPanel.execMenuOnce("scripts-versions-addCompareCodeButton", () => {
  2540. this.sourceDiffMonacoEditor();
  2541. });
  2542. },
  2543. /**
  2544. * 美化 历史版本 页面
  2545. */
  2546. beautifyHistoryVersionPage() {
  2547. log.info("美化 历史版本 页面");
  2548. let result = [];
  2549. result.push(addStyle(beautifyVersionsPageCSS));
  2550. result.push(
  2551. CommonUtil.addBlockCSS(
  2552. ".version-number",
  2553. ".version-date",
  2554. ".version-changelog"
  2555. )
  2556. );
  2557. domUtils.ready(function() {
  2558. let $historyVersion = document.querySelector(
  2559. "ul.history_versions"
  2560. );
  2561. if (!$historyVersion) {
  2562. Qmsg.error(i18next.t("未找到history_versions元素列表"));
  2563. return;
  2564. }
  2565. Array.from($historyVersion.children).forEach((liElement) => {
  2566. var _a2, _b;
  2567. let versionUrl = liElement.querySelector(".version-number a").href;
  2568. let versionNumber = liElement.querySelector(
  2569. ".version-number a"
  2570. ).innerText;
  2571. let versionDate = (_a2 = liElement.querySelector(".version-date")) == null ? void 0 : _a2.getAttribute("datetime");
  2572. let updateNote = ((_b = liElement.querySelector(".version-changelog")) == null ? void 0 : _b.innerHTML) || "";
  2573. let versionDateElement = domUtils.createElement("span", {
  2574. className: "script-version-date",
  2575. innerHTML: utils.formatTime(
  2576. versionDate,
  2577. i18next.t("yyyy年MM月dd日 HH:mm:ss")
  2578. )
  2579. });
  2580. let tagElement = domUtils.createElement("div", {
  2581. className: "script-tag",
  2582. innerHTML: (
  2583. /*html*/
  2584. `
  2585. <div class="script-tag-version">
  2586. <a href="${versionUrl}" class="flex-align-item-center">
  2587. <svg aria-label="Tag" role="img" height="16" viewBox="0 0 16 16" version="1.1" width="16">
  2588. <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path>
  2589. </svg>
  2590. <span>${versionNumber}</span>
  2591. </a>
  2592. </div>`
  2593. )
  2594. });
  2595. let boxBodyElement = domUtils.createElement("div", {
  2596. className: "script-note-box-body",
  2597. innerHTML: updateNote
  2598. });
  2599. liElement.appendChild(versionDateElement);
  2600. liElement.appendChild(tagElement);
  2601. liElement.appendChild(boxBodyElement);
  2602. });
  2603. });
  2604. return result;
  2605. },
  2606. /**
  2607. * 添加额外的标签按钮
  2608. */
  2609. addExtraTagButton() {
  2610. log.info("添加额外的标签按钮");
  2611. domUtils.ready(() => {
  2612. document.querySelectorAll(".script-tag-version").forEach(($tagVersion) => {
  2613. var _a2, _b;
  2614. let $anchor = $tagVersion.querySelector("a");
  2615. if (!$anchor) {
  2616. return;
  2617. }
  2618. let urlObj = new URL($anchor.href);
  2619. let scriptId = (_a2 = urlObj.pathname.match(/\/scripts\/([\d]+)/)) == null ? void 0 : _a2[1];
  2620. let scriptVersion = urlObj.searchParams.get("version");
  2621. let scriptName = (_b = urlObj.pathname.match(/\/scripts\/[\d]+-(.+)/)) == null ? void 0 : _b[1];
  2622. let installUrl = GreasyforkUrlUtils.getInstallUrl(
  2623. scriptId,
  2624. scriptVersion,
  2625. scriptName
  2626. );
  2627. let codeUrl = GreasyforkUrlUtils.getCodeUrl(scriptId, scriptVersion);
  2628. let $buttonTag = domUtils.createElement("div", {
  2629. className: "scripts-tag-install",
  2630. innerHTML: (
  2631. /*html*/
  2632. `
  2633. <a class="script-btn-install install-link" data-install-format="js" target="_blank" href="${installUrl}">${i18next.t(
  2634. "安装此脚本"
  2635. )}</a>
  2636. <a class="script-btn-see-code" target="_blank" href="${codeUrl}">${i18next.t(
  2637. "查看代码"
  2638. )}</a>
  2639. `
  2640. )
  2641. });
  2642. domUtils.after($tagVersion, $buttonTag);
  2643. });
  2644. });
  2645. },
  2646. /**
  2647. * 源码对比(monacoEditor)
  2648. */
  2649. sourceDiffMonacoEditor() {
  2650. log.info(`源码对比(monacoEditor)`);
  2651. addStyle(
  2652. /*css*/
  2653. `
  2654. @font-face {
  2655. font-family: 'codicon';
  2656. src: url('https://fastly.jsdelivr.net/npm/monaco-editor@0.52.0/min/vs/base/browser/ui/codicons/codicon/codicon.ttf') format('truetype');
  2657. }
  2658. `
  2659. );
  2660. let $monacoScript = domUtils.createElement("script", {
  2661. type: "module",
  2662. innerHTML: `
  2663. import * as monaco from "https://fastly.jsdelivr.net/npm/monaco-editor@0.52.0/+esm";
  2664. window.monaco = monaco;
  2665. window.dispatchEvent(new CustomEvent("monaco-editor-ready"));
  2666. `
  2667. });
  2668. domUtils.append(document.head || document.documentElement, $monacoScript);
  2669. domUtils.on(
  2670. window,
  2671. "monaco-editor-ready",
  2672. () => {
  2673. let monaco2 = unsafeWindow.monaco;
  2674. domUtils.ready(() => {
  2675. $$(
  2676. `#script-content form[action*="/diff"] input[type="submit"]`
  2677. ).forEach(($submit) => {
  2678. let $compareButton = domUtils.createElement(
  2679. "input",
  2680. {
  2681. type: "button",
  2682. value: i18next.t("对比选中版本差异(monacoEditor)")
  2683. },
  2684. {
  2685. style: "margin-left: 10px;"
  2686. }
  2687. );
  2688. domUtils.after($submit, $compareButton);
  2689. domUtils.on($compareButton, "click", async (event) => {
  2690. utils.preventEvent(event);
  2691. let $form = $submit.closest("form");
  2692. let formData = new FormData($form);
  2693. let compareLeftVersion = formData.get("v1");
  2694. let compareRighttVersion = formData.get("v2");
  2695. if (compareLeftVersion === compareRighttVersion) {
  2696. Qmsg.warning(i18next.t("版本号相同,不需要比较源码"));
  2697. return;
  2698. }
  2699. let loading = Qmsg.loading(i18next.t("正在获取对比文本中..."));
  2700. let scriptId = GreasyforkUrlUtils.getScriptId();
  2701. let response = await httpx.get(
  2702. `https://greasyfork.org/zh-CN/scripts/${scriptId}.json`,
  2703. {
  2704. fetch: true,
  2705. responseType: "json"
  2706. }
  2707. );
  2708. if (!response.status) {
  2709. loading.close();
  2710. return;
  2711. }
  2712. let respJSON = utils.toJSON(response.data.responseText);
  2713. let code_url = respJSON["code_url"];
  2714. let compareLeftUrl = code_url.replace(
  2715. `/${scriptId}`,
  2716. `/${scriptId}/${compareLeftVersion}`
  2717. );
  2718. let compareRightUrl = code_url.replace(
  2719. `/${scriptId}`,
  2720. `/${scriptId}/${compareRighttVersion}`
  2721. );
  2722. let compareLeftText = "";
  2723. let compareRightText = "";
  2724. let compareLeftResponse = await httpx.get(compareLeftUrl);
  2725. if (!compareLeftResponse.status) {
  2726. loading.close();
  2727. return;
  2728. }
  2729. compareLeftText = compareLeftResponse.data.responseText;
  2730. let compareRightResponse = await httpx.get(compareRightUrl);
  2731. if (!compareRightResponse.status) {
  2732. loading.close();
  2733. return;
  2734. }
  2735. compareRightText = compareRightResponse.data.responseText;
  2736. loading.close();
  2737. let { recovery } = CommonUtil.lockScroll();
  2738. let $alert = __pops.alert({
  2739. title: {
  2740. text: i18next.t("代码对比"),
  2741. html: false,
  2742. position: "center"
  2743. },
  2744. content: {
  2745. html: true,
  2746. text: (
  2747. /*html*/
  2748. `
  2749. <div class="monaco-editor-diff-container">
  2750. <div class="monaco-editor-diff"></div>
  2751. </div>
  2752. `
  2753. )
  2754. },
  2755. mask: {
  2756. enable: true,
  2757. clickEvent: {
  2758. toClose: false,
  2759. toHide: false
  2760. }
  2761. },
  2762. btn: {
  2763. ok: {
  2764. enable: false
  2765. },
  2766. close: {
  2767. callback(details, event2) {
  2768. details.close();
  2769. recovery();
  2770. }
  2771. }
  2772. },
  2773. zIndex() {
  2774. let maxZIndex = utils.getMaxZIndex();
  2775. let popsMaxZIndex = __pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
  2776. return utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
  2777. },
  2778. useShadowRoot: false,
  2779. width: "90vw",
  2780. height: "90vh",
  2781. drag: true,
  2782. style: (
  2783. /*css*/
  2784. `
  2785. .monaco-editor-diff-container{
  2786. width: 100%;
  2787. height: 100%;
  2788. }
  2789. .monaco-editor-diff{
  2790. width: 100%;
  2791. height: 100%;
  2792. }
  2793. .pops[type-value="alert"] .pops-alert-title{
  2794. --container-title-height: 40px;
  2795. }
  2796. `
  2797. )
  2798. });
  2799. $alert.$shadowRoot.querySelector(
  2800. ".monaco-editor-diff-container"
  2801. );
  2802. let $monacoEditor = $alert.$shadowRoot.querySelector(
  2803. ".monaco-editor-diff"
  2804. );
  2805. let monacoEditor = monaco2.editor.createDiffEditor($monacoEditor, {
  2806. hideUnchangedRegions: {
  2807. enabled: true
  2808. },
  2809. minimap: { enabled: true },
  2810. // 小地图
  2811. automaticLayout: true,
  2812. // 自动布局,
  2813. codeLens: true,
  2814. colorDecorators: true,
  2815. contextmenu: false,
  2816. readOnly: true,
  2817. //是否只读
  2818. formatOnPaste: true,
  2819. overviewRulerBorder: true,
  2820. // 滚动条的边框
  2821. scrollBeyondLastLine: true,
  2822. theme: "vs-dark",
  2823. // 主题
  2824. fontSize: window.innerWidth > 600 ? 14 : 12,
  2825. // 字体
  2826. wordWrap: "off",
  2827. // 换行
  2828. language: "javascript"
  2829. // 语言
  2830. });
  2831. const originModel = monaco2.editor.createModel(
  2832. compareLeftText,
  2833. "javascript"
  2834. );
  2835. const modifyModel = monaco2.editor.createModel(
  2836. compareRightText,
  2837. "javascript"
  2838. );
  2839. monacoEditor.setModel({
  2840. original: originModel,
  2841. modified: modifyModel
  2842. });
  2843. });
  2844. });
  2845. });
  2846. },
  2847. { once: true }
  2848. );
  2849. }
  2850. };
  2851. const PanelUISize = {
  2852. /**
  2853. * 一般设置界面的尺寸
  2854. */
  2855. setting: {
  2856. get width() {
  2857. return window.innerWidth < 550 ? "88vw" : "550px";
  2858. },
  2859. get height() {
  2860. return window.innerHeight < 450 ? "70vh" : "450px";
  2861. }
  2862. },
  2863. /**
  2864. * 功能丰富,aside铺满了的设置界面,要稍微大一点
  2865. */
  2866. settingBig: {
  2867. get width() {
  2868. return window.innerWidth < 800 ? "92vw" : "800px";
  2869. },
  2870. get height() {
  2871. return window.innerHeight < 600 ? "80vh" : "600px";
  2872. }
  2873. },
  2874. /**
  2875. * 信息界面,一般用于提示信息之类
  2876. */
  2877. info: {
  2878. get width() {
  2879. return window.innerWidth < 350 ? "350px" : "350px";
  2880. },
  2881. get height() {
  2882. return window.innerHeight < 250 ? "250px" : "250px";
  2883. }
  2884. }
  2885. };
  2886. let userCollection = [];
  2887. const GreasyforkScriptsCollectEvent = async function(scriptId) {
  2888. log.info("当前脚本id:" + scriptId);
  2889. if (!GreasyforkMenu.isLogin) {
  2890. log.error("请先登录账号");
  2891. Qmsg.error(i18next.t("请先登录账号"));
  2892. return;
  2893. }
  2894. let userId = GreasyforkUrlUtils.getUserId(
  2895. GreasyforkMenu.getUserLinkElement().href
  2896. );
  2897. if (userId == null) {
  2898. log.error("获取用户id失败");
  2899. Qmsg.error(i18next.t("获取用户id失败"));
  2900. return;
  2901. }
  2902. if (!userCollection.length) {
  2903. let loading = Qmsg.loading(i18next.t("获取收藏夹中..."));
  2904. userCollection = await GreasyforkApi.getUserCollection(userId) || [];
  2905. loading.close();
  2906. if (!userCollection.length) {
  2907. return;
  2908. }
  2909. }
  2910. let alertHTML = "";
  2911. const checkFavoriteFormInfo = (form, scriptId2) => {
  2912. let flag = false;
  2913. scriptId2 = scriptId2.toString().trim();
  2914. for (const [key, value] of form.entries()) {
  2915. if (key === "scripts-included[]" && value.toString().trim() === scriptId2) {
  2916. flag = true;
  2917. break;
  2918. }
  2919. }
  2920. return flag;
  2921. };
  2922. userCollection.forEach((userCollectInfo) => {
  2923. alertHTML += /*html*/
  2924. `
  2925. <li class="user-collect-item" data-id="${userCollectInfo.id}" data-name="${userCollectInfo.name}">
  2926. <div class="user-collect-name">${userCollectInfo.name}</div>
  2927. <div class="user-collect-btn-container">
  2928. <div class="pops-panel-button collect-add-script-id">
  2929. <button type="primary" data-icon="" data-righticon="">
  2930. <span>${i18next.t("添加")}</span>
  2931. </button>
  2932. </div>
  2933. <div class="pops-panel-button collect-delete-script-id">
  2934. <button type="danger" data-icon="" data-righticon="">
  2935. <span>${i18next.t("刪除")}</span>
  2936. </button>
  2937. </div>
  2938. </div>
  2939. </li>
  2940. `;
  2941. });
  2942. let collectionDialog = __pops.alert({
  2943. title: {
  2944. text: i18next.t("收藏集"),
  2945. position: "center"
  2946. },
  2947. content: {
  2948. html: true,
  2949. text: (
  2950. /*html*/
  2951. `<ul>${alertHTML}</ul>`
  2952. )
  2953. },
  2954. mask: {
  2955. enable: true,
  2956. clickEvent: {
  2957. toClose: true
  2958. }
  2959. },
  2960. btn: {
  2961. ok: {
  2962. enable: false
  2963. }
  2964. },
  2965. width: __pops.isPhone() ? "92vw" : "500px",
  2966. height: "auto",
  2967. drag: true,
  2968. only: true,
  2969. style: (
  2970. /*css*/
  2971. `
  2972. .pops{
  2973. --content-max-height: 400px;
  2974. max-height: var(--content-max-height);
  2975. }
  2976. .pops[type-value=alert] .pops-alert-content {
  2977. max-height: calc(var(--content-max-height) - var(--container-title-height) - var(--container-bottom-btn-height));
  2978. }
  2979. .user-collect-item{
  2980. -webkit-user-select: none;
  2981. user-select: none;
  2982. padding: 5px 10px;
  2983. display: flex;
  2984. align-items: center;
  2985. justify-content: space-between;
  2986. border-bottom: 1px dotted #c9c9c9;
  2987. }
  2988. .user-collect-name{
  2989.  
  2990. }
  2991. .user-collect-item:hover{
  2992. }
  2993. .user-collect-btn-container{
  2994. margin-left: 10px;
  2995. display: flex;
  2996. }
  2997. `
  2998. )
  2999. });
  3000. domUtils.on(
  3001. collectionDialog.$shadowRoot,
  3002. "click",
  3003. ".collect-add-script-id",
  3004. async function(event) {
  3005. let $userCollectItem = event.target.closest(
  3006. ".user-collect-item"
  3007. );
  3008. let setsId = $userCollectItem.dataset.id;
  3009. $userCollectItem.dataset.name;
  3010. let loading = Qmsg.loading(i18next.t("添加中..."));
  3011. try {
  3012. let formData = await GreasyforkApi.getUserCollectionInfo(
  3013. userId,
  3014. setsId
  3015. );
  3016. if (!formData) {
  3017. return;
  3018. }
  3019. if (checkFavoriteFormInfo(formData, scriptId)) {
  3020. Qmsg.warning(i18next.t("该脚本已经在该收藏集中"));
  3021. return;
  3022. }
  3023. let editForm = utils.cloneFormData(formData);
  3024. let saveEditForm = utils.cloneFormData(formData);
  3025. editForm.set("add-script", scriptId.toString());
  3026. editForm.set("script-action", "i");
  3027. saveEditForm.append("scripts-included[]", scriptId.toString());
  3028. saveEditForm.set("save", "1");
  3029. let addFormDataSearchParams = new URLSearchParams(editForm);
  3030. let saveFormDataSearchParams = new URLSearchParams(saveEditForm);
  3031. let addData = Array.from(addFormDataSearchParams).map(
  3032. // @ts-ignore
  3033. ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
  3034. ).join("&");
  3035. let saveData = Array.from(saveFormDataSearchParams).map(
  3036. // @ts-ignore
  3037. ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
  3038. ).join("&");
  3039. log.info("添加的数据", addData);
  3040. log.info("保存的数据", saveData);
  3041. let changeResultDoc = await GreasyforkApi.updateUserSetsInfo(
  3042. userId,
  3043. setsId,
  3044. addData
  3045. );
  3046. if (!changeResultDoc) {
  3047. return;
  3048. }
  3049. let $changeScriptSet = changeResultDoc.querySelector(".change-script-set");
  3050. if (!$changeScriptSet) {
  3051. Qmsg.error(
  3052. i18next.t("添加失败,{{selector}}元素不存在", {
  3053. selector: ".change-script-set"
  3054. })
  3055. );
  3056. return;
  3057. }
  3058. let $section = $changeScriptSet.querySelector("section");
  3059. if (!$section) {
  3060. Qmsg.error(
  3061. i18next.t("添加失败,{{selector}}元素不存在", {
  3062. selector: "section"
  3063. })
  3064. );
  3065. return;
  3066. }
  3067. let $alertElement = $section.querySelector(".alert");
  3068. if ($alertElement) {
  3069. __pops.alert({
  3070. title: {
  3071. text: i18next.t("添加失败"),
  3072. position: "center"
  3073. },
  3074. content: {
  3075. text: $alertElement.innerHTML,
  3076. html: true
  3077. },
  3078. mask: {
  3079. enable: true,
  3080. clickEvent: {
  3081. toClose: true
  3082. }
  3083. },
  3084. style: (
  3085. /*css*/
  3086. `
  3087. .pops-alert-content{
  3088. font-style: italic;
  3089. background-color: #ffc;
  3090. border: none;
  3091. border-left: 6px solid #FFEB3B;
  3092. padding: .5em;
  3093. }
  3094. `
  3095. ),
  3096. drag: true,
  3097. dragLimit: true,
  3098. width: PanelUISize.info.width,
  3099. height: PanelUISize.info.height
  3100. });
  3101. return;
  3102. }
  3103. let changeScriptForm = new FormData($changeScriptSet);
  3104. let changeFlag = checkFavoriteFormInfo(changeScriptForm, scriptId);
  3105. if (!changeFlag) {
  3106. log.error("添加失败,提交的添加请求中不包含该脚本id");
  3107. Qmsg.error(i18next.t("添加失败,表单数据中不包含该脚本"));
  3108. return;
  3109. }
  3110. await GreasyforkApi.updateUserSetsInfo(userId, setsId, saveData);
  3111. Qmsg.success(i18next.t("添加成功"));
  3112. } catch (error) {
  3113. console.error(error);
  3114. } finally {
  3115. loading.close();
  3116. }
  3117. }
  3118. );
  3119. domUtils.on(
  3120. collectionDialog.$shadowRoot,
  3121. "click",
  3122. ".collect-delete-script-id",
  3123. async function(event) {
  3124. let $collectItem = event.target.closest(
  3125. ".user-collect-item"
  3126. );
  3127. let setsId = $collectItem.dataset.id;
  3128. $collectItem.dataset.name;
  3129. let loading = Qmsg.loading(i18next.t("删除中..."));
  3130. try {
  3131. let formData = await GreasyforkApi.getUserCollectionInfo(
  3132. userId,
  3133. setsId
  3134. );
  3135. if (!formData) {
  3136. return;
  3137. }
  3138. if (!checkFavoriteFormInfo(formData, scriptId)) {
  3139. Qmsg.info(
  3140. i18next.t("已删除:{{scriptId}}", {
  3141. scriptId
  3142. })
  3143. );
  3144. return;
  3145. }
  3146. let editForm = utils.cloneFormData(formData, (key, value) => {
  3147. return key === "scripts-included[]" && typeof value === "string" && value.toString().trim() === scriptId.toString().trim();
  3148. });
  3149. let saveEditForm = utils.cloneFormData(editForm);
  3150. editForm.set("remove-scripts-included[]", scriptId.toString());
  3151. editForm.set("remove-selected-scripts", "i");
  3152. editForm.delete("script-action");
  3153. saveEditForm.set("save", "1");
  3154. let deleteFormDataSearchParams = new URLSearchParams(editForm);
  3155. let saveFormDataSearchParams = new URLSearchParams(saveEditForm);
  3156. let removeData = Array.from(deleteFormDataSearchParams).map(
  3157. // @ts-ignore
  3158. ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
  3159. ).join("&");
  3160. let saveData = Array.from(saveFormDataSearchParams).map(
  3161. // @ts-ignore
  3162. ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
  3163. ).join("&");
  3164. log.info("删除的数据", removeData);
  3165. log.info("保存的数据", saveData);
  3166. let changeResultDoc = await GreasyforkApi.updateUserSetsInfo(
  3167. userId,
  3168. setsId,
  3169. removeData
  3170. );
  3171. if (!changeResultDoc) {
  3172. return;
  3173. }
  3174. let $changeScriptSet = changeResultDoc.querySelector(".change-script-set");
  3175. if (!$changeScriptSet) {
  3176. Qmsg.error(
  3177. i18next.t("删除失败,{{selector}}元素不存在", {
  3178. selector: ".change-script-set"
  3179. })
  3180. );
  3181. return;
  3182. }
  3183. let changeScriptForm = new FormData($changeScriptSet);
  3184. let changeFlag = checkFavoriteFormInfo(changeScriptForm, scriptId);
  3185. if (changeFlag) {
  3186. log.error("删除失败,提交的删除请求中包含该脚本id");
  3187. Qmsg.error(i18next.t("删除失败,表单数据中仍包含该脚本"));
  3188. return;
  3189. }
  3190. await GreasyforkApi.updateUserSetsInfo(userId, setsId, saveData);
  3191. Qmsg.success(i18next.t("删除成功"));
  3192. } catch (error) {
  3193. console.error(error);
  3194. } finally {
  3195. loading.close();
  3196. }
  3197. }
  3198. );
  3199. };
  3200. const GreasyforkScripts = {
  3201. init() {
  3202. if (GreasyforkRouter.isCode()) {
  3203. GreasyforkScriptsCode.init();
  3204. } else if (GreasyforkRouter.isVersion()) {
  3205. GreasyforkVersions.init();
  3206. }
  3207. if (GreasyforkRouter.isCodeStrict()) {
  3208. PopsPanel.execMenuOnce("fullScreenOptimization", () => {
  3209. this.fullScreenOptimization();
  3210. });
  3211. PopsPanel.execMenuOnce("addCopyCodeButton", () => {
  3212. this.addCopyCodeButton();
  3213. });
  3214. }
  3215. PopsPanel.execMenuOnce("addCollectionButton", () => {
  3216. this.addCollectionButton();
  3217. });
  3218. PopsPanel.execMenuOnce("addFindReferenceButton", () => {
  3219. this.setFindCodeSearchBtn();
  3220. });
  3221. domUtils.ready(() => {
  3222. PopsPanel.execMenuOnce("scriptHomepageAddedTodaySUpdate", () => {
  3223. this.scriptHomepageAddedTodaySUpdate();
  3224. });
  3225. });
  3226. },
  3227. /**
  3228. * 添加【收藏】按钮
  3229. */
  3230. addCollectionButton() {
  3231. log.info("添加收藏按钮");
  3232. utils.waitNode("ul#script-links li.current span").then(() => {
  3233. let $collectBtn = domUtils.createElement("li", {
  3234. innerHTML: `
  3235. <a href="javascript:;">
  3236. <span>${i18next.t("收藏")}</span>
  3237. </a>`
  3238. });
  3239. domUtils.append(
  3240. document.querySelector("ul#script-links"),
  3241. $collectBtn
  3242. );
  3243. domUtils.on($collectBtn, "click", () => {
  3244. let scriptIdMatch = window.location.pathname.match(/scripts\/([\d]+)/i);
  3245. if (!scriptIdMatch) {
  3246. log.error(scriptIdMatch, window.location.pathname);
  3247. Qmsg.error(i18next.t("获取脚本id失败"));
  3248. return;
  3249. }
  3250. let scriptId = scriptIdMatch[scriptIdMatch.length - 1];
  3251. GreasyforkScriptsCollectEvent(scriptId);
  3252. });
  3253. });
  3254. },
  3255. /**
  3256. * F11全屏,F键代码全屏
  3257. */
  3258. fullScreenOptimization() {
  3259. log.info("F11全屏,F键代码全屏");
  3260. addStyle(
  3261. /*css*/
  3262. `
  3263. .code-container:has(.code-wide-screen){
  3264. height: auto !important;
  3265. }
  3266. .code-wide-screen{
  3267. position: absolute !important;
  3268. top: 0 !important;
  3269. left: 0 !important;
  3270. right: 0 !important;
  3271. bottom: 0 !important;
  3272. margin: 0 !important;
  3273. padding: 0 !important;
  3274. width: 100% !important;
  3275. height: 100% !important;
  3276. min-width: 100% !important;
  3277. min-height: 100% !important;
  3278. max-width: 100% !important;
  3279. max-height: 100% !important;
  3280. z-index: 1000000 !important;
  3281. }
  3282. `
  3283. );
  3284. let isFullScreen = false;
  3285. domUtils.keydown(
  3286. _unsafeWindow,
  3287. function(event) {
  3288. if (event.key.toLowerCase() === "f") {
  3289. let $code = $(".monaco-editor") || $("#script-content div.code-container code");
  3290. if (event.altKey && event.shiftKey) {
  3291. log.info(`宽屏`);
  3292. utils.preventEvent(event);
  3293. if ($code.classList.contains("code-wide-screen")) {
  3294. $code.classList.remove("code-wide-screen");
  3295. } else {
  3296. $code.classList.add("code-wide-screen");
  3297. }
  3298. } else if (!event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {
  3299. log.info(`全屏`);
  3300. utils.preventEvent(event);
  3301. if (isFullScreen) {
  3302. utils.exitFullScreen($code);
  3303. isFullScreen = false;
  3304. } else {
  3305. utils.enterFullScreen($code);
  3306. isFullScreen = true;
  3307. }
  3308. }
  3309. }
  3310. },
  3311. {
  3312. capture: true
  3313. }
  3314. );
  3315. },
  3316. /**
  3317. * 设置代码搜索按钮(对于库)
  3318. */
  3319. setFindCodeSearchBtn() {
  3320. log.info("设置代码搜索按钮(对于库)");
  3321. utils.waitNode("ul#script-links li.current span").then(() => {
  3322. let searchBtn = domUtils.createElement("li", {
  3323. innerHTML: `
  3324. <a href="javascript:;">
  3325. <span>${i18next.t("寻找引用")}</span>
  3326. </a>`
  3327. });
  3328. domUtils.append(
  3329. document.querySelector(
  3330. "ul#script-links"
  3331. ),
  3332. searchBtn
  3333. );
  3334. domUtils.on(searchBtn, "click", async function() {
  3335. let scriptIdMatch = window.location.pathname.match(/scripts\/([\d]+)/i);
  3336. if (!scriptIdMatch) {
  3337. log.error(scriptIdMatch, window.location.pathname);
  3338. Qmsg.error(i18next.t("获取脚本id失败"));
  3339. return;
  3340. }
  3341. let scriptId = scriptIdMatch[scriptIdMatch.length - 1];
  3342. window.location.href = GreasyforkUrlUtils.getCodeSearchUrl(
  3343. `greasyfork.org/scripts/${scriptId}`
  3344. );
  3345. });
  3346. });
  3347. },
  3348. /**
  3349. * 脚本首页新增【今日检查】
  3350. */
  3351. async scriptHomepageAddedTodaySUpdate() {
  3352. if (!document.querySelector("#install-area")) {
  3353. return;
  3354. }
  3355. log.info("脚本首页新增【今日检查】");
  3356. let scriptStatsJSON = await GreasyforkApi.getScriptStats(
  3357. GreasyforkUrlUtils.getScriptId()
  3358. );
  3359. if (!scriptStatsJSON) {
  3360. return;
  3361. }
  3362. log.info("统计信息", scriptStatsJSON);
  3363. let todayStatsJSON = scriptStatsJSON[utils.formatTime(void 0, "yyyy-MM-dd")];
  3364. if (!todayStatsJSON) {
  3365. log.error("今日份的统计信息不存在");
  3366. return;
  3367. }
  3368. let update_checks = todayStatsJSON["update_checks"];
  3369. log.info("今日统计信息", todayStatsJSON);
  3370. domUtils.after(
  3371. "dd.script-show-daily-installs",
  3372. domUtils.createElement("dt", {
  3373. className: "script-show-daily-update_checks",
  3374. innerHTML: `<span>${i18next.t("今日检查")}</span>`
  3375. })
  3376. );
  3377. domUtils.after(
  3378. "dt.script-show-daily-update_checks",
  3379. domUtils.createElement("dd", {
  3380. className: "script-show-daily-update_checks",
  3381. innerHTML: "<span>" + update_checks + "</span>"
  3382. })
  3383. );
  3384. },
  3385. /**
  3386. * 添加复制代码按钮
  3387. */
  3388. addCopyCodeButton() {
  3389. log.info("添加复制代码按钮");
  3390. utils.waitNode("div#script-content div.code-container").then(($codeContainer) => {
  3391. let copyButton = domUtils.createElement(
  3392. "button",
  3393. {
  3394. textContent: i18next.t("复制代码")
  3395. },
  3396. {
  3397. style: "margin-bottom: 1em;"
  3398. }
  3399. );
  3400. domUtils.on(copyButton, "click", async function() {
  3401. let loading = Qmsg.loading(i18next.t("加载文件中..."));
  3402. let getResp = await httpx.get(
  3403. `https://greasyfork.org/zh-CN/scripts/${GreasyforkUrlUtils.getScriptId()}.json`,
  3404. {
  3405. fetch: true,
  3406. responseType: "json"
  3407. }
  3408. );
  3409. if (!getResp.status) {
  3410. loading.close();
  3411. return;
  3412. }
  3413. let respJSON = utils.toJSON(getResp.data.responseText);
  3414. let code_url = respJSON["code_url"];
  3415. log.success("代码地址:", code_url);
  3416. let scriptJS = await httpx.get(code_url);
  3417. if (!scriptJS.status) {
  3418. loading.close();
  3419. return;
  3420. }
  3421. loading.close();
  3422. utils.setClip(scriptJS.data.responseText);
  3423. Qmsg.success(i18next.t("复制成功"));
  3424. });
  3425. domUtils.before($codeContainer, copyButton);
  3426. });
  3427. }
  3428. };
  3429. const beautifyCenterContentCSS = '.sidebarred-main-content {\r\n max-width: unset;\r\n flex: unset;\r\n}\r\nol.script-list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n border: none;\r\n gap: 20px;\r\n background: transparent;\r\n box-shadow: none;\r\n}\r\nol.script-list .script-description {\r\n overflow-wrap: anywhere;\r\n}\r\nol.script-list li {\r\n border: 1px solid rgb(221, 221, 221);\r\n border-radius: 5px;\r\n flex: 1 1 45%;\r\n box-shadow: rgb(221, 221, 221) 0px 0px 5px 2px;\r\n}\r\n/* 收藏按钮 */\r\n.script-collect-btn {\r\n color: #ffffff;\r\n border-color: #409eff;\r\n background-color: #409eff;\r\n}\r\n/* 评分按钮 */\r\n.script-list-rating-score[data-position="right"] {\r\n display: inline-block;\r\n min-width: 1em;\r\n text-align: center;\r\n padding: 0 0.25em;\r\n border: 1px solid #dddddd;\r\n border-radius: 10px;\r\n width: fit-content;\r\n}\r\n/* 安装按钮 */\r\n.install-link {\r\n border-radius: 0.25rem 0.25rem 0.25rem 0.25rem !important;\r\n}\r\n.install-link:has(+ .install-help-link) {\r\n border-radius: 0.25rem 0 0 0.25rem !important;\r\n}\r\n/* 加载圆圈动画 */\r\n.install-link.lum-lightbox-loader {\r\n position: relative;\r\n min-width: 4rem;\r\n min-height: 1rem;\r\n}\r\n.install-link.lum-lightbox-loader::before {\r\n margin-left: 1rem;\r\n}\r\n.install-link.lum-lightbox-loader::after {\r\n margin-right: 1rem;\r\n}\r\n.install-link.lum-lightbox-loader::before,\r\n.install-link.lum-lightbox-loader::after {\r\n width: 1em;\r\n height: 1em;\r\n margin-top: -0.5em;\r\n border-radius: 1em !important;\r\n background: hsla(0, 0%, 100%, 0.5);\r\n}\r\n';
  3430. const GreasyforkCheckVersion = {
  3431. /** 获取 TamperMonkey 暴露在window下的函数 */
  3432. getTampermonkey: () => {
  3433. var _a2;
  3434. return (_a2 = _unsafeWindow.external) == null ? void 0 : _a2.Tampermonkey;
  3435. },
  3436. /** 获取 Violentmonkey 暴露在window下的函数 */
  3437. getViolentmonkey: () => {
  3438. var _a2;
  3439. return (_a2 = _unsafeWindow.external) == null ? void 0 : _a2.Violentmonkey;
  3440. },
  3441. /** 获取 ScriptCat 暴露在window下的函数 */
  3442. getScriptCat: () => {
  3443. var _a2;
  3444. return (_a2 = _unsafeWindow.external) == null ? void 0 : _a2.Scriptcat;
  3445. },
  3446. /**
  3447. * 获取脚本容器启用状态
  3448. */
  3449. getScriptContainerStatus() {
  3450. var _a2, _b, _c;
  3451. let containerStatus = {
  3452. Tampermonkey: false,
  3453. Violentmonkey: false,
  3454. ScriptCat: false
  3455. };
  3456. if ((_a2 = _unsafeWindow.external) == null ? void 0 : _a2.Tampermonkey) {
  3457. containerStatus.Tampermonkey = true;
  3458. }
  3459. if ((_b = _unsafeWindow.external) == null ? void 0 : _b.Violentmonkey) {
  3460. containerStatus.Violentmonkey = true;
  3461. }
  3462. if ((_c = _unsafeWindow.external) == null ? void 0 : _c.Scriptcat) {
  3463. containerStatus.ScriptCat = true;
  3464. }
  3465. return containerStatus;
  3466. },
  3467. /**
  3468. * 获取已注册的脚本容器名
  3469. */
  3470. getRegisterScriptContainerNameList() {
  3471. let allScriptContainerStatus = this.getScriptContainerStatus();
  3472. let isRegisterScriptContainer = allScriptContainerStatus;
  3473. let scriptContainerNameList = [];
  3474. Object.keys(isRegisterScriptContainer).forEach((containerName) => {
  3475. let containerEnable = Reflect.get(
  3476. isRegisterScriptContainer,
  3477. containerName
  3478. );
  3479. if (containerEnable) {
  3480. scriptContainerNameList.push(containerName);
  3481. }
  3482. });
  3483. return scriptContainerNameList;
  3484. },
  3485. /**
  3486. * 获取脚本安装的版本号
  3487. * @param name 脚本名
  3488. * @param namespace 脚本命名空间
  3489. */
  3490. getInstalledVersion(name, namespace) {
  3491. return new Promise((resolve, reject) => {
  3492. const tm = this.getTampermonkey();
  3493. if (tm) {
  3494. tm.isInstalled(name, namespace, function(data) {
  3495. if (data.installed) {
  3496. resolve(data.version);
  3497. } else {
  3498. resolve(null);
  3499. }
  3500. });
  3501. return;
  3502. }
  3503. const vm = this.getViolentmonkey();
  3504. if (vm) {
  3505. vm.isInstalled(name, namespace).then(resolve);
  3506. return;
  3507. }
  3508. const scriptCat = this.getScriptCat();
  3509. if (scriptCat) {
  3510. scriptCat.isInstalled(name, namespace, function(data) {
  3511. if (data.installed) {
  3512. resolve(data.version);
  3513. } else {
  3514. resolve(null);
  3515. }
  3516. });
  3517. return;
  3518. }
  3519. reject(new TypeError("获取脚本容器暴露的external信息失败"));
  3520. });
  3521. },
  3522. /**
  3523. * https://developer.mozilla.org/en/docs/Toolkit_version_format
  3524. *
  3525. * 比较版本号
  3526. * @param a 版本号
  3527. * @param b 版本号
  3528. * @returns
  3529. * + -1 该版本号低
  3530. * + 0 该版本号和比较的版本号相同
  3531. * + 1 该版本号高
  3532. */
  3533. compareVersions(a, b) {
  3534. if (a === b) {
  3535. return 0;
  3536. }
  3537. const aParts = a.split(".");
  3538. const bParts = b.split(".");
  3539. for (let i = 0; i < aParts.length; i++) {
  3540. const result = this.compareVersionPart(aParts[i], bParts[i]);
  3541. if (result !== 0) {
  3542. return result;
  3543. }
  3544. }
  3545. return 0;
  3546. },
  3547. compareVersionPart(partA, partB) {
  3548. const partAParts = this.parseVersionPart(partA);
  3549. const partBParts = this.parseVersionPart(partB);
  3550. for (let i = 0; i < partAParts.length; i++) {
  3551. if (partAParts[i].length > 0 && partBParts[i].length === 0) {
  3552. return -1;
  3553. }
  3554. if (partAParts[i].length === 0 && partBParts[i].length > 0) {
  3555. return 1;
  3556. }
  3557. if (partAParts[i] > partBParts[i]) {
  3558. return 1;
  3559. }
  3560. if (partAParts[i] < partBParts[i]) {
  3561. return -1;
  3562. }
  3563. }
  3564. return 0;
  3565. },
  3566. // It goes number, string, number, string. If it doesn't exist, then
  3567. // 0 for numbers, empty string for strings.
  3568. parseVersionPart(part) {
  3569. if (!part) {
  3570. return [0, "", 0, ""];
  3571. }
  3572. const partParts = /([0-9]*)([^0-9]*)([0-9]*)([^0-9]*)/.exec(part);
  3573. return [
  3574. partParts[1] ? parseInt(partParts[1]) : 0,
  3575. partParts[2],
  3576. partParts[3] ? parseInt(partParts[3]) : 0,
  3577. partParts[4]
  3578. ];
  3579. },
  3580. /**
  3581. *
  3582. * @param installButton 安装按钮
  3583. * 必须属性
  3584. * + data-update-label 按钮升级的文字
  3585. * + data-downgrade-label 按钮降级的文字
  3586. * + data-reinstall-label 按钮重装的文字
  3587. * @param installedVersion 安装版本
  3588. * @param version 版本号
  3589. * @returns
  3590. */
  3591. handleInstallResult(installButton, installedVersion, version) {
  3592. if (installedVersion == null) {
  3593. return;
  3594. }
  3595. installButton.removeAttribute("data-ping-url");
  3596. switch (this.compareVersions(installedVersion, version)) {
  3597. // Upgrade
  3598. case -1:
  3599. installButton.textContent = installButton.getAttribute("data-update-label");
  3600. break;
  3601. // Downgrade
  3602. case 1:
  3603. installButton.textContent = installButton.getAttribute(
  3604. "data-downgrade-label"
  3605. );
  3606. break;
  3607. // Equal
  3608. case 0:
  3609. installButton.textContent = installButton.getAttribute(
  3610. "data-reinstall-label"
  3611. );
  3612. break;
  3613. }
  3614. },
  3615. /**
  3616. * 检测js脚本的更新
  3617. * @param installButton 安装按钮
  3618. * 必须属性
  3619. * + data-script-name 脚本名
  3620. * + data-script-namespace 脚本命名空间
  3621. * + data-script-version 脚本当前版本号
  3622. * @param retry 重试
  3623. */
  3624. async checkForUpdatesJS(installButton, retry) {
  3625. const name = installButton.getAttribute("data-script-name");
  3626. const namespace = installButton.getAttribute("data-script-namespace");
  3627. const version = installButton.getAttribute("data-script-version");
  3628. try {
  3629. let installedVersion = await this.getInstalledVersion(name, namespace);
  3630. if (installedVersion == null) {
  3631. return false;
  3632. }
  3633. this.handleInstallResult(installButton, installedVersion, version);
  3634. return true;
  3635. } catch (error) {
  3636. if (retry) {
  3637. await utils.sleep(1e3);
  3638. try {
  3639. return await this.checkForUpdatesJS(installButton, false);
  3640. } catch (error2) {
  3641. }
  3642. }
  3643. return false;
  3644. }
  3645. },
  3646. /**
  3647. * 检测css脚本的更新
  3648. * @param installButton 安装按钮
  3649. * 必须属性
  3650. * + data-script-name 脚本名
  3651. * + data-script-namespace 脚本命名空间
  3652. */
  3653. checkForUpdatesCSS(installButton) {
  3654. const name = installButton.getAttribute("data-script-name");
  3655. const namespace = installButton.getAttribute("data-script-namespace");
  3656. postMessage(
  3657. { type: "style-version-query", name, namespace, url: location.href },
  3658. location.origin
  3659. );
  3660. }
  3661. };
  3662. const parseScriptListInfo = ($scriptList) => {
  3663. let dataset = $scriptList.dataset;
  3664. const info = {
  3665. scriptId: parseInt(dataset.scriptId),
  3666. scriptName: dataset.scriptName,
  3667. scriptAuthors: [],
  3668. scriptDailyInstalls: parseInt(dataset.scriptDailyInstalls),
  3669. scriptTotalInstalls: parseInt(dataset.scriptTotalInstalls),
  3670. scriptRatingScore: parseFloat(dataset.scriptRatingScore),
  3671. scriptCreatedDate: new Date(dataset.scriptCreatedDate),
  3672. scriptUpdatedDate: new Date(dataset.scriptUpdatedDate),
  3673. scriptType: dataset.scriptType,
  3674. scriptVersion: dataset.scriptVersion,
  3675. sensitive: dataset.sensitive === "true",
  3676. scriptLanguage: dataset.scriptLanguage,
  3677. cssAvailableAsJs: dataset.cssAvailableAsJs === "true",
  3678. codeUrl: dataset.codeUrl,
  3679. scriptDescription: dataset.scriptDescription,
  3680. scriptAuthorId: parseInt(dataset.scriptAuthorId),
  3681. scriptAuthorName: dataset.scriptAuthorName
  3682. };
  3683. let scriptAuthorsObj = utils.toJSON(dataset.scriptAuthors);
  3684. Object.keys(scriptAuthorsObj).forEach((authorId) => {
  3685. let authorName = scriptAuthorsObj[authorId];
  3686. info.scriptAuthors.push({
  3687. authorId: parseInt(authorId),
  3688. authorName
  3689. });
  3690. });
  3691. if ((info.scriptAuthorName == null || isNaN(info.scriptAuthorId)) && info.scriptAuthors.length) {
  3692. info.scriptAuthorName = info.scriptAuthors[0].authorName;
  3693. info.scriptAuthorId = info.scriptAuthors[0].authorId;
  3694. }
  3695. if (info.scriptDescription == null) {
  3696. let $description = $scriptList.querySelector(".script-description") || $scriptList.querySelector(".description");
  3697. if ($description) {
  3698. info.scriptDescription = $description.innerText || $description.textContent;
  3699. }
  3700. }
  3701. return info;
  3702. };
  3703. const GreasyforkScriptsList = {
  3704. init() {
  3705. PopsPanel.execMenuOnce("gf-scripts-filter-enable", () => {
  3706. GreasyforkScriptsFilter.init();
  3707. });
  3708. PopsPanel.execMenuOnce("beautifyCenterContent", () => {
  3709. return this.beautifyCenterContent();
  3710. });
  3711. },
  3712. /**
  3713. * 美化脚本列表
  3714. */
  3715. beautifyCenterContent() {
  3716. log.info("美化脚本列表-双列");
  3717. let result = [];
  3718. result.push(addStyle(beautifyCenterContentCSS));
  3719. const lodingClassName = "lum-lightbox-loader";
  3720. const noInstallBtnText = i18next.t("安装此脚本");
  3721. DOMUtils.ready(() => {
  3722. let allScriptContainerStatus = GreasyforkCheckVersion.getScriptContainerStatus();
  3723. let hasScriptContainer = Object.values(allScriptContainerStatus).find(
  3724. (item) => item
  3725. );
  3726. let isRegisterScriptContainerNameList = GreasyforkCheckVersion.getRegisterScriptContainerNameList();
  3727. let isForceUseNameSpace = PopsPanel.getValue(
  3728. "beautifyCenterContent-queryNameSpace"
  3729. );
  3730. if (!hasScriptContainer) {
  3731. log.error("脚本容器未暴露external信息", window.external);
  3732. } else {
  3733. log.info(
  3734. "当前暴露的external信息:" + isRegisterScriptContainerNameList.map((it) => `【${it}】`).join("、")
  3735. );
  3736. }
  3737. let lockFn = new utils.LockFunction(() => {
  3738. let allScriptsList = GreasyforkScriptsFilter.getElementList();
  3739. allScriptsList.forEach(($scriptList) => {
  3740. if ($scriptList.querySelector(".script-list-operation")) {
  3741. return;
  3742. }
  3743. let scriptInfo = parseScriptListInfo($scriptList);
  3744. let $inlineStats = $scriptList.querySelector(
  3745. ".inline-script-stats"
  3746. );
  3747. if (!$inlineStats) {
  3748. return;
  3749. }
  3750. let code_url = scriptInfo.codeUrl;
  3751. let $ratingScoreLeft = DOMUtils.createElement("dt", {
  3752. className: "script-list-rating-score",
  3753. innerHTML: `<span>${i18next.t("评分")}</span>`
  3754. });
  3755. let $ratingScoreRight = DOMUtils.createElement(
  3756. "dd",
  3757. {
  3758. className: "script-list-rating-score",
  3759. innerHTML: `<span>${scriptInfo.scriptRatingScore}</span>`
  3760. },
  3761. {
  3762. "data-position": "right"
  3763. }
  3764. );
  3765. let $goodRatingCount = $scriptList.querySelector(
  3766. "dd.script-list-ratings .good-rating-count"
  3767. );
  3768. let $okRatingCount = $scriptList.querySelector(
  3769. "dd.script-list-ratings .ok-rating-count"
  3770. );
  3771. let $badRatingCount = $scriptList.querySelector(
  3772. "dd.script-list-ratings .bad-rating-count"
  3773. );
  3774. if ($goodRatingCount && $okRatingCount && $badRatingCount) {
  3775. let goodRatingCount = parseInt($goodRatingCount.innerText);
  3776. let okRatingCount = parseInt($okRatingCount.innerText);
  3777. let badRatingCount = parseInt($badRatingCount.innerText);
  3778. let totalRatingCount = goodRatingCount + okRatingCount + badRatingCount;
  3779. if (totalRatingCount >= 10) {
  3780. if (goodRatingCount / totalRatingCount >= 0.6) {
  3781. $ratingScoreRight.classList.add("good-rating-count");
  3782. } else {
  3783. $ratingScoreRight.classList.add("bad-rating-count");
  3784. }
  3785. } else if (totalRatingCount == 0) {
  3786. $ratingScoreRight.classList.add("good-rating-count");
  3787. } else {
  3788. if (goodRatingCount > okRatingCount + badRatingCount) {
  3789. $ratingScoreRight.classList.add("good-rating-count");
  3790. } else {
  3791. $ratingScoreRight.classList.add("bad-rating-count");
  3792. }
  3793. }
  3794. }
  3795. let $versionLeft = DOMUtils.createElement("dt", {
  3796. className: "script-list-version",
  3797. innerHTML: (
  3798. /*html*/
  3799. `<span>${i18next.t("版本")}</span>`
  3800. )
  3801. });
  3802. let $versionRight = DOMUtils.createElement(
  3803. "dd",
  3804. {
  3805. className: "script-list-version",
  3806. innerHTML: (
  3807. /*html*/
  3808. `<span>${scriptInfo.scriptVersion}</span>`
  3809. )
  3810. },
  3811. {
  3812. "data-position": "right"
  3813. }
  3814. );
  3815. let $operationLeft = DOMUtils.createElement("dt", {
  3816. className: "script-list-operation",
  3817. innerHTML: `<span>${i18next.t("操作")}</span>`
  3818. });
  3819. let $operationRight = DOMUtils.createElement(
  3820. "dd",
  3821. {
  3822. className: "script-list-operation",
  3823. innerHTML: (
  3824. /*html*/
  3825. `
  3826. <a
  3827. target="_blank"
  3828. class="install-link"
  3829. data-install-format="js"
  3830. data-script-name="${scriptInfo.scriptName}"
  3831. data-script-namespace=""
  3832. data-script-version="${scriptInfo.scriptVersion}"
  3833. data-update-label="${i18next.t("更新到 {{version}} 版本", {
  3834. version: scriptInfo.scriptVersion
  3835. })}"
  3836. data-downgrade-label="${i18next.t("降级到 {{version}} 版本", {
  3837. version: scriptInfo.scriptVersion
  3838. })}"
  3839. data-reinstall-label="${i18next.t("重新安装 {{version}} 版本", {
  3840. version: scriptInfo.scriptVersion
  3841. })}"
  3842. href="${code_url}"></a>
  3843. <button class="script-collect-btn">${i18next.t("收藏")}</button>
  3844. `
  3845. )
  3846. },
  3847. {
  3848. "data-position": "right",
  3849. style: "gap:10px;display: flex;flex-wrap: wrap;align-items: center;"
  3850. }
  3851. );
  3852. let $collect = $operationRight.querySelector(
  3853. ".script-collect-btn"
  3854. );
  3855. let $installLink = $operationRight.querySelector(".install-link");
  3856. $installLink["data-script-info"] = scriptInfo;
  3857. DOMUtils.addClass($installLink, lodingClassName);
  3858. if (scriptInfo.scriptType === "library") {
  3859. $installLink.remove();
  3860. }
  3861. DOMUtils.on($collect, "click", (event) => {
  3862. utils.preventEvent(event);
  3863. GreasyforkScriptsCollectEvent(scriptInfo.scriptId);
  3864. });
  3865. if (PopsPanel.getValue("gf-scripts-filter-enable")) {
  3866. let $filter = DOMUtils.createElement("button", {
  3867. className: "script-filter-btn",
  3868. innerHTML: i18next.t("过滤")
  3869. });
  3870. let attr_filter_key = "data-filter-key";
  3871. let attr_filter_value = "data-filter-value";
  3872. DOMUtils.on($filter, "click", (event) => {
  3873. utils.preventEvent(event);
  3874. let $dialog = __pops.alert({
  3875. title: {
  3876. text: i18next.t("选择需要过滤的选项"),
  3877. position: "center"
  3878. },
  3879. content: {
  3880. text: (
  3881. /*html*/
  3882. `
  3883. <button ${attr_filter_key}="scriptId" ${attr_filter_value}="^${scriptInfo.scriptId}$">${i18next.t("脚本id:{{text}}", {
  3884. text: scriptInfo.scriptId
  3885. })}</button>
  3886. <button ${attr_filter_key}="scriptName" ${attr_filter_value}="^${utils.parseStringToRegExpString(
  3887. scriptInfo.scriptName
  3888. )}$">${i18next.t("脚本名:{{text}}", {
  3889. text: scriptInfo.scriptName
  3890. })}</button>
  3891. `
  3892. ),
  3893. html: true
  3894. },
  3895. mask: {
  3896. enable: true,
  3897. clickEvent: {
  3898. toClose: true
  3899. }
  3900. },
  3901. width: "350px",
  3902. height: "300px",
  3903. drag: true,
  3904. dragLimit: true,
  3905. style: (
  3906. /*css*/
  3907. `
  3908. .pops-alert-content{
  3909. display: flex;
  3910. flex-direction: column;
  3911. gap: 20px;
  3912. }
  3913. .pops-alert-content button{
  3914. text-wrap: wrap;
  3915. padding: 8px;
  3916. height: auto;
  3917. text-align: left;
  3918. }
  3919. `
  3920. )
  3921. });
  3922. let $content = $dialog.$shadowRoot.querySelector(
  3923. ".pops-alert-content"
  3924. );
  3925. scriptInfo.scriptAuthors.forEach((scriptAuthorInfo) => {
  3926. let $authorIdButton = DOMUtils.createElement("button", {
  3927. innerHTML: i18next.t("作者id:{{text}}", {
  3928. text: scriptAuthorInfo.authorId
  3929. })
  3930. });
  3931. $authorIdButton.setAttribute(attr_filter_key, "scriptAuthorId");
  3932. $authorIdButton.setAttribute(
  3933. attr_filter_value,
  3934. "^" + scriptAuthorInfo.authorId + "$"
  3935. );
  3936. let $authorNameButton = DOMUtils.createElement("button", {
  3937. innerHTML: i18next.t("作者名:{{text}}", {
  3938. text: scriptAuthorInfo.authorName
  3939. })
  3940. });
  3941. $authorNameButton.setAttribute(
  3942. attr_filter_key,
  3943. "scriptAuthorName"
  3944. );
  3945. $authorNameButton.setAttribute(
  3946. attr_filter_value,
  3947. "^" + utils.parseStringToRegExpString(
  3948. scriptAuthorInfo.authorName
  3949. ) + "$"
  3950. );
  3951. $content.appendChild($authorIdButton);
  3952. $content.appendChild($authorNameButton);
  3953. });
  3954. DOMUtils.on(
  3955. $dialog.$shadowRoot,
  3956. "click",
  3957. `button[${attr_filter_key}]`,
  3958. (event2) => {
  3959. utils.preventEvent(event2);
  3960. let $click = event2.target;
  3961. let key = $click.getAttribute(
  3962. attr_filter_key
  3963. );
  3964. let value = $click.getAttribute(attr_filter_value);
  3965. GreasyforkScriptsFilter.addValue(key, value);
  3966. $dialog.close();
  3967. GreasyforkScriptsFilter.filter();
  3968. Qmsg.success(i18next.t("添加成功"));
  3969. }
  3970. );
  3971. });
  3972. $operationRight.appendChild($filter);
  3973. }
  3974. $inlineStats.appendChild($ratingScoreLeft);
  3975. $inlineStats.appendChild($ratingScoreRight);
  3976. $inlineStats.appendChild($versionLeft);
  3977. $inlineStats.appendChild($versionRight);
  3978. $inlineStats.appendChild($operationLeft);
  3979. $inlineStats.appendChild($operationRight);
  3980. });
  3981. }, 100);
  3982. let lockFn2 = new utils.LockFunction(async () => {
  3983. let $installLinkList = Array.from(
  3984. $$(
  3985. ".install-link[data-install-format=js]:not([gm-is-check-install-status])"
  3986. )
  3987. );
  3988. for (let index = 0; index < $installLinkList.length; index++) {
  3989. const $installLink = $installLinkList[index];
  3990. $installLink.setAttribute("gm-is-check-install-status", "");
  3991. let scriptInfo = Reflect.get(
  3992. $installLink,
  3993. "data-script-info"
  3994. );
  3995. if (hasScriptContainer) {
  3996. if (isForceUseNameSpace) {
  3997. let response = await httpx.get(
  3998. GreasyforkUrlUtils.getScriptInfoUrl(scriptInfo.scriptId),
  3999. {
  4000. fetch: true
  4001. }
  4002. );
  4003. if (response.status) {
  4004. let data = utils.toJSON(
  4005. response.data.responseText
  4006. );
  4007. $installLink.setAttribute(
  4008. "data-script-namespace",
  4009. data.namespace
  4010. );
  4011. }
  4012. }
  4013. GreasyforkCheckVersion.checkForUpdatesJS($installLink, true).then(
  4014. (checkResult) => {
  4015. DOMUtils.removeClass($installLink, lodingClassName);
  4016. if (!checkResult) {
  4017. DOMUtils.text($installLink, noInstallBtnText);
  4018. }
  4019. }
  4020. );
  4021. } else {
  4022. DOMUtils.removeClass($installLink, lodingClassName);
  4023. DOMUtils.text($installLink, noInstallBtnText);
  4024. }
  4025. }
  4026. });
  4027. utils.mutationObserver(document, {
  4028. config: {
  4029. subtree: true,
  4030. childList: true
  4031. },
  4032. immediate: true,
  4033. callback: () => {
  4034. lockFn.run();
  4035. lockFn2.run();
  4036. }
  4037. });
  4038. });
  4039. return result;
  4040. }
  4041. };
  4042. const GreasyforkElementUtils = {
  4043. /**
  4044. * 获取当前登录用户id
  4045. */
  4046. getCurrentLoginUserId() {
  4047. let $anchor = document.querySelector(
  4048. "#nav-user-info .user-profile-link a"
  4049. );
  4050. if (!$anchor) {
  4051. return;
  4052. }
  4053. let userId = GreasyforkUrlUtils.getUserId($anchor.href);
  4054. if (userId == null) {
  4055. return;
  4056. }
  4057. return userId;
  4058. },
  4059. /**
  4060. * 注册顶部导航菜单
  4061. */
  4062. registerTopNavMenu(config) {
  4063. domUtils.ready(() => {
  4064. let $nav = $("#site-nav nav");
  4065. let $subNav = $("#site-nav .with-submenu nav");
  4066. if (!$nav) {
  4067. log.error("元素#site-nav nav不存在");
  4068. return;
  4069. }
  4070. let $menuLink = domUtils.createElement("li", {
  4071. className: config.className,
  4072. innerHTML: (
  4073. /*html*/
  4074. `
  4075. <a href="javascript:;">${config.name}</a>
  4076. `
  4077. )
  4078. });
  4079. domUtils.on($menuLink, "click", (event) => {
  4080. utils.preventEvent(event);
  4081. config.clickEvent(event);
  4082. });
  4083. if ($subNav && $subNav.children.length) {
  4084. $subNav.appendChild($menuLink);
  4085. } else {
  4086. $nav.appendChild($menuLink);
  4087. }
  4088. let $mobileMenuLink = domUtils.createElement("li", {
  4089. className: config.className,
  4090. innerHTML: (
  4091. /*html*/
  4092. `
  4093. <a href="javascript:;">${config.name}</a>
  4094. `
  4095. )
  4096. });
  4097. domUtils.on($mobileMenuLink, "click", (event) => {
  4098. utils.preventEvent(event);
  4099. config.clickEvent(event);
  4100. });
  4101. let $mobileNav = $("#mobile-nav nav");
  4102. let $multiLinkNav = $("#mobile-nav nav .multi-link-nav");
  4103. if ($multiLinkNav) {
  4104. domUtils.before($multiLinkNav, $mobileMenuLink);
  4105. } else {
  4106. if ($mobileNav) {
  4107. domUtils.append($mobileNav, $mobileMenuLink);
  4108. } else {
  4109. log.error("元素#mobile-nav nav不存在");
  4110. }
  4111. }
  4112. });
  4113. }
  4114. };
  4115. const GreasyforkUtils = {
  4116. /**
  4117. * 判断是否是当前已登录账户的主页
  4118. */
  4119. isCurrentLoginUserHome() {
  4120. let currentLoginUserId = GreasyforkElementUtils.getCurrentLoginUserId();
  4121. if (currentLoginUserId != null && GreasyforkRouter.isUsers() && window.location.pathname.includes("/" + currentLoginUserId)) {
  4122. return true;
  4123. } else {
  4124. return false;
  4125. }
  4126. }
  4127. };
  4128. const GreasyforkScriptsFilter = {
  4129. /** 存储的键 */
  4130. key: "gf-shield-rule",
  4131. init() {
  4132. log.info("脚本过滤");
  4133. let lockFunction = new utils.LockFunction(() => {
  4134. this.filter();
  4135. }, 50);
  4136. domUtils.ready(() => {
  4137. if (GreasyforkUtils.isCurrentLoginUserHome()) {
  4138. log.warn("当前在已登录的账户主页下,禁用脚本过滤");
  4139. return;
  4140. }
  4141. utils.mutationObserver(document.body, {
  4142. config: {
  4143. subtree: true,
  4144. childList: true
  4145. },
  4146. immediate: true,
  4147. callback: () => {
  4148. lockFunction.run();
  4149. }
  4150. });
  4151. lockFunction.run();
  4152. });
  4153. },
  4154. /**
  4155. * 获取脚本列表元素
  4156. */
  4157. getElementList() {
  4158. let scriptList = [
  4159. ...Array.from($$("ol.script-list li[data-script-name]"))
  4160. ];
  4161. return scriptList;
  4162. },
  4163. /**
  4164. * 对页面进行过滤
  4165. */
  4166. filter() {
  4167. this.getElementList().forEach(($scriptList) => {
  4168. let data = parseScriptListInfo($scriptList);
  4169. let localValueSplit = this.getValue().split("\n");
  4170. for (let index = 0; index < localValueSplit.length; index++) {
  4171. let localRule = localValueSplit[index];
  4172. let ruleSplit = localRule.split("##");
  4173. let ruleName = ruleSplit[0];
  4174. let ruleValue = ruleSplit[1];
  4175. if (ruleName === "scriptRatingScore") {
  4176. let userRatingScoreValue = parseFloat(ruleValue.slice(1));
  4177. if (ruleValue.startsWith(">")) {
  4178. if (data.scriptRatingScore > userRatingScoreValue) {
  4179. log.info("触发脚本过滤规则", [localRule, data]);
  4180. $scriptList.remove();
  4181. break;
  4182. }
  4183. } else if (ruleValue.startsWith("<")) {
  4184. if (data.scriptRatingScore < userRatingScoreValue) {
  4185. log.info("触发脚本过滤规则", [localRule, data]);
  4186. $scriptList.remove();
  4187. break;
  4188. }
  4189. }
  4190. } else if (ruleName in data || ruleName === "scriptDescription") {
  4191. if (typeof ruleValue !== "string") {
  4192. continue;
  4193. }
  4194. let ruleValueRegExp = new RegExp(ruleValue, "ig");
  4195. let scriptInfoString = String(data[ruleName]);
  4196. if (scriptInfoString.match(ruleValueRegExp)) {
  4197. log.info("触发脚本过滤规则", localRule, data);
  4198. $scriptList.remove();
  4199. break;
  4200. }
  4201. }
  4202. }
  4203. });
  4204. },
  4205. setValue(value) {
  4206. PopsPanel.setValue(this.key, value);
  4207. },
  4208. addValue(key, value) {
  4209. let localValue = this.getValue();
  4210. if (localValue.trim() !== "") {
  4211. localValue += "\n";
  4212. }
  4213. if (utils.isNull(key)) {
  4214. return;
  4215. }
  4216. key = key.toString().trim();
  4217. let rule = key + "##" + value;
  4218. localValue += rule;
  4219. this.setValue(localValue);
  4220. },
  4221. getValue() {
  4222. return PopsPanel.getValue(this.key, "");
  4223. }
  4224. };
  4225. const SettingUICommon = {
  4226. id: "greasy-fork-panel-config-account",
  4227. title: i18next.t("通用"),
  4228. forms: [
  4229. {
  4230. text: "",
  4231. type: "forms",
  4232. forms: [
  4233. {
  4234. text: i18next.t("Toast配置"),
  4235. type: "deepMenu",
  4236. forms: [
  4237. {
  4238. text: "",
  4239. type: "forms",
  4240. forms: [
  4241. UISelect(
  4242. i18next.t("Toast位置"),
  4243. "qmsg-config-position",
  4244. "bottom",
  4245. [
  4246. {
  4247. value: "topleft",
  4248. text: i18next.t("左上角")
  4249. },
  4250. {
  4251. value: "top",
  4252. text: i18next.t("顶部")
  4253. },
  4254. {
  4255. value: "topright",
  4256. text: i18next.t("右上角")
  4257. },
  4258. {
  4259. value: "left",
  4260. text: i18next.t("左边")
  4261. },
  4262. {
  4263. value: "center",
  4264. text: i18next.t("中间")
  4265. },
  4266. {
  4267. value: "right",
  4268. text: i18next.t("右边")
  4269. },
  4270. {
  4271. value: "bottomleft",
  4272. text: i18next.t("左下角")
  4273. },
  4274. {
  4275. value: "bottom",
  4276. text: i18next.t("底部")
  4277. },
  4278. {
  4279. value: "bottomright",
  4280. text: i18next.t("右下角")
  4281. }
  4282. ],
  4283. (event, isSelectValue, isSelectText) => {
  4284. log.info("设置当前Qmsg弹出位置" + isSelectText);
  4285. },
  4286. i18next.t("Toast显示在页面九宫格的位置")
  4287. ),
  4288. UISelect(
  4289. i18next.t("最多显示的数量"),
  4290. "qmsg-config-maxnums",
  4291. 3,
  4292. [
  4293. {
  4294. value: 1,
  4295. text: "1"
  4296. },
  4297. {
  4298. value: 2,
  4299. text: "2"
  4300. },
  4301. {
  4302. value: 3,
  4303. text: "3"
  4304. },
  4305. {
  4306. value: 4,
  4307. text: "4"
  4308. },
  4309. {
  4310. value: 5,
  4311. text: "5"
  4312. }
  4313. ],
  4314. void 0,
  4315. i18next.t("限制Toast显示的数量")
  4316. ),
  4317. UISwitch(
  4318. i18next.t("逆序弹出"),
  4319. "qmsg-config-showreverse",
  4320. false,
  4321. void 0,
  4322. i18next.t("修改Toast弹出的顺序")
  4323. )
  4324. ]
  4325. }
  4326. ]
  4327. },
  4328. UISelect(
  4329. i18next.t("语言"),
  4330. "setting-language",
  4331. "zh-CN",
  4332. [
  4333. {
  4334. value: "zh-CN",
  4335. text: "中文"
  4336. },
  4337. {
  4338. value: "en-US",
  4339. text: "English"
  4340. }
  4341. ],
  4342. (event, isSelectValue, isSelectText) => {
  4343. log.info("改变语言:" + isSelectText);
  4344. i18next.changeLanguage(isSelectValue);
  4345. }
  4346. )
  4347. ]
  4348. },
  4349. {
  4350. text: "",
  4351. type: "forms",
  4352. forms: [
  4353. {
  4354. text: i18next.t("账号/密码"),
  4355. type: "deepMenu",
  4356. forms: [
  4357. {
  4358. text: "",
  4359. type: "forms",
  4360. forms: [
  4361. UIInput(
  4362. i18next.t("账号"),
  4363. "user",
  4364. "",
  4365. void 0,
  4366. void 0,
  4367. i18next.t("请输入账号")
  4368. ),
  4369. UIInput(
  4370. i18next.t("密码"),
  4371. "pwd",
  4372. "",
  4373. void 0,
  4374. void 0,
  4375. i18next.t("请输入密码"),
  4376. false,
  4377. true
  4378. )
  4379. ]
  4380. },
  4381. {
  4382. text: "",
  4383. type: "forms",
  4384. forms: [
  4385. UISwitch(
  4386. i18next.t("自动登录"),
  4387. "autoLogin",
  4388. true,
  4389. void 0,
  4390. i18next.t("自动登录当前保存的账号")
  4391. ),
  4392. UIButton(
  4393. i18next.t("清空账号/密码"),
  4394. void 0,
  4395. i18next.t("点击清空"),
  4396. void 0,
  4397. void 0,
  4398. false,
  4399. "default",
  4400. (event) => {
  4401. if (confirm(i18next.t("确定清空账号和密码?"))) {
  4402. PopsPanel.deleteValue("user");
  4403. PopsPanel.deleteValue("pwd");
  4404. Qmsg.success(i18next.t("已清空账号/密码"));
  4405. let $shadowRoot = event.target.getRootNode();
  4406. $shadowRoot.querySelector(
  4407. `li[data-key="user"] .pops-panel-input input`
  4408. ).value = "";
  4409. $shadowRoot.querySelector(
  4410. `li[data-key="pwd"] .pops-panel-input input`
  4411. ).value = "";
  4412. }
  4413. }
  4414. )
  4415. ]
  4416. }
  4417. ]
  4418. },
  4419. {
  4420. text: i18next.t("功能"),
  4421. type: "deepMenu",
  4422. forms: [
  4423. {
  4424. text: i18next.t("功能"),
  4425. type: "forms",
  4426. forms: [
  4427. UISelect(
  4428. i18next.t("固定当前语言"),
  4429. "language-selector-locale",
  4430. "",
  4431. function() {
  4432. let result = [
  4433. {
  4434. value: "",
  4435. text: i18next.t("无")
  4436. }
  4437. ];
  4438. document.querySelectorAll(
  4439. "select#language-selector-locale option"
  4440. ).forEach((element) => {
  4441. let value = element.getAttribute("value");
  4442. if (value === "help") {
  4443. return;
  4444. }
  4445. let text = (element.innerText || element.textContent).trim();
  4446. result.push({
  4447. value,
  4448. text
  4449. });
  4450. });
  4451. return result;
  4452. }()
  4453. ),
  4454. UISwitch(
  4455. i18next.t("修复图片宽度显示问题"),
  4456. "fixImageWidth",
  4457. true,
  4458. void 0,
  4459. i18next.t("修复图片在移动端宽度超出浏览器宽度问题")
  4460. ),
  4461. UISwitch(
  4462. i18next.t("优化图片浏览"),
  4463. "optimizeImageBrowsing",
  4464. true,
  4465. void 0,
  4466. i18next.t("使用Viewer浏览图片")
  4467. ),
  4468. UISwitch(
  4469. i18next.t("覆盖图床图片跳转"),
  4470. "overlayBedImageClickEvent",
  4471. true,
  4472. void 0,
  4473. i18next.t("配合上面的【优化图片浏览】更优雅浏览图片")
  4474. ),
  4475. UISwitch(
  4476. i18next.t("添加【操作面板】按钮"),
  4477. "scripts-addOperationPanelBtnWithNavigator",
  4478. true,
  4479. void 0,
  4480. i18next.t("在脚本列表页面时为顶部导航栏添加【操作面板】按钮")
  4481. ),
  4482. UISwitch(
  4483. i18next.t("给Markdown添加【复制】按钮"),
  4484. "addMarkdownCopyButton",
  4485. true,
  4486. void 0,
  4487. i18next.t(
  4488. "在Markdown内容右上角添加【复制】按钮,点击一键复制Markdown内容"
  4489. )
  4490. )
  4491. ]
  4492. },
  4493. {
  4494. text: i18next.t("检测页面加载"),
  4495. type: "forms",
  4496. forms: [
  4497. UISwitch(
  4498. i18next.t("启用"),
  4499. "checkPage",
  4500. true,
  4501. void 0,
  4502. i18next.t(
  4503. "检测Greasyfork页面是否正常加载,如加载失败则自动刷新页面"
  4504. )
  4505. ),
  4506. UISelect(
  4507. i18next.t("检测间隔"),
  4508. "greasyfork-check-page-timeout",
  4509. 5,
  4510. (() => {
  4511. let result = [];
  4512. for (let index = 0; index < 5; index++) {
  4513. result.push({
  4514. value: index + 1,
  4515. text: index + 1 + "s"
  4516. });
  4517. }
  4518. return result;
  4519. })(),
  4520. void 0,
  4521. i18next.t(
  4522. "设置检测上次刷新页面的间隔时间,当距离上次刷新页面的时间超过设置的值,将不再刷新页面"
  4523. )
  4524. )
  4525. ]
  4526. }
  4527. ]
  4528. },
  4529. {
  4530. type: "deepMenu",
  4531. text: i18next.t("表单"),
  4532. forms: [
  4533. {
  4534. type: "forms",
  4535. text: "",
  4536. forms: [
  4537. UISwitch(
  4538. i18next.t("记住回复内容"),
  4539. "rememberReplyContent",
  4540. true,
  4541. void 0,
  4542. i18next.t(
  4543. "监听表单内的textarea内容改变并存储到indexDB中,提交表单将清除保存的数据,误刷新页面时可动态恢复"
  4544. )
  4545. ),
  4546. UISelect(
  4547. i18next.t("自动清理空间"),
  4548. "gf-autoClearRememberReplayContent",
  4549. 7,
  4550. [
  4551. {
  4552. text: i18next.t("不清理"),
  4553. value: -1
  4554. },
  4555. {
  4556. text: i18next.t("{{value}} 天", {
  4557. value: 1
  4558. }),
  4559. value: 1
  4560. },
  4561. {
  4562. text: i18next.t("{{value}} 周", {
  4563. value: 1
  4564. }),
  4565. value: 7
  4566. },
  4567. {
  4568. text: i18next.t("{{value}} 个月", {
  4569. value: 1
  4570. }),
  4571. value: 30
  4572. },
  4573. {
  4574. text: i18next.t("{{value}} 个月", {
  4575. value: 2
  4576. }),
  4577. value: 60
  4578. },
  4579. {
  4580. text: i18next.t("{{value}} 个月", {
  4581. value: 3
  4582. }),
  4583. value: 90
  4584. },
  4585. {
  4586. text: i18next.t("半年"),
  4587. value: 180
  4588. }
  4589. ],
  4590. void 0,
  4591. i18next.t("根据设置的间隔时间自动清理保存的回复内容")
  4592. ),
  4593. UIButton(
  4594. i18next.t(`数据占用空间:{{size}}`, {
  4595. size: i18next.t("计算中")
  4596. }),
  4597. i18next.t("当前存储的数据所占用的空间大小"),
  4598. i18next.t("清空"),
  4599. void 0,
  4600. void 0,
  4601. void 0,
  4602. "default",
  4603. async () => {
  4604. let isClear = await GreasyforkRememberFormTextArea.clearAllRememberReplyContent();
  4605. if (isClear) {
  4606. Qmsg.success(i18next.t("清理成功"));
  4607. } else {
  4608. Qmsg.error(i18next.t("清理失败"));
  4609. }
  4610. },
  4611. async (formConfig, container) => {
  4612. let $leftTopText = container.ulElement.querySelector(
  4613. 'li[data-key="gf-autoClearRememberReplayContent"]+li .pops-panel-item-left-main-text'
  4614. );
  4615. let allText = await GreasyforkRememberFormTextArea.getAllRememberReplyContent();
  4616. let showSize = "";
  4617. if (allText.length) {
  4618. showSize = utils.getTextStorageSize(
  4619. JSON.stringify(allText)
  4620. );
  4621. } else {
  4622. showSize = utils.getTextStorageSize("");
  4623. }
  4624. $leftTopText.innerText = i18next.t(
  4625. `数据占用空间:{{size}}`,
  4626. {
  4627. size: showSize
  4628. }
  4629. );
  4630. }
  4631. )
  4632. ]
  4633. }
  4634. ]
  4635. },
  4636. {
  4637. text: i18next.t("美化"),
  4638. type: "deepMenu",
  4639. forms: [
  4640. {
  4641. text: i18next.t("全局"),
  4642. type: "forms",
  4643. forms: [
  4644. UISwitch(
  4645. i18next.t("美化页面元素"),
  4646. "beautifyPage",
  4647. true,
  4648. void 0,
  4649. i18next.t("如button、input、textarea")
  4650. ),
  4651. UISwitch(
  4652. i18next.t("美化上传图片按钮"),
  4653. "beautifyUploadImage",
  4654. true,
  4655. void 0,
  4656. i18next.t("放大上传区域")
  4657. ),
  4658. UISwitch(
  4659. i18next.t("美化顶部导航栏"),
  4660. "beautifyTopNavigationBar",
  4661. true,
  4662. void 0,
  4663. i18next.t("可能会跟Greasyfork Beautify脚本有冲突")
  4664. ),
  4665. UISwitch(
  4666. i18next.t("美化Greasyfork Beautify脚本"),
  4667. "beautifyGreasyforkBeautify",
  4668. true,
  4669. void 0,
  4670. i18next.t(
  4671. '需安装Greasyfork Beautify脚本,<a href="https://greasyfork.org/zh-CN/scripts/446849-greasyfork-beautify" target="_blank">🖐点我安装</a>'
  4672. )
  4673. )
  4674. ]
  4675. },
  4676. {
  4677. type: "forms",
  4678. text: i18next.t("脚本列表"),
  4679. forms: [
  4680. UISwitch(
  4681. i18next.t("美化脚本列表"),
  4682. "beautifyCenterContent",
  4683. true,
  4684. void 0,
  4685. i18next.t("双列显示且添加脚本卡片操作项(安装、收藏)")
  4686. ),
  4687. UISwitch(
  4688. "↑" + i18next.t("使用namespace查询脚本信息"),
  4689. "beautifyCenterContent-queryNameSpace",
  4690. true,
  4691. void 0,
  4692. i18next.t("开启后检测已安装的脚本信息更准确,但是速度会更慢")
  4693. )
  4694. ]
  4695. }
  4696. ]
  4697. },
  4698. {
  4699. type: "deepMenu",
  4700. text: i18next.t("自定义快捷键"),
  4701. forms: [
  4702. {
  4703. type: "forms",
  4704. text: "",
  4705. forms: [
  4706. UIButtonShortCut(
  4707. i18next.t("快捷键发表回复"),
  4708. i18next.t("在输入框内按下快捷发表回复,例如:{{key}}", {
  4709. key: "Ctrl + Enter"
  4710. }),
  4711. "gf-quickReply",
  4712. {
  4713. keyName: "Enter",
  4714. keyValue: "13",
  4715. ohterCodeList: ["ctrl"]
  4716. },
  4717. i18next.t("点击录入快捷键"),
  4718. void 0,
  4719. GreasyforkShortCut.shortCut
  4720. )
  4721. ]
  4722. }
  4723. ]
  4724. },
  4725. {
  4726. text: i18next.t("过滤"),
  4727. type: "deepMenu",
  4728. forms: [
  4729. {
  4730. text: `<a target="_blank" href="https://greasyfork.org/zh-CN/scripts/475722-greasyfork%E4%BC%98%E5%8C%96#:~:text=%E8%84%9A%E6%9C%AC%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99">${i18next.t(
  4731. "帮助文档"
  4732. )}</a>`,
  4733. type: "forms",
  4734. forms: [
  4735. UISwitch(
  4736. i18next.t("启用"),
  4737. "gf-scripts-filter-enable",
  4738. true,
  4739. void 0,
  4740. i18next.t("作用域:脚本、脚本搜索、用户主页")
  4741. ),
  4742. {
  4743. type: "own",
  4744. getLiElementCallBack(liElement) {
  4745. let textareaDiv = domUtils.createElement(
  4746. "div",
  4747. {
  4748. className: "pops-panel-textarea",
  4749. innerHTML: `
  4750. <textarea placeholder="${i18next.t(
  4751. "请输入规则,每行一个"
  4752. )}" style="height:200px;"></textarea>`
  4753. },
  4754. {
  4755. style: "width: 100%;"
  4756. }
  4757. );
  4758. let $textarea = textareaDiv.querySelector(
  4759. "textarea"
  4760. );
  4761. $textarea.value = GreasyforkScriptsFilter.getValue();
  4762. domUtils.on(
  4763. $textarea,
  4764. ["input", "propertychange"],
  4765. void 0,
  4766. utils.debounce(function(event) {
  4767. GreasyforkScriptsFilter.setValue($textarea.value);
  4768. }, 200)
  4769. );
  4770. liElement.appendChild(textareaDiv);
  4771. return liElement;
  4772. }
  4773. }
  4774. ]
  4775. }
  4776. ]
  4777. }
  4778. ]
  4779. },
  4780. {
  4781. type: "forms",
  4782. text: i18next.t("脚本管理"),
  4783. forms: [
  4784. {
  4785. type: "deepMenu",
  4786. text: i18next.t("代码同步"),
  4787. forms: [
  4788. {
  4789. text: i18next.t("代码同步"),
  4790. type: "forms",
  4791. forms: [
  4792. UIButton(
  4793. i18next.t("源代码同步【脚本列表】"),
  4794. void 0,
  4795. i18next.t("一键同步"),
  4796. void 0,
  4797. void 0,
  4798. false,
  4799. "primary",
  4800. (event) => {
  4801. if (!GreasyforkRouter.isUsers()) {
  4802. PopsPanel.setValue(
  4803. "goto_updateSettingsAndSynchronize_scriptList",
  4804. true
  4805. );
  4806. if (GreasyforkMenu.getUserLinkElement()) {
  4807. Qmsg.success(i18next.t("前往用户主页"));
  4808. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  4809. } else {
  4810. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  4811. }
  4812. return;
  4813. }
  4814. let scriptUrlList = [];
  4815. document.querySelectorAll(
  4816. "#user-script-list-section li a.script-link"
  4817. ).forEach((item) => {
  4818. scriptUrlList = scriptUrlList.concat(
  4819. GreasyforkUrlUtils.getAdminUrl(item.href)
  4820. );
  4821. });
  4822. GreasyforkMenu.updateScript(scriptUrlList);
  4823. }
  4824. ),
  4825. UIButton(
  4826. i18next.t("源代码同步【未上架的脚本】"),
  4827. void 0,
  4828. i18next.t("一键同步"),
  4829. void 0,
  4830. void 0,
  4831. false,
  4832. "primary",
  4833. (event) => {
  4834. if (!GreasyforkRouter.isUsers()) {
  4835. PopsPanel.setValue(
  4836. "goto_updateSettingsAndSynchronize_unlistedScriptList",
  4837. true
  4838. );
  4839. if (GreasyforkMenu.getUserLinkElement()) {
  4840. Qmsg.success(i18next.t("前往用户主页"));
  4841. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  4842. } else {
  4843. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  4844. }
  4845. return;
  4846. }
  4847. let scriptUrlList = [];
  4848. document.querySelectorAll(
  4849. "#user-unlisted-script-list li a.script-link"
  4850. ).forEach((item) => {
  4851. scriptUrlList = scriptUrlList.concat(
  4852. GreasyforkUrlUtils.getAdminUrl(item.href)
  4853. );
  4854. });
  4855. GreasyforkMenu.updateScript(scriptUrlList);
  4856. }
  4857. ),
  4858. UIButton(
  4859. i18next.t("源代码同步【库】"),
  4860. void 0,
  4861. i18next.t("一键同步"),
  4862. void 0,
  4863. void 0,
  4864. false,
  4865. "primary",
  4866. (event) => {
  4867. if (!GreasyforkRouter.isUsers()) {
  4868. PopsPanel.setValue(
  4869. "goto_updateSettingsAndSynchronize_libraryScriptList",
  4870. true
  4871. );
  4872. if (GreasyforkMenu.getUserLinkElement()) {
  4873. Qmsg.success(i18next.t("前往用户主页"));
  4874. window.location.href = GreasyforkMenu.getUserLinkElement().href;
  4875. } else {
  4876. Qmsg.error(i18next.t("获取当前已登录的用户主页失败"));
  4877. }
  4878. return;
  4879. }
  4880. let scriptUrlList = [];
  4881. document.querySelectorAll(
  4882. "#user-library-script-list li a.script-link"
  4883. ).forEach((item) => {
  4884. scriptUrlList = scriptUrlList.concat(
  4885. GreasyforkUrlUtils.getAdminUrl(item.href)
  4886. );
  4887. });
  4888. GreasyforkMenu.updateScript(scriptUrlList);
  4889. }
  4890. )
  4891. ]
  4892. }
  4893. ]
  4894. },
  4895. {
  4896. type: "deepMenu",
  4897. text: i18next.t("脚本列表"),
  4898. forms: [],
  4899. afterEnterDeepMenuCallBack(formConfig, container) {
  4900. PopsPanelUISetting.UIScriptList(
  4901. "script-list",
  4902. container.sectionBodyContainer
  4903. );
  4904. }
  4905. },
  4906. {
  4907. type: "deepMenu",
  4908. text: i18next.t("库"),
  4909. forms: [],
  4910. afterEnterDeepMenuCallBack(formConfig, container) {
  4911. PopsPanelUISetting.UIScriptList(
  4912. "script-library",
  4913. container.sectionBodyContainer
  4914. );
  4915. }
  4916. }
  4917. ]
  4918. }
  4919. ]
  4920. };
  4921. const SettingUIScripts = {
  4922. id: "greasy-fork-panel-config-scripts",
  4923. title: i18next.t("脚本"),
  4924. forms: [
  4925. {
  4926. text: "",
  4927. type: "forms",
  4928. forms: [
  4929. {
  4930. text: i18next.t("代码"),
  4931. type: "deepMenu",
  4932. forms: [
  4933. {
  4934. text: "",
  4935. type: "forms",
  4936. forms: [
  4937. UISwitch(
  4938. i18next.t("添加复制代码按钮"),
  4939. "addCopyCodeButton",
  4940. true,
  4941. void 0,
  4942. i18next.t("更优雅的复制")
  4943. ),
  4944. UISwitch(
  4945. i18next.t("快捷键"),
  4946. "fullScreenOptimization",
  4947. true,
  4948. void 0,
  4949. i18next.t("【F】键全屏、【Alt+Shift+F】键宽屏")
  4950. ),
  4951. UISwitch(
  4952. i18next.t("修复代码行号显示"),
  4953. "code-repairCodeLineNumber",
  4954. false,
  4955. void 0,
  4956. i18next.t("修复代码行数超过1k行号显示不全问题")
  4957. ),
  4958. UISwitch(
  4959. "monacoEditor",
  4960. "code-use-monaco-editor",
  4961. true,
  4962. void 0,
  4963. i18next.t("使用Monaco编辑器")
  4964. )
  4965. ]
  4966. }
  4967. ]
  4968. },
  4969. {
  4970. text: i18next.t("历史版本"),
  4971. type: "deepMenu",
  4972. forms: [
  4973. {
  4974. text: i18next.t("功能"),
  4975. type: "forms",
  4976. forms: [
  4977. UISwitch(
  4978. i18next.t("添加额外的标签按钮"),
  4979. "scripts-versions-addExtraTagButton",
  4980. true,
  4981. void 0,
  4982. i18next.t("在版本下面添加【安装】、【查看代码】按钮")
  4983. ),
  4984. UISwitch(
  4985. i18next.t("添加代码对比按钮"),
  4986. "scripts-versions-addCompareCodeButton",
  4987. true,
  4988. void 0,
  4989. i18next.t("monacoEditor")
  4990. )
  4991. ]
  4992. },
  4993. {
  4994. text: i18next.t("美化"),
  4995. type: "forms",
  4996. forms: [
  4997. UISwitch(
  4998. i18next.t("美化历史版本页面"),
  4999. "beautifyHistoryVersionPage",
  5000. true,
  5001. void 0,
  5002. i18next.t("更直观的查看版本迭代")
  5003. )
  5004. ]
  5005. }
  5006. ]
  5007. }
  5008. ]
  5009. },
  5010. {
  5011. text: "",
  5012. type: "forms",
  5013. forms: [
  5014. {
  5015. text: i18next.t("功能"),
  5016. type: "deepMenu",
  5017. forms: [
  5018. {
  5019. text: "",
  5020. type: "forms",
  5021. forms: [
  5022. UISwitch(
  5023. i18next.t("添加【寻找引用】按钮"),
  5024. "addFindReferenceButton",
  5025. true,
  5026. void 0,
  5027. i18next.t("在脚本栏添加按钮,一般用于搜索引用该库的相关脚本")
  5028. ),
  5029. UISwitch(
  5030. i18next.t("添加【收藏】按钮"),
  5031. "addCollectionButton",
  5032. true,
  5033. void 0,
  5034. i18next.t("在脚本栏添加按钮,一般用于快捷收藏该脚本/库")
  5035. ),
  5036. UISwitch(
  5037. i18next.t("添加【今日检查】信息块"),
  5038. "scriptHomepageAddedTodaySUpdate",
  5039. true,
  5040. void 0,
  5041. i18next.t("在脚本信息栏添加【今日检查】信息块")
  5042. )
  5043. ]
  5044. }
  5045. ]
  5046. }
  5047. ]
  5048. }
  5049. ]
  5050. };
  5051. const GreasyforkDiscussionsFilter = {
  5052. /** 存储的键 */
  5053. key: "gf-discuessions-filter-rule",
  5054. $data: {
  5055. /** 脚本 */
  5056. FILTER_SCRIPT_KEY: "greasyfork-discussions-filter-script",
  5057. /** 发布用户 */
  5058. FILTER_POST_USER_KEY: "greasyfork-discussions-filter-post-user",
  5059. /** 回复用户 */
  5060. FILTER_REPLY_USER_KEY: "greasyfork-discussions-filter-reply-user"
  5061. },
  5062. init() {
  5063. log.info("论坛-过滤");
  5064. addStyle(
  5065. /*css*/
  5066. `
  5067. .discussion-list-container {
  5068. --discusstion-repeat-color: #ffa700;
  5069. }
  5070. .discussion-list-container a.discussion-title[data-repeat-tip-show]::before {
  5071. content: attr(data-repeat-tip-show);
  5072. color: var(--discusstion-repeat-color);
  5073. border-radius: 5px;
  5074. border: 2px solid var(--discusstion-repeat-color);
  5075. padding: 2px 5px;
  5076. font-weight: 800;
  5077. font-size: 14px;
  5078. }
  5079. `
  5080. );
  5081. let lockFunction = new utils.LockFunction(() => {
  5082. this.filter();
  5083. }, 50);
  5084. utils.mutationObserver(document.body, {
  5085. config: {
  5086. subtree: true,
  5087. childList: true
  5088. },
  5089. immediate: true,
  5090. callback: () => {
  5091. lockFunction.run();
  5092. }
  5093. });
  5094. lockFunction.run();
  5095. },
  5096. /**
  5097. * 获取反馈列表元素
  5098. */
  5099. getElementList() {
  5100. let discussionsListContainer = [];
  5101. discussionsListContainer = discussionsListContainer.concat(
  5102. Array.from(
  5103. document.querySelectorAll(".discussion-list-container")
  5104. )
  5105. );
  5106. return discussionsListContainer;
  5107. },
  5108. /**
  5109. * 论坛-过滤
  5110. */
  5111. filter() {
  5112. this.transformOldRule();
  5113. const SNIPPET_MAP = /* @__PURE__ */ new Map();
  5114. this.getElementList().forEach(($listContainer, index) => {
  5115. const discussionInfo = this.parseDiscuessionListContainerInfo($listContainer);
  5116. let localValueSplit = this.getValue().split("\n");
  5117. if (SNIPPET_MAP.has(discussionInfo.snippet) && PopsPanel.getValue("greasyfork-discussions-filter-duplicate-comments")) {
  5118. let discussionTitleElement = SNIPPET_MAP.get(
  5119. discussionInfo.snippet
  5120. ).querySelector("a.discussion-title");
  5121. discussionTitleElement.setAttribute("data-repeat-tip-show", "true");
  5122. let oldCount = 0;
  5123. if (discussionTitleElement.hasAttribute("data-repeat-count")) {
  5124. oldCount = parseInt(
  5125. discussionTitleElement.getAttribute("data-repeat-count")
  5126. );
  5127. }
  5128. oldCount++;
  5129. discussionTitleElement.setAttribute(
  5130. "data-repeat-count",
  5131. oldCount.toString()
  5132. );
  5133. discussionTitleElement.setAttribute(
  5134. "data-repeat-tip-show",
  5135. i18next.t("已过滤:{{oldCount}}", { oldCount })
  5136. );
  5137. log.success([
  5138. `过滤重复内容:${discussionInfo.snippet}`,
  5139. discussionInfo
  5140. ]);
  5141. $listContainer.remove();
  5142. return;
  5143. }
  5144. SNIPPET_MAP.set(discussionInfo.snippet, $listContainer);
  5145. for (let index2 = 0; index2 < localValueSplit.length; index2++) {
  5146. let localRule = localValueSplit[index2];
  5147. let ruleSplit = localRule.split("##");
  5148. let ruleName = ruleSplit[0];
  5149. let ruleValue = ruleSplit[1];
  5150. if (ruleName in discussionInfo) {
  5151. let ruleValueRegExp = new RegExp(ruleValue, "ig");
  5152. if (discussionInfo[ruleName] != null) {
  5153. let scriptInfoString = String(discussionInfo[ruleName]);
  5154. if (scriptInfoString.match(ruleValueRegExp)) {
  5155. log.info("触发论坛过滤规则", localRule, discussionInfo);
  5156. $listContainer.remove();
  5157. return;
  5158. }
  5159. }
  5160. }
  5161. }
  5162. });
  5163. },
  5164. /**
  5165. * 解析出元素上的属性
  5166. */
  5167. parseDiscuessionListContainerInfo($listContainer) {
  5168. var _a2, _b, _c, _d;
  5169. let discussionUrl = $listContainer.querySelector("a.discussion-title").href;
  5170. let discuessionIdMatch = discussionUrl.match(
  5171. /\/discussions(|\/greasyfork)\/([\d]+)/
  5172. );
  5173. let discuessionId = discuessionIdMatch[discuessionIdMatch.length - 1];
  5174. const info = {
  5175. /** 脚本名 */
  5176. scriptName: $listContainer.querySelector(
  5177. ".discussion-meta-item-script-name"
  5178. ).innerText,
  5179. /** 脚本主页地址 */
  5180. scriptUrl: (_a2 = $listContainer.querySelector(
  5181. ".discussion-meta-item-script-name a"
  5182. )) == null ? void 0 : _a2.href,
  5183. /** 脚本id */
  5184. scriptId: GreasyforkUrlUtils.getScriptId(
  5185. (_b = $listContainer.querySelector(
  5186. ".discussion-meta-item-script-name a"
  5187. )) == null ? void 0 : _b.href
  5188. ),
  5189. /** 发布的用户名 */
  5190. postUserName: $listContainer.querySelector("a.user-link").innerText,
  5191. /** 发布的用户主页地址 */
  5192. postUserHomeUrl: $listContainer.querySelector("a.user-link").href,
  5193. /** 发布的用户id */
  5194. postUserId: GreasyforkUrlUtils.getUserId(
  5195. $listContainer.querySelector("a.user-link").href
  5196. ),
  5197. /** 发布的时间 */
  5198. postTimeStamp: new Date(
  5199. $listContainer.querySelector("relative-time").getAttribute("datetime")
  5200. ),
  5201. /** 发布的id */
  5202. snippetId: discuessionId,
  5203. /** 发布的地址*/
  5204. snippetUrl: discussionUrl,
  5205. /** 发布的内容片段*/
  5206. snippet: ((_c = $listContainer.querySelector("span.discussion-snippet")) == null ? void 0 : _c.innerText) || "",
  5207. /** (如果有)回复的用户名*/
  5208. replyUserName: void 0,
  5209. /** (如果有)回复的用户主页地址*/
  5210. replyUserHomeUrl: void 0,
  5211. /** (如果有)回复的用户id*/
  5212. replyUserId: void 0,
  5213. /** (如果有)回复的时间 */
  5214. replyTimeStamp: void 0
  5215. };
  5216. if ($listContainer.querySelector(
  5217. ".discussion-meta-item .discussion-meta-item"
  5218. )) {
  5219. info.replyUserName = $listContainer.querySelector(
  5220. ".discussion-meta-item .discussion-meta-item a.user-link"
  5221. ).innerText;
  5222. info.replyUserHomeUrl = $listContainer.querySelector(
  5223. ".discussion-meta-item .discussion-meta-item a.user-link"
  5224. ).href;
  5225. info.replyUserId = GreasyforkUrlUtils.getUserId(info.replyUserHomeUrl);
  5226. info.replyTimeStamp = new Date(
  5227. (_d = $listContainer.querySelector(
  5228. ".discussion-meta-item .discussion-meta-item relative-time"
  5229. )) == null ? void 0 : _d.getAttribute("datetime")
  5230. );
  5231. }
  5232. return info;
  5233. },
  5234. /** 转换旧规则 @deprecated */
  5235. transformOldRule() {
  5236. if (Date.now() > (/* @__PURE__ */ new Date("2024-8-19")).getTime()) {
  5237. return;
  5238. }
  5239. const FILTER_SCRIPT_KEY = "greasyfork-discussions-filter-script";
  5240. const FILTER_POST_USER_KEY = "greasyfork-discussions-filter-post-user";
  5241. const FILTER_REPLY_USER_KEY = "greasyfork-discussions-filter-reply-user";
  5242. const filterScript = PopsPanel.getValue(FILTER_SCRIPT_KEY, "");
  5243. const filterPostUser = PopsPanel.getValue(FILTER_POST_USER_KEY, "");
  5244. const filterReplyUser = PopsPanel.getValue(FILTER_REPLY_USER_KEY, "");
  5245. const filterScriptList = filterScript.trim() === "" ? [] : filterScript.split("\n");
  5246. const filterPostUserList = filterPostUser.trim() === "" ? [] : filterPostUser.split("\n");
  5247. const filterReplyUserList = filterReplyUser.trim() === "" ? [] : filterReplyUser.split("\n");
  5248. filterScriptList.forEach((ruleValue) => {
  5249. this.addValue(
  5250. "scriptId",
  5251. utils.parseStringToRegExpString("^" + ruleValue + "$")
  5252. );
  5253. });
  5254. filterPostUserList.forEach((ruleValue) => {
  5255. this.addValue(
  5256. "postUserId",
  5257. utils.parseStringToRegExpString("^" + ruleValue + "$")
  5258. );
  5259. });
  5260. filterReplyUserList.forEach((ruleValue) => {
  5261. this.addValue(
  5262. "replyUserId",
  5263. utils.parseStringToRegExpString("^" + ruleValue + "$")
  5264. );
  5265. });
  5266. PopsPanel.deleteValue(FILTER_SCRIPT_KEY);
  5267. PopsPanel.deleteValue(FILTER_POST_USER_KEY);
  5268. PopsPanel.deleteValue(FILTER_REPLY_USER_KEY);
  5269. },
  5270. setValue(value) {
  5271. PopsPanel.setValue(this.key, value);
  5272. },
  5273. addValue(key, value) {
  5274. let localValue = this.getValue();
  5275. if (localValue.trim() !== "") {
  5276. localValue += "\n";
  5277. }
  5278. if (utils.isNull(key)) {
  5279. return;
  5280. }
  5281. key = key.toString().trim();
  5282. let rule = key + "##" + value;
  5283. localValue += rule;
  5284. this.setValue(localValue);
  5285. },
  5286. getValue() {
  5287. return PopsPanel.getValue(this.key, "");
  5288. }
  5289. };
  5290. const SettingUIDiscuessions = {
  5291. id: "greasy-fork-panel-config-discussions",
  5292. title: i18next.t("论坛"),
  5293. forms: [
  5294. {
  5295. text: "",
  5296. type: "forms",
  5297. forms: [
  5298. {
  5299. text: i18next.t("功能"),
  5300. type: "deepMenu",
  5301. forms: [
  5302. {
  5303. text: "",
  5304. type: "forms",
  5305. forms: [
  5306. {
  5307. type: "own",
  5308. attributes: {
  5309. "data-key": "discussions-readBgColor",
  5310. "data-default-value": "#e5e5e5"
  5311. },
  5312. getLiElementCallBack(liElement) {
  5313. let key = "discussions-readBgColor";
  5314. let $left = domUtils.createElement("div", {
  5315. className: "pops-panel-item-left-text",
  5316. innerHTML: `
  5317. <p class="pops-panel-item-left-main-text">${i18next.t("自定义已读颜色")}</p>
  5318. <p class="pops-panel-item-left-desc-text">${i18next.t("在讨论内生效")}</p>
  5319. `
  5320. });
  5321. let $right = domUtils.createElement("div", {
  5322. className: "pops-panel-item-right",
  5323. innerHTML: `
  5324. <input type="color" class="pops-color-choose" />
  5325. `
  5326. });
  5327. let $color = $right.querySelector(
  5328. ".pops-color-choose"
  5329. );
  5330. $color.value = PopsPanel.getValue(key);
  5331. let $style = domUtils.createElement("style");
  5332. domUtils.append(document.head, $style);
  5333. domUtils.on(
  5334. $color,
  5335. ["input", "propertychange"],
  5336. (event) => {
  5337. log.info("选择颜色:" + $color.value);
  5338. $style.innerHTML = `
  5339. .discussion-read{
  5340. background: ${$color.value} !important;
  5341. }
  5342. `;
  5343. PopsPanel.setValue(key, $color.value);
  5344. }
  5345. );
  5346. liElement.appendChild($left);
  5347. liElement.appendChild($right);
  5348. return liElement;
  5349. }
  5350. },
  5351. UISwitch(
  5352. i18next.t("添加【过滤】按钮"),
  5353. "discussions-addShortcutOperationButton",
  5354. true,
  5355. void 0,
  5356. i18next.t(
  5357. "在每一行讨论的最后面添加【过滤】按钮,需开启过滤功能才会生效"
  5358. )
  5359. ),
  5360. UISwitch(
  5361. i18next.t("添加【举报】按钮"),
  5362. "discussions-addReportButton",
  5363. true,
  5364. void 0,
  5365. i18next.t("在每一行讨论的最后面添加【举报】按钮")
  5366. )
  5367. ]
  5368. }
  5369. ]
  5370. },
  5371. {
  5372. text: i18next.t("过滤"),
  5373. type: "deepMenu",
  5374. forms: [
  5375. {
  5376. text: `<a target="_blank" href="https://greasyfork.org/zh-CN/scripts/475722-greasyfork%E4%BC%98%E5%8C%96#:~:text=%E8%AE%BA%E5%9D%9B%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99">${i18next.t(
  5377. "帮助文档"
  5378. )}</a>`,
  5379. type: "forms",
  5380. forms: [
  5381. UISwitch(
  5382. i18next.t("启用"),
  5383. "greasyfork-discussions-filter-enable",
  5384. true,
  5385. void 0,
  5386. i18next.t("开启后下面的过滤功能才会生效")
  5387. ),
  5388. UISwitch(
  5389. i18next.t("过滤重复的评论"),
  5390. "greasyfork-discussions-filter-duplicate-comments",
  5391. false,
  5392. void 0,
  5393. i18next.t("过滤掉重复的评论数量(≥2)")
  5394. ),
  5395. {
  5396. type: "own",
  5397. getLiElementCallBack(liElement) {
  5398. let textareaDiv = domUtils.createElement(
  5399. "div",
  5400. {
  5401. className: "pops-panel-textarea",
  5402. innerHTML: `
  5403. <textarea placeholder="${i18next.t(
  5404. "请输入规则,每行一个"
  5405. )}" style="height:200px;"></textarea>`
  5406. },
  5407. {
  5408. style: "width: 100%;"
  5409. }
  5410. );
  5411. let $textarea = textareaDiv.querySelector(
  5412. "textarea"
  5413. );
  5414. $textarea.value = GreasyforkDiscussionsFilter.getValue();
  5415. domUtils.on(
  5416. $textarea,
  5417. ["input", "propertychange"],
  5418. void 0,
  5419. utils.debounce(function(event) {
  5420. GreasyforkDiscussionsFilter.setValue($textarea.value);
  5421. }, 200)
  5422. );
  5423. liElement.appendChild(textareaDiv);
  5424. return liElement;
  5425. }
  5426. }
  5427. ]
  5428. }
  5429. ]
  5430. }
  5431. ]
  5432. }
  5433. ]
  5434. };
  5435. const UIScriptListCSS = '.w-script-list-item {\r\n padding: 10px;\r\n border-bottom: 1px solid #e5e5e5;\r\n font-size: 16px;\r\n text-align: left;\r\n background: var(--aside-bg-color);\r\n border-radius: 8px;\r\n --pops-panel-forms-margin-left-right: 10px;\r\n}\r\n.w-script-version,\r\n.w-script-fan-score,\r\n.w-script-create-time,\r\n.w-script-update-time,\r\n.w-script-locale,\r\n.w-script-sync-type {\r\n font-size: 14px;\r\n color: #7c7c7c;\r\n}\r\n.w-script-fan-score {\r\n margin-left: unset !important;\r\n text-align: unset !important;\r\n max-width: unset !important;\r\n}\r\n.w-script-deleted {\r\n text-decoration: line-through;\r\n font-style: italic;\r\n color: red;\r\n}\r\n.w-script-deleted .w-script-name::before {\r\n content: "【删除】";\r\n}\r\n\r\nli[data-key="user"] .pops-panel-input,\r\nli[data-key="pwd"] .pops-panel-input {\r\n max-width: 200px;\r\n}\r\n';
  5436. const SettingUIUsers = {
  5437. id: "greasy-fork-panel-config-account",
  5438. title: i18next.t("用户"),
  5439. forms: [
  5440. {
  5441. text: "",
  5442. type: "forms",
  5443. forms: [
  5444. {
  5445. text: i18next.t("功能"),
  5446. type: "deepMenu",
  5447. forms: [
  5448. {
  5449. text: "",
  5450. type: "forms",
  5451. forms: [
  5452. UISwitch(
  5453. i18next.t("迁移【控制台】到顶部导航栏"),
  5454. "users-changeConsoleToTopNavigator",
  5455. true,
  5456. void 0,
  5457. i18next.t("将【控制台】按钮移动到顶部导航栏,节省空间")
  5458. )
  5459. ]
  5460. }
  5461. ]
  5462. },
  5463. {
  5464. text: i18next.t("美化"),
  5465. type: "deepMenu",
  5466. forms: [
  5467. {
  5468. text: "",
  5469. type: "forms",
  5470. forms: [
  5471. UISwitch(
  5472. i18next.t("美化私信页面"),
  5473. "conversations-beautifyDialogBox",
  5474. true,
  5475. void 0,
  5476. i18next.t("美化为左右对话模式")
  5477. ),
  5478. UISwitch(
  5479. i18next.t("美化私信列表"),
  5480. "conversations-beautifyPrivateMessageList",
  5481. true
  5482. )
  5483. ]
  5484. }
  5485. ]
  5486. }
  5487. ]
  5488. }
  5489. ]
  5490. };
  5491. const GithubUrl2WebhookUrl = {
  5492. init() {
  5493. },
  5494. /**
  5495. * 显示视图
  5496. */
  5497. showView() {
  5498. let $alert = __pops.alert({
  5499. title: {
  5500. text: i18next.t("Url To WebhookUrl"),
  5501. position: "center"
  5502. },
  5503. content: {
  5504. text: (
  5505. /*html*/
  5506. `
  5507. <div class="github-2-webhook-container">
  5508. <div class="url-container">
  5509. <h4>Github Url</h4>
  5510. <div class="url-parse url-parse-link">
  5511. <label>${i18next.t("转换前")}</label>
  5512. <textarea id="github" placeholder="${i18next.t("例如:") + "https://github.com/WhiteSevs/TamperMonkeyScript/blob/master/README.md"}"></textarea>
  5513. </div>
  5514. <div class="url-parse url-parse-result">
  5515. <label>${i18next.t("转换后")}</label>
  5516. <textarea id="webhook" placeholder="${i18next.t("结果:") + "https://raw.githubusercontent.com/WhiteSevs/TamperMonkeyScript/master/README.md"}" readonly></textarea>
  5517. </div>
  5518. </div>
  5519. </div>
  5520. `
  5521. ),
  5522. html: true
  5523. },
  5524. btn: {
  5525. ok: {
  5526. type: "default",
  5527. text: i18next.t("关闭")
  5528. }
  5529. },
  5530. mask: {
  5531. enable: true,
  5532. clickEvent: {
  5533. toClose: false,
  5534. toHide: false
  5535. }
  5536. },
  5537. drag: true,
  5538. width: window.innerWidth > 500 ? "500px" : "88vw",
  5539. height: window.innerHeight > 500 ? "500px" : "80vh",
  5540. style: (
  5541. /*css*/
  5542. `
  5543. .github-2-webhook-container{
  5544. display: flex;
  5545. flex-direction: column;
  5546. height: 100%;
  5547. }
  5548. .url-container{
  5549. display: flex;
  5550. flex-direction: column;
  5551. gap: 10px;
  5552. padding: 20px;
  5553. flex: 1;
  5554. }
  5555. .url-parse{
  5556. display: flex;
  5557. flex-direction: column;
  5558. flex: 1;
  5559. }
  5560. .url-container textarea{
  5561. height: 100%;
  5562. width: 100%;
  5563. position: relative;
  5564. display: block;
  5565. resize: none;
  5566. padding: 5px 11px;
  5567. box-sizing: border-box;
  5568. font-size: inherit;
  5569. font-family: inherit;
  5570. background-color: rgb(255, 255, 255, var(--pops-bg-opacity));
  5571. background-image: none;
  5572. -webkit-appearance: none;
  5573. appearance: none;
  5574. box-shadow: 0 0 0 1px #dcdfe6 inset;
  5575. border-radius: 0;
  5576. transition: box-shadow 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
  5577. border: none;
  5578. }
  5579. .url-container textarea:hover,
  5580. .url-container textarea:focus{
  5581. outline: 0;
  5582. box-shadow: 0 0 0 1px #409eff inset;
  5583. }
  5584. `
  5585. )
  5586. });
  5587. let $githubUrlInput = $alert.$shadowRoot.querySelector("#github");
  5588. let $webhookUrlInput = $alert.$shadowRoot.querySelector("#webhook");
  5589. domUtils.on($githubUrlInput, ["input", "propertychange"], (event) => {
  5590. let githubUrl = $githubUrlInput.value.trim();
  5591. let webhookUrlList = [];
  5592. githubUrl.split("\n").forEach((urlStr) => {
  5593. try {
  5594. urlStr = urlStr.trim();
  5595. if (utils.isNull(urlStr)) {
  5596. return;
  5597. }
  5598. let urlObj = new URL(urlStr);
  5599. let urlPathNameSplit = urlObj.pathname.split("/");
  5600. let {
  5601. 1: userName,
  5602. 2: repoName,
  5603. 3: blobStr,
  5604. 4: branchName
  5605. } = urlPathNameSplit;
  5606. let filePath = "";
  5607. if (urlPathNameSplit.length >= 6 && blobStr === "blob") {
  5608. filePath = urlPathNameSplit.slice(5, urlPathNameSplit.length).join("/");
  5609. } else if (urlPathNameSplit.length >= 8 && blobStr === "raw" && branchName === "refs") {
  5610. branchName = urlPathNameSplit[6];
  5611. filePath = urlPathNameSplit.slice(7, urlPathNameSplit.length).join("/");
  5612. } else {
  5613. return;
  5614. }
  5615. if (filePath === "") {
  5616. return;
  5617. }
  5618. webhookUrlList.push(
  5619. `https://raw.githubusercontent.com/${userName}/${repoName}/${branchName}/${filePath}`
  5620. );
  5621. } catch (error) {
  5622. }
  5623. });
  5624. $webhookUrlInput.value = webhookUrlList.join("\n");
  5625. });
  5626. }
  5627. };
  5628. const SettingUIScriptSearch = {
  5629. id: "greasy-fork-panel-config-script-search",
  5630. title: i18next.t("搜索"),
  5631. forms: [
  5632. {
  5633. type: "forms",
  5634. text: "",
  5635. forms: [
  5636. UISwitch(
  5637. i18next.t("新增【关键词】搜索框"),
  5638. "gf-script-search-addFilterSearchInput",
  5639. true,
  5640. void 0,
  5641. i18next.t("输入自定义关键词后自动执行过滤")
  5642. ),
  5643. UISwitch(
  5644. i18next.t("新增【{{buttonText}}】按钮", {
  5645. buttonText: i18next.t("名称")
  5646. }),
  5647. "gf-script-search-filterScriptTitleWholeWordMatching",
  5648. true,
  5649. void 0,
  5650. i18next.t("该Checkbox按钮开启后,自动过滤出包含搜索关键词的脚本")
  5651. ),
  5652. UISwitch(
  5653. i18next.t("新增【{{buttonText}}】按钮", {
  5654. buttonText: i18next.t("描述")
  5655. }),
  5656. "gf-script-search-filterScriptDescWholeWordMatching",
  5657. true,
  5658. void 0,
  5659. i18next.t("该Checkbox按钮开启后,自动过滤出包含搜索关键词的脚本")
  5660. ),
  5661. UISwitch(
  5662. i18next.t("新增【{{buttonText}}】按钮", {
  5663. buttonText: i18next.t("名称/描述")
  5664. }),
  5665. "gf-script-search-filterScriptTitleOrDescWholeWordMatching",
  5666. true,
  5667. void 0,
  5668. i18next.t("该Checkbox按钮开启后,自动过滤出包含搜索关键词的脚本")
  5669. ),
  5670. UISwitch(
  5671. i18next.t("新增【{{buttonText}}】按钮", {
  5672. buttonText: i18next.t("作者名称")
  5673. }),
  5674. "gf-script-search-filterScriptAuthorNameWholeWordMatching",
  5675. true,
  5676. void 0,
  5677. i18next.t("该Checkbox按钮开启后,自动过滤出包含搜索关键词的脚本")
  5678. )
  5679. ]
  5680. }
  5681. ]
  5682. };
  5683. const PopsPanel = {
  5684. /** 数据 */
  5685. $data: {
  5686. __data: null,
  5687. __oneSuccessExecMenu: null,
  5688. __onceExec: null,
  5689. __listenData: null,
  5690. /**
  5691. * 菜单项的默认值
  5692. */
  5693. get data() {
  5694. if (PopsPanel.$data.__data == null) {
  5695. PopsPanel.$data.__data = new utils.Dictionary();
  5696. }
  5697. return PopsPanel.$data.__data;
  5698. },
  5699. /**
  5700. * 成功只执行了一次的项
  5701. */
  5702. get oneSuccessExecMenu() {
  5703. if (PopsPanel.$data.__oneSuccessExecMenu == null) {
  5704. PopsPanel.$data.__oneSuccessExecMenu = new utils.Dictionary();
  5705. }
  5706. return PopsPanel.$data.__oneSuccessExecMenu;
  5707. },
  5708. /**
  5709. * 成功只执行了一次的项
  5710. */
  5711. get onceExec() {
  5712. if (PopsPanel.$data.__onceExec == null) {
  5713. PopsPanel.$data.__onceExec = new utils.Dictionary();
  5714. }
  5715. return PopsPanel.$data.__onceExec;
  5716. },
  5717. /** 脚本名,一般用在设置的标题上 */
  5718. get scriptName() {
  5719. return SCRIPT_NAME;
  5720. },
  5721. /** 菜单项的总值在本地数据配置的键名 */
  5722. key: KEY,
  5723. /** 菜单项在attributes上配置的菜单键 */
  5724. attributeKeyName: ATTRIBUTE_KEY,
  5725. /** 菜单项在attributes上配置的菜单默认值 */
  5726. attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE
  5727. },
  5728. /** 监听器 */
  5729. $listener: {
  5730. /**
  5731. * 值改变的监听器
  5732. */
  5733. get listenData() {
  5734. if (PopsPanel.$data.__listenData == null) {
  5735. PopsPanel.$data.__listenData = new utils.Dictionary();
  5736. }
  5737. return PopsPanel.$data.__listenData;
  5738. }
  5739. },
  5740. init() {
  5741. this.initPanelDefaultValue();
  5742. this.initExtensionsMenu();
  5743. },
  5744. /** 判断是否是顶层窗口 */
  5745. isTopWindow() {
  5746. return _unsafeWindow.top === _unsafeWindow.self;
  5747. },
  5748. initExtensionsMenu() {
  5749. if (!this.isTopWindow()) {
  5750. return;
  5751. }
  5752. GM_Menu.add([
  5753. {
  5754. key: "show_pops_panel_setting",
  5755. text: i18next.t("⚙ 设置"),
  5756. autoReload: false,
  5757. isStoreValue: false,
  5758. showText(text) {
  5759. return text;
  5760. },
  5761. callback: () => {
  5762. this.showPanel();
  5763. }
  5764. },
  5765. {
  5766. key: "githubUrl2webhookUrl",
  5767. text: "⚙ " + i18next.t("Url To WebhookUrl"),
  5768. autoReload: false,
  5769. isStoreValue: false,
  5770. showText(text) {
  5771. return text;
  5772. },
  5773. callback: () => {
  5774. GithubUrl2WebhookUrl.showView();
  5775. }
  5776. }
  5777. ]);
  5778. },
  5779. /** 初始化菜单项的默认值保存到本地数据中 */
  5780. initPanelDefaultValue() {
  5781. let that = this;
  5782. function initDefaultValue(config) {
  5783. if (!config.attributes) {
  5784. return;
  5785. }
  5786. let needInitConfig = {};
  5787. let key = config.attributes[ATTRIBUTE_KEY];
  5788. if (key != null) {
  5789. needInitConfig[key] = config.attributes[ATTRIBUTE_DEFAULT_VALUE];
  5790. }
  5791. let __attr_init__ = config.attributes[ATTRIBUTE_INIT];
  5792. if (typeof __attr_init__ === "function") {
  5793. let __attr_result__ = __attr_init__();
  5794. if (typeof __attr_result__ === "boolean" && !__attr_result__) {
  5795. return;
  5796. }
  5797. }
  5798. let initMoreValue = config.attributes[ATTRIBUTE_INIT_MORE_VALUE];
  5799. if (initMoreValue && typeof initMoreValue === "object") {
  5800. Object.assign(needInitConfig, initMoreValue);
  5801. }
  5802. let needInitConfigList = Object.keys(needInitConfig);
  5803. if (!needInitConfigList.length) {
  5804. log.warn("请先配置键", config);
  5805. return;
  5806. }
  5807. needInitConfigList.forEach((__key) => {
  5808. let __defaultValue = needInitConfig[__key];
  5809. if (that.$data.data.has(__key)) {
  5810. log.warn("请检查该key(已存在): " + __key);
  5811. }
  5812. that.$data.data.set(__key, __defaultValue);
  5813. });
  5814. }
  5815. function loopInitDefaultValue(configList) {
  5816. for (let index = 0; index < configList.length; index++) {
  5817. let configItem = configList[index];
  5818. initDefaultValue(configItem);
  5819. let childForms = configItem.forms;
  5820. if (childForms && Array.isArray(childForms)) {
  5821. loopInitDefaultValue(childForms);
  5822. }
  5823. }
  5824. }
  5825. let contentConfigList = this.getPanelContentConfig();
  5826. for (let index = 0; index < contentConfigList.length; index++) {
  5827. let leftContentConfigItem = contentConfigList[index];
  5828. if (!leftContentConfigItem.forms) {
  5829. continue;
  5830. }
  5831. let rightContentConfigList = leftContentConfigItem.forms;
  5832. if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
  5833. loopInitDefaultValue(rightContentConfigList);
  5834. }
  5835. }
  5836. },
  5837. /**
  5838. * 设置值
  5839. * @param key 键
  5840. * @param value 值
  5841. */
  5842. setValue(key, value) {
  5843. let locaData = _GM_getValue(KEY, {});
  5844. let oldValue = locaData[key];
  5845. locaData[key] = value;
  5846. _GM_setValue(KEY, locaData);
  5847. if (this.$listener.listenData.has(key)) {
  5848. this.$listener.listenData.get(key).callback(key, oldValue, value);
  5849. }
  5850. },
  5851. /**
  5852. * 获取值
  5853. * @param key 键
  5854. * @param defaultValue 默认值
  5855. */
  5856. getValue(key, defaultValue) {
  5857. let locaData = _GM_getValue(KEY, {});
  5858. let localValue = locaData[key];
  5859. if (localValue == null) {
  5860. if (this.$data.data.has(key)) {
  5861. return this.$data.data.get(key);
  5862. }
  5863. return defaultValue;
  5864. }
  5865. return localValue;
  5866. },
  5867. /**
  5868. * 删除值
  5869. * @param key 键
  5870. */
  5871. deleteValue(key) {
  5872. let locaData = _GM_getValue(KEY, {});
  5873. let oldValue = locaData[key];
  5874. Reflect.deleteProperty(locaData, key);
  5875. _GM_setValue(KEY, locaData);
  5876. if (this.$listener.listenData.has(key)) {
  5877. this.$listener.listenData.get(key).callback(key, oldValue, void 0);
  5878. }
  5879. },
  5880. /**
  5881. * 监听调用setValue、deleteValue
  5882. * @param key 需要监听的键
  5883. * @param callback
  5884. */
  5885. addValueChangeListener(key, callback, option) {
  5886. let listenerId = Math.random();
  5887. this.$listener.listenData.set(key, {
  5888. id: listenerId,
  5889. key,
  5890. callback
  5891. });
  5892. if (option) {
  5893. if (option.immediate) {
  5894. callback(key, this.getValue(key), this.getValue(key));
  5895. }
  5896. }
  5897. return listenerId;
  5898. },
  5899. /**
  5900. * 移除监听
  5901. * @param listenerId 监听的id
  5902. */
  5903. removeValueChangeListener(listenerId) {
  5904. let deleteKey = null;
  5905. for (const [key, value] of this.$listener.listenData.entries()) {
  5906. if (value.id === listenerId) {
  5907. deleteKey = key;
  5908. break;
  5909. }
  5910. }
  5911. if (typeof deleteKey === "string") {
  5912. this.$listener.listenData.delete(deleteKey);
  5913. } else {
  5914. console.warn("没有找到对应的监听器");
  5915. }
  5916. },
  5917. /**
  5918. * 主动触发菜单值改变的回调
  5919. * @param key 菜单键
  5920. * @param newValue 想要触发的新值,默认使用当前值
  5921. * @param oldValue 想要触发的旧值,默认使用当前值
  5922. */
  5923. triggerMenuValueChange(key, newValue, oldValue) {
  5924. if (this.$listener.listenData.has(key)) {
  5925. let listenData = this.$listener.listenData.get(key);
  5926. if (typeof listenData.callback === "function") {
  5927. let value = this.getValue(key);
  5928. let __newValue = value;
  5929. let __oldValue = value;
  5930. if (typeof newValue !== "undefined" && arguments.length > 1) {
  5931. __newValue = newValue;
  5932. }
  5933. if (typeof oldValue !== "undefined" && arguments.length > 2) {
  5934. __oldValue = oldValue;
  5935. }
  5936. listenData.callback(key, __oldValue, __newValue);
  5937. }
  5938. }
  5939. },
  5940. /**
  5941. * 判断该键是否存在
  5942. * @param key 键
  5943. */
  5944. hasKey(key) {
  5945. let locaData = _GM_getValue(KEY, {});
  5946. return key in locaData;
  5947. },
  5948. /**
  5949. * 自动判断菜单是否启用,然后执行回调
  5950. * @param key
  5951. * @param callback 回调
  5952. * @param [isReverse=false] 逆反判断菜单启用
  5953. */
  5954. execMenu(key, callback, isReverse = false) {
  5955. if (!(typeof key === "string" || typeof key === "object" && Array.isArray(key))) {
  5956. throw new TypeError("key 必须是字符串或者字符串数组");
  5957. }
  5958. let runKeyList = [];
  5959. if (typeof key === "object" && Array.isArray(key)) {
  5960. runKeyList = [...key];
  5961. } else {
  5962. runKeyList.push(key);
  5963. }
  5964. let value = void 0;
  5965. for (let index = 0; index < runKeyList.length; index++) {
  5966. const runKey = runKeyList[index];
  5967. if (!this.$data.data.has(runKey)) {
  5968. log.warn(`${key} 键不存在`);
  5969. return;
  5970. }
  5971. let runValue = PopsPanel.getValue(runKey);
  5972. if (isReverse) {
  5973. runValue = !runValue;
  5974. }
  5975. if (!runValue) {
  5976. break;
  5977. }
  5978. value = runValue;
  5979. }
  5980. if (value) {
  5981. callback(value);
  5982. }
  5983. },
  5984. /**
  5985. * 自动判断菜单是否启用,然后执行回调,只会执行一次
  5986. * @param key
  5987. * @param callback 回调
  5988. * @param getValueFn 自定义处理获取当前值,值true是启用并执行回调,值false是不执行回调
  5989. * @param handleValueChangeFn 自定义处理值改变时的回调,值true是启用并执行回调,值false是不执行回调
  5990. */
  5991. execMenuOnce(key, callback, getValueFn, handleValueChangeFn) {
  5992. if (typeof key !== "string") {
  5993. throw new TypeError("key 必须是字符串");
  5994. }
  5995. if (!this.$data.data.has(key)) {
  5996. log.warn(`${key} 键不存在`);
  5997. return;
  5998. }
  5999. if (this.$data.oneSuccessExecMenu.has(key)) {
  6000. return;
  6001. }
  6002. this.$data.oneSuccessExecMenu.set(key, 1);
  6003. let __getValue = () => {
  6004. let localValue = PopsPanel.getValue(key);
  6005. return typeof getValueFn === "function" ? getValueFn(key, localValue) : localValue;
  6006. };
  6007. let resultStyleList = [];
  6008. let dynamicPushStyleNode = ($style) => {
  6009. let __value = __getValue();
  6010. let dynamicResultList = [];
  6011. if ($style instanceof HTMLStyleElement) {
  6012. dynamicResultList = [$style];
  6013. } else if (Array.isArray($style)) {
  6014. dynamicResultList = [
  6015. ...$style.filter(
  6016. (item) => item != null && item instanceof HTMLStyleElement
  6017. )
  6018. ];
  6019. }
  6020. if (__value) {
  6021. resultStyleList = resultStyleList.concat(dynamicResultList);
  6022. } else {
  6023. for (let index = 0; index < dynamicResultList.length; index++) {
  6024. let $css = dynamicResultList[index];
  6025. $css.remove();
  6026. dynamicResultList.splice(index, 1);
  6027. index--;
  6028. }
  6029. }
  6030. };
  6031. let changeCallBack = (currentValue) => {
  6032. let resultList = [];
  6033. if (currentValue) {
  6034. let result = callback(currentValue, dynamicPushStyleNode);
  6035. if (result instanceof HTMLStyleElement) {
  6036. resultList = [result];
  6037. } else if (Array.isArray(result)) {
  6038. resultList = [
  6039. ...result.filter(
  6040. (item) => item != null && item instanceof HTMLStyleElement
  6041. )
  6042. ];
  6043. }
  6044. }
  6045. for (let index = 0; index < resultStyleList.length; index++) {
  6046. let $css = resultStyleList[index];
  6047. $css.remove();
  6048. resultStyleList.splice(index, 1);
  6049. index--;
  6050. }
  6051. resultStyleList = [...resultList];
  6052. };
  6053. this.addValueChangeListener(
  6054. key,
  6055. (__key, oldValue, newValue) => {
  6056. let __newValue = newValue;
  6057. if (typeof handleValueChangeFn === "function") {
  6058. __newValue = handleValueChangeFn(__key, newValue, oldValue);
  6059. }
  6060. changeCallBack(__newValue);
  6061. }
  6062. );
  6063. let value = __getValue();
  6064. if (value) {
  6065. changeCallBack(value);
  6066. }
  6067. },
  6068. /**
  6069. * 父子菜单联动,自动判断菜单是否启用,然后执行回调,只会执行一次
  6070. * @param key 菜单键
  6071. * @param childKey 子菜单键
  6072. * @param callback 回调
  6073. * @param replaceValueFn 用于修改mainValue,返回undefined则不做处理
  6074. */
  6075. execInheritMenuOnce(key, childKey, callback, replaceValueFn) {
  6076. let that = this;
  6077. const handleInheritValue = (key2, childKey2) => {
  6078. let mainValue = that.getValue(key2);
  6079. let childValue = that.getValue(childKey2);
  6080. if (typeof replaceValueFn === "function") {
  6081. let changedMainValue = replaceValueFn(mainValue, childValue);
  6082. if (changedMainValue !== void 0) {
  6083. return changedMainValue;
  6084. }
  6085. }
  6086. return mainValue;
  6087. };
  6088. this.execMenuOnce(
  6089. key,
  6090. callback,
  6091. () => {
  6092. return handleInheritValue(key, childKey);
  6093. },
  6094. () => {
  6095. return handleInheritValue(key, childKey);
  6096. }
  6097. );
  6098. this.execMenuOnce(
  6099. childKey,
  6100. () => {
  6101. },
  6102. () => false,
  6103. () => {
  6104. this.triggerMenuValueChange(key);
  6105. return false;
  6106. }
  6107. );
  6108. },
  6109. /**
  6110. * 根据key执行一次
  6111. * @param key
  6112. */
  6113. onceExec(key, callback) {
  6114. if (typeof key !== "string") {
  6115. throw new TypeError("key 必须是字符串");
  6116. }
  6117. if (this.$data.onceExec.has(key)) {
  6118. return;
  6119. }
  6120. callback();
  6121. this.$data.onceExec.set(key, 1);
  6122. },
  6123. /**
  6124. * 显示设置面板
  6125. */
  6126. showPanel() {
  6127. __pops.panel({
  6128. title: {
  6129. text: i18next.t("{{SCRIPT_NAME}}-设置", { SCRIPT_NAME }),
  6130. position: "center",
  6131. html: false,
  6132. style: ""
  6133. },
  6134. content: this.getPanelContentConfig(),
  6135. mask: {
  6136. enable: true,
  6137. clickEvent: {
  6138. toClose: true,
  6139. toHide: false
  6140. }
  6141. },
  6142. zIndex() {
  6143. let maxZIndex = Utils.getMaxZIndex();
  6144. let popsMaxZIndex = __pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
  6145. return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
  6146. },
  6147. width: PanelUISize.setting.width,
  6148. height: PanelUISize.setting.height,
  6149. drag: true,
  6150. only: true,
  6151. style: `
  6152. ${UIScriptListCSS}
  6153. `
  6154. });
  6155. },
  6156. /**
  6157. * 获取配置内容
  6158. */
  6159. getPanelContentConfig() {
  6160. let configList = [
  6161. SettingUICommon,
  6162. SettingUIScripts,
  6163. SettingUIScriptSearch,
  6164. SettingUIDiscuessions,
  6165. SettingUIUsers
  6166. ];
  6167. return configList;
  6168. }
  6169. };
  6170. const beautifyMarkdownCSS = ':root {\r\n --borderColor-muted: #d1d9e0b3;\r\n}\r\ncode {\r\n font-family: Menlo, Monaco, Consolas, "Courier New", monospace;\r\n font-size: 0.85em;\r\n color: #000;\r\n background-color: #f0f0f0;\r\n border-radius: 3px;\r\n padding: 0.2em 0;\r\n}\r\ntable {\r\n text-indent: initial;\r\n}\r\ntable {\r\n margin: 10px 0 15px 0;\r\n border-collapse: collapse;\r\n border-spacing: 0;\r\n display: block;\r\n width: 100%;\r\n overflow: auto;\r\n word-break: normal;\r\n word-break: keep-all;\r\n}\r\ncode,\r\npre {\r\n color: #333;\r\n background: 0 0;\r\n font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;\r\n text-align: left;\r\n white-space: pre;\r\n word-spacing: normal;\r\n word-break: normal;\r\n word-wrap: normal;\r\n line-height: 1.4;\r\n -moz-tab-size: 8;\r\n -o-tab-size: 8;\r\n tab-size: 8;\r\n -webkit-hyphens: none;\r\n -moz-hyphens: none;\r\n -ms-hyphens: none;\r\n hyphens: none;\r\n}\r\npre {\r\n padding: 0.8em;\r\n overflow: auto;\r\n border-radius: 3px;\r\n background: #f5f5f5;\r\n}\r\n:not(pre) > code {\r\n padding: 0.1em;\r\n border-radius: 0.3em;\r\n white-space: normal;\r\n background: #f5f5f5;\r\n}\r\nhtml body {\r\n font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans,\r\n sans-serif;\r\n font-size: 16px;\r\n line-height: 1.6;\r\n color: #333;\r\n background-color: #fff;\r\n overflow: initial;\r\n box-sizing: border-box;\r\n word-wrap: break-word;\r\n}\r\nhtml body > :first-child {\r\n margin-top: 0;\r\n}\r\nhtml body h1,\r\nhtml body h2,\r\nhtml body h3,\r\nhtml body h4,\r\nhtml body h5,\r\nhtml body h6 {\r\n line-height: 1.2;\r\n margin-top: 1em;\r\n margin-bottom: 16px;\r\n color: #000;\r\n}\r\nhtml body h1 {\r\n font-size: 2.25em;\r\n font-weight: 300;\r\n padding-bottom: 0.3em;\r\n}\r\nhtml body h2 {\r\n font-size: 1.75em;\r\n font-weight: 400;\r\n padding-bottom: 0.3em;\r\n}\r\nhtml body h3 {\r\n font-size: 1.5em;\r\n font-weight: 500;\r\n}\r\nhtml body h4 {\r\n font-size: 1.25em;\r\n font-weight: 600;\r\n}\r\nhtml body h5 {\r\n font-size: 1.1em;\r\n font-weight: 600;\r\n}\r\nhtml body h6 {\r\n font-size: 1em;\r\n font-weight: 600;\r\n}\r\nhtml body h1,\r\nhtml body h2,\r\nhtml body h3,\r\nhtml body h4,\r\nhtml body h5 {\r\n font-weight: 600;\r\n}\r\nhtml body h5 {\r\n font-size: 1em;\r\n}\r\nhtml body h6 {\r\n color: #5c5c5c;\r\n}\r\nhtml body strong {\r\n color: #000;\r\n}\r\nhtml body del {\r\n color: #5c5c5c;\r\n}\r\nhtml body a:not([href]) {\r\n color: inherit;\r\n}\r\nhtml body a {\r\n text-decoration: underline;\r\n text-underline-offset: 0.2rem;\r\n}\r\nhtml body a:hover {\r\n color: #00a3f5;\r\n}\r\nhtml body img {\r\n max-width: 100%;\r\n}\r\nhtml body > p {\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n word-wrap: break-word;\r\n}\r\nhtml body > ol,\r\nhtml body > ul {\r\n margin-bottom: 16px;\r\n}\r\nhtml body ol,\r\nhtml body ul {\r\n padding-left: 2em;\r\n}\r\nhtml body ol.no-list,\r\nhtml body ul.no-list {\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\nhtml body ol ol,\r\nhtml body ol ul,\r\nhtml body ul ol,\r\nhtml body ul ul {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\nhtml body li {\r\n margin-bottom: 0;\r\n}\r\nhtml body li.task-list-item {\r\n list-style: none;\r\n}\r\nhtml body li > p {\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\nhtml body .task-list-item-checkbox {\r\n margin: 0 0.2em 0.25em -1.8em;\r\n vertical-align: middle;\r\n}\r\nhtml body .task-list-item-checkbox:hover {\r\n cursor: pointer;\r\n}\r\nhtml body blockquote {\r\n margin: 16px 0;\r\n font-size: inherit;\r\n padding: 0 15px;\r\n color: #5c5c5c;\r\n background-color: #f0f0f0;\r\n border-left: 4px solid #d6d6d6 !important;\r\n}\r\nhtml body blockquote > :first-child {\r\n margin-top: 0;\r\n}\r\nhtml body blockquote > :last-child {\r\n margin-bottom: 0;\r\n}\r\nhtml body hr {\r\n height: 4px;\r\n margin: 32px 0;\r\n background-color: #d6d6d6;\r\n border: 0 none;\r\n}\r\nhtml body table {\r\n margin: 10px 0 15px 0;\r\n border-collapse: collapse;\r\n border-spacing: 0;\r\n display: block;\r\n width: 100%;\r\n overflow: auto;\r\n word-break: normal;\r\n word-break: keep-all;\r\n}\r\nhtml body table th {\r\n font-weight: 700;\r\n color: #000;\r\n}\r\nhtml body table td,\r\nhtml body table th {\r\n border: 1px solid #d6d6d6;\r\n padding: 6px 13px;\r\n}\r\nhtml body dl {\r\n padding: 0;\r\n}\r\nhtml body dl dt {\r\n padding: 0;\r\n margin-top: 16px;\r\n font-size: 1em;\r\n font-style: italic;\r\n font-weight: 700;\r\n}\r\nhtml body dl dd {\r\n padding: 0 16px;\r\n margin-bottom: 16px;\r\n}\r\nhtml body code {\r\n font-family: Menlo, Monaco, Consolas, "Courier New", monospace;\r\n font-size: 0.85em;\r\n color: #000;\r\n background-color: #f0f0f0;\r\n border-radius: 3px;\r\n padding: 0.2em 0;\r\n}\r\nhtml body code::after,\r\nhtml body code::before {\r\n letter-spacing: -0.2em;\r\n content: "\\00a0";\r\n}\r\nhtml body pre > code {\r\n padding: 0;\r\n margin: 0;\r\n word-break: normal;\r\n white-space: pre;\r\n background: 0 0;\r\n border: 0;\r\n}\r\nhtml body .highlight {\r\n margin-bottom: 16px;\r\n}\r\nhtml body .highlight pre,\r\nhtml body pre {\r\n padding: 1em;\r\n overflow: auto;\r\n line-height: 1.45;\r\n border: #d6d6d6;\r\n border-radius: 3px;\r\n}\r\nhtml body .highlight pre {\r\n margin-bottom: 0;\r\n word-break: normal;\r\n}\r\nhtml body pre code,\r\nhtml body pre tt {\r\n display: inline;\r\n max-width: initial;\r\n padding: 0;\r\n margin: 0;\r\n overflow: initial;\r\n line-height: inherit;\r\n word-wrap: normal;\r\n background-color: transparent;\r\n border: 0;\r\n}\r\nhtml body pre code:after,\r\nhtml body pre code:before,\r\nhtml body pre tt:after,\r\nhtml body pre tt:before {\r\n content: normal;\r\n}\r\nhtml body blockquote,\r\nhtml body dl,\r\nhtml body ol,\r\nhtml body p,\r\nhtml body pre,\r\nhtml body ul {\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n}\r\nhtml body kbd {\r\n color: #000;\r\n border: 1px solid #d6d6d6;\r\n border-bottom: 2px solid #c7c7c7;\r\n padding: 2px 4px;\r\n background-color: #f0f0f0;\r\n border-radius: 3px;\r\n}\r\n@media print {\r\n html body {\r\n background-color: #fff;\r\n }\r\n html body h1,\r\n html body h2,\r\n html body h3,\r\n html body h4,\r\n html body h5,\r\n html body h6 {\r\n color: #000;\r\n page-break-after: avoid;\r\n }\r\n html body blockquote {\r\n color: #5c5c5c;\r\n }\r\n html body pre {\r\n page-break-inside: avoid;\r\n }\r\n html body table {\r\n display: table;\r\n }\r\n html body img {\r\n display: block;\r\n max-width: 100%;\r\n max-height: 100%;\r\n }\r\n html body code,\r\n html body pre {\r\n word-wrap: break-word;\r\n white-space: pre;\r\n }\r\n}\r\n/* 强制换行 */\r\ncode {\r\n text-wrap: wrap !important;\r\n}\r\n\r\n.scrollbar-style::-webkit-scrollbar {\r\n width: 8px;\r\n}\r\n.scrollbar-style::-webkit-scrollbar-track {\r\n border-radius: 10px;\r\n background-color: transparent;\r\n}\r\n.scrollbar-style::-webkit-scrollbar-thumb {\r\n border-radius: 5px;\r\n background-color: rgba(150, 150, 150, 0.66);\r\n border: 4px solid rgba(150, 150, 150, 0.66);\r\n background-clip: content-box;\r\n}\r\n\r\n/* 上面是通用 */\r\n\r\n/* 下面是自定义 */\r\n.user-content {\r\n background: #ffffff !important;\r\n border-left-color: #ffffff !important;\r\n}\r\n.user-content a {\r\n color: #0969da;\r\n}\r\n.user-content h1 {\r\n padding-bottom: 0.3em;\r\n font-size: 2em;\r\n border-bottom: 1px solid var(--borderColor-muted, var(--color-border-muted));\r\n}\r\n.user-content h2 {\r\n padding-bottom: 0.3em;\r\n font-size: 1.5em;\r\n border-bottom: 1px solid var(--borderColor-muted, var(--color-border-muted));\r\n}\r\n/* 任务列表样式 */\r\n.task-list-item-checkbox {\r\n margin: 0 0.2em 0.25em -1.4em;\r\n vertical-align: middle;\r\n}\r\n/* 隐藏标记框 */\r\nul li:has(> .task-list-item-checkbox)::marker {\r\n content: "";\r\n}\r\n\r\n/* 警告列表 */\r\n.markdown-alert {\r\n --borderColor-default: #d1d9e0;\r\n padding: 0.5rem 1rem;\r\n margin-bottom: 1rem;\r\n color: inherit;\r\n border-left: 0.25em solid var(--borderColor-default);\r\n border-left-color: var(--fgColor-accent);\r\n}\r\n.markdown-alert-title {\r\n display: flex;\r\n font-weight: 500;\r\n align-items: center;\r\n line-height: 1;\r\n color: var(--fgColor-accent);\r\n}\r\n.markdown-alert > :last-child {\r\n margin-bottom: 0;\r\n}\r\n.markdown-alert-title .octicon {\r\n display: inline-block;\r\n overflow: visible !important;\r\n vertical-align: text-bottom;\r\n fill: currentColor;\r\n}\r\n.markdown-alert-title .mr-2 {\r\n margin-right: 0.5rem !important;\r\n}\r\n.markdown-alert[data-type="NOTE"] {\r\n --fgColor-accent: #0969da;\r\n}\r\n\r\n.markdown-alert[data-type="TIP"] {\r\n --fgColor-accent: #1a7f37;\r\n}\r\n.markdown-alert[data-type="IMPORTANT"] {\r\n --fgColor-accent: #8250df;\r\n}\r\n.markdown-alert[data-type="WARNING"] {\r\n --fgColor-accent: #9a6700;\r\n}\r\n.markdown-alert[data-type="CAUTION"] {\r\n --fgColor-accent: #d1242f;\r\n}\r\n';
  6171. const beautifyButtonCSS = '/* 美化按钮 */\r\ninput[type="submit"],\r\ninput[type="button"],\r\nbutton {\r\n display: inline-flex;\r\n justify-content: center;\r\n align-items: center;\r\n line-height: 1;\r\n height: 32px;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n /* color: #606266; */\r\n text-align: center;\r\n box-sizing: border-box;\r\n outline: none;\r\n transition: 0.1s;\r\n font-weight: 500;\r\n user-select: none;\r\n vertical-align: middle;\r\n appearance: none;\r\n -webkit-appearance: none;\r\n background-color: #ffffff;\r\n border: 1px solid #dcdfe6;\r\n border-color: #dcdfe6;\r\n padding: 8px 15px;\r\n font-size: 14px;\r\n border-radius: 4px;\r\n}\r\n\r\ninput[type="submit"]:hover,\r\ninput[type="submit"]:focus,\r\ninput[type="button"]:hover,\r\ninput[type="button"]:focus,\r\nbutton:hover,\r\nbutton:focus {\r\n color: #409eff;\r\n border-color: #c6e2ff;\r\n background-color: #ecf5ff;\r\n outline: none;\r\n}\r\n\r\ninput[type="url"] {\r\n position: relative;\r\n font-size: 14px;\r\n display: inline-flex;\r\n line-height: 32px;\r\n box-sizing: border-box;\r\n vertical-align: middle;\r\n appearance: none;\r\n -webkit-appearance: none;\r\n /* color: #606266; */\r\n padding: 0;\r\n outline: none;\r\n border: none;\r\n background: none;\r\n flex-grow: 1;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1px 11px;\r\n background-color: #ffffff;\r\n background-image: none;\r\n border-radius: 4px;\r\n cursor: text;\r\n transition: box-shadow 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\r\n transform: translateZ(0);\r\n box-shadow: 0 0 0 1px #dcdfe6 inset;\r\n\r\n width: 100%;\r\n width: -moz-available;\r\n width: -webkit-fill-available;\r\n width: fill-available;\r\n}\r\n\r\ninput[type="url"]::placeholder {\r\n color: #a8abb2;\r\n}\r\n\r\ninput[type="url"]:hover {\r\n box-shadow: 0 0 0 1px #c0c4cc inset;\r\n}\r\n\r\ninput[type="url"]:focus {\r\n box-shadow: 0 0 0 1px #409eff inset;\r\n}\r\n';
  6172. const beautifyRadioCSS = 'label.radio-label {\r\n font-weight: 500;\r\n position: relative;\r\n cursor: pointer;\r\n display: inline-flex;\r\n align-items: center;\r\n white-space: normal;\r\n outline: none;\r\n font-size: 14px;\r\n user-select: none;\r\n margin-right: 32px;\r\n height: 32px;\r\n padding: 4px;\r\n border-radius: 4px;\r\n box-sizing: border-box;\r\n}\r\nlabel:has(input[type="radio"]:checked),\r\nlabel:has(input[type="radio"]:checked) a {\r\n color: #409eff;\r\n}\r\nlabel.radio-label input[type="radio"] {\r\n margin-right: 4px;\r\n width: 14px;\r\n height: 14px;\r\n}\r\nlabel.radio-label input[type="radio"]:checked {\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n appearance: none;\r\n border-radius: 50%;\r\n width: 14px;\r\n height: 14px;\r\n outline: none;\r\n border: 4px solid #409eff;\r\n cursor: pointer;\r\n}\r\nlabel.radio-label input[type="radio"]:checked + span {\r\n color: #409eff;\r\n}\r\n';
  6173. const beautifyInputCSS = 'input[type="search"],\r\ninput[type="text"],\r\ninput[type="password"] {\r\n justify-content: center;\r\n align-items: center;\r\n /* line-height: 1; */\r\n /* height: 32px; */\r\n white-space: nowrap;\r\n cursor: text;\r\n text-align: center;\r\n box-sizing: border-box;\r\n outline: 0;\r\n transition: 0.1s;\r\n /* font-weight: 500; */\r\n user-select: none;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n vertical-align: middle;\r\n -webkit-appearance: none;\r\n appearance: none;\r\n background-color: transparent;\r\n border: 0;\r\n padding: 8px 8px;\r\n /* font-size: 14px; */\r\n text-align: start;\r\n /* width: 100%; */\r\n flex: 1;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 4px;\r\n}\r\ninput[type="search"]:hover,\r\ninput[type="text"]:hover,\r\ninput[type="password"]:hover {\r\n box-shadow: 0 0 0 1px #c0c4cc;\r\n}\r\ninput[type="search"]:focus,\r\ninput[type="text"]:focus,\r\ninput[type="password"]:focus {\r\n outline: 0;\r\n border: 1px solid #409eff;\r\n border-radius: 4px;\r\n box-shadow: none;\r\n}\r\n';
  6174. const beautifyTextAreaCSS = "textarea {\r\n display: block;\r\n position: relative;\r\n /*vertical-align: bottom;*/\r\n position: relative;\r\n resize: vertical;\r\n padding: 5px 11px;\r\n line-height: 1.5;\r\n box-sizing: border-box;\r\n width: 100%;\r\n font-size: inherit;\r\n font-family: inherit;\r\n /* color: #606266; */\r\n background-color: #ffffff;\r\n background-image: none;\r\n appearance: none;\r\n -webkit-appearance: none;\r\n box-shadow: 0 0 0 1px #dcdfe6 inset;\r\n border-radius: 4px;\r\n transition: box-shadow 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\r\n border: none;\r\n}\r\ntextarea:focus {\r\n outline: none;\r\n box-shadow: 0 0 0 1px #409eff inset;\r\n}\r\n";
  6175. const beautifyUploadImageCSS = '/* 隐藏 添加: */\r\nlabel[for="discussion_comments_attributes_0_attachments"],\r\nlabel[for="comment_attachments"] {\r\n display: none;\r\n}\r\ninput[type="file"] {\r\n width: 100%;\r\n font-size: 20px;\r\n background: #e2e2e2;\r\n padding: 40px 0px;\r\n border-radius: 10px;\r\n text-align-last: center;\r\n}\r\n';
  6176. const compatibleBeautifyCSS = "#main-header {\r\n background-color: #670000 !important;\r\n background-image: linear-gradient(#670000, #990000) !important;\r\n}\r\n#site-nav-vue {\r\n flex-wrap: wrap;\r\n justify-content: flex-end;\r\n}\r\n.open-sidebar {\r\n border-width: 1px;\r\n border-radius: 3px;\r\n margin-right: 0;\r\n}\r\ninput.search-submit {\r\n transform: translateY(-5%) !important;\r\n margin-left: 10px;\r\n}\r\n#script-content code {\r\n word-wrap: break-word;\r\n}\r\n.code-container ::selection {\r\n background-color: #3d4556 !important;\r\n}\r\n";
  6177. const beautifyTopNavigationBarCSS = "#language-selector {\r\n display: none;\r\n}\r\n/* PC端 */\r\n@media screen and (min-width: 600px) {\r\n body {\r\n --header-height: 50px;\r\n --el-gap: 20px;\r\n }\r\n\r\n header#main-header {\r\n height: var(--header-height);\r\n position: fixed;\r\n top: 0;\r\n width: 100%;\r\n z-index: 55555;\r\n padding: unset;\r\n display: flex;\r\n justify-content: space-around;\r\n }\r\n\r\n body > .width-constraint {\r\n margin-top: calc(var(--header-height) + 35px);\r\n }\r\n\r\n header#main-header .width-constraint {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--el-gap);\r\n padding: unset;\r\n margin: unset;\r\n max-width: unset;\r\n }\r\n\r\n header#main-header a {\r\n text-decoration: none;\r\n text-wrap: nowrap;\r\n }\r\n\r\n header#main-header .sign-out-link a {\r\n text-decoration: underline;\r\n }\r\n\r\n header#main-header #site-name {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n header#main-header #site-name img {\r\n width: calc(var(--header-height) - 5px);\r\n height: calc(var(--header-height) - 5px);\r\n }\r\n\r\n /* 隐藏Greasyfork文字 */\r\n header#main-header #site-name-text {\r\n display: none;\r\n }\r\n\r\n header#main-header #site-nav {\r\n display: flex;\r\n flex-direction: row-reverse;\r\n align-items: center;\r\n flex: 1;\r\n justify-content: space-between;\r\n height: 100%;\r\n gap: var(--el-gap);\r\n }\r\n\r\n header#main-header #site-nav nav li {\r\n padding: 0 0.5em;\r\n display: flex;\r\n align-items: center;\r\n height: var(--header-height);\r\n min-width: 30px;\r\n justify-content: center;\r\n }\r\n\r\n header#main-header #site-nav nav li:hover {\r\n background: #5f0101;\r\n }\r\n\r\n header#main-header #nav-user-info {\r\n max-width: 150px;\r\n }\r\n\r\n header#main-header #nav-user-info > span {\r\n /*flex: 1;*/\r\n flex: 1 0 auto;\r\n }\r\n\r\n header#main-header #nav-user-info,\r\n header#main-header #nav-user-info + nav {\r\n position: unset;\r\n width: unset;\r\n display: flex;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n }\r\n}\r\n/* mobile端 */\r\n@media screen and (max-width: 600px) {\r\n header#main-header #site-name-text h1 {\r\n line-height: normal;\r\n padding-bottom: 0;\r\n }\r\n /* 美化移动端顶部导航栏的更多 */\r\n #mobile-nav nav {\r\n font-size: 1rem !important;\r\n }\r\n /* 添加鼠标悬浮效果 */\r\n #mobile-nav nav li:hover {\r\n background: #840404;\r\n }\r\n /* 去除链接下划线 */\r\n #mobile-nav nav li a {\r\n text-decoration: none;\r\n }\r\n}\r\n";
  6178. const beautifyHomeCSS = '.browser-list li::before,\r\n.browser-list-selector::before {\r\n content: "";\r\n width: 22px;\r\n height: 22px;\r\n display: inline-block;\r\n vertical-align: -4px;\r\n margin: 0px 5px;\r\n background-size: 100% 100% !important;\r\n background-repeat: no-repeat !important;\r\n}\r\n/* Desktop */\r\n.browser-list-selector[data-for="desktop-browser-list"]::before {\r\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAQklEQVQ4jWP87if3nwEH4Nz0iLF+FwNO+UY3BkYmXJLEglEDqGAAxYCRYcl7nPHMECPI+H8n7nTA6D6aDgaHARQDAKgRDRsLiHU6AAAAAElFTkSuQmCC");\r\n}\r\n/* Android */\r\n.browser-list-selector[data-for="android-browser-list"]::before {\r\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAALVBMVEX///893IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93IQ93ITplTBcAAAAD3RSTlMAkMBA/2DwECCAUKBw0DCZFhB0AAAAj0lEQVR4AWOgF2BUgLGYBMAUsytMIMQAQqsVQGj2JKhEywSOlZu0ZzVwesAM8bniAgS+RwSgAjwuUHAAqlUFJuAEMeyZCxzkgfh8KQgBtwdAgVoXJHAdKCCCLOAIdCdQoS2Edxmo2YCBCeiAaojAdqBzFBhagKwUqJFA7MFwxAUF+DCooAo4MbigAUyBQQIAqJE/SmDXXYoAAAAASUVORK5CYII=");\r\n}\r\n/* iOS */\r\n.browser-list-selector[data-for="ios-browser-list"]::before {\r\n background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzEyNjg4ODM1MTk5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2ODQiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjIiIGhlaWdodD0iMjIiPjxwYXRoIGQ9Ik04NDkuMTI0IDcwNC44OTZjLTEuMDQgMy4xNTgtMTcuMyA1OS44NzMtNTcuMjUgMTE4LjE5MS0zNC41NzggNTAuMzA2LTcwLjMzMyAxMDEuMDE5LTEyNi44MDMgMTAxLjkxLTU1LjUzMyAwLjk3NS03My4zMDMtMzMuMTM2LTEzNi43MDctMzMuMTM2LTYzLjMyNCAwLTgzLjIzIDMyLjI0NS0xMzUuNzEzIDM0LjExMS01NC4yNTUgMi4yMjEtOTYuMDA0LTU0Ljk1MS0xMzAuNzEyLTEwNS4wMTEtNzAuOTM1LTEwMi41NS0xMjUuNTUzLTI5MC42LTUyLjMwMS00MTYuNjI2IDM2LjA0LTYzLjA1NSAxMDAuODItMTAzLjEzNiAxNzEuMzY0LTEwNC4yMzEgNTMuMTYxLTEuMDA1IDEwMy43NCAzNi4wMTIgMTM2LjAyOSAzNi4wMTIgMzMuMTcxIDAgOTQuMzU3LTQ0Ljc5MSAxNTguOTA2LTM4LjA5IDI3LjAyNiAxLjE1MiAxMDIuNjIyIDExLjI5OSAxNTEuMzI4IDgxLjg5Mi0zLjgzMiAyLjYwNy05MC40NTIgNTMuNzI0LTg5LjQ4NyAxNTcuNzYgMS4zMDIgMTI1LjU5NyAxMTAuMTc0IDE2Ni43OSAxMTEuMzQ2IDE2Ny4yMThNNjMzLjY5NyAyMzAuNzVjMjkuMTA4LTM1LjUwNiA0OC4yMzUtODQuMzE0IDQzLjIwMy0xMzIuNzg1LTQxLjU2IDEuNjMtOTIuMTk3IDI3LjYtMTIyLjI5MiA2Mi44OTctMjYuNjA5IDMwLjc5NC01MC4wNjIgODAuMzYyLTQzLjUyIDEyOC4yNyA0Ni4xNzcgMi44MDUgOTMuNjU3LTI0LjE4MiAxMjIuNjA5LTU4LjM4MiIgcC1pZD0iMTY4NSIgZmlsbD0iIzAwMDAwMCI+PC9wYXRoPjwvc3ZnPg==");\r\n}\r\n/* Chrome */\r\n#desktop-browser-list li:nth-child(1)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* Firefox */\r\n#desktop-browser-list li:nth-child(2)::before,\r\n#android-browser-list li:nth-child(1)::before {\r\n background: url("data:image/x-icon;base64,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9zEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxDeYQbgzkrmoN4v9jEOD/WCDr/1Av+v9NMv3/SzP+/0k1/v9HNv//Rjf//0U5//9EO///Qz3//0I///9BQP//QEL//z9D//8+Rf//PUb//zxH//88SP//O0r//ztK//86S///Okz//zpN//85Tf//OU3//zlO//85Uf//OVb//zlb//85YP//RVT5/1dE8v9cR/T/XU72/1tU97lVXvkVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuDOV0aw3j+2QQ4f9XIu7/TjH8/0sz/v9JNf7/Rzb//0Y4//9FOv//Qzz//0I9//9BP///QEL//z9D//8+Rf//PUf//zxI//87Sv//O0v//zpM//85Tf//OU///zhQ//84Uf//N1H//zdS//83Uv//NlP//zZW//84W///OGD//zhk//84af//OG7//0Zh+f9XUfT/Wlb2/1pb+P5XYfiBOIj+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8N5S9tDOTgZw/h/1gh7v9NMv3/SjT+/0g2//9GN///RTr//0M8//9CPv//QUD//0BC//8+RP//PUb//zxI//87Sv//OUz//zhN//83T///NlH//zZS//81U///NFT//zVU//81Vf//NFb//zRX//8zWP//M1v//zRg//81Zf//Nmr//zdu//83cv//N3f//zh6//9Jafn/WF32/1lj+P9XafnnVG76OQAAAAAAAAAAAAAAAAAAAAAAAAAAdQ7oBG4M5JhqDeL/Wx3r/0wy/f9INf//Rzf//0U5//9EO///Qj3//0FA//8/Qv//PkT//z1G//88Sf//O0v//zhN//86T/z/SU7o/11Ly/9tSLX/dEer/3FIrv9nSrz/VU3W/0BS8v80Vf//M1b//zJZ//8xX///MmX//zNq//80bv//NHP//zZ3//82e///N4D//ziE//88hP7/UG/5/1dr+P9Xcfr/VXX6pEp4/AYAAAAAAAAAAAAAAAAAAAAAbw3lNG0M4+hhF+j/TDH7/0c2//9GOP//RDr//0M9//9BP///QEL//z5E//89R///PEn//zpL//85Tf//OFH+/1BP3P+BRJr/oT1s/606XP+wOVj/sTlX/7A5V/+wOFv/rTdm/5w6gf9zRLf/QlPv/zRZ//82Xv//NGf//zJx//8zd///NHz//zSA//80hP//NYj//zeM//84kP//QYn9/1N0+P9VePr/U3377lB/+z4AAAAAAAAAAAAAAAAAAAAAbwzkiWgQ5f9QLPf/Rjf//0U5//9DPP//Qj7//0BB//8/Q///PUb//zxJ//86S///OU7//zdQ//84Wfj/alK0/6M+af+xOVf/sDlY/685Wf+vOVn/sDpZ/7A5Wf+xN13/szRh/7YxZP+2L2r/mzeN/1NW3P8zZ///N2j//zdt//81ev//M4T//zKI//8zjP//NJD//zaU//83mP//OZr//0uG+/9Uf/r/U4X7/1CI+5Ywjv8BAAAAAAAAAABxDeYYbQzk0lof7/9GN///RDr//0M9//9BP///P0L//z5F//88SP//O0v//zlN//84UP//NlL//zVi9/90WKL/rTtb/7A5WP+vOVn/sTpZ/7M8Wf+1Pln/tj9Z/7c+W/+4O1//uDdk/7cyaP+3Lmz/uSpv/6cxhv9UYNz/MXf//zZ2//83dv//Nn///zOO//8ylf//M5j//zWc//82n///N6P//0Cc/v9RiPv/Uoz7/1CR/NtLlP0gAAAAAAAAAABwDORKZxLn90sx+v9DO///Qj3//0BB//8/Q///PUb//ztJ//86TP//OE///zdS//82VP//L2b9/2hkrv+tO1v/sDlY/7E6Wf+0Pln/uEFZ/7tFWf++R1n/v0ha/8FGXv/CQmP/wT5n/8A4bP++M2//uyx0/7smdf+fN5T/QXju/zGF//81g///OIL//zmH//82lf//MqD//zSj//81pv//Nqr//zmr//9Mlfz/UZL8/1CY/ftNm/1XAAAAAAAAAABvDOSFWiHw/0M7//9CPv//QEL//z5E//88SP//O0v//zlO//84Uf//NlP//zRW//8uYf//RXjV/6VBZf+wOVj/sjxZ/7hBWf+9Rln/wUpZ/8RNWv/HTlv/yU9d/8tMYv/MSWf/y0Rr/8o/cP/HOHT/xDF4/78qe/+8JHz/d1a6/y6R//8xj///No7//zmN//9Ghf3/PJr+/zOq//81rf//NrD//za0//9Fpf7/UJn9/1Cf/f9Nov2SAAAAAHkI4whqEee1TDH5/0FA//8/Qv//PkX//zxJ//86TP//OU///zdS//81Vf//M1j//zFb//8of/v/fl2T/7M2WP+zPFr/uUJZ/79IWf/FTVr/yVBc/81SXv/QVGD/01Vi/9VTZv/VTmz/1Upw/9NEdf/QPnj/zDZ9/8cvgP/BJ3//pjWR/zyO7/8tnP//Mpr//zaZ//9Djv3/ToX8/zum/v81tP//Nbb//za6//8/s///T6H9/0+m/v9Oqf7BRqb+DnYH4hxgHO3WQz3+/z9D//89Rv//O0n//zpN//84UP//NlP//zRW//8yWf//MVz//ypq//83jOX/pT9w/7Y2X/+7P17/wkdd/8hOXf/OUl//0lVi/9ZWZP/ZWGb/3Flo/95XbP/eU3H/3k52/9xIev/ZQn7/1TqD/84zhP/GLIP/uyeE/1h71f8oqf//L6X//zOk//88nP//Tof9/0uT/f85s///Nr3//zbA//87v///Tar+/0+r/v9Nr/7dSK7+I3IK5DJUKvToP0P//z1G//87Sv//OU3//zhR//82VP//NFf//zJa//8wXf//LmD//yN///9Ogs3/tDRo/7w6Zf/DQmT/y0pk/9FSY//XV2T/21ln/99aav/iW2z/5Vxv/+Zacv/mVnj/5lF8/+RLgf/hRYX/3D6H/9Q3h//LMIf/xCaF/3JpwP8ms///La///zGu//85p///SpD//06R/v9HpP7/OMH//zjF//87xv//SbT+/02x/v9Ltv/rSLb/N2kU6URKNvnyPEf//ztK//85Tv//N1H//zVV//8zWP//MVv//y9f//8tYv//K2X//x+Q//9HjNb/tThx/8Q8av/LRWr/001r/9pUa//fWWv/41tt/+dccP/qXHP/7F12/+5bev/uV3//7lOD/+tNiP/nSIr/4UGL/9k6i//QMov/ySeI/4Netv8nuv//Krn//y+3//83sP//SJn//0uZ//9Nnf7/QLn+/zjL//86zP//Rr3//0y4//9Lvf/zSL3/R1wj8VBCQPz2Okv//zlO//83Uv//NVX//zNY//8xXP//L2D//y1j//8rZv//KGv//yCa//8krfr/f2ur/8s+cf/URnD/2k9x/+FVcv/nWnP/61x1/+5deP/xXHv/81x+//Vbgv/1V4f/9FOL//FOjv/rSY//5EOQ/908kf/TNJD/zSmN/4lht/8qwP//KsH//y3A//82uP//R6H//0mh//9Lo/7/Sa/+/zrM//850v//RMb//0u///9KxP/2SMT/UE40908+R/72OU7//zdS//81Vf//Mln//zBc//8uYP//LGT//ypm//8oav//JXD//yGe//8gtP//Lq71/4N3tf/PT4L/5E14/+tTef/vWHv/81t9//VbgP/2W4T/+FqH//pYi//7Vo7/+FKR//NOk//uSZT/50OV/989lP/WNZT/zyuQ/4Jxw/8sx///Lsb//y7G//82vP//Rqj//0ep//9Kq///TK7+/0DI//861///RMz//0rG//9Jy//2SMn/UUZD+kI7Tf7xN1H//zVV//8yWf//MF3//y5g//8sZP//KWj//yV3//8gi///IJr//yCr//8jtf//JLj//yq6/f9VouH/lYG4/8Rsnv/eY5L/6mGP//Ncjv/9Voz//FeQ//xWkv/7VJX/+FGX//ROmP/vSZn/6EOa/+A9mv/YNpj/zi+W/2yN1v8vzf//Msr//zLL//87vP//Ra///0ax//9Js///S7T//0bC//882f//RNL//0nN//9J0f/0SNH/Sj9O/S44Uf/mNVX//zNZ//8wXf//LmH//yxk//8pav//IIX//xqi//8brP//HrD//yGz//8ktv//J7r//yi9//8owv//LMT+/zvB+P9OvO//W7rq/3Gv3//Id7D//FSV//pTmP/5UZr/90+d//RMnv/vR5//6UOf/+E9nv/aNZz/wD6l/0607v8z0P//Nc///zbN//9Auv//RLb//0W4//9Iuv//Srv//0nC//9A2f//Rdb//0nT//9I1f/tR9X/OjpY/hg1Vv/RM1j//zBc//8uYP//LGT//ylp//8fhf//GKX//xqq//8drf//ILH//yO0//8luP//KLz//yrA//8sw///Lsb//zDJ//8wzP//MtD//zXW//9OzPX/vX27//dPnf/2TaD/9Uyj//NJpP/uRqT/6EGj/+E8ov/aMp//lXDF/zrR/v840///ONP//zvJ//9Cu///Q7z//0W+//9HwP//SsL//0rF//9E2f//Rtn//0fX//9H2P/gRtf/Jj9b/Ac0Wf+yMVz//y5g//8sZP//Kmj//yVy//8Zmv//GKj//xus//8er///IbP//yS2//8nuv//Kb3//ye7//8isv//Hav//xqp//8bq///Hq///yG2//8lwf//Yaro/+dUqv/0Sab/8kip//FGqv/sQ6n/5z+o/+I3pv/DSbH/Vrnu/znZ//861///OtL//z7D//9Awf//QsP//0XE//9Hxv//Scj//0nK//9F2f//Rtv//0bZ//9G2f/HRdb/EQAAAAAzW/6HL1///yxj//8qaP//J2z//yRx//8gf///HZL//xyh//8eqf//Ia3//yKv//8hrf//HKT//xWb//8Smv//E5///xak//8Yqf//Gq7//zSm9v97hNn/y1y5/+9Iq//wRaz/70Su/+5Dr//qQK7/5zqr/9JDsf9yo+L/O97//zzc//881v//O8n//z7F//9Ax///Qsj//0XK//9HzP//Sc7//0nQ//9H2///Rdz//0Xc//9F2/+fQsf+AgAAAAAzX/5PLWL/+Spn//8na///JW///yN0//8hd///Hnz//xyC//8aif//GY3//xaQ//8Ukf//EpX//xKb//8Uof//F6X//xir//8nqfv/cIfe/8hau//vRqz/8UOt/+5DsP/tQbL/7EGz/+tAs//nPbL/x1W9/3Ks5v9A4P7/Tc32/2Or5f9CxPr/Osr//z3L//9AzP//Qs7//0TP//9H0f//SdP//0nT//9H2///Rd3//0Te//9F3P9oAAAAAAAAAAA0Yf4bLGb/1ihq//8lb///I3P//yF4//8fe///HID//xqE//8XiP//FYz//xOQ//8Slv//E5z//xWh//8Ypv//Gaz//zye8v+qZ8f/60av//BBr//tQbL/7EC0/+s/tv/qPrf/6j64/+g7t//YRbr/mYPT/oKY2/+XeMr/rVG0/2+Q2/86zP//PM7//z/Q//9B0f//QtP//0XU//9H1v//SNb//0jV//5G2v/+Rd7//0Tf/+lD3v8vAAAAAAAAAAAAAAAAKmr/jiZu//8kcv//IXf//x97//8cf///GoT//xeI//8VjP//E5H//xKW//8TnP//FaL//xin//8arP//Qprw/7xXvf/tPq7/7ECz/+s/tv/qPrj/6T25/+g8uv/oO7v/5zu6/+U6t//iObP/3Tev/9swp//QMKT/gn7P/zrN/f850v//PNP//z/U//9B1f//Q9f//0bY//9G2f//R9f//0jW/+hG3P/uRt///0Xg/7FC2/8IAAAAAAAAAAAAAAAAKm7/NiVx/+kidv//IHr//x1+//8ag///GIf//xWM//8TkP//Epb//xOc//8Vov//GKf//xus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//85TP//QU3z/15Jyv95RaX/hEOV/4JEl/9zRq7/VkzX/zlV+f8yWv//MmT//zNt//80dP//NXr//zaB//84h///R3v7/1Zv+P9VdvrHUHz7FQAAAAAAAAAAbwvjU2MW6fhLMvv/RTn//0M9//9AQP//PkT//zxI//86TP//N1L//1RS1f+RQYL/rDpc/7E5Vv+yOVb/sjhX/7Q1Xv+uM27/iT2g/0dZ6v80aP//NXH//zN///8zh///NI3//zaT//87lf7/ToH7/1OB+/pQh/tbAAAAAH0G4wRrD+WiUin1/0Q7//9CPv//P0P//z1H//87S///OU///zRW//9VXcz/oUFq/7E5Vv+yPFn/tj9Z/7hBWf+6P13/ujpk/7ozav+6K27/mDmX/0Nu7v80ev//N3///zSO//8zmf//NZ7//zek//9Dmf3/Uoz7/1CT/KtGnP4GdAfiIWAb7NlGOf3/QUD//z5E//88Sf//OU3//zdS//8zV///Pmvl/5lIcv+zOlf/t0BZ/75HWf/DS1r/xk1c/8lKYv/JRGn/xzxw/8Iydv++J3n/flC0/zGM/v81jP//PIr+/zyW/v80qf//Nq7//zut//9Omv3/T57930uh/SdtDuVKUiv180BB//8+Rv//O0r//zhP//82VP//M1f//ytr//9sZKv/tDha/7pCW//DS1r/ylBd/9BUYP/VVWP/11Np/9dMcP/VQ3f/zzl9/8gtgP+tM47/QYzr/y+f//84mf//Sor9/z2l/v81uP//OLv//0qp/v9Pp/72TKv+UmIb7G9GOvv9PUf//zpL//84UP//NVX//zJa//8vXv//K4D4/5JPiP++OWH/x0hi/9BSYv/YV2X/3llp/+JbbP/kWHL/5FF5/+JJgP/bP4X/0TSG/8Erh/9ZgNb/KbD//zOq//9GlP7/S5f9/zu5//84xf//Rbf+/02x/v5Ltf91VCz0hz9E/v86TP//N1H//zRW//8xW///LmD//ypn//8llfv/iF6c/8o8af/TS2z/3VZt/+Rbb//pXHP/7Vx3//Baff/wVIT/7EyK/+NDjP/YOI3/yyuL/2l7zP8nvv//MLj//0Ki//9Mm/7/RbD+/znM//9CxP//S7v//0q//4lGPfqOO0v//zdS//80V///MFz//y1h//8qZv//JnD//x+j//88oej/o2Kb/9xOef/rVHf/81l5//Zafv/3WoT/+ViK//dUj//xTZL/6EWT/9w7lP/PL5H/aofS/yrH//8ww///Qqz//0mn//9Krv7/Pcz//0DO//9Kxv//Scn/jz5L/X83Uf//NFf//zBd//8tYv//KG3//yGI//8fnf//Ia///yO5//81tPb/bJrT/6CEt/+7fav/2G6g//tXkf/8VJT/+VKY//NMmv/qRJv/3zua/8s3nP9YpOX/MM7//zXH//9Ds///R7P//0q2//9Eyf//QtX//0nP//9I0v+GOFT+XzRX//owXP//LWL//yhu//8clP//Gqv//x+x//8jtf//J7v//ynB//8qxv//L8j//zbL/v9MxvT/sYW///ZQnf/2TaD/8kmj/+pDov/hN5//rli2/0DI+f820///PMb//0O6//9Gvf//ScD//0fL//9F2v//SNb//UfX/241Wf46MVz/7C1i//8qZ///Inr//xqf//8cq///ILH//yS2//8ltv//IK///xup//8aqv//G7D//ye2/f9zmN//6VCr//JHqf/vRav/6T2p/9RBrf9qp+T/ONv//zvR//8+w///QsT//0XG//9Jyf//SND//0Xc//9G2v/zRtn/STZb/hYvYf/NKmf//yZt//8jdP//H3///xyN//8blv//GZn//xWZ//8Tm///FKL//xqp/v9Nluz/qGrI/+RLsf/vQ6//7UKy/+s/sv/TTbj/fp7f/03N9v9Qv/L/O8r//z7K//9CzP//Rc7//0jR//9I1f//Rt3//0Xd/9lF2/8hAAAAACxn/40nbP//I3P//yB5//8cf///GIX//xWL//8Sk///E5z//xak//8gqP3/eX7a/9xMtv/wQLH/7D+1/+o+t//pPbn/5jy3/75cwv+hcsj/n2S//1Wu7P860P//P9H//0LT//9G1v//SNb//0fX//lF3v//RN//o0HZ/wQAAAAAKW3/OyRx/+0heP//HX///xmF//8VjP//EpT//xOd//8Wpf//Gqz/9HF82+LfP7H+6jy0/+k9uf/oPLv/5zu7/+c6uf/lOLT/4TOs/75JtP9ipOT/ONT//zzW//9A2P//RNr//0ba//9H2P/4R9r/0Ebg//RG4P9RAAAAAAAAAAAubf4FI3f/mx59//8ahP//Fov//xOS//sYl//6HZz//yae//8unP+1uUu+LN83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");\r\n}\r\n/* Safari */\r\n#desktop-browser-list li:nth-child(3)::before,\r\n#ios-browser-list li:nth-child(1)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* Edge */\r\n#desktop-browser-list li:nth-child(4)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* Opera */\r\n#desktop-browser-list li:nth-child(5)::before {\r\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALzSURBVHgBzVdNUhNREO5+k7BwoeOOAiyGnWVBam7AcAL1BIQTBE9AOIHhBJIToCdIcgISQMqdY2koqlwYS90Q3rQ9P8lkmPfmz6LkWyQv0/26v9fd6ekH8J+BUBK0/NwCqDsgyEoKcAg0HeL1JxdKoBABMi0THj1u8bIJeMdxGi6bbYO8GRQhk0uAVhoH7HSfl6ZGZQLgvQc0OAL0M9zEJBEtjspnvDo7hCoEglAbtRNWsdUKfFJBe/jtoh/qb3JaxDavbLZqRtYnTMLF8dmbUgRC5/UeLy31NjrC8cX+/NfqCyYp3rI5R63PZOV0R5USLO1cyD38enmsEtHqVpO/mIgyXUoSIqWW5RzpUOc8EI/PWSZ3IKiLFPhgSyd3HyYIBAWnDTscc77bkAMcXw75U1N4ZNPKZjuhPxflhV4aG3g9dKEgOB2+LUchmsAftjUZBlGKI2DUHcg6fQnnAThdGgn3lNt5AS+m4AB0uJFHUBLR33OiFsLLBIGwvWpPP8Hvfl4rwIMPagHakc8oAvW6rbdC1ZwH1j39XkM4MQFJGQRgBJUJCFcr89CMCWSBNHksginp92JRAveMfAKI63CPEJETV6tB8BSqwsiqLTyNCUijr9eDbagKFPq9njGaE4i6nKtRNWmN3/VVQKCZJWg466xi4WEX9IZeQVnfz7b8PZZSiKIzW8YElmr+Q83fBndnnaswPFS3dn+SkmKQIoAuv52IdD3f5JfVOygIWmu0gtFMBUHdxRdbeiJabZxqNxO284bMcDwzeqCaivj0eHW+keCTUpLidRAmFZDa0dCicd7YzXLOlb+TMqk0tGxbPPv1WGqBUiEZiUDfkH6KHLV+6Fw1U2SM5TkkogsIj9zdWP+2mewbfoPju4KsdXQDTf7FZI1nOA93M4hw8UKfNUes50INnwB5G0ELJ2+A44+dLPvFrmZhiB1etbQXlVi7z1YH8JtPHc19/0wgRaYuba6DdfC88D0hxA8u0C/wy+gXcfqg8BeNgChJhUErggAAAABJRU5ErkJggg==");\r\n}\r\n/* Maxthon */\r\n#desktop-browser-list li:nth-child(6)::before,\r\n#android-browser-list li:nth-child(2)::before {\r\n background: url("data:image/x-icon;base64,AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAABAQAAAAQAgAChCAABGFQAAKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALx5LVC9gi3pvoou/7+TL/+/my//wKMw/8CsMP/BtDH/wr0y/8LFMv/DzjP/w9Yz/8TeNP/F4zX/xOQ16cbmM1C8dSzpvX0t/76FLv++ji7/v5Yv/7+fL//ApzD/wa8x/8G4Mf/CwDL/wsky/8PRM//E2jT/xOE0/8XkNf/E5DXpvG8s/714Lf+9gC3/voku/76RLv+/mi//wKIw/8CrMP/BszH/wbsx/8LEMv/DzDP/w9Uz/8TdNP/E4zT/xeQ1/7xrLP+8cyz/vXst/76ELv++jC7/v5Uv/7+dL//ApjD/wa4x/8G3Mf/CvzL/wscy/8PQM//D2DP/xOA0/8XkNf+7Ziv/vG4s/799Nv/gxJ3/4Mid/8+tZP/KqlT/4dSe/+HYnv/JvEz/1M9v/+Ljn//j56D/xtY+/8TcNP/E4zT/u2Er/7xpLP/Cfj/////////////dxJP/1LZ0////////////0MJk/+Tepv///////////8nUR//D1zP/xN80/7tcK/+7ZCv/wnk+////////////3cGT/9OzdP///////////8++ZP/k3Kb////////////Jz0f/w9Iz/8TbNP+6Vyr/u18r/8J1Pv///////////92/k//Mo13/6tu8/+revP/Ks1P/49ql////////////yMtG/8PNM//D1jP/ulIq/7tbK//BcD7////////////dvZL/voUu/76NLv+/li//v54v/9jMmv/4+Pj//////8jHRv/CyDL/w9Ez/7pNKv+6Vir/wWw+////////////+vbw//bu5P/27+T/9vDj//bx4//x7+n/7u7u//n5+f/Iwkb/wsMy/8PMM/+6SSr/ulEq/8FoPv/////////////////////////////////////////////////k3an/wbcy/8K/Mv/CxzL/ukgq/7pMKv+9XDT/3rCZ/960mf/euJn/372a/9/Bmv/fxZr/4Mma/+DNm//YxoL/wKkw/8GxMf/BujH/wsIy/7pIKv+6SCr/ulAq/7pYKv+7YCv/vGks/7xxLP+9ei3/vYIt/76LLv+/ky//v5sv/8CkMP/ArDD/wbUx/8K9Mv+6SCr/ukgq/7pLKv+6Uyr/u1wr/7tkK/+8bCz/vHUs/719Lf++hi7/vo4u/7+XL/+/ny//wKcw/8GwMf/BuDH/uUco6bpIKv+6SCr/uk4q/7pXKv+7Xyv/vGgs/7xwLP+9eC3/vYEt/76JLv+/ki//v5ov/8CjMP/AqzD/wbMw6blGJlC5Ryjpukgq/7pKKv+6Uir/u1or/7tjK/+8ayz/vHQs/718Lf++hC7/vo0u/7+VL/+/ni//wKYv6b+vMFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBfCwpvYEssr6GLfS+ii7/vo4u/7+SL/+/li//v5ov/8CfMP/AozD/wKcw/8GrMf/BsDH/wbQx/8G4Mf/CvDL/wsAy/8LFMv/DyTP/w80z/8PRM//E1TP/xNo0/8TeNP/E4jT/xeQ1/8XkNf/E5DT0xOQ0ssfmMikAAAAAu3YsKb17LfC9fy3/voMu/76HLv++iy7/v5Av/7+UL/+/mC//v5wv/8CgMP/ApTD/wKkw/8GtMf/BsTH/wbYx/8K6Mv/CvjL/wsIy/8LGMv/DyzP/w88z/8PTM//E1zT/xNs0/8TgNP/F4zX/xeQ1/8XkNf/F5DX/xeM08MLhMSq9dCuyvXgt/718Lf++gC7/voUu/76JLv++jS7/v5Ev/7+WL/+/mi//wJ4w/8CiMP/ApjD/wKsw/8GvMf/BszH/wbcx/8K8Mv/CwDL/wsQy/8PIM//DzDP/w9Ez/8PVM//E2TT/xN00/8ThNP/F5DX/xeQ1/8XkNf/F5DX/xOQ0sr1yLPS9di3/vXot/71+Lf++gi7/voYu/76LLv+/jy//v5Mv/7+XL/+/nC//wKAw/8CkMP/AqDD/wawx/8GxMf/BtTH/wbkx/8K9Mv/CwjL/wsYy/8PKM//DzjP/w9Iz/8TXNP/E2zT/xN80/8TjNP/F5DX/xeQ1/8XkNf/E5DT0vG8s/71zLf+9dy3/vXwt/72ALf++hC7/vogu/76MLv+/kS//v5Uv/7+ZL//AnTD/wKIw/8CmMP/AqjD/wa4x/8GyMf/BtzH/wrsy/8K/Mv/CwzL/w8gz/8PMM//D0DP/w9Qz/8TYNP/E3TT/xOE0/8XjNf/F5DX/xeQ1/8XkNf+8bCz/vHEs/711Lf+9eS3/vX0t/76CLv++hi7/voou/76OLv+/ki//v5cv/7+bL//AnzD/wKMw/8CoMP/BrDH/wbAx/8G0Mf/BuDH/wr0y/8LBMv/CxTL/w8kz/8POM//D0jP/xNY0/8TaNP/E3jT/xOI0/8XkNf/F5DX/xeQ1/7xqLP+8biz/vXIt/713Lf+9ey3/vX8t/76DLv++iC7/vowu/7+QL/+/lC//v5gv/7+dL//AoTD/wKUw/8CpMP/BrjH/wbIx/8G2Mf/CujL/wr4y/8LDMv/CxzL/w8sz/8PPM//D1DP/xNg0/8TcNP/E4DT/xeM1/8XkNf/F5DX/vGgs/7xsLP+8cCz/vXQt/714Lf+9fS3/voEu/76FLv++iS7/vo4u/7+SL/+/li//v5ov/8CeMP/AozD/wKcw/8GrMf/BrzH/wbQx/8G4Mf/CvDL/wsAy/8LEMv/DyTP/w80z/8PRM//D1TP/xNo0/8TeNP/E4jT/xeQ1/8XkNf+8ZSz/vGks/7xuLP+8ciz/vXYt/718L//Chzz/wow8/8KQPP/Ckzz/w5c9/7+UL/+/mC//wqE5/8SnPv/Eqz7/xK8+/8WzP//DtDj/wbUx/8K6M//Gw0D/xsZA/8bKQf/HzkH/x9JB/8TUNv/E1zT/xNs0/8TgNP/F4zX/xeQ1/7tjK/+8Zyz/vGss/7xvLP+9dC3/yJBS///////////////////////9+/j/v5Ev/7+VL//p3Lr//////////////////////+DXmP/BszH/ycFN////////////////////////////z9pc/8PVM//E2TT/xN00/8ThNP/F5DX/u2Ar/7xkLP+8aSz/vG0s/7xxLP/IjVL///////////////////////37+P+/jy//v5Mv/+ncuv//////////////////////4NaY/8GwMf/Jvk3////////////////////////////P2Fz/w9Iz/8TWNP/E2zT/xN80/8TjNP+7Xiv/u2Ir/7xmLP+8aiz/vG8s/8iMUv///////////////////////fv4/76MLv+/kC//6du6///////////////////////g1Zj/wa4x/8m8Tf///////////////////////////8/WXP/D0DP/w9Qz/8TYNP/E3DT/xOE0/7tbK/+7YCv/u2Qr/7xoLP+8bCz/yIlS///////////////////////9+/j/voou/76OLv/p2rr//////////////////////9/UmP/BrDH/ybpN////////////////////////////z9Rc/8PNM//D0jP/xNY0/8TaNP/E3jT/u1kr/7tdK/+7YSv/vGYs/7xqLP/IiFH///////////////////////37+P++hy7/vowu/+nZuv//////////////////////39KY/8CpMP/JuE3////////////////////////////P0lz/w8sz/8PPM//D0zP/xNg0/8TcNP+7Viv/u1sr/7tfK/+7Yyv/vGcs/8iFUf///////////////////////fv4/76FLv++iS7/6di5///////////////////////f0Zj/wKcw/8m2TP///////////////////////////87QW//DyDP/w80z/8PRM//D1TP/xNk0/7pUKv+7WCv/u1wr/7thK/+8ZSz/yIRR///////////////////////9+/j/voIu/76HLv/NpmD/1rd5/9a5ef/WvHn/1r95/8uxVf/ApDD/yLRM////////////////////////////zs9b/8LGMv/DyjP/w84z/8PTM//E1zT/ulIq/7pWKv+7Wiv/u14r/7tiK//IgVH///////////////////////37+P+9gC3/voQu/76ILv++jS7/v5Ev/7+VL/+/mS//wJ4w/8CiMP/Iskz////////////////////////////OzFv/wsQy/8PIM//DzDP/w9Az/8PUM/+6Tyr/ulMq/7tYK/+7XCv/u2Ar/8iAUf///////////////////////fv4/71+Lf++gi7/voYu/76KLv++ji7/v5Mv/7+XL/+/my//wJ8w/8GpRv/Z2dn/6urq//v7+////////////87LW//CwTL/wsUy/8PKM//DzjP/w9Iz/7pNKv+6USr/ulUq/7tZK/+7Xiv/x35R///////////////////////+/f3/7t3I/+7eyf/u38n/7uDJ/+7hyf/u4sn/7ePI/+3kyP/t5cn/6+TM/93d3f/d3d3/3t7e/+zs7P/7+/v/zslb/8K/Mv/CwzL/wscy/8PLM//D0DP/ukoq/7pOKv+6Uyr/u1cr/7tbK//He1H////////////////////////////////////////////////////////////////////////////////////////////////////////////Ox1v/wrwy/8LAMv/CxTL/w8kz/8PNM/+6SCr/ukwq/7pQKv+6VCr/u1kr/8d6Uf//////////////////////////////////////////////////////////////////////////////////////////////////////6+fB/8O4N//CujL/wr4y/8LCMv/CxjL/w8sz/7pIKv+6Sir/uk4q/7pSKv+7Viv/x3dR/////////////////////////////////////////////////////////////////////////////////////////////////+fgsv/CsDT/wbMx/8G3Mf/CvDL/wsAy/8LEMv/DyDP/ukgq/7pIKv+6Syr/ulAq/7pUKv/HdlH////////////////////////////////////////////////////////////////////////////////////////////i1qL/wKkx/8GsMf/BsTH/wbUx/8G5Mf/CvTL/wsIy/8LGMv+6SCr/ukgq/7pJKv+6TSr/ulEq/7tXLP+9YDP/vWQz/75oM/++bDT/vnA0/751NP+/eTX/v301/7+BNf/AhTX/wIk2/8CNNv/BkTb/wZU3/8GZN//BnTf/wqE3/8CiMP/ApjD/wKow/8GuMf/BsjH/wbcx/8K7Mv/CvzL/wsMy/7pIKv+6SCr/ukgq/7pLKv+6Tyr/ulMq/7tXK/+7XCv/u2Ar/7xkLP+8aCz/vGws/7xxLP+9dS3/vXkt/719Lf++gi7/voYu/76KLv++ji7/v5Iv/7+XL/+/my//wJ8w/8CjMP/AqDD/wawx/8GwMf/BtDH/wbgx/8K9Mv/CwTL/ukgq/7pIKv+6SCr/ukgq/7pNKv+6USr/ulUq/7tZK/+7XSv/u2Ir/7xmLP+8aiz/vG4s/71yLf+9dy3/vXst/71/Lf++gy7/vogu/76M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Lv+/ji//v5Av/7+TL/+/lS//v5cv/7+ZL/+/my//wJ0w/8CfMP/AoTD/wKMw/8CmMP/AqDD/waox/8GsMf/BrjH/wbAx/8GyMf/BtDH/wbYx/8K5Mv/CuzL/wr0y/8K/Mv/CwTL/wsMy/8LFMv/DxzP/w8kz/8PMM//DzjP/w9Az/8PSM//D1DP/xNY0/8TYNP/E2jT/xNw0/8TeNP/E4TT/xeM1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNJ4AAAAAvnMoM711LP69eC3/vXot/718Lf+9fi3/voAu/76DLv++hS7/vocu/76JLv++iy7/vo0u/7+PL/+/kS//v5Mv/7+WL/+/mC//v5ov/8CcMP/AnjD/wKAw/8CiMP/ApDD/wKYw/8CpMP/BqzH/wa0x/8GvMf/BsTH/wbMx/8G1Mf/BtzH/wrky/8K8Mv/CvjL/wsAy/8LCMv/CxDL/wsYy/8PIM//DyjP/w8wz/8PPM//D0TP/w9Mz/8TVNP/E1zT/xNk0/8TbNP/E3TT/xN80/8ThNP/F4zX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DT+w+EyM7xzK5m9dS3/vXct/715Lf+9ey3/vX0t/75/Lv++gS7/voMu/76GLv++iC7/voou/76MLv+/ji//v5Av/7+SL/+/lC//v5Yv/7+ZL/+/my//wJ0w/8CfMP/AoTD/wKMw/8ClMP/ApzD/wKkw/8GsMf/BrjH/wbAx/8GyMf/BtDH/wbYx/8K4Mv/CujL/wrwy/8K/Mv/CwTL/wsMy/8LFMv/DxzP/w8kz/8PLM//DzTP/w88z/8PRM//D1DP/xNY0/8TYNP/E2jT/xNw0/8TeNP/E4DT/xOI0/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XjNJm9cSzavXMt/712Lf+9eC3/vXot/718Lf+9fi3/voAu/76CLv++hC7/voYu/76JLv++iy7/vo0u/7+PL/+/kS//v5Mv/7+VL/+/ly//v5kv/7+cL//AnjD/wKAw/8CiMP/ApDD/wKYw/8CoMP/BqjH/wawx/8GvMf/BsTH/wbMx/8G1Mf/BtzH/wrky/8K7Mv/CvTL/wr8y/8LCMv/CxDL/wsYy/8PIM//DyjP/w8wz/8POM//D0DP/w9Iz/8TUNP/E1zT/xNk0/8TbNP/E3TT/xN80/8ThNP/F4zX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DXavHEs+b1yLf+9dC3/vXYt/715Lf+9ey3/vX0t/71/Lf++gS7/voMu/76FLv++hy7/voku/76MLv+/ji//v5Av/7+SL/+/lC//v5Yv/7+YL/+/mi//wJww/8CfMP/AoTD/wKMw/8ClMP/ApzD/wKkw/8GrMf/BrTH/wa8x/8GyMf/BtDH/wbYx/8G4Mf/CujL/wrwy/8K+Mv/CwDL/wsIy/8LFMv/DxzP/w8kz/8PLM//DzTP/w88z/8PRM//D0zP/xNU0/8TXNP/E2jT/xNw0/8TeNP/E4DT/xOI0/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ0+bxvLP+8cSz/vXMt/711Lf+9dy3/vXkt/718Lf+9fi3/voAu/76CLv++hC7/voYu/76ILv++ii7/vowu/7+PL/+/kS//v5Mv/7+VL/+/ly//v5kv/7+bL//AnTD/wJ8w/8CiMP/ApDD/wKYw/8CoMP/BqjH/wawx/8GuMf/BsDH/wbIx/8G1Mf/BtzH/wrky/8K7Mv/CvTL/wr8y/8LBMv/CwzL/wsUy/8PIM//DyjP/w8wz/8POM//D0DP/w9Iz/8PUM//E1jT/xNg0/8TaNP/E3TT/xN80/8ThNP/F4zX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf+8biz/vHAs/71yLf+9dC3/vXYt/714Lf+9ei3/vXwt/71/Lf++gS7/voMu/76FLv++hy7/voku/76LLv++jS7/v48v/7+SL/+/lC//v5Yv/7+YL/+/mi//wJww/8CeMP/AoDD/wKIw/8ClMP/ApzD/wKkw/8GrMf/BrTH/wa8x/8GxMf/BszH/wbUx/8G4Mf/CujL/wrwy/8K+Mv/CwDL/wsIy/8LEMv/DxjP/w8gz/8PLM//DzTP/w88z/8PRM//D0zP/xNU0/8TXNP/E2TT/xNs0/8TdNP/E4DT/xOI0/8XjNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/vGws/7xvLP+8cSz/vXMt/711Lf+9dy3/vXkt/717Lf+9fS3/vn8u/76CLv++hC7/voYu/76ILv++ii7/vowu/7+OL/+/kC//v5Iv/7+VL/+/ly//v5kv/7+bL//AnTD/wJ8w/8ChMP/AozD/wKUw/8CoMP/AqjD/wawx/8GuMf/BsDH/wbIx/8G0Mf/BtjH/wrgy/8K7Mv/CvTL/wr8y/8LBMv/CwzL/wsUy/8PHM//DyTP/w8sz/8POM//D0DP/w9Iz/8PUM//E1jT/xNg0/8TaNP/E3DT/xN40/8TgNP/F4zX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/7xrLP+8bSz/vG8s/71yLf+9dC3/vXYt/714Lf+9ei3/vXwt/71+Lf++gC7/voIu/76FLv++hy7/voku/76LLv++jS7/v48v/7+RL/+/ky//v5Uv/7+YL/+/mi//wJww/8CeMP/AoDD/wKIw/8CkMP/ApjD/wKgw/8GrMf/BrTH/wa8x/8GxMf/BszH/wbUx/8G3Mf/CuTL/wrsy/8K+Mv/CwDL/wsIy/8LEMv/CxjL/w8gz/8PKM//DzDP/w84z/8PRM//D0zP/xNU0/8TXNP/E2TT/xNs0/8TdNP/E3zT/xOE0/8XjNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/8XkNf+8aiz/vGws/7xuLP+8cCz/vXIt/711Lf+9dy3/vXkt/717Lf+9fS3/vX8t/76BLv++gy7/voUu/76ILv++ii7/vowu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+bL//AnTD/wJ8w/8ChMP/AozD/wKUw/8CnMP/AqTD/wasx/8GuMf/BsDH/wbIx/8G0Mf/BtjH/wrgy/8K6Mv/CvDL/wr4y/8LBMv/CwzL/wsUy/8PHM//DyTP/w8sz/8PNM//DzzP/w9Ez/8PUM//E1jT/xNg0/8TaNP/E3DT/xN40/8TgNP/E4jT/xeQ1/8XkNf/F5DX/xeQ1/8XkNf/F5DX/vGks/7xrLP+8bSz/vG8s/71xLf+9cy3/vXUt/714Lf+9ei3/vXwt/71+Lf++gC7/voIu/76ELv++hi7/vogu/76LLv++jS7/v48v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CeMP/AoDD/wKIw/8CkMP/ApjD/wKgw/8GqMf/BrDH/wa4x/8GxMf/BszH/wbUx/8G3Mf/CuTL/wrsy/8K9Mv/CvzL/wsEy/8LEMv/CxjL/w8gz/8PKM//DzDP/w84z/8PQM//D0jP/xNQ0/8TXNP/E2TT/xNs0/8TdNP/E3zT/xOE0/8XjNf/F5DX/xeQ1/8XkNf/F5DX/xeQ1/7xoLP+8aiz/vGws/7xuLP+8cCz/vXIt/710Lf+9di3/vXgt/717Lf+9fS3/vX8t/76BLv++gy7/voUu/76HLv++iS7/vosu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8ChMP/AozD/wKUw/8CnMP/AqTD/wasx/8GtMf/BrzH/wbEx/8G0Mf/BtjH/wbgx/8K6Mv/CvDL/wr4y/8LAMv/CwjL/wsQy/8PHM//DyTP/w8sz/8PNM//DzzP/w9Ez/8PTM//E1TT/xNc0/8TaNP/E3DT/xN40/8TgNP/E4jT/xeM1/8XkNf/F5DX/xeQ1/8XkNf+8Ziz/vGgs/7xrLP+8bSz/vG8s/7xxLP+9cy3/vXUt/713Lf+9eS3/vXst/71+Lf++gC7/voIu/76ELv++hi7/vogu/76KLv++jC7/v44v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CdMP/AnzD/wKEw/8CkMP/ApjD/wKgw/8GqMf/BrDH/wa4x/8GwMf/BsjH/wbQx/8G3Mf/CuTL/wrsy/8K9Mv/CvzL/wsEy/8LDMv/CxTL/w8cz/8PKM//DzDP/w84z/8PQM//D0jP/w9Qz/8TWNP/E2DT/xNo0/8TdNP/E3zT/xOE0/8XjNf/F5DX/xeQ1/8XkNf/F5DX/vGUs/7xnLP+8aSz/vGss/7xuLP+8cCz/vXIt/710Lf+9di3/vXgt/716Lf+9fC3/vX4t/76BLv++gy7/voUu/76HLv++iS7/vosu/76NLv+/jy//v5Ev/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8CgMP/AojD/wKQw/8CnMP/AqTD/wasx/8GtMf/BrzH/wbEx/8GzMf/BtTH/wbcx/8K6Mv/CvDL/wr4y/8LAMv/CwjL/wsQy/8PGM//DyDP/w8oz/8PNM//DzzP/w9Ez/8PTM//E1TT/xNc0/8TZNP/E2zT/xN00/8TgNP/E4jT/xeM1/8XkNf/F5DX/xeQ1/7xkLP+8Ziz/vGgs/7xqLP+8bCz/vG4s/7xxLP+9cy3/vXUt/713Lf+9eS3/wII3/8aPSv/HkUv/x5NL/8eVS//Hl0v/x5lL/8eaS//HnEv/yJ5M/8efSv+/ki//v5Qv/7+XL/+/mS//wp85/8irTf/IrE3/yK5N/8iwTf/Isk3/yLNN/8m2Tf/Jt07/yblO/8m7Tv/BsjH/wbQx/8G2Mf/CuDL/xL05/8rGTv/KyE7/yslO/8rLTv/KzU//y89P/8vRT//L0k//y9RP/8vWT//G1D7/w9Qz/8TWNP/E2DT/xNo0/8TcNP/E3jT/xOA0/8XjNf/F5DX/xeQ1/8XkNf+7Yyv/vGUs/7xnLP+8aSz/vGss/7xtLP+8byz/vXEt/710Lf+9di3/vXgt/9SpeP/////////////////////////////////////////////////7+PL/v5Ev/7+TL/+/lS//v5cv/9S7df//////////////////////////////////////////////////////wbEy/8GzMf/BtTH/wbcx/9LMav//////////////////////////////////////////////////////2+OG/8PTM//E1TT/xNc0/8TZNP/E2zT/xN00/8TfNP/E4TT/xeM1/8XkNf/F5DX/u2Er/7xkLP+8Ziz/vGgs/7xqLP+8bCz/vG4s/7xwLP+9ci3/vXQt/713Lf/UqHj/////////////////////////////////////////////////+/jy/7+QL/+/ki//v5Qv/7+WL//UunX//////////////////////////////////////////////////////8GwMv/BsjH/wbQx/8G2Mf/Sy2r//////////////////////////////////////////////////////9vjhv/D0TP/w9Mz/8TWNP/E2DT/xNo0/8TcNP/E3jT/xOA0/8TiNP/F5DX/xeQ1/7tgK/+7Yiv/vGQs/7xnLP+8aSz/vGss/7xtLP+8byz/vXEt/71zLf+9dS3/1Kd4//////////////////////////////////////////////////v48v+/jy//v5Ev/7+TL/+/lS//1Ll1///////////////////////////////////////////////////////BrzL/wbAx/8GzMf/BtTH/0spp///////////////////////////////////////////////////////b4ob/w9Az/8PSM//E1DT/xNY0/8TZNP/E2zT/xN00/8TfNP/E4TT/xeM1/8XkNf+7Xyv/u2Er/7xjLP+8ZSz/vGcs/7xqLP+8bCz/vG4s/7xwLP+9ci3/vXQt/9SneP/////////////////////////////////////////////////7+PL/v40v/7+QL/+/ki//v5Qv/9S5df//////////////////////////////////////////////////////wa0y/8GvMf/BsTH/wbMx/9LJaf//////////////////////////////////////////////////////2+GG/8PPM//D0TP/w9Mz/8TVNP/E1zT/xNk0/8TcNP/E3jT/xOA0/8TiNP/F4zX/u14r/7tgK/+7Yiv/vGQs/7xmLP+8aCz/vGos/7xtLP+8byz/vHEs/71zLf/Upnj/////////////////////////////////////////////////+/jy/76MLv+/ji//v5Av/7+TL//UuHX//////////////////////////////////////////////////////8GsMv/BrjH/wbAx/8GyMf/SyGn//////////////////////////////////////////////////////9vghv/DzjP/w9Az/8PSM//D1DP/xNY0/8TYNP/E2jT/xNw0/8TfNP/E4TT/xeM1/7tdK/+7Xyv/u2Er/7xjLP+8ZSz/vGcs/7xpLP+8ayz/vG0s/7xwLP+9ci3/1KV4//////////////////////////////////////////////////v48v++iy7/vo0u/7+PL/+/kS//1Ld1///////////////////////////////////////////////////////BqzL/wa0x/8GvMf/BsTH/0sdp///////////////////////////////////////////////////////b4Ib/w8wz/8PPM//D0TP/w9Mz/8TVNP/E1zT/xNk0/8TbNP/E3TT/xN80/8TiNP+7Wyv/u10r/7tgK/+7Yiv/vGQs/7xmLP+8aCz/vGos/7xsLP+8biz/vHAs/9SkeP/////////////////////////////////////////////////7+PL/voou/76MLv+/ji//v5Av/9S2df//////////////////////////////////////////////////////waoy/8GsMf/BrjH/wbAx/9LGaf//////////////////////////////////////////////////////29+G/8PLM//DzTP/w88z/8PSM//D1DP/xNY0/8TYNP/E2jT/xNw0/8TeNP/E4DT/u1or/7tcK/+7Xiv/u2Ar/7tjK/+8ZSz/vGcs/7xpLP+8ayz/vG0s/7xvLP/UpHj/////////////////////////////////////////////////+/jy/76JLv++iy7/vo0u/7+PL//UtXX//////////////////////////////////////////////////////8CpMf/BqjH/wawx/8GvMf/Sxmn//////////////////////////////////////////////////////9vehv/DyjP/w8wz/8POM//D0DP/w9Iz/8TVNP/E1zT/xNk0/8TbNP/E3TT/xN80/7tZK/+7Wyv/u10r/7tfK/+7YSv/vGMs/7xmLP+8aCz/vGos/7xsLP+8biz/1KN3//////////////////////////////////////////////////v48v++hy7/voku/76MLv+/ji//1LV1///////////////////////////////////////////////////////ApzH/wKkw/8GrMf/BrTH/0sVp///////////////////////////////////////////////////////b3Yb/w8kz/8PLM//DzTP/w88z/8PRM//D0zP/xNU0/8TYNP/E2jT/xNw0/8TeNP+7WCv/u1or/7tcK/+7Xiv/u2Ar/7tiK/+8ZCz/vGYs/7xpLP+8ayz/vG0s/9Sid//////////////////////////////////////////////////7+PL/voYu/76ILv++ii7/vowu/9S0df//////////////////////////////////////////////////////wKYx/8CoMP/BqjH/wawx/9LEaf//////////////////////////////////////////////////////292G/8PIM//DyjP/w8wz/8POM//D0DP/w9Iz/8PUM//E1jT/xNg0/8TbNP/E3TT/u1Yr/7tZK/+7Wyv/u10r/7tfK/+7YSv/vGMs/7xlLP+8Zyz/vGks/7xsLP/UoXf/////////////////////////////////////////////////+/fy/76FLv++hy7/voku/76LLv/Us3T//////////////////////////////////////////////////////8ClMf/ApzD/wKkw/8GrMf/Sw2n//////////////////////////////////////////////////////9vchf/DxjP/w8gz/8PLM//DzTP/w88z/8PRM//D0zP/xNU0/8TXNP/E2TT/xNs0/7tVK/+7Vyv/u1kr/7tcK/+7Xiv/u2Ar/7tiK/+8ZCz/vGYs/7xoLP+8aiz/1KB3//////////////////////////////////////////////////v38v++hC7/voYu/76ILv++ii7/07J0///////////////////////////////////////////////////////ApDH/wKUw/8CoMP/AqjD/0sJp///////////////////////////////////////////////////////b24X/wsUy/8PHM//DyTP/w8sz/8POM//D0DP/w9Iz/8PUM//E1jT/xNg0/8TaNP+6VCr/u1Yr/7tYK/+7Wiv/u1wr/7tfK/+7YSv/u2Mr/7xlLP+8Zyz/vGks/9Sgd//////////////////////////////////////////////////79/L/voIu/76FLv++hy7/voku/82mYP/s3sT/7d/E/+3gxP/t4MT/7eHE/+3hxP/t4sT/7eLE/+3jxP/t5MT/wKIw/8CkMP/ApjD/wKgw/9LBaf//////////////////////////////////////////////////////2tuF/8LEMv/CxjL/w8gz/8PKM//DzDP/w84z/8PRM//D0zP/xNU0/8TXNP/E2TT/ulMq/7tVK/+7Vyv/u1kr/7tbK/+7XSv/u18r/7tiK/+8ZCz/vGYs/7xoLP/Un3f/////////////////////////////////////////////////+/fy/76BLv++gy7/voUu/76ILv++ii7/vowu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+bL//AnTD/wJ8w/8ChMP/AozD/wKUw/8CnMP/RwGn//////////////////////////////////////////////////////9rahf/CwzL/wsUy/8PHM//DyTP/w8sz/8PNM//DzzP/w9Ez/8PUM//E1jT/xNg0/7pSKv+6VCr/u1Yr/7tYK/+7Wiv/u1wr/7teK/+7YCv/u2Ir/7xlLP+8Zyz/1J53//////////////////////////////////////////////////v38v++gC7/voIu/76ELv++hi7/vogu/76LLv++jS7/v48v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CeMP/AoDD/wKIw/8CkMP/ApjD/0b9o///////////////////////////////////////////////////////a2YX/wsEy/8LEMv/CxjL/w8gz/8PKM//DzDP/w84z/8PQM//D0jP/xNQ0/8TXNP+6UCr/ulIq/7pVKv+7Vyv/u1kr/7tbK/+7XSv/u18r/7thK/+8Yyz/vGUs/9Sdd//////////////////////////////////////////////////79/L/vX8t/76BLv++gy7/voUu/76HLv++iS7/vosu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8ChMP/AozD/wKUw/9G+aP//////////////////////////////////////////////////////2tmF/8LAMv/CwjL/wsQy/8PHM//DyTP/w8sz/8PNM//DzzP/w9Ez/8PTM//E1TT/uk8q/7pRKv+6Uyr/u1Ur/7tYK/+7Wiv/u1wr/7teK/+7YCv/u2Ir/7xkLP/UnXf/////////////////////////////////////////////////+/fy/71+Lf++gC7/voIu/76ELv++hi7/vogu/76KLv++jC7/v44v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CdMP/AnzD/wKEw/8CkMP/Rvmj//////////////////////////////////////////////////////9rYhf/CvzL/wsEy/8LDMv/CxTL/w8cz/8PKM//DzDP/w84z/8PQM//D0jP/w9Qz/7pOKv+6UCr/ulIq/7pUKv+7Viv/u1gr/7tbK/+7XSv/u18r/7thK/+8Yyz/1Jx3//////////////////////////////////////////////////v38v+9fC3/vX4t/76BLv++gy7/voUu/76HLv++iS7/vosu/76NLv+/jy//v5Ev/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8CgMP/AojD/tqNR/6qqqv+8vLz/zs7O/9/f3//x8fH//v7+///////////////////////a14X/wr4y/8LAMv/CwjL/wsQy/8PGM//DyDP/w8oz/8PNM//DzzP/w9Ez/8PTM/+6TSr/uk8q/7pRKv+6Uyr/u1Ur/7tXK/+7WSv/u1sr/7teK/+7YCv/u2Ir/9Sbd//////////////////////////////////////////////////8+vj/3buS/928kv/dvZP/3b6T/92/k//dwJP/3cGT/93Ck//dw5P/3sST/97Fk//expP/3ciT/9zIkv/cyZL/3MqS/9zLk//cy5P/3MyT/9PJn/+8vLz/vLy8/7y8vP+8vLz/vLy8/7+/v//Q0ND/4uLi//Pz8//+/v7/2taF/8K9Mv/CvzL/wsEy/8LDMv/CxTL/w8cz/8PJM//DyzP/w80z/8PQM//D0jP/uksq/7pOKv+6UCr/ulIq/7pUKv+7Viv/u1gr/7taK/+7XCv/u14r/7thK//Tmnf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9rWhf/CuzL/wr0y/8LAMv/CwjL/wsQy/8LGMv/DyDP/w8oz/8PMM//DzjP/w9Az/7pKKv+6TCr/uk4q/7pRKv+6Uyr/u1Ur/7tXK/+7WSv/u1sr/7tdK/+7Xyv/05l3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////a1YX/wroy/8K8Mv/CvjL/wsAy/8LDMv/CxTL/w8cz/8PJM//DyzP/w80z/8PPM/+6SSr/uksq/7pNKv+6Tyr/ulEq/7pUKv+7Viv/u1gr/7taK/+7XCv/u14r/9OZd///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2tSF/8K5Mv/CuzL/wr0y/8K/Mv/CwTL/wsMy/8LGMv/DyDP/w8oz/8PMM//DzjP/ukgq/7pKKv+6TCr/uk4q/7pQKv+6Uir/ulQq/7tXK/+7WSv/u1sr/7tdK//TmHf/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vXk/8m/TP/BuDH/wroy/8K8Mv/CvjL/wsAy/8LCMv/CxDL/w8Yz/8PJM//DyzP/w80z/7pIKv+6SSr/uksq/7pNKv+6Tyr/ulEq/7pTKv+7VSv/u1cr/7taK/+7XCv/05d3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/Hb/8e6Rv/BtDH/wbYx/8K5Mv/CuzL/wr0y/8K/Mv/CwTL/wsMy/8LFMv/DxzP/w8kz/8PMM/+6SCr/ukgq/7pKKv+6TCr/uk4q/7pQKv+6Uir/ulQq/7tWK/+7WCv/u1or/9OWd///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8OzQ/8W0Pv/BsTH/wbMx/8G1Mf/BtzH/wrky/8K8Mv/CvjL/wsAy/8LCMv/CxDL/w8Yy/8PIM//DyjP/ukgq/7pIKv+6SCr/uksq/7pNKv+6Tyr/ulEq/7pTKv+7VSv/u1cr/7tZK//TlXf/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7ebD/8OvOf/BrjH/wbAx/8GyMf/BtDH/wbYx/8K4Mv/CujL/wrwy/8K/Mv/CwTL/wsMy/8LFMv/DxzP/w8kz/7pIKv+6SCr/ukgq/7pJKv+6Syr/uk4q/7pQKv+6Uir/ulQq/7tWK/+7WCv/05V3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6N+1/8GqNP/BqjH/wawx/8GvMf/BsTH/wbMx/8G1Mf/BtzH/wrky/8K7Mv/CvTL/wr8y/8LCMv/CxDL/wsYy/8PIM/+6SCr/ukgq/7pIKv+6SCr/ukoq/7pMKv+6Tir/ulEq/7pTKv+7VSv/u1cr/9OUd///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////49el/8ClMf/ApzD/wKkw/8GrMf/BrTH/wa8x/8GyMf/BtDH/wbYx/8G4Mf/CujL/wrwy/8K+Mv/CwDL/wsIy/8LFMv/DxzP/ukgq/7pIKv+6SCr/ukgq/7pJKv+6Syr/uk0q/7pPKv+6USr/ulQq/7tWK/+8XDD/wGY7/8BoO//Aajv/wG07/8BuPP/BcDz/wXI8/8F0PP/Bdjz/wXg8/8F6PP/CfD3/wn49/8KAPf/Cgj3/woQ9/8KGPf/CiD3/w4k+/8OLPv/DjT7/w5A+/8ORPv/Dkz7/w5U+/8SXP//EmT//xJs//8SdP//Enz//xKE//8SjP//EpUD/xKc//8CiMP/ApDD/wKYw/8CoMP/BqjH/wawx/8GuMf/BsDH/wbIx/8G1Mf/BtzH/wrky/8K7Mv/CvTL/wr8y/8LBMv/CwzL/wsUy/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukoq/7pMKv+6Tir/ulAq/7pSKv+6VCr/u1cr/7tZK/+7Wyv/u10r/7tfK/+7YSv/vGMs/7xlLP+8Zyz/vGks/7xsLP+8biz/vHAs/71yLf+9dC3/vXYt/714Lf+9ei3/vXwt/71/Lf++gS7/voMu/76FLv++hy7/voku/76LLv+/jS7/v48v/7+SL/+/lC//v5Yv/7+YL/+/mi//wJww/8CeMP/AoDD/wKIw/8ClMP/ApzD/wKkw/8GrMf/BrTH/wa8x/8GxMf/BszH/wbUx/8G4Mf/CujL/wrwy/8K+Mv/CwDL/wsIy/8LEMv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pJKv+6Syr/uk0q/7pPKv+6USr/ulMq/7tVK/+7Vyv/u1or/7tcK/+7Xiv/u2Ar/7tiK/+8ZCz/vGYs/7xoLP+8aiz/vGws/7xvLP+8cSz/vXMt/711Lf+9dy3/vXkt/717Lf+9fS3/vn8u/76CLv++hC7/voYu/76ILv++ii7/vowu/7+OL/+/kC//v5Iv/7+VL/+/ly//v5kv/7+bL//AnTD/wJ8w/8ChMP/AozD/wKUw/8CoMP/AqjD/wawx/8GuMf/BsDH/wbIx/8G0Mf/BtjH/wrgy/8K7Mv/CvTL/wr8y/8LBMv/CwzL/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukoq/7pMKv+6Tir/ulAq/7pSKv+6VCr/u1Yr/7tYK/+7Wiv/u10r/7tfK/+7YSv/vGMs/7xlLP+8Zyz/vGks/7xrLP+8bSz/vG8s/71yLf+9dC3/vXYt/714Lf+9ei3/vXwt/71+Lf++gC7/voIu/76FLv++hy7/voku/76LLv++jS7/v48v/7+RL/+/ky//v5Uv/7+YL/+/mi//wJww/8CeMP/AoDD/wKIw/8CkMP/ApjD/wKgw/8GrMf/BrTH/wa8x/8GxMf/BszH/wbUx/8G3Mf/CuTL/wrsy/8K+Mv/CwDL/wsIy/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6Sir/uk0q/7pPKv+6USr/ulMq/7tVK/+7Vyv/u1kr/7tbK/+7XSv/u2Ar/7tiK/+8ZCz/vGYs/7xoLP+8aiz/vGws/7xuLP+8cCz/vXIt/711Lf+9dy3/vXkt/717Lf+9fS3/vX8t/76BLv++gy7/voUu/76ILv++ii7/vowu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+bL//AnTD/wJ8w/8ChMP/AozD/wKUw/8CnMP/AqTD/wasx/8GuMf/BsDH/wbIx/8G0Mf/BtjH/wrgy/8K6Mv/CvDL/wr4y/8LBMv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukkq/7pLKv+6TSr/ulAq/7pSKv+6VCr/u1Yr/7tYK/+7Wiv/u1wr/7teK/+7YCv/u2Mr/7xlLP+8Zyz/vGks/7xrLP+8bSz/vG8s/71xLf+9cy3/vXUt/714Lf+9ei3/vXwt/71+Lf++gC7/voIu/76ELv++hi7/vogu/76LLv++jS7/v48v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CeMP/AoDD/wKIw/8CkMP/ApjD/wKgw/8GqMf/BrDH/wa4x/8GxMf/BszH/wbUx/8G3Mf/CuTL/wrsy/8K9Mv/CvzL/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6Sir/ukwq/7pOKv+6UCr/ulMq/7pVKv+7Vyv/u1kr/7tbK/+7XSv/u18r/7thK/+8Yyz/vGYs/7xoLP+8aiz/vGws/7xuLP+8cCz/vXIt/710Lf+9di3/vXgt/717Lf+9fS3/vX8t/76BLv++gy7/voUu/76HLv++iS7/vosu/7+OL/+/kC//v5Iv/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8ChMP/AozD/wKUw/8CnMP/AqTD/wasx/8GtMf/BrzH/wbEx/8G0Mf/BtjH/wbgx/8K6Mv/CvDL/wr4y/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukkq/7pLKv+6TSr/uk8q/7pRKv+6Uyr/u1Yr/7tYK/+7Wiv/u1wr/7teK/+7YCv/u2Ir/7xkLP+8Ziz/vGgs/7xrLP+8bSz/vG8s/7xxLP+9cy3/vXUt/713Lf+9eS3/vXst/71+Lf++gC7/voIu/76ELv++hi7/vogu/76KLv++jC7/v44v/7+RL/+/ky//v5Uv/7+XL/+/mS//v5sv/8CdMP/AnzD/wKEw/8CkMP/ApjD/wKgw/8GqMf/BrDH/wa4x/8GwMf/BsjH/wbQx/8G3Mf/CuTL/wrsy/8K9Mv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6Sir/ukwq/7pOKv+6UCr/ulIq/7pUKv+7Viv/u1kr/7tbK/+7XSv/u18r/7thK/+8Yyz/vGUs/7xnLP+8aSz/vGss/7xuLP+8cCz/vXIt/710Lf+9di3/vXgt/716Lf+9fC3/vX4t/76BLv++gy7/voUu/76HLv++iS7/vosu/76NLv+/jy//v5Ev/7+UL/+/li//v5gv/7+aL//AnDD/wJ4w/8CgMP/AojD/wKQw/8CnMP/AqTD/wasx/8GtMf/BrzH/wbEx/8GzMf/BtTH/wbcx/8K6Mv/CvDL/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukkq/7pLKv+6TSr/uk8q/7pRKv+6Uyr/u1Ur/7tXK/+7WSv/u1wr/7teK/+7YCv/u2Ir/7xkLP+8Ziz/vGgs/7xqLP+8bCz/vG4s/7xxLP+9cy3/vXUt/713Lf+9eS3/vXst/719Lf++fy7/voEu/76ELv++hi7/vogu/76KLv++jC7/v44v/7+QL/+/ki//v5Qv/7+XL/+/mS//v5sv/8CdMP/AnzD/wKEw/8CjMP/ApTD/wKcw/8CqMP/BrDH/wa4x/8GwMf/BsjH/wbQx/8G2Mf/CuDL/wroy/7pIKfm6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SSr/ukwq/7pOKv+6UCr/ulIq/7pUKv+7Viv/u1gr/7taK/+7XCv/u18r/7thK/+7Yyv/vGUs/7xnLP+8aSz/vGss/7xtLP+8byz/vXEt/710Lf+9di3/vXgt/716Lf+9fC3/vX4t/76ALv++gi7/voQu/76HLv++iS7/vosu/76NLv+/jy//v5Ev/7+TL/+/lS//v5cv/7+aL//AnDD/wJ4w/8CgMP/AojD/wKQw/8CmMP/AqDD/waox/8GtMf/BrzH/wbEx/8GzMf/BtTH/wbcx/8K5Mfm6Rynaukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pKKv+6TCr/uk8q/7pRKv+6Uyr/u1Ur/7tXK/+7WSv/u1sr/7tdK/+7Xyv/u2Ir/7xkLP+8Ziz/vGgs/7xqLP+8bCz/vG4s/7xwLP+9ci3/vXQt/713Lf+9eS3/vXst/719Lf+9fy3/voEu/76DLv++hS7/vocu/76KLv++jC7/v44v/7+QL/+/ki//v5Qv/7+WL/+/mC//v5ov/8CdMP/AnzD/wKEw/8CjMP/ApTD/wKcw/8CpMP/BqzH/wa0x/8GwMf/BsjH/wbQx/8G2Mf/CuDHauUgombpIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SSr/uksq/7pNKv+6Tyr/ulIq/7pUKv+7Viv/u1gr/7taK/+7XCv/u14r/7tgK/+7Yiv/vGUs/7xnLP+8aSz/vGss/7xtLP+8byz/vXEt/71zLf+9dS3/vXct/716Lf+9fC3/vX4t/76ALv++gi7/voQu/76GLv++iC7/voou/76NLv+/jy//v5Ev/7+TL/+/lS//v5cv/7+ZL/+/my//wJ0w/8CgMP/AojD/wKQw/8CmMP/AqDD/waox/8GsMf/BrjH/wbAx/8GzMf/BtTH/wbcxmLlGKDO6Ryn+ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pIKv+6SCr/ukgq/7pKKv+6TCr/uk4q/7pQKv+6Uir/ulUq/7tXK/+7WSv/u1sr/7tdK/+7Xyv/u2Er/7xjLP+8ZSz/vGgs/7xq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");\r\n}\r\n/* AdGuard */\r\n#desktop-browser-list li:nth-child(7)::before {\r\n background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjNjhCQzcxIiBkPSJNMTYgMEMxMSAwIDUgMS4xIDAgMy43IDAgOSAwIDIyLjcgMTYgMzIgMzIgMjIuNyAzMiA5LjEgMzIgMy43IDI3IDEgMjEgMCAxNiAweiIvPjxwYXRoIGZpbGw9IiM2N0IyNzkiIGQ9Ik0xNiAwdjMyQzAgMjIuNyAwIDkuMSAwIDMuNyA1IDEgMTEgMCAxNiAweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xNS45IDIwLjYgMjUgOC4zYy0uNi0uNi0xLjItLjItMS42LjFsLTcuNyA4LTMtMy41Yy0xLjMtMS42LTMuMi0uNC0zLjcgMGw2LjggNy43Ii8+PC9nPjwvc3ZnPg==");\r\n}\r\n/* Dolphin */\r\n#android-browser-list li:nth-child(3)::before {\r\n background: url("data:image/webp;base64,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");\r\n}\r\n/* UC */\r\n#android-browser-list li:nth-child(4)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* Kiwi */\r\n#android-browser-list li:nth-child(5)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* X浏览器 */\r\n#android-browser-list li:nth-child(6)::before {\r\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAB1FBMVEUAAAAJePoHof0AjewXV/YdY/8dPOcAm/8Bmv0cYPgAm/8cY/8XNO4fZf8AmPsCnv8Bmf4dYv0FmfsAy/8BlvcpaPwwY/NVju0A0P8XNvQReusBjOceY/0BlvcUKc4bUu0XM+QWNNoAzf4dY/8Dy/4Mmv0hZf8Oku0LzP8Ay/4AkOwepf8enPooZfwjP/8nXvUomO0ZOusrz/82jPk6tf81av8AwP8Tc+cCh90BoeYaUtwAzf8bWuobT+ABh9wYNewdWuccOfUJzv8KnP8RjfUKnP8gX/AhZf8cM9EiZf8PnPwQnf8NzP4hT9wPnP8RqOkfY+AkYvYkZv8Dm/0Fy/0DjOclZv8Snv8lZv8hN9sVhdwVlfEmZ/8hbOIXnv8XkOglXOIiMtEpZvoqaP8cnfwoP+sc0P8cmPYhm/sazP8zbf8aXv8mQP85//8Am/8cY/8BoP8dYv4AnP8cYv0fa/8dZ/8cYfocXvQAov8bXvABpf8Bn/8eaP8fZP8aXe4aWukaT+AWM98A2f8A1f8A0v8Anv8FlPoAj/EAku4ZV90UKdEA6f8A3v8Dyv8Ar/8Bp/8SiP8GkfkBwvgBk/ITd/AZYesCpukWM+UWPeIBgt4ZO9sWMtpotjNrAAAAbnRSTlMAAgMFBfoD+v7+/f0hIP38+vn4mJhgNQn+/v38+/v7+vn5+PX129bOoJeXPjIpJCMiHxoVDwwG/v78/Pv6+fn29e/t7Ovi4d/Rz8jFwr+6ubSrqqWenp2blpSSkYaCe3p0cGlbW1lSUkU8Ix4UEnTatA8AAAHPSURBVDjLvZNXW+JAFIbPBCZE2KUL9t57W7f33nvvvWeSkAgiqNh11971z3oCz4gGr32fuUjmnTnfl4vAIUFEYiJaXrN+/wOxCgJ/2jqPIJ1AMrvtR5Hfrcd2b7RdLDxfUVGZ+gh2wPXCqKa0mtXxA7j1tTCV2p6Z2QqBaIfPOjNJhkDgWSK8XC8rqyxn18MAvyijLpcv8Qnse8vc2ChXDao/AriZoGrEZzzEa1lEaC8xXCqjev4b3Rfpy4tcC/MCvEZ+gjLmYskk6mh/f4gHZE880ylT1bQ+E/1g9TiP1BklaT10dvABEAIWBGhV1bzo4NDwqZUrPfwLLTX6UE8fX/Q0gw1yEaH7wvB00YQnVgsHgZl3V4smBjTZEX9+UIIN3i54USPO+BfozfU/BjwaSqcsS7K/w9pCgO7LigO9Mi5J7lK5PrfBvTh6R+xW7Xjp8lTx5Cs+gge8mze95u9pkaaKN0+cnP0GvXt9syI7ZcmtfAd4P3lubalgrKYLhGyB8FXN63X7ldfm4PsFVaerasbumMGc23NKTNFi9enTfy/9Hx0ZGf3XwEcQaHkcDAabmp524Baunw2NgUCg8UkXKgskk5iLLQP/D4QMcEjsADN8ZLYyFhBKAAAAAElFTkSuQmCC");\r\n}\r\n/* 书签地球 */\r\n#android-browser-list li:nth-child(7)::before {\r\n background: url("data:image/x-icon;base64,AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iIiIiQAAAAAAAAAAAAAAAAAAAAACAgIC//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8CAgICAAAAAPj4+Pn29vb3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9LS0tP9/f3+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9ra2/9PUFL/IyQm/zM1N/83ODr/Njc5/ykqLP8zNDb/srKy//7+/v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9TU1X/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/ywuMP/09PT//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////////////////////////////////////////////////////5+fo/////////////////////////////////zEyNP86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/V1tb///////////////////////////////////////////////////////////////////////////////////////////////////////39/f7/////////////////////////////////////////////////////////////////////////////////////bGxu//n5+f//////////////////////HR4h/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Kisu/1NUVv/Z2dr/////////////////tre4/y0uMP85Ojz/Ojs9/zo7Pf86Oz3/Ojs9/zs8Pv/////////////////////////////////////////////////////////////////////////////////////////////////9/f3+////////////////////////////////////////////////////////////////////////////////LjAy/z9AQ//////////////////8/Pz/Ozw+/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/1tcXf//////////////////////////////////////////////////////////////////////MjM1/zo7Pf86Oz3/Ojs9/5ucnP///////////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////////////////////////////////////TE1P/zs8Pv/////////////////f3+D/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf87PD7/zc3O////////////////////////////////////////////////////////////////////////////////////////////Xl9g/zo7Pf86Oz3/Jicq//////////////////////////////////////////////////////////////////////////////////39/f7/////////////////////////////////////////////////////////////////////q6us/zo7Pf/8/Pz////////////Kysv/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf9vcHH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////KSos/zo7Pf8sLS/////////////////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////////////////////zo7Pf85Ojz/////////////////Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf///////////////////////////5iZmv9cXV7/aWps//////////////////////////////////////////////////////////////////////////////////////+4uLn/Ojs9/y0uMP///////////////////////////////////////////////////////////////////////f39/v///////////////////////////////////////////////////////////////zs8Pv86Oz3/7u7u////////////Ojs9/zo7Pf86Oz3/Ojs9/zc4Ov///////////////////////////x4fIv86Oz3/c3R1/ystL/86Oz3/OTo8/8DAwf////////////////////////////////////////////////////////////////////////////r6+v86Oz3/wMDB//////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////////////////////0NERv86Oz3/Ojs9////////////MjM1/zo7Pf86Oz3/Ojs9/zY3Ov///////////////////////////9fY2P8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zEyNP///////////////////////////////////////////////////////////////////////////zo7Pf/////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////////////////////86Oz3/Ojs9/2lqbP//////4+Pk/zo7Pf86Oz3/Ojs9/zs8Pv/////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zk6PP+IiYr////////////////////////////////////////////////////////////09PT/LzAy/////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////8vLzL/Ojs9/zo7Pf///////////zo7Pf86Oz3/Ojs9/zo7Pf//////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/Fxcb//////////////////////////////////////////////////////2trbf////////////////////////////////////////////////////////////39/f7/////////////////////////////////////////////////////Ojs9/zo7Pf86Oz3//////9HS0v86Oz3/Ojs9/zo7Pf+BgYL//////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/y0vMf//////////////////////////////////////////////////////LzAy///////////////////////////////////////////////////////9/f3+////////////////////////////////////////////////jI2P/zo7Pf86Oz3/MjM2//////80NTf/Ojs9/zo7Pf86Oz3////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v///////////////////////////////////////////////zk6PP86Oz3/Ojs9/3N0df//////Ojs9/zo7Pf86Oz3/4ODg////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/////////////////////////////////////////////////jY6P//////////////////////////////////////////////////39/f7///////////////////////////////////////////////86Oz3/Ojs9/zo7Pf/u7u7/wMHB/zo7Pf86Oz3/Ojs9/////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/////////////////////////////////////////////////////////////////////////////////////////////////9/f3+///////////////////////////////////////////W1tf/Ojs9/zo7Pf86Oz3//////zg5O/86Oz3/Ojs9/3N0df/////////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3///////////84ODr/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/MDEz/////////////////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////LzEz/zo7Pf86Oz3/Ojs9//////81Njj/Ojs9/zo7Pf//////////////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////////////////////81Njj/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf+7u7z///////////////////////////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////zc4Ov86Oz3/Ojs9/zo7Pf//////Ojs9/zo7Pf86Oz3//////////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf///////////////////////////ykqLP86Oz3/Ojs9/zo7Pf86Oz3/Ojs9///////////////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////86Oz3/Ojs9/zo7Pf86Oz3//////zo7Pf86Oz3/Hh8h///////////////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/////////////////////////////////Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/Z2dn//////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////Ojs9/zo7Pf86Oz3/Ojs9//////86Oz3/Ojs9/4GCg///////////////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////////////////////////////////////86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////////////////////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////zo7Pf86Oz3/Ojs9/zo7Pf//////Ojs9/zo7Pf/9/f3//////////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf//////////////////////////////////////Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/////////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////86Oz3/Ojs9/zo7Pf86Oz3/m5ud/zk6PP86Oz3////////////////////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3//////////////////////////////////////xsdH/86Oz3/Ojs9/zo7Pf86Oz3//////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////Ojs9/zo7Pf86Oz3/Ojs9/zIzNf8pKiz/Ojs9////////////////////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////////////////////////////////////+AgIH/Ojs9/zo7Pf86Oz3/Ojs9/4OEhv////////////////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////zo7Pf86Oz3/Ojs9/zo7Pf85Ojz/e3x9/zo7Pf///////////////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf//////////////////////////////////////o6Ok/zo7Pf86Oz3/Ojs9/zo7Pf85Oz3////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////86Oz3/7u/v///////////////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3//////////////////////////////////////0FCRP86Oz3/Ojs9/zo7Pf86Oz3/MzQ2/////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////Jigq/zo7Pf86Oz3/Ojs9/zo7Pf+4uLn/Ojs9/1tcXf//////////////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//////////////////////////////////////87PD7/Ojs9/zo7Pf86Oz3/Ojs9/zM0Nv////////////////////////////////////////////////////////////////////////////39/f7//////////////////////////////////////////3R1dv86Oz3/Ojs9/zo7Pf86Oz3/MjM1/0BBQ/8sLS///////////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf9iYmT////////////////////////////W1tb/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf80NTf////////////////////////////////////////////////////////////////////////////9/f3+///////////////////////////////////////////6+vr/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf//////Ojs9///////////////////////////////////////////////////////R0dH/HR4h/zo7Pf9zdHX/Ky0v/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf8uLzL/3d7e/9zc3P8lJyn/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/aWlr/////////////////////////////////////////////////////////////////////////////f39/v///////////////////////////////////////////////zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Jygq/x4fIf//////////////////////////////////////////////////////0dHR/x0eIf86Oz3/c3R1/ystL/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//f39/////////////////////////////////////////////////////////////////////////////39/f7///////////////////////////////////////////////8tLzH/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf//////Ozw+/////////////////////////////////////////////////9HR0f8dHiH/Ojs9/3N0df8rLS//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/////////////////////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/MDEz/93d3v/////////////////////////////////////////////////R0dH/HR4h/ywtL//Q0NH/7+/v/xkaHf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf8uLzL//////////////////////////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////85Ojz/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf/l5eb/k5OU////////////////////////////////////////////0dHR/////////////v7+///////b29z//////62urv83ODr/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3///////////////////////////////////////////////////////////////////////////////////////39/f7/////////////////////////////////////////////////////2dnZ/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/////////////////////////////////////////////////8/P0P//////////////////////1NTU//////+IiYr///////////8vMDL/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/yMjJ///////////////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////////////////////88PT//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf83ODr////////////////////////////////////////////5+fn///////n5+f//////qamq///////39/f/6erq//////9gYWP///////////+VlZb/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf8yMzX/+/v7/////////////////////////////////////////////////////////////////////////////////////////////f39/v///////////////////////////////////////////////////////////////zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/yMkJv////////////////////////////////////////////////9VVlj//////7m5uv//////KSot///////l5eb//v7+//////9lZmf/+/v7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7///////////////////////////////////////////////////////////////89P0D/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Gxwf/////////////////////////////////////////////////zU2OP//////3t7e////////////ra2t//////9wcXP/4uPj//////9wcXP/rKyt///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////////////////////zU2OP86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf8tLjD/////////////////////////////////////////////////Ojs9/8TExf//////gYKC//////9wcHL/19fX//////84OTv/3Nzc//////+EhIX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////////////////////////////////////Ozw+/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zk6PP////////////////////////////////////////////////86Oz3/Li8x//////+Ki4v///////////8nKCv//f39///////6+vr///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7///////////////////////////////////////////////////////////////////////////////86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/5OUlv///////////////////////////////////////////zw9P/86Oz3///////////9FRkf///////T09P///////////////////////////////////////////////////////////8vLzP/////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////////////////////////////////////zs8Pv86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9//Pz8////////////////////////////////////////////////////////////+Dg4P//////////////////////////////////////////////////////+/z8/0FCQ////////////////////////////////////////////////////////////////////////f39/v//////////////////////////////////////////////////////////////////////////////////////////NTY4/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/NTY4/97e3v/////////////////////////////////////////////////////////////////////////////////////////////////x8fH/Kywu/6anqP////////////////////////////////////////////////////////////////////////////39/f7///////////////////////////////////////////////////////////////////////////////////////////////87PT//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zM0Nv/6+vr//////////////////////////////////////////////////////////////////////zo8Pf9BQkT/Ojs9///////////////////////////////////////////////////////////////////////////////////////9/f3+//////////////////////////////////////////////////////////////////////////////////////////////////////////88PT//Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/LS4w/ywtL/9sbG7/np+g/6Chof94eHr/MDEz/ycoKv86Oz3/Ojs9/zo7Pf86Oz3/Ozw+/////////////////////////////////////////////////////////////////////////////////////////////f39/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////9HR0v85Ojz/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf8tLzH///////////////////////////////////////////////////////////////////////////////////////////////////////39/f7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/v8tLjD/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/OTo8/4WGh//////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Pj/b3Bx/ycpK/86Oz3/Ojs9/zo7Pf86Oz3/Ojs9/zo7Pf86Oz3/ODk7/y0uMP/S0tL//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f39/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/Pz9AAAAACcnJyf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+Pj4+AAAAAAAAAAAAAAAAJycnJ//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7u7vAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+/f39/v39/f79/f3+r6+vsAAAAAAAAAAA4AAAAAAAAAPAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAcAAAAAAAAAD4AAAAAAAAAM=");\r\n}\r\n/* M浏览器 */\r\n#android-browser-list li:nth-child(8)::before {\r\n background: url("data:image/png;base64,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");\r\n}\r\n/* 狐猴浏览器 */\r\n#android-browser-list li:nth-child(9)::before {\r\n background: url("data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP95AAD/eAAC/3oALf98AIP/fQDE/38A5v+AAPb/ggD9/oQA//6GAP/+hwD//okA//6LAP/+jQD//o8A//6QAP/+kgD//pQA//6WAP/+mAD//pkA/f6bAPb+nQDm/p8AxP6hAIP+owAt/qUAAv6kAAAAAAAAAAAAAAAAAAD/cQAA/2kADP94AHP/ewDe/3wA/v9+AP//gAD//4IA//+EAP/+hgD//ocA//6JAP/+iwD//o0A//6OAP/+kAD//pIA//6UAP/+lgD//pcA//6ZAP/+mwD//p0A//6fAP/+oAD//qIA/v6kAN7+pgBz/qgADP6oAAAAAAAA//v4AP///wz/tHCU/4cX+/98Af//fAD//38A//+CAP//hAD//oUA//6HAP/+iQD//osA//6NAP/+jgD//pAA//6SAP/+lAD//pYA//6XAP/+mQD//psA//6dAP/+nwD//qAA//6iAP/+pAD//qYA//6oAPv9qgCU/awADP2rAAD//voA////c//79/v/5s///8SK//+kSP//jxv//4YF//6EAP/+hQD//ogA//6KAP//jQD//48A//+RAP//kwD//5QA//6WAP/+mAD//pkA//6bAP/+nQD//p8A//6gAP/+ogD//qQA//6mAP/+qAD//akA//2rAPv9rQBz/3wAAP///y3////d//////////////////v3///t2v//2a///8SC//+zW///pz3//J0o/+qJDP/riAf/74wG//OPBf/2kgT/+JUD//qYAv/9mwH//54A//+hAP//ogD//qIA//6kAP/+pgD//qgA//6pAP/9qwD//a0A//2vAN39sAAt////g/////7///////////////////////////////////////79///79f/68OT/gnVk/0k6Jf9TQSj/WUUo/19IJ/9mTCb/bFAk/3ZWI/+KYh//rXYX/9iPDP/4ogP//6cA//6oAP/+qQD//asA//2tAP/9rwD//bEA/v2yAIP////D///////////////////////////////////////////////////////////U1db/YmNk/zI0Nf8oKSv/KCkr/yorLf8qKy7/KSsu/yorLv8tLi7/Pzgs/3NXI//IiRD/+6kC//6sAP/9rQD//a8A//2xAP/9sgD//bQAw////+X////////////////////////////////////////////////////////////////y8vL/ycnJ/5mZmf9VVVX/LS0t/y0tLf8tLS3/LS0t/y0tLf8sLC3/Kisu/zo2Lf+UbRz/86gE//6wAP/9sQD//bIA//20AP/9tgDl////9f///////////////////////////////////////////////////////////////////////////////+np6f97e3v/LS0t/y0tLf8tLS3/LS0t/y0tLf8tLS3/LCwt/y4uLv+GZh//9awD//6zAP/9tAD//bYA//24APX////8/////////////////////////////////////////////////////////////////////////////////////+vr6/9bW1v/Kysr/y0tLf8tLS3/LS0t/y0tLf8tLS3/LC0t/zAvLf+kexj//rUA//22AP/9uAD//boA/P///////////////////////////////////////////////////////////////////////////////////////////////6ysrP8vLy//LS0t/y0tLf8tLS3/LS0t/y0tLf8tLS3/Kywt/0pBKf/hpAj//7kA//26AP/9uwD////////////////////////////////////////////+/v7/////////////////////////////////////////////////4+Pj/0dHR/8rKyv/LS0t/y0tLf8tLS3/LS0t/y0tLf8tLS3/LS0u/6mBFf//vAD//bsA//29AP////////////////////////////f39//AwMD/h4eH/3Z2dv+Kior/vb29//Ly8v/////////////////////////////////8/Pz/c3Nz/yoqKv8tLS3/LS0t/y0tLf8tLS3/LS0t/y0tLf8pKi7/hGkc//68AP/9vQD//b8A///////////////////////w8PD/goKC/zQ0NP8pKSn/KSkp/ykpKf8yMjL/YmJi/76+vv/6+vr///////////////////////////+vr6//Li4u/y0tLf8tLS3/LS0t/y0tLf8tLS3/LS0t/yssLv+cehf//78A//2/AP/9wQD//////////////////Pz8/46Ojv8sLCz/LCws/y0tLf8tLS3/LS0t/y0tLf8qKir/NjY2/4SEhP/o6Oj//////////////////////+7u7v9hYWH/KSkp/y0tLf8tLS3/LS0t/yssLf8tLS3/blog/+mwBf/+wAD//cEA//3DAP/////////////////V1dX/Pj4+/ywsLP8tLS3/LS0t/y0tLf8sKyv/LCsq/ywrKv8sKir/Kysr/2FiYv/c3Nz//////////////////////9fX1/9cXFz/LCws/ykqKv8qKy3/Qzwo/5h3F//uswT//sAA//3BAP/9wwD//cQA/////////////////6Ojo/8rKyv/LS0t/y0tLf8tLS3/LSws/zdJUf9IfZL/SX+V/zhNVv8tLCz/Kioq/15eXv/m5ub//////////////////////+np6f+goaP/cGxf/4htIf/Xogj//b4A//7AAP/9wQD//cMA//3EAP/9xgD/////////////////jY2N/yoqKv8tLS3/LS0t/ywrK/83SVH/XLfb/2fW//9jzvf/W7ba/zlPWP8sKyv/Kioq/4uLi//+/v7////////////////////////yzP/7ykP//bwC//+/AP/9vwD//cEA//3DAP/9xAD//cYA//3IAP////////////////+RkZH/Kioq/y0tLf8tLS3/LCsq/0l9kv9n1///YMXu/y5RX/84aX3/SoKY/y0sK/8rKyv/UFBQ/+3t7f/////////////////+67f//cMj//27AP/9vQD//b8A//3BAP/9wwD//cQA//3GAP/9yAD//coA/////////////////6ioqP8sLCz/LS0t/y0tLf8sKyr/SX+U/2fX//9fxOz/K0lV/zVidP9KhJr/LSws/ysrK/9OTk7/7Ozs/////////////+/F//3DIv/9uwD//b0A//2/AP/9wQD//cMA//3EAP/9xgD//cgA//3KAP/9zAD/////////////////zc3N/zc3N/8sLCz/LS0t/ywrK/84TVX/Xrzh/2fW//9iyvP/XLfc/zpTXf8sKyv/Kioq/4iIiP/9/f3////////45f/9yjz//boA//29AP/9vwD//cEA//3DAP/9xAD//cYA//3IAP/9ygD//cwA//3NAP/////////////////y8vL/Xl5e/yoqKv8tLS3/LS0t/y0tLP85T1j/TIae/02Jof86VF7/LS0t/yoqKv9nZ2f/6Ojo//////////7//tt7//27AP/9vQD//b8A//3BAP/9wwD//cQA//3GAP/9yAD//coA//3MAP/9zQD//c8A//////z///////////////+tra3/MDAw/y0tLf8tLS3/LS0t/ywrK/8sKyv/LSwr/ysqKf8uLi7/cXFx/+Xl5f/////////////xzP/9whn//b0A//2/AP/9wQD//cMA//3EAP/9xgD//cgA//3KAP/9zAD//c0A//3PAP/80QD8////9f////////////////Pz8/9ubm7/Kioq/y0tLf8tLS3/LS0t/ywsLP8qKir/Q0ND/5ubm//y8vL//////////////vr//tZl//28AP/9vwD//cEA//3DAP/9xAD//cYA//3IAP/9ygD//cwA//3NAP/9zwD//NEA//zTAPX////l/////////////////////9/f3/9iYmL/LS0t/yoqKv8sLCz/QkJC/4ODg//X19f//v7+//////////////////7st//9wRD//b8A//3BAP/9wwD//cQA//3GAP/9yAD//coA//3MAP/9zQD//c8A//zRAP/80wD//NQA5f///8P//////////////////////////+vr6/+rq6v/jo6O/6enp//b29v//Pz8////////////////////////+OX//c07//2+AP/9wQD//cMA//3EAP/9xgD//cgA//3KAP/9zAD//c0A//3PAP/80QD//NMA//zVAP/81gDD////g/////7///////////////////////////////////////////////////////////////////////z1//7YZ//9vwD//cEA//3DAP/9xAD//cYA//3IAP/9ygD//cwA//3NAP/9zwD//NEA//zTAP/81QD//NYA/vzYAIP///8t////3f/////////////////////////////////////////////////////////////////9+P/+3n///cAG//3BAP/9wwD//cQA//3GAP/9yAD//coA//3MAP/9zQD//c8A//zRAP/80wD//NUA//zWAP/82ADd/NkALf///wD///9z////+////////////////////////////////////////////////////////PP//t18//3BCP/9wAD//cMA//3EAP/9xgD//cgA//3KAP/9zAD//c0A//3PAP/80QD//NMA//zVAP/81gD//NgA+/zZAHP8xwAA////AP///wz///+U////+/////////////////////////////////////////////fe//7WXv/9wAX//cEA//3DAP/9xAD//cYA//3IAP/9ygD//cwA//3NAP/9zwD//NEA//zTAP/81QD//NYA//zYAPv82QCU/NoADPzaAAAAAAAA////AP///wz///9z////3v////7///////////////////////vx//7no//9yS7//b8A//3BAP/9wwD//cQA//3GAP/9yAD//coA//3MAP/9zQD//c8A//zRAP/80wD//NUA//zWAP782ADe/NkAc/zaAAz82gAAAAAAAAAAAAAAAAAA////AP///wL///8t////g////8T////m//799v/vwv3+0VL//b8J//2+AP/9wQD//cMA//3EAP/9xgD//cgA//3KAP/9zAD//c0A//3PAP/80QD9/NMA9vzUAOb81gDE/NgAg/zZAC382wAC/NoAAAAAAAAAAAAA4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA+AAAAc=");\r\n}\r\n/* Gear */\r\n#ios-browser-list li:nth-child(2)::before {\r\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////dKircKSnYKSn30dH51tb2xsb63Nz1wsLWKCjKJib75+f74eHQJyf0t7fwnJzTKCj3zMz+9vb98fHEKir86ur2zMzzsrL0vLz0tbXjSkrNJib87OzxqKjrfn70urrAJCS6IyP1vb3vnJztkJD/+vrxrKzxpaXQTU3gOjreLi7EJCT//Pz++Pj75OT32dn3yMjulZXsjIzpcHDlV1fGOTm8LS3RJyf539/zrq7wn5/rmprnZmbhQEDdMzP409PwoaHmnp7ok5PshobffHzpdXXUVlbNR0fiRkbIJSX98/P1v7/zv7/wu7vqrq7ro6PvmZnki4vhgoLfcnLYYmLmXV34zs7utLTmjo7ZaWnYSEi0IiKzIiKvIiKS+5rSAAAAGnRSTlMA94/f+/Tr6dbSzsCsqGtTTUM7NxkTBFreWXyFh3sAAAQOSURBVGjexZppV9pAFIYTKChurbXF9kYghrUSCjQNm+wKFUGx7rtVu+97/34nbEkFkxhyT5+vnPM+szBJZu5Q/dyfnrJMjjse2G30LdDBLdpmf+AYn7RMTd+nNLlrGYUhGLXcVUt3PhyDoRl76Lwu/44VTMF6Z2D8vQkwjYl7/fkzI2AiIzNX82/TYCr07Sv5YDr/GGZoMB16RjG/I4DAiDzTE4DCRO//D0h01oPTCkhY22t6FtCYbQnGAI2x1vMTEJGerRZAxEIEo4DIKHl/ASr3qWlAZZqaAlSmsOZYnuVJQGWSGgdUxikH3IDI13gylz/OJV/PPwNdOCgr6CSxtbY353J5vQtB0Ucof3yjQ2Kl7KCL7BdmjsSTdF+l/PHoW+zgzbsPP05roIGdsoEOihcMySfx4uX5BzbgT0R4no9E/bV3R1FQxUbRoIlnnWnnB33NY7dnPuCPRggJvz8w70m/VR0omtL+vn2/LOW7XAti5RMXkwSkC4RWvjvGJjfVvowp0IBfYzr5vsffOTbcMRBIfkvACWoGSiv/Syt/juQ3d0JZjo25iYEoCO18lsuma4YFhV2mJZDafxwPPeFIH4iBKAgejzscZrknobhQMypIdfK9Yua0WIxLXSB9IAoJtzsm5RNBzGgP0kxngIKVF4clImgbwm4JqfksJ3XgAAwKoku9AdqoHyaTxTjniUb4AlkCtbAU327/PBgVpJgWZAFkPtdzh0kuqpgdf5jjpHxhBYwKVpblDuTrue0rLS14nmSFkBAFYwK5A2QGMuVGfrs/KRCKpxNgWPBsvztCvsVPjfygkfCnX4JxQZrpCBYuN1Inq6CCMcFZVxCsNFP5qvmCi+4UiJnz1CqYLogwHYFXXCyfRcwXrPYEvsUXJ2C+QFAKSgiCpEJQ3kIQ5BSC8xD0U37c42hYQTMO/fx8Tgi22BluiMTMxjb089TVw5BAYORH0Z/GIEH7Z4ncMH9TxvW88vvzQEGPR8MsNIY8rRc3Ns0XwIViEn7tIAjOugLShUyTN1+Q7gm8wcvKqfmCZ/sKgyi+NV0AqZ6AfFcv7L82USC/9LsfRoS5RtVUgdwFYmizLhSgCx9aGk4gf3gpWTopsptRz6vkGpmg4QWQZlQwQwApbEFhF1kA/DqaQN5CaVNSEWhvAuvLGvF7gtomkAZNDlSHaTnPq25jbaBNtbR3besbKxobcTvooSqsD2r82qsqqGPXfxjiL+0uKdf0bp19CZo8uNlxTmJ1q/Q+v72VDQdAHw70Ayn0IzX0Q0H0Y030g1n0o2Xsw3H04330AgV2iQW7SPQQvcyFXajDLjXiF0vxy734BWv8kjv+pQH8aw/4FzdknLNmXD2Zdf6XyzP913+sN7n+Y732+s9feZ65wtLu860AAAAASUVORK5CYII=");\r\n}\r\n';
  6179. const beautifyFeedbackCSS = "";
  6180. const GreasyforkBeautify = {
  6181. init() {
  6182. PopsPanel.execMenuOnce("beautifyPage", () => {
  6183. return this.beautifyPageElement();
  6184. });
  6185. PopsPanel.execMenuOnce("beautifyGreasyforkBeautify", () => {
  6186. return this.beautifyGreasyforkBeautify();
  6187. });
  6188. PopsPanel.execMenuOnce("beautifyUploadImage", () => {
  6189. return this.beautifyUploadImage();
  6190. });
  6191. PopsPanel.execMenuOnce("beautifyTopNavigationBar", () => {
  6192. return this.beautifyTopNavigationBar();
  6193. });
  6194. },
  6195. /**
  6196. * 美化页面元素,包括Markdown
  6197. */
  6198. beautifyPageElement() {
  6199. log.info("美化页面元素");
  6200. let result = [];
  6201. result.push(addStyle(beautifyMarkdownCSS));
  6202. result.push(addStyle(beautifyButtonCSS));
  6203. result.push(addStyle(beautifyRadioCSS));
  6204. result.push(addStyle(beautifyInputCSS));
  6205. result.push(addStyle(beautifyTextAreaCSS));
  6206. result.push(
  6207. addStyle(
  6208. /*css*/
  6209. `
  6210. p:has(input[type="submit"][name="update-and-sync"]){
  6211. margin-top: 10px;
  6212. }
  6213. `
  6214. )
  6215. );
  6216. domUtils.ready(() => {
  6217. let $markupChoice = $(
  6218. 'a[target="markup_choice"][href*="daringfireball.net"]'
  6219. );
  6220. if ($markupChoice) {
  6221. $markupChoice.parentElement.replaceChild(
  6222. domUtils.createElement("span", {
  6223. textContent: "Markdown"
  6224. }),
  6225. $markupChoice
  6226. );
  6227. }
  6228. $$(".user-content ul li").forEach(($li) => {
  6229. var _a2, _b;
  6230. let $first = $li.firstChild;
  6231. if (($first == null ? void 0 : $first.nodeName) === "#text") {
  6232. if ((_a2 = $first.textContent) == null ? void 0 : _a2.startsWith("[x] ")) {
  6233. $first.textContent = $first.textContent.replace("[x] ", "");
  6234. domUtils.prepend(
  6235. $li,
  6236. /*html*/
  6237. `
  6238. <input type="checkbox" disabled="" class="task-list-item-checkbox" checked="">
  6239. `
  6240. );
  6241. } else if ((_b = $first.textContent) == null ? void 0 : _b.startsWith("[ ] ")) {
  6242. $first.textContent = $first.textContent.replace("[ ] ", "");
  6243. domUtils.prepend(
  6244. $li,
  6245. /*html*/
  6246. `
  6247. <input type="checkbox" disabled="" class="task-list-item-checkbox">
  6248. `
  6249. );
  6250. }
  6251. }
  6252. });
  6253. let warningListMap = {
  6254. "[!NOTE]": (
  6255. /*html*/
  6256. `
  6257. <p class="markdown-alert-title" data-type="NOTE">
  6258. <svg class="octicon octicon-info mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16">
  6259. <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
  6260. </svg>Note
  6261. </p>
  6262. `
  6263. ),
  6264. "[!TIP]": (
  6265. /*html*/
  6266. `
  6267. <p class="markdown-alert-title" data-type="TIP">
  6268. <svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
  6269. <path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path>
  6270. </svg>Tip
  6271. </p>
  6272. `
  6273. ),
  6274. "[!IMPORTANT]": (
  6275. /*html*/
  6276. `
  6277. <p class="markdown-alert-title" data-type="IMPORTANT">
  6278. <svg class="octicon octicon-report mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
  6279. </svg>Important
  6280. </p>
  6281. `
  6282. ),
  6283. "[!WARNING]": (
  6284. /*html*/
  6285. `
  6286. <p class="markdown-alert-title" data-type="WARNING">
  6287. <svg class="octicon octicon-alert mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
  6288. </svg>Warning
  6289. </p>
  6290. `
  6291. ),
  6292. "[!CAUTION]": (
  6293. /*html*/
  6294. `
  6295. <p class="markdown-alert-title" data-type="CAUTION">
  6296. <svg class="octicon octicon-stop mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path>
  6297. </svg>Caution
  6298. </p>
  6299. `
  6300. )
  6301. };
  6302. let warningList = Object.keys(warningListMap);
  6303. $$(".user-content blockquote").forEach(($blockQuote) => {
  6304. Array.from($blockQuote.children).forEach(($child) => {
  6305. let htmlStr = domUtils.html($child);
  6306. if ($child.nodeName === "P") {
  6307. let findValue = warningList.find((value) => {
  6308. return htmlStr.toLowerCase().startsWith(value.toLowerCase());
  6309. });
  6310. if (findValue) {
  6311. domUtils.html(
  6312. $child,
  6313. htmlStr.replace(findValue, "")
  6314. );
  6315. domUtils.before(
  6316. $child,
  6317. warningListMap[findValue]
  6318. );
  6319. if (domUtils.html($child) === "") {
  6320. $child.remove();
  6321. }
  6322. }
  6323. }
  6324. });
  6325. });
  6326. $$(".user-content > blockquote").forEach(($blockQuote) => {
  6327. Array.from(
  6328. $blockQuote.querySelectorAll(".markdown-alert-title")
  6329. ).forEach(($markdownAlertTitle) => {
  6330. var _a2, _b;
  6331. let $markdownAlert = domUtils.createElement(
  6332. "div",
  6333. {
  6334. className: "markdown-alert markdown-alert-tip"
  6335. },
  6336. {
  6337. "data-type": $markdownAlertTitle.getAttribute("data-type")
  6338. }
  6339. );
  6340. while ($markdownAlertTitle.nextSibling) {
  6341. if ((_b = (_a2 = $markdownAlertTitle.nextSibling) == null ? void 0 : _a2.classList) == null ? void 0 : _b.contains("markdown-alert-title")) {
  6342. break;
  6343. }
  6344. domUtils.append(
  6345. $markdownAlert,
  6346. $markdownAlertTitle.nextSibling
  6347. );
  6348. }
  6349. domUtils.prepend($markdownAlert, $markdownAlertTitle);
  6350. domUtils.before($blockQuote, $markdownAlert);
  6351. });
  6352. });
  6353. if (GreasyforkRouter.isHome()) {
  6354. result.push(addStyle(beautifyHomeCSS));
  6355. } else if (GreasyforkRouter.isScriptsFeedback()) {
  6356. result.push(addStyle(beautifyFeedbackCSS));
  6357. let $noRating = document.querySelector(
  6358. '.radio-label[for*="discussion_rating_0"]'
  6359. );
  6360. if ($noRating) {
  6361. $noRating.innerHTML = $noRating.innerHTML.replace(
  6362. "不评分",
  6363. '<span class="rating-icon rating-icon-none">不评分</span>'
  6364. );
  6365. }
  6366. let $badRating = document.querySelector(
  6367. '.radio-label[for*="discussion_rating_2"]'
  6368. );
  6369. if ($badRating) {
  6370. $badRating.innerHTML = $badRating.innerHTML.replace(
  6371. "差评",
  6372. '<span class="rating-icon rating-icon-bad">差评</span>'
  6373. );
  6374. }
  6375. let $okRating = document.querySelector(
  6376. '.radio-label[for*="discussion_rating_3"]'
  6377. );
  6378. if ($okRating) {
  6379. $okRating.innerHTML = $okRating.innerHTML.replace(
  6380. "一般",
  6381. '<span class="rating-icon rating-icon-ok">一般</span>'
  6382. );
  6383. }
  6384. let $goodRating = document.querySelector(
  6385. '.radio-label[for*="discussion_rating_4"]'
  6386. );
  6387. if ($goodRating) {
  6388. $goodRating.innerHTML = $goodRating.innerHTML.replace(
  6389. "好评",
  6390. '<span class="rating-icon rating-icon-good">好评</span>'
  6391. );
  6392. }
  6393. } else if (GreasyforkRouter.isScriptAdmin()) {
  6394. if (!document.querySelector('input[type="submit"][name="update-only"]')) {
  6395. result.push(
  6396. addStyle(
  6397. /*css*/
  6398. `
  6399. .indented{
  6400. padding-left: unset;
  6401. }
  6402. `
  6403. )
  6404. );
  6405. }
  6406. }
  6407. });
  6408. return result;
  6409. },
  6410. /**
  6411. * 美化 Greasyfork Beautify脚本
  6412. */
  6413. beautifyGreasyforkBeautify() {
  6414. log.info("美化 Greasyfork Beautify脚本");
  6415. let result = [];
  6416. result.push(addStyle(compatibleBeautifyCSS));
  6417. if (utils.isPhone()) {
  6418. result.push(
  6419. addStyle(
  6420. /*css*/
  6421. `
  6422. section#script-info,
  6423. section.text-content,
  6424. div.width-constraint table.text-content.log-table{
  6425. margin-top: 80px;
  6426. }
  6427. div.width-constraint div.sidebarred{
  6428. padding-top: 80px;
  6429. }
  6430. div.width-constraint div.sidebarred .sidebar{
  6431. top: 80px;
  6432. }`
  6433. )
  6434. );
  6435. } else {
  6436. result.push(
  6437. addStyle(
  6438. /*css*/
  6439. `
  6440. section#script-info{
  6441. margin-top: 10px;
  6442. }`
  6443. )
  6444. );
  6445. }
  6446. return result;
  6447. },
  6448. /**
  6449. * 美化上传图片
  6450. */
  6451. beautifyUploadImage() {
  6452. log.info("美化上传图片");
  6453. let result = [];
  6454. result.push(addStyle(beautifyUploadImageCSS));
  6455. domUtils.ready(() => {
  6456. function clearErrorTip(element) {
  6457. while (element.nextElementSibling) {
  6458. element.parentElement.removeChild(element.nextElementSibling);
  6459. }
  6460. }
  6461. let $fileInputList = document.querySelectorAll('input[type="file"]');
  6462. $fileInputList.forEach(($input) => {
  6463. if ($input.getAttribute("name") === "code_upload") {
  6464. return;
  6465. }
  6466. if ($input.hasAttribute("accept") && $input.getAttribute("accept").includes("javascript")) {
  6467. return;
  6468. }
  6469. domUtils.on($input, ["propertychange", "input"], function(event) {
  6470. clearErrorTip(event.target);
  6471. let chooseImageFiles = event.currentTarget.files;
  6472. if (!chooseImageFiles) {
  6473. return;
  6474. }
  6475. if (chooseImageFiles.length === 0) {
  6476. return;
  6477. }
  6478. log.info("选择的图片", chooseImageFiles);
  6479. if (chooseImageFiles.length > 5) {
  6480. domUtils.after(
  6481. $input,
  6482. domUtils.createElement("p", {
  6483. textContent: i18next.t(`❌ 最多同时长传5张图片`)
  6484. })
  6485. );
  6486. }
  6487. let notAllowImage = [];
  6488. Array.from(chooseImageFiles).forEach((imageFile) => {
  6489. if (imageFile.size > 204800 || !imageFile.type.match(/png|jpg|jpeg|gif|apng|webp/i)) {
  6490. notAllowImage.push(imageFile);
  6491. }
  6492. });
  6493. if (notAllowImage.length === 0) {
  6494. return;
  6495. }
  6496. notAllowImage.forEach((imageFile) => {
  6497. domUtils.after(
  6498. $input,
  6499. domUtils.createElement("p", {
  6500. textContent: i18next.t("❌ 图片:{{name}} 大小:{{size}}", {
  6501. name: imageFile.name,
  6502. size: imageFile.size
  6503. })
  6504. })
  6505. );
  6506. });
  6507. });
  6508. });
  6509. let $textAreaSelectorString = [
  6510. /* 某条反馈内的回复框 */
  6511. "textarea#comment_text",
  6512. /* 反馈页面的回复框 */
  6513. "textarea.comment-entry"
  6514. ];
  6515. $textAreaSelectorString.forEach((selector) => {
  6516. domUtils.on(selector, "paste", (event) => {
  6517. log.info("触发粘贴事件", event);
  6518. setTimeout(() => {
  6519. domUtils.trigger($fileInputList, "input");
  6520. }, 100);
  6521. });
  6522. });
  6523. });
  6524. return result;
  6525. },
  6526. /**
  6527. * 美化顶部导航栏
  6528. */
  6529. beautifyTopNavigationBar() {
  6530. log.info("美化顶部导航栏");
  6531. let result = [];
  6532. result.push(addStyle(beautifyTopNavigationBarCSS));
  6533. if (window.outerWidth > 550) {
  6534. result.push(CommonUtil.addBlockCSS(".with-submenu"));
  6535. domUtils.ready(() => {
  6536. let $siteNav = $("#site-nav");
  6537. let $siteNavNav = $siteNav.querySelector("nav");
  6538. $$(".with-submenu nav li").forEach(($ele) => {
  6539. $siteNavNav.appendChild($ele);
  6540. });
  6541. });
  6542. }
  6543. return result;
  6544. }
  6545. };
  6546. const GreasyforkAccount = {
  6547. init() {
  6548. PopsPanel.execMenu("autoLogin", () => {
  6549. this.autoLogin();
  6550. });
  6551. },
  6552. /**
  6553. * 自动登录
  6554. */
  6555. autoLogin() {
  6556. utils.waitNode("span.sign-in-link a[rel=nofollow]").then(async () => {
  6557. let user = PopsPanel.getValue("user");
  6558. let pwd = PopsPanel.getValue("pwd");
  6559. if (utils.isNull(user)) {
  6560. Qmsg.error(i18next.t("请先在菜单中录入账号"));
  6561. return;
  6562. }
  6563. if (utils.isNull(pwd)) {
  6564. Qmsg.error(i18next.t("请先在菜单中录入密码"));
  6565. return;
  6566. }
  6567. let csrfToken = document.querySelector("meta[name='csrf-token']");
  6568. if (!csrfToken) {
  6569. Qmsg.error(i18next.t("获取csrf-token失败"));
  6570. return;
  6571. }
  6572. let loginTip = Qmsg.loading(i18next.t("正在登录中..."));
  6573. let postResp = await httpx.post(
  6574. "https://greasyfork.org/zh-CN/users/sign_in",
  6575. {
  6576. fetch: true,
  6577. data: encodeURI(
  6578. `authenticity_token=${csrfToken.getAttribute(
  6579. "content"
  6580. )}&user[email]=${user}&user[password]=${pwd}&user[remember_me]=1&commit=登录`
  6581. ),
  6582. headers: {
  6583. "Content-Type": "application/x-www-form-urlencoded"
  6584. }
  6585. }
  6586. );
  6587. loginTip.destroy();
  6588. if (!postResp.status) {
  6589. log.error(postResp);
  6590. Qmsg.error(i18next.t("登录失败,请在控制台查看原因"));
  6591. return;
  6592. }
  6593. let respText = postResp.data.responseText;
  6594. let parseLoginHTMLNode = domUtils.parseHTML(respText, true, true);
  6595. if (parseLoginHTMLNode.querySelectorAll(
  6596. ".sign-out-link a[rel=nofollow][data-method='delete']"
  6597. ).length) {
  6598. Qmsg.success(i18next.t("登录成功,1s后自动跳转"));
  6599. setTimeout(() => {
  6600. window.location.reload();
  6601. }, 1e3);
  6602. } else {
  6603. log.error(postResp);
  6604. log.error(`当前账号:${user}`);
  6605. log.error(`当前密码:${pwd}`);
  6606. Qmsg.error(
  6607. i18next.t("登录失败,可能是账号/密码错误,请在控制台查看原因")
  6608. );
  6609. }
  6610. });
  6611. }
  6612. };
  6613. const GreasyforkForum = {
  6614. init() {
  6615. this.readBgColor();
  6616. domUtils.ready(() => {
  6617. PopsPanel.execMenuOnce("greasyfork-discussions-filter-enable", () => {
  6618. this.filterEnable();
  6619. });
  6620. let lockFn = new utils.LockFunction(() => {
  6621. PopsPanel.execMenu("discussions-addShortcutOperationButton", () => {
  6622. this.addShortcutOperationButton();
  6623. });
  6624. PopsPanel.execMenu("discussions-addReportButton", () => {
  6625. this.addReportButton();
  6626. });
  6627. });
  6628. utils.mutationObserver(document.body, {
  6629. config: {
  6630. subtree: true,
  6631. childList: true
  6632. },
  6633. immediate: true,
  6634. callback: () => {
  6635. lockFn.run();
  6636. }
  6637. });
  6638. });
  6639. },
  6640. /**
  6641. * 启用Greasyfork论坛过滤器
  6642. */
  6643. filterEnable() {
  6644. log.info("启用Greasyfork论坛过滤器");
  6645. GreasyforkDiscussionsFilter.init();
  6646. },
  6647. /**
  6648. * 设置已读背景颜色
  6649. */
  6650. readBgColor() {
  6651. log.info("设置已读背景颜色");
  6652. let color = PopsPanel.getValue("discussions-readBgColor");
  6653. return addStyle(
  6654. /*css*/
  6655. `
  6656. .discussion-read{
  6657. background: ${color} !important;
  6658. }
  6659. `
  6660. );
  6661. },
  6662. /**
  6663. * 添加【过滤】按钮
  6664. */
  6665. addShortcutOperationButton() {
  6666. log.info("添加【过滤】按钮");
  6667. GreasyforkDiscussionsFilter.getElementList().forEach(($listContainer) => {
  6668. if ($listContainer.querySelector(
  6669. ".discussion-filter-button"
  6670. )) {
  6671. return;
  6672. }
  6673. let $listItem = $listContainer.querySelector(
  6674. ".discussion-list-item"
  6675. );
  6676. let $meta = $listItem.querySelector(".discussion-meta");
  6677. let $ownMetaItem = domUtils.createElement(
  6678. "div",
  6679. {
  6680. className: "discussion-meta-item",
  6681. innerHTML: `
  6682. <button class="discussion-filter-button">${i18next.t("过滤")}</button>
  6683. `
  6684. },
  6685. {
  6686. style: "flex: 0;"
  6687. }
  6688. );
  6689. let $button = $ownMetaItem.querySelector(
  6690. ".discussion-filter-button"
  6691. );
  6692. $meta.appendChild($ownMetaItem);
  6693. domUtils.on($button, "click", (event) => {
  6694. var _a2, _b, _c;
  6695. utils.preventEvent(event);
  6696. const discussionInfo = GreasyforkDiscussionsFilter.parseDiscuessionListContainerInfo(
  6697. $listContainer
  6698. );
  6699. let attr_filter_key = "data-filter-key";
  6700. let attr_filter_value = "data-filter-value";
  6701. let $dialog = __pops.alert({
  6702. title: {
  6703. text: i18next.t("选择需要过滤的选项"),
  6704. position: "center",
  6705. html: false
  6706. },
  6707. content: {
  6708. text: (
  6709. /*html*/
  6710. `
  6711. <button ${attr_filter_key}="scriptId" ${attr_filter_value}="^${discussionInfo.scriptId}$">${i18next.t("脚本id:{{text}}", {
  6712. text: discussionInfo.scriptId
  6713. })}</button>
  6714. <button ${attr_filter_key}="scriptName" ${attr_filter_value}="^${utils.parseStringToRegExpString(
  6715. discussionInfo.scriptName
  6716. )}$">${i18next.t("脚本名:{{text}}", {
  6717. text: discussionInfo.scriptName
  6718. })}</button>
  6719. <button ${attr_filter_key}="postUserId" ${attr_filter_value}="^${utils.parseStringToRegExpString(
  6720. discussionInfo.postUserId
  6721. )}$">${i18next.t("发布的用户id:{{text}}", {
  6722. text: discussionInfo.postUserId
  6723. })}</button>
  6724. `
  6725. ),
  6726. html: true
  6727. },
  6728. mask: {
  6729. enable: true,
  6730. clickEvent: {
  6731. toClose: true
  6732. }
  6733. },
  6734. btn: {
  6735. ok: {
  6736. enable: false
  6737. }
  6738. },
  6739. drag: true,
  6740. dragLimit: true,
  6741. width: "350px",
  6742. height: "300px",
  6743. style: (
  6744. /*css*/
  6745. `
  6746. .pops-alert-content{
  6747. display: flex;
  6748. flex-direction: column;
  6749. gap: 20px;
  6750. }
  6751. .pops-alert-content button{
  6752. text-wrap: wrap;
  6753. padding: 8px;
  6754. height: auto;
  6755. text-align: left;
  6756. }
  6757. `
  6758. )
  6759. });
  6760. let $content = $dialog.$shadowRoot.querySelector(
  6761. ".pops-alert-content"
  6762. );
  6763. if (discussionInfo.scriptId == null) {
  6764. (_a2 = $content.querySelector(`button[${attr_filter_key}="scriptId"]`)) == null ? void 0 : _a2.remove();
  6765. }
  6766. if (discussionInfo.scriptName == null) {
  6767. (_b = $content.querySelector(`button[${attr_filter_key}="scriptName"]`)) == null ? void 0 : _b.remove();
  6768. }
  6769. if (discussionInfo.postUserId == null) {
  6770. (_c = $content.querySelector(`button[${attr_filter_key}="postUserId"]`)) == null ? void 0 : _c.remove();
  6771. }
  6772. if (discussionInfo.replyUserId != null) {
  6773. let $replyUserIdButton = domUtils.createElement("button", {
  6774. innerHTML: i18next.t("作者id:{{text}}", {
  6775. text: discussionInfo.replyUserId
  6776. })
  6777. });
  6778. $replyUserIdButton.setAttribute(attr_filter_key, "scriptAuthorId");
  6779. $replyUserIdButton.setAttribute(
  6780. attr_filter_value,
  6781. "^" + discussionInfo.replyUserId + "$"
  6782. );
  6783. $content.appendChild($replyUserIdButton);
  6784. }
  6785. domUtils.on(
  6786. $dialog.$shadowRoot,
  6787. "click",
  6788. `button[${attr_filter_key}]`,
  6789. (event2) => {
  6790. utils.preventEvent(event2);
  6791. let $click = event2.target;
  6792. let key = $click.getAttribute(
  6793. attr_filter_key
  6794. );
  6795. let value = $click.getAttribute(attr_filter_value);
  6796. GreasyforkDiscussionsFilter.addValue(key, value);
  6797. $dialog.close();
  6798. GreasyforkDiscussionsFilter.filter();
  6799. Qmsg.success(i18next.t("添加成功"));
  6800. }
  6801. );
  6802. });
  6803. });
  6804. },
  6805. /**
  6806. * 添加【举报】按钮
  6807. */
  6808. addReportButton() {
  6809. log.info(`添加【举报】按钮`);
  6810. GreasyforkDiscussionsFilter.getElementList().forEach(($listContainer) => {
  6811. if ($listContainer.querySelector(".discussion-report-button")) {
  6812. return;
  6813. }
  6814. let $listItem = $listContainer.querySelector(
  6815. ".discussion-list-item"
  6816. );
  6817. let $meta = $listItem.querySelector(".discussion-meta");
  6818. let $ownMetaItem = domUtils.createElement(
  6819. "div",
  6820. {
  6821. className: "discussion-meta-item",
  6822. innerHTML: `
  6823. <button class="discussion-report-button" style="border-color: #ff4d4d;background-color: #ffe6e6;color: red;">${i18next.t(
  6824. "举报"
  6825. )}</button>
  6826. `
  6827. },
  6828. {
  6829. style: "flex: 0;"
  6830. }
  6831. );
  6832. let $button = $ownMetaItem.querySelector(
  6833. ".discussion-report-button"
  6834. );
  6835. $meta.appendChild($ownMetaItem);
  6836. domUtils.on($button, "click", (event) => {
  6837. utils.preventEvent(event);
  6838. const discussionInfo = GreasyforkDiscussionsFilter.parseDiscuessionListContainerInfo(
  6839. $listContainer
  6840. );
  6841. __pops.alert({
  6842. title: {
  6843. text: i18next.t("举报"),
  6844. position: "center",
  6845. html: false
  6846. },
  6847. content: {
  6848. text: (
  6849. /*html*/
  6850. `
  6851. <div class="report-item">
  6852. ${i18next.t("举报讨论:")}
  6853. <a href="${GreasyforkUrlUtils.getReportUrl(
  6854. "discussion",
  6855. discussionInfo.snippetId
  6856. )}" target="_blank">${discussionInfo.snippet}</a>
  6857. </div>
  6858. ${discussionInfo.scriptId ? (
  6859. /*html*/
  6860. `
  6861. <div class="report-item">
  6862. ${i18next.t("举报脚本:")}
  6863. <a href="${GreasyforkUrlUtils.getReportUrl(
  6864. "script",
  6865. discussionInfo.scriptId
  6866. )}" target="_blank">${discussionInfo.scriptName}</a>
  6867. </div>
  6868. `
  6869. ) : ""}
  6870. <div class="report-item">
  6871. ${i18next.t("举报用户:")}
  6872. <a href="${GreasyforkUrlUtils.getReportUrl(
  6873. "user",
  6874. discussionInfo.postUserId
  6875. )}" target="_blank">${discussionInfo.postUserName}</a>
  6876. </div>
  6877. ${discussionInfo.replyUserId && discussionInfo.replyUserId != discussionInfo.postUserId ? (
  6878. /*html*/
  6879. `
  6880. <div class="report-item">
  6881. ${i18next.t("举报用户:")}
  6882. <a href="${GreasyforkUrlUtils.getReportUrl(
  6883. "user",
  6884. discussionInfo.replyUserId
  6885. )}" target="_blank">${discussionInfo.replyUserName}</a>
  6886. </div>
  6887. `
  6888. ) : ""}
  6889. `
  6890. ),
  6891. html: true
  6892. },
  6893. btn: {
  6894. ok: {
  6895. enable: false
  6896. }
  6897. },
  6898. mask: {
  6899. enable: true,
  6900. clickEvent: {
  6901. toClose: true
  6902. }
  6903. },
  6904. drag: true,
  6905. dragLimit: true,
  6906. width: "350px",
  6907. height: "300px",
  6908. style: (
  6909. /*css*/
  6910. `
  6911. .pops-alert-content{
  6912. display: flex;
  6913. flex-direction: column;
  6914. gap: 20px;
  6915. }
  6916. .pops-alert-content .report-item{
  6917. text-wrap: wrap;
  6918. padding: 8px;
  6919. height: auto;
  6920. text-align: left;
  6921. margin: var(--button-margin-top) var(--button-margin-right)
  6922. var(--button-margin-bottom) var(--button-margin-left);
  6923. border-radius: var(--button-radius);
  6924. color: var(--button-color);
  6925. border-color: var(--button-bd-color);
  6926. background-color: var(--button-bg-color);
  6927. }
  6928. `
  6929. )
  6930. });
  6931. });
  6932. });
  6933. }
  6934. };
  6935. const GreasyforkUsers = {
  6936. init() {
  6937. PopsPanel.execMenuOnce("users-changeConsoleToTopNavigator", () => {
  6938. this.changeConsoleToTopNavigator();
  6939. });
  6940. PopsPanel.execMenuOnce("gf-scripts-filter-enable", () => {
  6941. GreasyforkScriptsFilter.init();
  6942. });
  6943. PopsPanel.execMenuOnce("beautifyCenterContent", () => {
  6944. return GreasyforkScriptsList.beautifyCenterContent();
  6945. });
  6946. },
  6947. /**
  6948. * 迁移【控制台】到顶部导航栏
  6949. */
  6950. changeConsoleToTopNavigator() {
  6951. log.info("迁移【控制台】到顶部导航栏");
  6952. CommonUtil.addBlockCSS("#about-user");
  6953. domUtils.ready(() => {
  6954. let $aboutUser = document.querySelector("#about-user");
  6955. if (!$aboutUser) {
  6956. log.error("#about-user元素不存在");
  6957. return;
  6958. }
  6959. $aboutUser = $aboutUser.cloneNode(true);
  6960. GreasyforkElementUtils.registerTopNavMenu({
  6961. name: i18next.t("控制台"),
  6962. className: "scripts-console",
  6963. clickEvent(event) {
  6964. let $dialog = __pops.alert({
  6965. title: {
  6966. text: i18next.t("控制台"),
  6967. position: "center"
  6968. },
  6969. content: {
  6970. text: "",
  6971. html: true
  6972. },
  6973. btn: {
  6974. ok: { enable: false }
  6975. },
  6976. mask: {
  6977. enable: true,
  6978. clickEvent: {
  6979. toClose: true
  6980. }
  6981. },
  6982. drag: true,
  6983. useShadowRoot: true,
  6984. width: PanelUISize.setting.width,
  6985. height: PanelUISize.setting.height,
  6986. zIndex: utils.getMaxZIndex(100),
  6987. style: (
  6988. /*css*/
  6989. `
  6990. #about-user{
  6991. border: 0;
  6992. box-shadow: none;
  6993. }
  6994. #about-user a{
  6995. color: #670000;
  6996. }
  6997. #about-user a:hover{
  6998. color: #00a3f5;
  6999. }
  7000. .text-content{
  7001. list-style-type: none;
  7002. box-shadow: rgb(221, 221, 221) 0px 0px 5px;
  7003. background-color: rgb(255, 255, 255);
  7004. box-sizing: border-box;
  7005. border-width: 1px;
  7006. border-style: solid;
  7007. border-color: rgb(187, 187, 187);
  7008. border-image: initial;
  7009. border-radius: 5px;
  7010. margin: 14px 0px;
  7011. padding: 10px 40px;
  7012. }
  7013. a.report-link{
  7014. position: absolute;
  7015. right: 0px;
  7016. font-size: smaller;
  7017. margin-right: 16px;
  7018. margin-top: 8px;
  7019. }
  7020. .notification-widget{
  7021. display: inline-block;
  7022. width: 1.2em;
  7023. height: 1.2em;
  7024. text-align: center;
  7025. line-height: 1.2em;
  7026. padding: 0;
  7027. background-color: #31708f;
  7028. border-radius: 50%;
  7029. color: #fff;
  7030. text-decoration: none;
  7031. }
  7032. `
  7033. )
  7034. });
  7035. let $content = $dialog.$shadowRoot.querySelector(
  7036. ".pops-alert-content"
  7037. );
  7038. $content.appendChild($aboutUser);
  7039. }
  7040. });
  7041. });
  7042. }
  7043. };
  7044. const beautifyContentCSS = "section.text-content {\r\n /*height: calc(100vh - 100px);*/\r\n /*overflow-y: auto;\r\n overflow-x: hidden;*/\r\n background: #eaf0ff;\r\n}\r\n\r\n.comment .user-content {\r\n border: 1px solid transparent;\r\n background: #fff;\r\n max-width: 70%;\r\n border-radius: 10px;\r\n width: fit-content;\r\n}\r\n\r\n.comment .comment-meta-spacer {\r\n flex: unset;\r\n margin-left: 15px;\r\n}\r\n.comment:not(:has(.report-link)) .comment-meta-spacer {\r\n flex: unset;\r\n margin-left: unset;\r\n margin-right: 10px;\r\n}\r\n.comment:not(:has(.report-link)) {\r\n display: flex;\r\n align-items: flex-end;\r\n flex-direction: column;\r\n}\r\n\r\n.comment:not(:has(.report-link)) .comment-meta {\r\n display: flex;\r\n flex-direction: row-reverse;\r\n}\r\n.comment:not(:has(.report-link)) .comment-meta-item {\r\n margin-left: 0px;\r\n margin-right: 15px;\r\n}";
  7045. const GreasyforkConversations = {
  7046. init() {
  7047. PopsPanel.execMenuOnce("conversations-beautifyDialogBox", () => {
  7048. return this.beautifyDialogBox();
  7049. });
  7050. domUtils.ready(() => {
  7051. PopsPanel.execMenuOnce("conversations-beautifyPrivateMessageList", () => {
  7052. this.beautifyPrivateMessageList();
  7053. });
  7054. });
  7055. },
  7056. /**
  7057. * 美化对话框
  7058. */
  7059. beautifyDialogBox() {
  7060. log.info("美化对话框");
  7061. return addStyle(beautifyContentCSS);
  7062. },
  7063. /**
  7064. * 美化私信列表
  7065. */
  7066. beautifyPrivateMessageList() {
  7067. log.info(`美化私信列表`);
  7068. addStyle(
  7069. /*css*/
  7070. `
  7071. .user-conversations-item{
  7072. list-style: none;
  7073. border: 1px solid #bfbfbf;
  7074. border-radius: 4px;
  7075. display: flex;
  7076. gap: 10px;
  7077. flex-direction: column;
  7078. padding: 4px 20px;
  7079. margin: 10px 0px;
  7080. }
  7081. .user-conversations-item .user-link-container{
  7082.  
  7083. }
  7084. .user-conversations-item .user-link-container .user-latest-send-time{
  7085. float: right;
  7086. }
  7087. .user-conversations-item .enter-coversations{
  7088. float: right;
  7089. }
  7090. `
  7091. );
  7092. document.querySelectorAll("section.text-content ul li").forEach(($li) => {
  7093. var _a2;
  7094. let $user = $li.querySelector(
  7095. 'a[href*="conversations"]'
  7096. );
  7097. let chatUrl = $user.href;
  7098. let userName = (_a2 = $user.textContent) == null ? void 0 : _a2.split(" ")[1];
  7099. let $latestMsgUser = $li.querySelector("a.user-link");
  7100. let latestSendMsgUser = null;
  7101. let latestSendMsgUserHomeUrl = null;
  7102. let latestSendMsgTimeText = null;
  7103. if ($latestMsgUser) {
  7104. latestSendMsgUser = $latestMsgUser.textContent;
  7105. latestSendMsgUserHomeUrl = $latestMsgUser.href;
  7106. let $relativeTime = $li.querySelector("relative-time");
  7107. new Date($relativeTime.getAttribute("datetime"));
  7108. latestSendMsgTimeText = $relativeTime.shadowRoot.lastChild.textContent;
  7109. }
  7110. $li.classList.add("user-conversations-item");
  7111. GreasyforkUrlUtils.getUserId();
  7112. $li.innerHTML = /*html*/
  7113. `
  7114. <div class="user-link-container">
  7115. <a class="user-link" href="${chatUrl}">${userName}</a>
  7116. <span class="user-latest-send-time">${latestSendMsgTimeText}</span>
  7117. </div>
  7118. <div class="latest-send-user-container">
  7119. ${i18next.t("最后回复:")}
  7120. <a href="${latestSendMsgUserHomeUrl}">${latestSendMsgUser}</a>
  7121. <a class="enter-coversations" href="${chatUrl}">${i18next.t("进入")}</a>
  7122. </div>
  7123. `;
  7124. });
  7125. }
  7126. };
  7127. const GreasyforkScriptsSearchElement = {
  7128. /**
  7129. * 等待脚本列表元素
  7130. */
  7131. waitScritList() {
  7132. return utils.waitNode("#browse-script-list", 1e4);
  7133. },
  7134. /**
  7135. * 添加控制区域
  7136. */
  7137. addFilterControls($scriptList) {
  7138. function getControls() {
  7139. let $el = $("#gm-script-filter-controls");
  7140. if (!$el) {
  7141. return;
  7142. }
  7143. let shadowRoot2 = $el == null ? void 0 : $el.shadowRoot;
  7144. if (!shadowRoot2) {
  7145. return;
  7146. }
  7147. let $filterControl2 = shadowRoot2.querySelector(
  7148. ".pops-filter-controls_inner"
  7149. );
  7150. let $search2 = shadowRoot2.querySelector(
  7151. ".pops-filter-search-container"
  7152. );
  7153. if ($filterControl2 && $search2) {
  7154. return {
  7155. $filterControl: $filterControl2,
  7156. $search: $search2
  7157. };
  7158. }
  7159. }
  7160. let $controls = getControls();
  7161. if ($controls) {
  7162. return $controls;
  7163. }
  7164. let $controlsContainer = domUtils.createElement("div", {
  7165. id: "gm-script-filter-controls"
  7166. });
  7167. let shadowRoot = $controlsContainer.attachShadow({ mode: "open" });
  7168. shadowRoot.appendChild(
  7169. domUtils.createElement("style", {
  7170. innerHTML: (
  7171. /*css*/
  7172. `
  7173. ${__pops.config.cssText.index}
  7174.  
  7175. ${__pops.config.cssText.common}
  7176.  
  7177. ${__pops.config.cssText.panelCSS}
  7178. `
  7179. )
  7180. })
  7181. );
  7182. shadowRoot.appendChild(
  7183. domUtils.createElement("style", {
  7184. innerHTML: (
  7185. /*css*/
  7186. `
  7187. .pops{
  7188. display: flex;
  7189. flex-direction: column;
  7190. gap: 10px;
  7191. padding: 10px;
  7192. }
  7193. .pops-filter-controls_inner{
  7194. display: flex;
  7195. align-items: center;
  7196. flex-direction: row;
  7197. gap: 10px;
  7198. flex-wrap: wrap;
  7199. }
  7200. .pops .gm-script-control-item{
  7201. display: flex;
  7202. align-items: center;
  7203. gap: 10px;
  7204. width: 150px;
  7205. }
  7206. .pops .pops-panel-item-left-main-text{
  7207. display: flex;
  7208. align-items: center;
  7209. margin: 0px;
  7210. padding: 0px;
  7211. }
  7212. .pops .pops-panel-item-left-desc-text{
  7213. line-height: normal;
  7214. margin-top: 6px;
  7215. font-size: 0.8em;
  7216. color: rgb(108, 108, 108);
  7217. }
  7218. .gm-script-search-input{
  7219. display: flex;
  7220. align-items: center;
  7221. gap: 20px;
  7222. }
  7223. `
  7224. )
  7225. })
  7226. );
  7227. let $pops = domUtils.createElement("div", {
  7228. className: "pops pops-filter-controls-container",
  7229. innerHTML: (
  7230. /*html*/
  7231. `
  7232. <div class="pops-filter-search-container"></div>
  7233. <div class="pops-filter-controls_inner"></div>
  7234. `
  7235. )
  7236. });
  7237. let $filterControl = $pops.querySelector(
  7238. ".pops-filter-controls_inner"
  7239. );
  7240. let $search = $pops.querySelector(
  7241. ".pops-filter-search-container"
  7242. );
  7243. shadowRoot.appendChild($pops);
  7244. domUtils.before($scriptList, $controlsContainer);
  7245. return { $filterControl, $search };
  7246. }
  7247. };
  7248. const GreasyforkScriptsSearch = {
  7249. init() {
  7250. domUtils.ready(() => {
  7251. GreasyforkScriptsSearchElement.waitScritList().then(($scriptList) => {
  7252. if (!$scriptList) {
  7253. log.error("未找到脚本列表节点,无法继续执行");
  7254. return;
  7255. }
  7256. PopsPanel.onceExec("GreasyforkScriptsSearch", () => {
  7257. let { $filterControl, $search } = GreasyforkScriptsSearchElement.addFilterControls($scriptList);
  7258. this.addFilterControlsItem($search, $filterControl);
  7259. });
  7260. });
  7261. });
  7262. },
  7263. /**
  7264. * 添加过滤项
  7265. */
  7266. addFilterControlsItem($search, $filterControlsContainer) {
  7267. let panelHandleContentUtils = __pops.config.panelHandleContentUtils();
  7268. let controlsConfig = [
  7269. {
  7270. name: i18next.t("名称"),
  7271. desc: i18next.t("全词匹配"),
  7272. ENABLE_KEY: "gf-script-search-filterScriptTitleWholeWordMatching",
  7273. STORAGE_KEY: "gf-script-search-filterScriptTitleWholeWordMatching-enable",
  7274. callback: (searchText, scriptInfo) => {
  7275. try {
  7276. return !scriptInfo.scriptName.match(new RegExp(searchText, "i"));
  7277. } catch (error) {
  7278. log.error(error);
  7279. return !scriptInfo.scriptName.match(searchText);
  7280. }
  7281. },
  7282. mutualExclusionSwitch: [
  7283. `.gm-script-control-item[data-storage-key="gf-script-search-filterScriptTitleOrDescWholeWordMatching-enable"]`
  7284. ]
  7285. },
  7286. {
  7287. name: i18next.t("描述"),
  7288. desc: i18next.t("全词匹配"),
  7289. ENABLE_KEY: "gf-script-search-filterScriptDescWholeWordMatching",
  7290. STORAGE_KEY: "gf-script-search-filterScriptDescWholeWordMatching-enable",
  7291. callback: (searchText, scriptInfo) => {
  7292. try {
  7293. return !scriptInfo.scriptDescription.match(
  7294. new RegExp(searchText, "i")
  7295. );
  7296. } catch (error) {
  7297. return !scriptInfo.scriptDescription.match(searchText);
  7298. }
  7299. },
  7300. mutualExclusionSwitch: [
  7301. `.gm-script-control-item[data-storage-key="gf-script-search-filterScriptTitleOrDescWholeWordMatching-enable"]`
  7302. ]
  7303. },
  7304. {
  7305. name: i18next.t("名称/描述"),
  7306. desc: i18next.t("任一全词匹配"),
  7307. ENABLE_KEY: "gf-script-search-filterScriptTitleOrDescWholeWordMatching",
  7308. STORAGE_KEY: "gf-script-search-filterScriptTitleOrDescWholeWordMatching-enable",
  7309. callback: (searchText, scriptInfo) => {
  7310. let isFilterNameFlag = controlsConfig.find(
  7311. (it) => it.ENABLE_KEY === "gf-script-search-filterScriptTitleWholeWordMatching"
  7312. ).callback(searchText, scriptInfo);
  7313. let isFilterDescFlag = controlsConfig.find(
  7314. (it) => it.ENABLE_KEY === "gf-script-search-filterScriptDescWholeWordMatching"
  7315. ).callback(searchText, scriptInfo);
  7316. return isFilterNameFlag && isFilterDescFlag;
  7317. },
  7318. mutualExclusionSwitch: [
  7319. `.gm-script-control-item[data-storage-key="gf-script-search-filterScriptTitleWholeWordMatching-enable"]`,
  7320. `.gm-script-control-item[data-storage-key="gf-script-search-filterScriptDescWholeWordMatching-enable"]`
  7321. ]
  7322. },
  7323. {
  7324. name: i18next.t("作者名称"),
  7325. desc: i18next.t("全词匹配"),
  7326. ENABLE_KEY: "gf-script-search-filterScriptAuthorNameWholeWordMatching",
  7327. STORAGE_KEY: "gf-script-search-filterScriptAuthorNameWholeWordMatching-enable",
  7328. callback: (searchText, scriptInfo) => {
  7329. try {
  7330. return !scriptInfo.scriptAuthorName.match(
  7331. new RegExp(searchText, "i")
  7332. );
  7333. } catch (error) {
  7334. return !scriptInfo.scriptAuthorName.match(searchText);
  7335. }
  7336. }
  7337. }
  7338. ];
  7339. let querySearchText = () => {
  7340. var _a2, _b;
  7341. let $ownSearchInput = $search.querySelector("input");
  7342. if ($ownSearchInput) {
  7343. return $ownSearchInput.value;
  7344. }
  7345. let searchParams = new URLSearchParams(window.location.search);
  7346. let searchText = ((_a2 = searchParams.get("q")) == null ? void 0 : _a2.trim()) || ((_b = searchParams.get("c")) == null ? void 0 : _b.trim()) || "";
  7347. return searchText;
  7348. };
  7349. let execTotalFilter = () => {
  7350. let searchText = querySearchText();
  7351. let allScriptsList = GreasyforkScriptsFilter.getElementList();
  7352. allScriptsList.forEach(($scriptList) => {
  7353. let scriptInfo = parseScriptListInfo($scriptList);
  7354. let fitlerFlagList = controlsConfig.map((controlsConfig2) => {
  7355. if (searchText == "") {
  7356. return false;
  7357. }
  7358. let enable = _GM_getValue(controlsConfig2.STORAGE_KEY);
  7359. if (!enable) {
  7360. return;
  7361. }
  7362. return controlsConfig2.callback(searchText, scriptInfo);
  7363. }).filter((item) => typeof item === "boolean");
  7364. if (fitlerFlagList.length !== 0) {
  7365. let flag = false;
  7366. fitlerFlagList.forEach((enable) => {
  7367. flag = flag || enable;
  7368. });
  7369. if (flag) {
  7370. domUtils.hide($scriptList, false);
  7371. } else {
  7372. domUtils.show($scriptList, false);
  7373. }
  7374. } else {
  7375. domUtils.show($scriptList, false);
  7376. }
  7377. });
  7378. };
  7379. if (PopsPanel.getValue("gf-script-search-addFilterSearchInput")) {
  7380. let $searchInner = panelHandleContentUtils.createSectionContainerItem_input({
  7381. type: "input",
  7382. className: "gm-script-search-input",
  7383. getValue() {
  7384. let queryText = querySearchText();
  7385. return PopsPanel.getValue(
  7386. "gf-script-search-addFilterSearchInput-text"
  7387. ) || queryText || "";
  7388. },
  7389. description: i18next.t("自动执行过滤"),
  7390. placeholder: i18next.t("过滤的关键词"),
  7391. text: i18next.t("关键词"),
  7392. callback: utils.debounce((event, value) => {
  7393. PopsPanel.setValue(
  7394. "gf-script-search-addFilterSearchInput-text",
  7395. value.toString()
  7396. );
  7397. execTotalFilter();
  7398. }, 500)
  7399. });
  7400. domUtils.append($search, $searchInner);
  7401. }
  7402. controlsConfig.forEach((controlConfig) => {
  7403. if (!PopsPanel.getValue(controlConfig.ENABLE_KEY)) {
  7404. return;
  7405. }
  7406. log.info(`添加按钮${controlConfig.name}`);
  7407. let $controlContainer = panelHandleContentUtils.createSectionContainerItem_switch({
  7408. type: "switch",
  7409. className: "gm-script-control-item",
  7410. text: controlConfig.name,
  7411. description: controlConfig.desc,
  7412. attributes: {
  7413. "data-storage-key": controlConfig.STORAGE_KEY
  7414. },
  7415. getValue() {
  7416. let value = _GM_getValue(controlConfig.STORAGE_KEY, false);
  7417. value = Boolean(value);
  7418. execTotalFilter();
  7419. return value;
  7420. },
  7421. callback(event, value) {
  7422. _GM_setValue(controlConfig.STORAGE_KEY, value);
  7423. execTotalFilter();
  7424. if (value && Array.isArray(controlConfig.mutualExclusionSwitch)) {
  7425. let $pops = $controlContainer.closest(".pops");
  7426. controlConfig.mutualExclusionSwitch.forEach((selector) => {
  7427. let $switch = $pops.querySelector(selector);
  7428. if ($switch) {
  7429. let $input = $switch.querySelector("input");
  7430. if ($input == null ? void 0 : $input.checked) {
  7431. let $core = $switch.querySelector(
  7432. ".pops-panel-switch__core"
  7433. );
  7434. $core == null ? void 0 : $core.click();
  7435. }
  7436. }
  7437. });
  7438. }
  7439. }
  7440. });
  7441. domUtils.append($filterControlsContainer, $controlContainer);
  7442. });
  7443. }
  7444. };
  7445. const Greasyfork = {
  7446. init() {
  7447. if (GreasyforkRouter.isImageSource()) {
  7448. log.info(`Router: 资源界面,不执行脚本功能`);
  7449. return;
  7450. }
  7451. PopsPanel.execMenu("checkPage", () => {
  7452. this.checkPage();
  7453. });
  7454. GreasyforkBeautify.init();
  7455. GreasyforkShortCut.init();
  7456. if (GreasyforkRouter.isScript()) {
  7457. GreasyforkScripts.init();
  7458. }
  7459. if (GreasyforkRouter.isScriptList() || GreasyforkRouter.isScriptLibraryList() || GreasyforkRouter.isScriptCodeSearch() || GreasyforkRouter.isScriptsBySite()) {
  7460. GreasyforkScriptsList.init();
  7461. }
  7462. if (GreasyforkRouter.isDiscuessions()) {
  7463. log.info(`Router: 讨论页面`);
  7464. GreasyforkForum.init();
  7465. } else if (GreasyforkRouter.isUsers()) {
  7466. log.info(`Router: 用户页面`);
  7467. GreasyforkUsers.init();
  7468. if (GreasyforkRouter.isUsersConversations()) {
  7469. log.info(`Router-next: 私聊用户页面`);
  7470. GreasyforkConversations.init();
  7471. }
  7472. } else if (GreasyforkRouter.isScriptSearch() || GreasyforkRouter.isScriptsBySite() || GreasyforkRouter.isScriptCodeSearch() || GreasyforkRouter.isScriptLibraryListSearch()) {
  7473. log.info(`Router: 脚本搜索页面`);
  7474. GreasyforkScriptsSearch.init();
  7475. }
  7476. PopsPanel.execMenuOnce("scripts-addOperationPanelBtnWithNavigator", () => {
  7477. this.addOperationPanelBtnWithNavigator();
  7478. });
  7479. domUtils.ready(() => {
  7480. GreasyforkMenu.initEnv();
  7481. GreasyforkAccount.init();
  7482. GreasyforkRememberFormTextArea.init();
  7483. GreasyforkMenu.handleLocalGotoCallBack();
  7484. PopsPanel.execMenuOnce("fixImageWidth", () => {
  7485. Greasyfork.fixImageWidth();
  7486. });
  7487. Greasyfork.languageSelectorLocale();
  7488. PopsPanel.execMenuOnce("optimizeImageBrowsing", () => {
  7489. Greasyfork.optimizeImageBrowsing();
  7490. });
  7491. PopsPanel.execMenuOnce("overlayBedImageClickEvent", () => {
  7492. Greasyfork.overlayBedImageClickEvent();
  7493. });
  7494. if (!GreasyforkRouter.isCodeStrict()) {
  7495. PopsPanel.execMenuOnce("addMarkdownCopyButton", () => {
  7496. Greasyfork.addMarkdownCopyButton();
  7497. });
  7498. }
  7499. });
  7500. },
  7501. /**
  7502. * 修复图片宽度显示问题
  7503. */
  7504. fixImageWidth() {
  7505. if (window.innerWidth < window.innerHeight) {
  7506. log.info("修复图片显示问题");
  7507. addStyle(
  7508. /*css*/
  7509. `
  7510. img.lum-img{
  7511. width: 100% !important;
  7512. height: 100% !important;
  7513. }
  7514. `
  7515. );
  7516. }
  7517. },
  7518. /**
  7519. * 优化图片浏览
  7520. */
  7521. optimizeImageBrowsing() {
  7522. log.info("优化图片浏览");
  7523. {
  7524. addStyle(_GM_getResourceText("ViewerCSS"));
  7525. }
  7526. addStyle(
  7527. /*css*/
  7528. `
  7529. @media (max-width: 460px) {
  7530. .lum-lightbox-image-wrapper {
  7531. display:flex;
  7532. overflow: auto;
  7533. -webkit-overflow-scrolling: touch
  7534. }
  7535. .lum-lightbox-caption {
  7536. width: 100%;
  7537. position: absolute;
  7538. bottom: 0
  7539. }
  7540. .lum-lightbox-position-helper {
  7541. margin: auto
  7542. }
  7543. .lum-lightbox-inner img {
  7544. max-width:100%;
  7545. max-height:100%;
  7546. }
  7547. }
  7548. `
  7549. );
  7550. function viewIMG(imgList = [], viewIndex = 0) {
  7551. let viewerULNodeHTML = "";
  7552. imgList.forEach((item) => {
  7553. viewerULNodeHTML += `<li><img data-src="${item}" loading="lazy"></li>`;
  7554. });
  7555. let viewerULNode = domUtils.createElement("ul", {
  7556. innerHTML: viewerULNodeHTML
  7557. });
  7558. let viewer = new Viewer(viewerULNode, {
  7559. inline: false,
  7560. url: "data-src",
  7561. zIndex: utils.getMaxZIndex() + 100,
  7562. hidden: () => {
  7563. viewer.destroy();
  7564. }
  7565. });
  7566. viewIndex = viewIndex < 0 ? 0 : viewIndex;
  7567. viewer.view(viewIndex);
  7568. viewer.zoomTo(1);
  7569. viewer.show();
  7570. }
  7571. function getImgElementSrc(element) {
  7572. return element.getAttribute("data-src") || element.getAttribute("src") || element.getAttribute("alt");
  7573. }
  7574. domUtils.on(
  7575. document,
  7576. "click",
  7577. "img",
  7578. function(event) {
  7579. var _a2;
  7580. let $img = event.target;
  7581. if (((_a2 = $img.parentElement) == null ? void 0 : _a2.localName) === "a" && $img.hasAttribute("data-screenshots")) {
  7582. return;
  7583. }
  7584. if ($img.closest(".viewer-container")) {
  7585. return;
  7586. }
  7587. if ($img.closest(".lum-lightbox-position-helper")) {
  7588. return;
  7589. }
  7590. let userContentElement = $img.closest(".user-content");
  7591. let imgList = [];
  7592. let imgIndex = 0;
  7593. let imgElementList = [];
  7594. let currentImgSrc = getImgElementSrc($img);
  7595. if (currentImgSrc) {
  7596. if (currentImgSrc.startsWith("https://img.shields.io")) {
  7597. return;
  7598. } else if (currentImgSrc.startsWith("/vite/assets/")) {
  7599. return;
  7600. }
  7601. }
  7602. if (userContentElement) {
  7603. userContentElement.querySelectorAll("img").forEach((childImgElement) => {
  7604. imgElementList.push(childImgElement);
  7605. let imgSrc = getImgElementSrc(childImgElement);
  7606. let $parent = childImgElement.parentElement;
  7607. if (($parent == null ? void 0 : $parent.localName) === "a") {
  7608. imgSrc = $parent.getAttribute("data-href") || $parent.href;
  7609. }
  7610. imgList.push(imgSrc);
  7611. });
  7612. imgIndex = imgElementList.indexOf($img);
  7613. if (imgIndex === -1) {
  7614. imgIndex = 0;
  7615. }
  7616. } else {
  7617. imgList.push(currentImgSrc);
  7618. imgIndex = 0;
  7619. }
  7620. log.success("点击浏览图片👉", imgList, imgIndex);
  7621. viewIMG(imgList, imgIndex);
  7622. }
  7623. );
  7624. document.querySelectorAll(".user-screenshots").forEach((element) => {
  7625. let linkElement = element.querySelector("a");
  7626. if (!linkElement) {
  7627. return;
  7628. }
  7629. let imgSrc = linkElement.getAttribute("data-href") || linkElement.getAttribute("href");
  7630. let imgElement = element.querySelector("img");
  7631. if (!imgElement) {
  7632. return;
  7633. }
  7634. imgElement.setAttribute("data-screenshots", "true");
  7635. imgElement.setAttribute("data-src", imgSrc);
  7636. linkElement.setAttribute("href", "javascript:;");
  7637. domUtils.after(linkElement, imgElement);
  7638. linkElement.remove();
  7639. });
  7640. },
  7641. /**
  7642. * 覆盖图床图片的parentElement的a标签
  7643. */
  7644. overlayBedImageClickEvent() {
  7645. log.info("覆盖图床图片的parentElement的a标签");
  7646. document.querySelectorAll(".user-content a>img").forEach((imgElement) => {
  7647. let $link = imgElement.parentElement;
  7648. let url = $link.getAttribute("href");
  7649. $link.setAttribute("data-href", url);
  7650. $link.removeAttribute("href");
  7651. if (url.startsWith("/rails/active_storage/blobs/redirect")) {
  7652. log.info(`该图片是上传到Greasyfork的图片,拦截默认行为,不做提示`);
  7653. return;
  7654. }
  7655. domUtils.on($link, "click", () => {
  7656. Qmsg.warning(
  7657. /*html*/
  7658. `<div style="overflow-wrap: anywhere;">${i18next.t(
  7659. "拦截跳转:"
  7660. )}<a href="${url}" target="_blank">${url}</a></div>`,
  7661. {
  7662. html: true,
  7663. zIndex: utils.getMaxZIndex() + 105
  7664. }
  7665. );
  7666. });
  7667. });
  7668. },
  7669. /**
  7670. * 在Markdown右上角添加复制按钮
  7671. */
  7672. addMarkdownCopyButton() {
  7673. log.info("在Markdown右上角添加复制按钮");
  7674. addStyle(
  7675. /*css*/
  7676. `
  7677. pre{
  7678. position: relative;
  7679. margin-bottom: 0px !important;
  7680. width: 100%;
  7681. }
  7682. `
  7683. );
  7684. addStyle(
  7685. /*css*/
  7686. `
  7687. .snippet-clipboard-content{
  7688. display: flex;
  7689. justify-content: space-between;
  7690. background: rgb(246, 248, 250);
  7691. margin-bottom: 16px;
  7692. position: relative;
  7693. }
  7694. .zeroclipboard-container {
  7695. right: 0;
  7696. top: 0;
  7697. position: absolute;
  7698. box-sizing: border-box;
  7699. display: flex;
  7700. font-size: 16px;
  7701. line-height: 24px;
  7702. text-size-adjust: 100%;
  7703. overflow-wrap: break-word;
  7704. width: fit-content;
  7705. height: fit-content;
  7706. }
  7707. .zeroclipboard-container svg{
  7708. vertical-align: text-bottom;
  7709. display: inline-block;
  7710. overflow: visible;
  7711. fill: currentColor;
  7712. margin: 8px;
  7713. }
  7714. .zeroclipboard-container svg[aria-hidden="true"]{
  7715. display: none;
  7716. }
  7717. clipboard-copy.js-clipboard-copy {
  7718. position: relative;
  7719. padding: 0px;
  7720. color: rgb(36, 41, 47);
  7721. background-color: rgb(246, 248, 250);
  7722. transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);
  7723. transition-property: color,background-color,box-shadow,border-color;
  7724. display: inline-block;
  7725. font-size: 14px;
  7726. line-height: 20px;
  7727. white-space: nowrap;
  7728. vertical-align: middle;
  7729. cursor: pointer;
  7730. -webkit-user-select: none;
  7731. user-select: none;
  7732. border: 1px solid rgba(31, 35, 40, 0.15);
  7733. -webkit-appearance: none;
  7734. appearance: none;
  7735. box-shadow: rgba(31, 35, 40, 0.04) 0px 1px 0px 0px, rgba(255, 255, 255, 0.25) 0px 1px 0px 0px inset;
  7736. margin: 8px;
  7737. overflow-wrap: break-word;
  7738. text-wrap: nowrap;
  7739. border-radius: 6px;
  7740. }
  7741. clipboard-copy.js-clipboard-copy[success]{
  7742. border-color: rgb(31, 136, 61);
  7743. box-shadow: 0 0 0 0.2em rgba(52,208,88,.4);
  7744. }
  7745. clipboard-copy.js-clipboard-copy:hover{
  7746. background-color: rgb(243, 244, 246);
  7747. border-color: rgba(31, 35, 40, 0.15);
  7748. transition-duration: .1s;
  7749. }
  7750. clipboard-copy.js-clipboard-copy:active{
  7751. background-color: rgb(235, 236, 240);
  7752. border-color: rgba(31, 35, 40, 0.15);
  7753. transition: none;
  7754. }
  7755. `
  7756. );
  7757. addStyle(
  7758. /*css*/
  7759. `
  7760. .pops-tip.github-tooltip {
  7761. border-radius: 6px;
  7762. padding: 6px 8px;
  7763. }
  7764. .pops-tip.github-tooltip, .pops-tip.github-tooltip .pops-tip-arrow::after {
  7765. background: rgb(36, 41, 47);
  7766. color: #fff;
  7767. }
  7768. .pops-tip.github-tooltip .pops-tip-arrow::after {
  7769. width: 8px;
  7770. height: 8px;
  7771. }
  7772. `
  7773. );
  7774. function createCopyElement() {
  7775. let $copy = domUtils.createElement("div", {
  7776. className: "zeroclipboard-container",
  7777. innerHTML: (
  7778. /*html*/
  7779. `
  7780. <clipboard-copy class="js-clipboard-copy">
  7781. <svg height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon-copy">
  7782. <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
  7783. </svg>
  7784. <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon-check-copy">
  7785. <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
  7786. </svg>
  7787. </clipboard-copy>
  7788. `
  7789. )
  7790. });
  7791. let clipboardCopyElement = $copy.querySelector(
  7792. ".js-clipboard-copy"
  7793. );
  7794. let octiconCopyElement = $copy.querySelector(
  7795. ".octicon-copy"
  7796. );
  7797. let octiconCheckCopyElement = $copy.querySelector(
  7798. ".octicon-check-copy"
  7799. );
  7800. domUtils.on($copy, "click", () => {
  7801. let $parent = domUtils.parent($copy);
  7802. let $code = $parent.querySelector("code");
  7803. if (!$code && $parent.className.includes("prettyprinted")) {
  7804. $code = $copy.parentElement;
  7805. }
  7806. if (!$code) {
  7807. $code = $parent.querySelector("pre");
  7808. }
  7809. if (!$code) {
  7810. Qmsg.error(i18next.t("未找到{{selector}}元素", { selector: "code" }));
  7811. return;
  7812. }
  7813. utils.setClip(domUtils.text($code));
  7814. clipboardCopyElement.setAttribute("success", "true");
  7815. octiconCopyElement.setAttribute("aria-hidden", "true");
  7816. octiconCheckCopyElement.removeAttribute("aria-hidden");
  7817. let tooltip = __pops.tooltip({
  7818. target: clipboardCopyElement,
  7819. content: i18next.t("✅ 复制成功!"),
  7820. position: "left",
  7821. className: "github-tooltip",
  7822. alwaysShow: true
  7823. });
  7824. tooltip.toolTip.onToolTipAnimationFinishEvent();
  7825. setTimeout(() => {
  7826. clipboardCopyElement.removeAttribute("success");
  7827. octiconCheckCopyElement.setAttribute("aria-hidden", "true");
  7828. octiconCopyElement.removeAttribute("aria-hidden");
  7829. tooltip.toolTip.close();
  7830. }, 2e3);
  7831. });
  7832. return $copy;
  7833. }
  7834. $$("pre").forEach((preElement) => {
  7835. let zeroclipboardElement = preElement.querySelector(
  7836. "div.zeroclipboard-container"
  7837. );
  7838. if (zeroclipboardElement) {
  7839. return;
  7840. }
  7841. let copyElement = createCopyElement();
  7842. let snippetClipboardContentElement = domUtils.createElement("div", {
  7843. className: "snippet-clipboard-content"
  7844. });
  7845. domUtils.before(preElement, snippetClipboardContentElement);
  7846. snippetClipboardContentElement.appendChild(preElement);
  7847. snippetClipboardContentElement.appendChild(copyElement);
  7848. });
  7849. },
  7850. /**
  7851. * 固定当前语言
  7852. */
  7853. languageSelectorLocale() {
  7854. let localeLanguage = PopsPanel.getValue("language-selector-locale");
  7855. let currentLocaleLanguage = window.location.pathname.split("/").filter((item) => Boolean(item))[0];
  7856. log.success("选择语言:" + localeLanguage);
  7857. log.success("当前语言:" + currentLocaleLanguage);
  7858. if (utils.isNull(localeLanguage)) {
  7859. return;
  7860. }
  7861. if (localeLanguage === currentLocaleLanguage) {
  7862. return;
  7863. } else {
  7864. let timer = null;
  7865. let url = GreasyforkUrlUtils.getSwitchLanguageUrl(localeLanguage);
  7866. GreasyforkApi.switchLanguage(url);
  7867. log.success("新Url:" + url);
  7868. Qmsg.loading(
  7869. i18next.t(
  7870. "当前语言:{{currentLocaleLanguage}},,3秒后切换至:{{localeLanguage}}",
  7871. {
  7872. currentLocaleLanguage,
  7873. localeLanguage
  7874. }
  7875. ),
  7876. {
  7877. timeout: 3e3,
  7878. showClose: true,
  7879. onClose() {
  7880. clearTimeout(timer);
  7881. }
  7882. }
  7883. );
  7884. Qmsg.info(i18next.t("导航至:") + url, {
  7885. timeout: 3e3
  7886. });
  7887. timer = setTimeout(() => {
  7888. window.location.href = url;
  7889. }, 3e3);
  7890. }
  7891. },
  7892. /**
  7893. * 检测gf页面是否正确加载,有时候会出现
  7894. * We're down for maintenance. Check back again soon.
  7895. */
  7896. checkPage() {
  7897. log.info("检测gf页面是否正确加载,有时候会出现");
  7898. domUtils.ready(() => {
  7899. if (document.body.firstElementChild && document.body.firstElementChild.localName === "p" && document.body.firstElementChild.innerText.includes(
  7900. "We're down for maintenance. Check back again soon."
  7901. )) {
  7902. let latestRefreshPageTime = parseInt(
  7903. _GM_getValue(
  7904. "greasyfork-check-page-time",
  7905. 0
  7906. )
  7907. );
  7908. let checkPageTimeout = PopsPanel.getValue(
  7909. "greasyfork-check-page-timeout",
  7910. 5
  7911. );
  7912. let checkPageTimeoutStamp = checkPageTimeout * 1e3;
  7913. if (latestRefreshPageTime && Date.now() - latestRefreshPageTime < checkPageTimeoutStamp) {
  7914. Qmsg.warning(
  7915. i18next.t("上次重载时间 {{time}},{{timeout}}秒内拒绝反复重载", {
  7916. time: utils.formatTime(
  7917. latestRefreshPageTime,
  7918. "yyyy-MM-dd HH:mm:ss"
  7919. ),
  7920. timeout: checkPageTimeout
  7921. })
  7922. );
  7923. return;
  7924. }
  7925. _GM_setValue("greasyfork-check-page-time", Date.now());
  7926. window.location.reload();
  7927. }
  7928. });
  7929. },
  7930. /**
  7931. * 在顶部导航栏添加【操作面板】按钮
  7932. */
  7933. addOperationPanelBtnWithNavigator() {
  7934. log.info("添加【操作面板】按钮");
  7935. CommonUtil.addBlockCSS(
  7936. ".sidebarred .sidebar",
  7937. ".sidebarred-main-content .open-sidebar"
  7938. );
  7939. addStyle(
  7940. /*css*/
  7941. `
  7942. .sidebarred .sidebarred-main-content{
  7943. max-width: 100%;
  7944. }
  7945. `
  7946. );
  7947. domUtils.ready(() => {
  7948. document.querySelector("#site-nav nav");
  7949. document.querySelector(
  7950. "#site-nav .with-submenu nav"
  7951. );
  7952. let $scriptsOptionGroups = document.querySelector("#script-list-option-groups") || document.querySelector(".list-option-groups");
  7953. if (!$scriptsOptionGroups) {
  7954. log.warn("不存在右侧面板元素#script-list-option-groups");
  7955. return;
  7956. }
  7957. $scriptsOptionGroups = $scriptsOptionGroups.cloneNode(
  7958. true
  7959. );
  7960. $scriptsOptionGroups.classList.add("option-panel-groups");
  7961. GreasyforkElementUtils.registerTopNavMenu({
  7962. name: i18next.t("操作面板"),
  7963. className: "filter-scripts",
  7964. clickEvent(event) {
  7965. let $dialog = __pops.alert({
  7966. title: {
  7967. text: i18next.t("操作面板"),
  7968. position: "center"
  7969. },
  7970. content: {
  7971. text: "",
  7972. html: true
  7973. },
  7974. btn: {
  7975. ok: { enable: false }
  7976. },
  7977. mask: {
  7978. enable: true,
  7979. clickEvent: {
  7980. toClose: true
  7981. }
  7982. },
  7983. drag: true,
  7984. useShadowRoot: true,
  7985. width: PanelUISize.setting.width,
  7986. height: PanelUISize.setting.height,
  7987. zIndex: utils.getMaxZIndex(100),
  7988. style: (
  7989. /*css*/
  7990. `
  7991. .pops-drawer-content div:first-child{
  7992. margin: 20px;
  7993. }
  7994. .option-panel-groups > div{
  7995. }
  7996. .option-panel-groups ul{
  7997. margin: .5em 0 0;
  7998. list-style-type: none;
  7999. padding: 1em 0;
  8000. box-shadow: 0 0 5px #ddd;
  8001. border: 1px solid #BBBBBB;
  8002. border-radius: 5px;
  8003. background-color: #fff;
  8004. }
  8005. .option-panel-groups ul li{
  8006. }
  8007. li.list-current{
  8008. border-left: 7px solid #800;
  8009. box-shadow: inset 0 1px #0000001a, inset 0 -1px #0000001a;
  8010. margin: 0 0 0 -4px;
  8011. padding: .4em 1em .4em calc(1em - 3px);
  8012. background: linear-gradient(#fff, #eee);
  8013. }
  8014. .list-option-group a {
  8015. padding: .35em 1em;
  8016. display: block;
  8017. }
  8018. .list-option-group {
  8019. margin-bottom: 1em;
  8020. }
  8021. form.sidebar-search{
  8022. display: flex;
  8023. align-items: center;
  8024. gap: 10px;
  8025. }
  8026. form.sidebar-search input[type="search"]{
  8027. display: inline-flex;
  8028. justify-content: center;
  8029. align-items: center;
  8030. line-height: 1;
  8031. height: 32px;
  8032. white-space: nowrap;
  8033. cursor: text;
  8034. text-align: center;
  8035. box-sizing: border-box;
  8036. outline: 0;
  8037. transition: 0.1s;
  8038. font-weight: 500;
  8039. user-select: none;
  8040. -webkit-user-select: none;
  8041. -moz-user-select: none;
  8042. -ms-user-select: none;
  8043. vertical-align: middle;
  8044. -webkit-appearance: none;
  8045. appearance: none;
  8046. background-color: transparent;
  8047. border: 0;
  8048. padding: 8px 8px;
  8049. font-size: 14px;
  8050. text-align: start;
  8051. /* width: 100%; */
  8052. // flex: 1;
  8053. display: flex;
  8054. align-items: center;
  8055. border: 1px solid #dcdfe6;
  8056. border-radius: 4px;
  8057. background-color: #ffffff;
  8058. }
  8059. form.sidebar-search input[type="submit"]{
  8060. width: 32px;
  8061. height: 32px;
  8062. }
  8063. `
  8064. )
  8065. });
  8066. let $content = $dialog.$shadowRoot.querySelector(
  8067. ".pops-alert-content"
  8068. );
  8069. $content.appendChild($scriptsOptionGroups);
  8070. }
  8071. });
  8072. });
  8073. }
  8074. };
  8075. PopsPanel.init();
  8076. Greasyfork.init();
  8077.  
  8078. })(Qmsg, DOMUtils, Utils, i18next, pops, Viewer);