您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
给 poipiku 作品和用户添加备注,支持分组
当前为
// ==UserScript== // @name Poipiku Remark // @namespace https://greasyfork.org/zh-CN/users/8659-fc4soda // @version 20210328 // @description 给 poipiku 作品和用户添加备注,支持分组 // @author fc4soda // @match https://poipiku.com/* // @grant GM.info // @grant GM_info // @grant GM.getValue // @grant GM_getValue // @grant GM.setValue // @grant GM_setValue // @grant GM.deleteValue // @grant GM_deleteValue // @grant GM.listValues // @grant GM_listValues // @grant GM.openInTab // @grant GM_openInTab // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // @license GNU General Public License v3.0 or later // ==/UserScript== /* jshint esversion: 6 */ // TODO 作品分组 // TODO 用户备注 & 分组 const AddonName = '8659-pr-'; const ICON = {}; const PAGE_TYPE = { 'USER1': 'USER1', // https://poipiku.com/928521/ 'WORK1': 'WORK1', // https://poipiku.com/IllustViewPcV.jsp?ID=928521&TD=3996609 'WORK2': 'WORK2', // https://poipiku.com/928521/2382608.html }; // id:用户id td:作品id const EditboxClass = AddonName + 'editbox', WorkItemClassUser = 'IllustThumbImg', IdSelector = 'data-' + AddonName + 'id', TdSelector = 'data-' + AddonName + 'td', WorkItemClassWork = 'IllustItemThumb', StoreKeyWorkGroupAll = AddonName + 'workgroupall', storeKeyWorkGroup = AddonName + 'workgroup-', StoreKeyWork = AddonName + 'work-', EditboxChangeEvent = 'input', EditboxContentSelector = 'textContent'; (function () { 'use strict'; // 判断不同页面使用不同选择器 var url = window.location.href; console.log("url", url); var pageReturn = checkPage(url); console.log('pageReturn', pageReturn) if (pageReturn == null) { return } var pageType = pageReturn[0]; switch (pageType) { case PAGE_TYPE.USER1: userPageFunc(); break; case PAGE_TYPE.WORK1: case PAGE_TYPE.WORK2: var id = pageReturn[1], td = pageReturn[2]; workPageFunc(id, td); break; } })(); function workPageFunc(id, td) { console.log("workPageFunc"); var work = document.getElementsByClassName(WorkItemClassWork); for (let item of work) { var key = StoreKeyWork + id + '-' + td; var oldVal = GM.getValue(key); oldVal.then((val) => { console.log("getVal", StoreKeyWork + id + '-' + td, val); if (val != null) { var oldEditor = document.getElementById(StoreKeyWork + id + '-' + td); if (oldEditor != null) { oldEditor.textContent = val; //oldEditor.addEventListener(EditboxChangeEvent, storeVal); } else { var editboxContainer = newEditbox(StoreKeyWork, id, td); editboxContainer.children[0].textContent = val; editboxContainer.children[0].addEventListener(EditboxChangeEvent, storeVal); item.parentElement.insertBefore(editboxContainer, item); } } }); var editboxContainer = newEditbox(StoreKeyWork, id, td); editboxContainer.children[0].addEventListener(EditboxChangeEvent, storeVal); item.parentElement.insertBefore(editboxContainer, item); } } function userPageFunc() { console.log("userPageFunc"); var elements = document.getElementsByClassName(WorkItemClassUser); for (let item of elements) { var href = item.href; if (href == null) { continue; } let regex = /(\d+)/g; let idtd = href.match(regex); var key = StoreKeyWork + idtd[0] + '-' + idtd[1]; var oldVal = GM.getValue(key); oldVal.then((val) => { console.log("getVal", StoreKeyWork + idtd[0] + '-' + idtd[1], val); if (val != null) { var oldEditor = document.getElementById(StoreKeyWork + idtd[0] + '-' + idtd[1]); if (oldEditor != null) { oldEditor.textContent = val; //oldEditor.addEventListener(EditboxChangeEvent, storeVal); } else { var editboxContainer = newEditbox(StoreKeyWork, idtd[0], idtd[1]); editboxContainer.children[0].textContent = val; editboxContainer.children[0].addEventListener(EditboxChangeEvent, storeVal); item.parentElement.insertBefore(editboxContainer, item.nextSibling); } } }); var editboxContainer = newEditbox(StoreKeyWork, idtd[0], idtd[1]); editboxContainer.children[0].addEventListener(EditboxChangeEvent, storeVal); item.parentElement.insertBefore(editboxContainer, item.nextSibling); } } function newEditbox(key, id, td) { let editboxContainer = document.createElement("div"); editboxContainer.style.width = '100%'; editboxContainer.style.display = 'flex'; editboxContainer.style.justifyContent = 'center'; editboxContainer.style.alignContent = 'center'; let editbox = document.createElement("div"); editbox.id = key + id + '-' + td; editbox.class = EditboxClass; editbox.contentEditable = true; editbox.style.backgroundColor = 'lemonchiffon'; editbox.style.width = '99%'; editbox.style.display = 'inline-block'; editbox.style.border = '1px darkgrey solid'; editbox.style.margin = '1px'; editbox.style.wordWarp = 'break-word'; editbox.style.maxHeight = '2.5rem'; editbox.style.overflow = 'auto'; editbox.setAttribute(IdSelector, id); editbox.setAttribute(TdSelector, td); editboxContainer.appendChild(editbox); return editboxContainer } // 是否可优化为编辑框失去焦点时保存值 function storeVal(event) { var element = event.target; console.log(EditboxChangeEvent, element); if (element.class == EditboxClass) { var id = element.getAttribute(IdSelector); var td = element.getAttribute(TdSelector); var val = element[EditboxContentSelector]; var key = StoreKeyWork + id + '-' + td; console.log('set', key, val); // 这里应该不判断空,可以用空值覆盖旧值 if (val != null) { GM.setValue(key, val); } } } // 返回数组:[页面类型, id, td] function checkPage(url) { var arr; var work1Regex = /poipiku\.com\/IllustViewPcV\.jsp\?ID=(\d+)\&TD=(\d+)$/; arr = url.match(work1Regex); if (arr != null && arr.length == 3) { return [PAGE_TYPE.WORK1, arr[1], arr[2]]; } var work2Regex = /poipiku\.com\/(\d+)\/(\d+)\.html$/; arr = url.match(work2Regex); if (arr != null && arr.length == 3) { return [PAGE_TYPE.WORK2, arr[1], arr[2]]; } var user1Regex = /poipiku\.com\/(\d+)\/?$/; arr = url.match(user1Regex); if (arr != null && arr.length == 2) { return [PAGE_TYPE.USER1, arr[1]]; } return null; }