// ==UserScript== // @name 🏷️ UTags - Add usertags to links // @name:zh-CN 🏷️ 小鱼标签 (UTags) - 为链接添加用户标签 // @namespace https://utags.pipecraft.net/ // @homepageURL https://github.com/utags/utags#readme // @supportURL https://github.com/utags/utags/issues // @version 0.12.11 // @description Add custom tags or notes to links such as users, posts and videos. For example, tags can be added to users or posts on a forum, making it easy to identify them or block their posts and replies. It works on X (Twitter), Reddit, Facebook, Threads, Instagram, Youtube, TikTok, GitHub, Greasy Fork, Hacker News, pixiv and numerous other websites. // @description:zh-CN 这是个超实用的工具,能给用户、帖子、视频等链接添加自定义标签和备注信息。比如,可以给论坛的用户或帖子添加标签,易于识别他们或屏蔽他们的帖子和回复。支持 V2EX, X, Reddit, Greasy Fork, GitHub, B站, 抖音, 小红书, 知乎, 掘金, 豆瓣, 吾爱破解, pixiv, LINUX DO, 小众软件, NGA, BOSS直聘等网站。 // @icon data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23ff6361' class='bi bi-tags-fill' viewBox='0 0 16 16'%3E %3Cpath d='M2 2a1 1 0 0 1 1-1h4.586a1 1 0 0 1 .707.293l7 7a1 1 0 0 1 0 1.414l-4.586 4.586a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 2 6.586V2zm3.5 4a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z'/%3E %3Cpath d='M1.293 7.793A1 1 0 0 1 1 7.086V2a1 1 0 0 0-1 1v4.586a1 1 0 0 0 .293.707l7 7a1 1 0 0 0 1.414 0l.043-.043-7.457-7.457z'/%3E %3C/svg%3E // @author Pipecraft // @license MIT // @match https://x.com/* // @match https://twitter.com/* // @match https://github.com/* // @match https://www.reddit.com/* // @match https://www.instagram.com/* // @match https://www.threads.net/* // @match https://*.facebook.com/* // @match https://*.youtube.com/* // @match https://www.tiktok.com/* // @match https://*.bilibili.com/* // @match https://*.biligame.com/* // @match https://greasyfork.org/* // @match https://lobste.rs/* // @match https://news.ycombinator.com/* // @match https://*.v2ex.com/* // @match https://*.v2ex.co/* // @match https://*.zhihu.com/* // @match https://*.weibo.com/* // @match https://*.weibo.cn/* // @match https://*.douban.com/* // @match https://www.52pojie.cn/* // @match https://juejin.cn/* // @match https://mp.weixin.qq.com/* // @match https://www.xiaohongshu.com/* // @match https://sspai.com/* // @match https://www.douyin.com/* // @match https://podcasts.google.com/* // @match https://sleazyfork.org/* // @match https://tilde.news/* // @match https://www.journalduhacker.net/* // @match https://rebang.today/* // @match https://myanimelist.net/* // @match https://www.pixiv.net/* // @match https://meta.discourse.org/* // @match https://linux.do/* // @match https://meta.appinn.net/* // @match https://community.openai.com/* // @match https://community.cloudflare.com/* // @match https://community.wanikani.com/* // @match https://forum.cursor.com/* // @match https://bbs.nga.cn/* // @match https://nga.178.com/* // @match https://ngabbs.com/* // @match https://www.dlsite.com/* // @match https://keylol.com/* // @match https://kemono.su/* // @match https://coomer.su/* // @match https://nekohouse.su/* // @match https://rule34video.com/* // @match https://rule34gen.com/* // @match https://panda.chaika.moe/* // @match https://bbs.tampermonkey.net.cn/* // @match https://discuss.flarum.org/* // @match https://discuss.flarum.org.cn/* // @match https://www.nodeloc.com/* // @match https://freesmth.net/* // @match https://freesmth.uk/* // @match https://veryfb.com/* // @match https://www.nodeseek.com/* // @match https://*.inoreader.com/* // @match https://kater.me/* // @match https://bbs.viva-la-vita.org/* // @match https://www.zhipin.com/* // @match https://v2hot.pipecraft.net/* // @match https://utags.pipecraft.net/* // @match https://*.pipecraft.net/* // @run-at document-start // @grant GM.getValue // @grant GM.setValue // @grant GM_addValueChangeListener // @grant GM_removeValueChangeListener // @grant GM_addElement // @grant GM.registerMenuCommand // ==/UserScript== // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// The Official Installation URLs //// //// 官方安装网址 //// //// //// //// * https://greasyfork.org/scripts/460718-utags-add-usertags-to-links //// //// ** downloadURL https://update.greasyfork.org/scripts/460718/%F0%9F%8F%B7%EF%B8%8F%20UTags%20-%20Add%20usertags%20to%20links.user.js //// //// * https://scriptcat.org/script-show-page/2784 //// //// ** downloadURL https://scriptcat.org/scripts/code/2784/%F0%9F%8F%B7%EF%B8%8F+UTags+-+Add+usertags+to+links.user.js //// //// * https://github.com/utags/utags //// //// ** downloadURL https://github.com/utags/utags/raw/main/build/userscript-prod/utags.user.js //// //// * https://gist.github.com/PipecraftNet/38d90a567ff04660f2a1b5430af9ae96 //// //// ** downloadURL https://gist.github.com/PipecraftNet/38d90a567ff04660f2a1b5430af9ae96/raw/utags.user.js //// //// //// //// //// //// Extension Version //// //// 浏览器扩展版本 //// //// * Chrome Web Store - https://chromewebstore.google.com/detail/utags-add-usertags-to-lin/kofjcnaphffjoookgahgjidofbdplgig //// //// * Edge Add-ons - https://microsoftedge.microsoft.com/addons/detail/utags-add-usertags-to-l/bhlbflbehfoccjjenpekilgabbjjnphe //// //// * Firefox Addon Store - https://addons.mozilla.org/firefox/addon/utags/ //// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ;(() => { "use strict" var listeners = {} var getValue = async (key) => { const value = await GM.getValue(key) return value && value !== "undefined" ? JSON.parse(value) : void 0 } var setValue = async (key, value) => { if (value !== void 0) { const newValue = JSON.stringify(value) if (listeners[key]) { const oldValue = await GM.getValue(key) await GM.setValue(key, newValue) if (newValue !== oldValue) { for (const func of listeners[key]) { func(key, oldValue, newValue) } } } else { await GM.setValue(key, newValue) } } } var _addValueChangeListener = (key, func) => { listeners[key] = listeners[key] || [] listeners[key].push(func) return () => { if (listeners[key] && listeners[key].length > 0) { for (let i3 = listeners[key].length - 1; i3 >= 0; i3--) { if (listeners[key][i3] === func) { listeners[key].splice(i3, 1) } } } } } var addValueChangeListener = (key, func) => { if (typeof GM_addValueChangeListener !== "function") { console.warn("Do not support GM_addValueChangeListener!") return _addValueChangeListener(key, func) } const listenerId = GM_addValueChangeListener(key, func) return () => { GM_removeValueChangeListener(listenerId) } } var doc = document var win = window var uniq = (array) => [...new Set(array)] if (typeof String.prototype.replaceAll !== "function") { String.prototype.replaceAll = String.prototype.replace } var $ = (selectors, element) => (element || doc).querySelector(selectors) var $$ = (selectors, element) => [ ...(element || doc).querySelectorAll(selectors), ] var getRootElement = (type) => type === 1 ? doc.head || doc.body || doc.documentElement : type === 2 ? doc.body || doc.documentElement : doc.documentElement var createElement = (tagName, attributes) => setAttributes(doc.createElement(tagName), attributes) var addElement = (parentNode, tagName, attributes) => { if (typeof parentNode === "string") { return addElement(null, parentNode, tagName) } if (!tagName) { return } if (!parentNode) { parentNode = /^(script|link|style|meta)$/.test(tagName) ? getRootElement(1) : getRootElement(2) } if (typeof tagName === "string") { const element = createElement(tagName, attributes) parentNode.append(element) return element } setAttributes(tagName, attributes) parentNode.append(tagName) return tagName } var addEventListener = (element, type, listener, options) => { if (!element) { return } if (typeof type === "object") { for (const type1 in type) { if (Object.hasOwn(type, type1)) { element.addEventListener(type1, type[type1]) } } } else if (typeof type === "string" && typeof listener === "function") { element.addEventListener(type, listener, options) } } var removeEventListener = (element, type, listener, options) => { if (!element) { return } if (typeof type === "object") { for (const type1 in type) { if (Object.hasOwn(type, type1)) { element.removeEventListener(type1, type[type1]) } } } else if (typeof type === "string" && typeof listener === "function") { element.removeEventListener(type, listener, options) } } var getAttribute = (element, name) => element && element.getAttribute ? element.getAttribute(name) : null var setAttribute = (element, name, value) => element && element.setAttribute ? element.setAttribute(name, value) : void 0 var setAttributes = (element, attributes) => { if (element && attributes) { for (const name in attributes) { if (Object.hasOwn(attributes, name)) { const value = attributes[name] if (value === void 0) { continue } if (/^(value|textContent|innerText)$/.test(name)) { element[name] = value } else if (/^(innerHTML)$/.test(name)) { element[name] = createHTML(value) } else if (name === "style") { setStyle(element, value, true) } else if (/on\w+/.test(name)) { const type = name.slice(2) addEventListener(element, type, value) } else { setAttribute(element, name, value) } } } } return element } var addClass = (element, className) => { if (!element || !element.classList) { return } element.classList.add(className) } var removeClass = (element, className) => { if (!element || !element.classList) { return } element.classList.remove(className) } var hasClass = (element, className) => { if (!element || !element.classList) { return false } return element.classList.contains(className) } var setStyle = (element, values, overwrite) => { if (!element) { return } const style = element.style if (typeof values === "string") { style.cssText = overwrite ? values : style.cssText + ";" + values return } if (overwrite) { style.cssText = "" } for (const key in values) { if (Object.hasOwn(values, key)) { style[key] = values[key].replace("!important", "") } } } var isUrl = (text) => /^https?:\/\//.test(text) var throttle = (func, interval) => { let timeoutId = null let next = false const handler = (...args) => { if (timeoutId) { next = true } else { func.apply(void 0, args) timeoutId = setTimeout(() => { timeoutId = null if (next) { next = false handler() } }, interval) } } return handler } if (typeof Object.hasOwn !== "function") { Object.hasOwn = (instance, prop) => Object.prototype.hasOwnProperty.call(instance, prop) } var extendHistoryApi = () => { const pushState = history.pushState const replaceState = history.replaceState history.pushState = function () { pushState.apply(history, arguments) window.dispatchEvent(new Event("pushstate")) window.dispatchEvent(new Event("locationchange")) } history.replaceState = function () { replaceState.apply(history, arguments) window.dispatchEvent(new Event("replacestate")) window.dispatchEvent(new Event("locationchange")) } window.addEventListener("popstate", function () { window.dispatchEvent(new Event("locationchange")) }) } var getOffsetPosition = (element, referElement) => { const position = { top: 0, left: 0 } referElement = referElement || doc.body while (element && element !== referElement) { position.top += element.offsetTop position.left += element.offsetLeft element = element.offsetParent } return position } var parseInt10 = (number, defaultValue) => { if (typeof number === "number" && !Number.isNaN(number)) { return number } if (typeof defaultValue !== "number") { defaultValue = Number.NaN } if (!number) { return defaultValue } const result = Number.parseInt(number, 10) return Number.isNaN(result) ? defaultValue : result } var rootFuncArray = [] var headFuncArray = [] var bodyFuncArray = [] var headBodyObserver var startObserveHeadBodyExists = () => { if (headBodyObserver) { return } headBodyObserver = new MutationObserver(() => { if (doc.head && doc.body) { headBodyObserver.disconnect() } if (doc.documentElement && rootFuncArray.length > 0) { for (const func of rootFuncArray) { func() } rootFuncArray.length = 0 } if (doc.head && headFuncArray.length > 0) { for (const func of headFuncArray) { func() } headFuncArray.length = 0 } if (doc.body && bodyFuncArray.length > 0) { for (const func of bodyFuncArray) { func() } bodyFuncArray.length = 0 } }) headBodyObserver.observe(doc, { childList: true, subtree: true, }) } var runWhenHeadExists = (func) => { if (!doc.head) { headFuncArray.push(func) startObserveHeadBodyExists() return } func() } var runWhenDomReady = (func) => { if (doc.readyState === "interactive" || doc.readyState === "complete") { return func() } const handler = () => { if (doc.readyState === "interactive" || doc.readyState === "complete") { func() removeEventListener(doc, "readystatechange", handler) } } addEventListener(doc, "readystatechange", handler) } var isVisible = (element) => { if (typeof element.checkVisibility === "function") { return element.checkVisibility() } return element.offsetParent !== null } var isTouchScreen = () => "ontouchstart" in win var escapeHTMLPolicy = typeof trustedTypes !== "undefined" && typeof trustedTypes.createPolicy === "function" ? trustedTypes.createPolicy("beuEscapePolicy", { createHTML: (string) => string, }) : void 0 var createHTML = (html) => { return escapeHTMLPolicy ? escapeHTMLPolicy.createHTML(html) : html } var addElement2 = typeof GM_addElement === "function" ? (parentNode, tagName, attributes) => { if (typeof parentNode === "string") { return addElement2(null, parentNode, tagName) } if (!tagName) { return } if (!parentNode) { parentNode = /^(script|link|style|meta)$/.test(tagName) ? getRootElement(1) : getRootElement(2) } if (typeof tagName === "string") { let attributes2 if (attributes) { const entries1 = [] const entries2 = [] for (const entry of Object.entries(attributes)) { if (/^(on\w+|innerHTML)$/.test(entry[0])) { entries2.push(entry) } else { entries1.push(entry) } } attributes = Object.fromEntries(entries1) attributes2 = Object.fromEntries(entries2) } const element = GM_addElement(null, tagName, attributes) setAttributes(element, attributes2) parentNode.append(element) return element } setAttributes(tagName, attributes) parentNode.append(tagName) return tagName } : addElement var addStyle = (styleText) => addElement2(null, "style", { textContent: styleText }) var registerMenuCommand = (name, callback, accessKey) => { if (window !== top) { return } if (typeof GM.registerMenuCommand !== "function") { console.warn("Do not support GM.registerMenuCommand!") return } GM.registerMenuCommand(name, callback, accessKey) } var style_default = '#browser_extension_settings_container{--browser-extension-settings-background-color: #f2f2f7;--browser-extension-settings-text-color: #444444;--browser-extension-settings-link-color: #217dfc;--sb-track-color: #00000000;--sb-thumb-color: #33334480;--sb-size: 2px;--font-family: "helvetica neue", "microsoft yahei", arial, sans-serif;position:fixed;top:10px;right:30px;max-height:90%;height:600px;overflow:hidden;display:none;z-index:100000;border-radius:5px;-webkit-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);-moz-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);box-shadow:0px 10px 39px 10px rgba(62,66,66,.22) !important}#browser_extension_settings_container .browser_extension_settings_wrapper{display:flex;height:100%;overflow:hidden;background-color:var(--browser-extension-settings-background-color);font-family:var(--font-family)}#browser_extension_settings_container .browser_extension_settings_wrapper h1,#browser_extension_settings_container .browser_extension_settings_wrapper h2{border:none;color:var(--browser-extension-settings-text-color);padding:0;font-family:var(--font-family);line-height:normal;letter-spacing:normal}#browser_extension_settings_container .browser_extension_settings_wrapper h1{font-size:26px;font-weight:800;margin:18px 0}#browser_extension_settings_container .browser_extension_settings_wrapper h2{font-size:18px;font-weight:600;margin:14px 0}#browser_extension_settings_container .browser_extension_settings_wrapper footer{display:flex;justify-content:center;flex-direction:column;font-size:11px;margin:10px auto 0px;background-color:var(--browser-extension-settings-background-color);color:var(--browser-extension-settings-text-color);font-family:var(--font-family)}#browser_extension_settings_container .browser_extension_settings_wrapper footer a{color:var(--browser-extension-settings-link-color) !important;font-family:var(--font-family);text-decoration:none;padding:0}#browser_extension_settings_container .browser_extension_settings_wrapper footer p{text-align:center;padding:0;margin:2px;line-height:13px;font-size:11px;color:var(--browser-extension-settings-text-color);font-family:var(--font-family)}#browser_extension_settings_container .browser_extension_settings_wrapper a.navigation_go_previous{color:var(--browser-extension-settings-link-color);cursor:pointer;display:none}#browser_extension_settings_container .browser_extension_settings_wrapper a.navigation_go_previous::before{content:"< "}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container{overflow-x:auto;box-sizing:border-box;padding:10px 15px;background-color:var(--browser-extension-settings-background-color);color:var(--browser-extension-settings-text-color)}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div{background-color:#fff;font-size:14px;border-top:1px solid #ccc;padding:6px 15px 6px 15px}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a:visited,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a:visited{display:flex;justify-content:space-between;align-items:center;cursor:pointer;text-decoration:none;color:var(--browser-extension-settings-text-color);font-family:var(--font-family)}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a:hover,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a:visited:hover,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a:hover,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a:visited:hover{text-decoration:none;color:var(--browser-extension-settings-text-color)}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a span,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div a:visited span,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a span,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div a:visited span{margin-right:10px;line-height:24px;font-family:var(--font-family)}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div.active,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div:hover,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div.active,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div:hover{background-color:#e4e4e6}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div.active a,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div.active a{cursor:default}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div:first-of-type,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div:first-of-type{border-top:none;border-top-right-radius:10px;border-top-left-radius:10px}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .installed_extension_list div:last-of-type,#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container .related_extension_list div:last-of-type{border-bottom-right-radius:10px;border-bottom-left-radius:10px}#browser_extension_settings_container .thin_scrollbar{scrollbar-color:var(--sb-thumb-color) var(--sb-track-color);scrollbar-width:thin}#browser_extension_settings_container .thin_scrollbar::-webkit-scrollbar{width:var(--sb-size)}#browser_extension_settings_container .thin_scrollbar::-webkit-scrollbar-track{background:var(--sb-track-color);border-radius:10px}#browser_extension_settings_container .thin_scrollbar::-webkit-scrollbar-thumb{background:var(--sb-thumb-color);border-radius:10px}#browser_extension_settings_main{min-width:250px;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;padding:10px 15px;background-color:var(--browser-extension-settings-background-color);color:var(--browser-extension-settings-text-color);font-family:var(--font-family)}#browser_extension_settings_main h2{text-align:center;margin:5px 0 0}#browser_extension_settings_main .option_groups{background-color:#fff;padding:6px 15px 6px 15px;border-radius:10px;display:flex;flex-direction:column;margin:10px 0 0}#browser_extension_settings_main .option_groups .action{font-size:14px;padding:6px 0 6px 0;color:var(--browser-extension-settings-link-color);cursor:pointer}#browser_extension_settings_main .bes_external_link{font-size:14px;padding:6px 0 6px 0}#browser_extension_settings_main .bes_external_link a,#browser_extension_settings_main .bes_external_link a:visited,#browser_extension_settings_main .bes_external_link a:hover{color:var(--browser-extension-settings-link-color);font-family:var(--font-family);text-decoration:none;cursor:pointer}#browser_extension_settings_main .option_groups textarea{font-size:12px;margin:10px 0 10px 0;height:100px;width:100%;border:1px solid #a9a9a9;border-radius:4px;box-sizing:border-box}#browser_extension_settings_main .switch_option,#browser_extension_settings_main .select_option{display:flex;justify-content:space-between;align-items:center;padding:6px 0 6px 0;font-size:14px}#browser_extension_settings_main .option_groups>*{border-top:1px solid #ccc}#browser_extension_settings_main .option_groups>*:first-child{border-top:none}#browser_extension_settings_main .bes_option>.bes_icon{width:24px;height:24px;margin-right:10px}#browser_extension_settings_main .bes_option>.bes_title{margin-right:10px;flex-grow:1}#browser_extension_settings_main .bes_option>.bes_select{box-sizing:border-box;background-color:#fff;height:24px;padding:0 2px 0 2px;margin:0;border-radius:6px;border:1px solid #ccc}#browser_extension_settings_main .option_groups .bes_tip{position:relative;margin:0;padding:0 15px 0 0;border:none;max-width:none;font-size:14px}#browser_extension_settings_main .option_groups .bes_tip .bes_tip_anchor{cursor:help;text-decoration:underline}#browser_extension_settings_main .option_groups .bes_tip .bes_tip_content{position:absolute;bottom:15px;left:0;background-color:#fff;color:var(--browser-extension-settings-text-color);text-align:left;padding:10px;display:none;border-radius:5px;-webkit-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);-moz-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);box-shadow:0px 10px 39px 10px rgba(62,66,66,.22) !important}#browser_extension_settings_main .option_groups .bes_tip .bes_tip_anchor:hover+.bes_tip_content,#browser_extension_settings_main .option_groups .bes_tip .bes_tip_content:hover{display:block}#browser_extension_settings_main .option_groups .bes_tip p,#browser_extension_settings_main .option_groups .bes_tip pre{margin:revert;padding:revert}#browser_extension_settings_main .option_groups .bes_tip pre{font-family:Consolas,panic sans,bitstream vera sans mono,Menlo,microsoft yahei,monospace;font-size:13px;letter-spacing:.015em;line-height:120%;white-space:pre;overflow:auto;background-color:#f5f5f5;word-break:normal;overflow-wrap:normal;padding:.5em;border:none}#browser_extension_settings_main .bes_switch_container{--button-width: 51px;--button-height: 24px;--toggle-diameter: 20px;--color-off: #e9e9eb;--color-on: #34c759;width:var(--button-width);height:var(--button-height);position:relative;padding:0;margin:0;flex:none;user-select:none}#browser_extension_settings_main input[type=checkbox]{opacity:0;width:0;height:0;position:absolute}#browser_extension_settings_main .bes_switch{width:100%;height:100%;display:block;background-color:var(--color-off);border-radius:calc(var(--button-height)/2);border:none;cursor:pointer;transition:all .2s ease-out}#browser_extension_settings_main .bes_switch::before{display:none}#browser_extension_settings_main .bes_slider{width:var(--toggle-diameter);height:var(--toggle-diameter);position:absolute;left:2px;top:calc(50% - var(--toggle-diameter)/2);border-radius:50%;background:#fff;box-shadow:0px 3px 8px rgba(0,0,0,.15),0px 3px 1px rgba(0,0,0,.06);transition:all .2s ease-out;cursor:pointer}#browser_extension_settings_main input[type=checkbox]:checked+.bes_switch{background-color:var(--color-on)}#browser_extension_settings_main input[type=checkbox]:checked+.bes_switch .bes_slider{left:calc(var(--button-width) - var(--toggle-diameter) - 2px)}#browser_extension_side_menu{min-height:80px;width:30px;opacity:0;position:fixed;top:80px;right:0;padding-top:20px;z-index:10000}#browser_extension_side_menu:hover{opacity:1}#browser_extension_side_menu button{cursor:pointer;width:24px;height:24px;padding:0;border:none;background-color:rgba(0,0,0,0);background-image:none}#browser_extension_side_menu button svg{width:24px;height:24px}#browser_extension_side_menu button:hover{opacity:70%}#browser_extension_side_menu button:active{opacity:100%}@media(max-width: 500px){#browser_extension_settings_container{right:10px}#browser_extension_settings_container .browser_extension_settings_wrapper a.navigation_go_previous{display:block}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container{display:none}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container.bes_active{display:block}#browser_extension_settings_container .browser_extension_settings_wrapper .extension_list_container.bes_active+div{display:none}}' function createSwitch(options = {}) { const container = createElement("label", { class: "bes_switch_container" }) const checkbox = createElement( "input", options.checked ? { type: "checkbox", checked: "" } : { type: "checkbox" } ) addElement2(container, checkbox) const switchElm = createElement("span", { class: "bes_switch" }) addElement2(switchElm, "span", { class: "bes_slider" }) addElement2(container, switchElm) if (options.onchange) { addEventListener(checkbox, "change", options.onchange) } return container } function createSwitchOption(icon, text, options) { if (typeof text !== "string") { return createSwitchOption(void 0, icon, text) } const div = createElement("div", { class: "switch_option bes_option" }) if (icon) { addElement2(div, "img", { src: icon, class: "bes_icon" }) } addElement2(div, "span", { textContent: text, class: "bes_title" }) div.append(createSwitch(options)) return div } var besVersion = 55 var openButton = '' var openInNewTabButton = '' var settingButton = '' function initI18n(messageMaps, language) { language = (language || navigator.language).toLowerCase() const language2 = language.slice(0, 2) let messagesDefault let messagesLocal for (const entry of Object.entries(messageMaps)) { const langs = new Set( entry[0] .toLowerCase() .split(",") .map((v) => v.trim()) ) const value = entry[1] if (langs.has(language)) { messagesLocal = value } if (langs.has(language2) && !messagesLocal) { messagesLocal = value } if (langs.has("en")) { messagesDefault = value } if (langs.has("en-us") && !messagesDefault) { messagesDefault = value } } if (!messagesLocal) { messagesLocal = {} } if (!messagesDefault || messagesDefault === messagesLocal) { messagesDefault = {} } return function (key, ...parameters) { let text = messagesLocal[key] || messagesDefault[key] || key if (parameters && parameters.length > 0 && text !== key) { for (let i3 = 0; i3 < parameters.length; i3++) { text = text.replaceAll( new RegExp("\\{".concat(i3 + 1, "\\}"), "g"), String(parameters[i3]) ) } } return text } } var messages = { "settings.title": "Settings", "settings.otherExtensions": "Other Extensions", "settings.displaySettingsButtonInSideMenu": "Display Settings Button in Side Menu", "settings.menu.settings": "\u2699\uFE0F Settings", "settings.extensions.utags.title": "\u{1F3F7}\uFE0F UTags - Add usertags to links", "settings.extensions.links-helper.title": "\u{1F517} Links Helper", "settings.extensions.v2ex.rep.title": "V2EX.REP - \u4E13\u6CE8\u63D0\u5347 V2EX \u4E3B\u9898\u56DE\u590D\u6D4F\u89C8\u4F53\u9A8C", "settings.extensions.v2ex.min.title": "v2ex.min - V2EX Minimalist (\u6781\u7B80\u98CE\u683C)", "settings.extensions.replace-ugly-avatars.title": "Replace Ugly Avatars", "settings.extensions.more-by-pipecraft.title": "Find more useful userscripts", } var en_default = messages var messages2 = { "settings.title": "\u8BBE\u7F6E", "settings.otherExtensions": "\u5176\u4ED6\u6269\u5C55", "settings.displaySettingsButtonInSideMenu": "\u5728\u4FA7\u8FB9\u680F\u83DC\u5355\u4E2D\u663E\u793A\u8BBE\u7F6E\u6309\u94AE", "settings.menu.settings": "\u2699\uFE0F \u8BBE\u7F6E", "settings.extensions.utags.title": "\u{1F3F7}\uFE0F \u5C0F\u9C7C\u6807\u7B7E (UTags) - \u4E3A\u94FE\u63A5\u6DFB\u52A0\u7528\u6237\u6807\u7B7E", "settings.extensions.links-helper.title": "\u{1F517} \u94FE\u63A5\u52A9\u624B", "settings.extensions.v2ex.rep.title": "V2EX.REP - \u4E13\u6CE8\u63D0\u5347 V2EX \u4E3B\u9898\u56DE\u590D\u6D4F\u89C8\u4F53\u9A8C", "settings.extensions.v2ex.min.title": "v2ex.min - V2EX \u6781\u7B80\u98CE\u683C", "settings.extensions.replace-ugly-avatars.title": "\u8D50\u4F60\u4E2A\u5934\u50CF\u5427", "settings.extensions.more-by-pipecraft.title": "\u66F4\u591A\u6709\u8DA3\u7684\u811A\u672C", } var zh_cn_default = messages2 var i = initI18n({ "en,en-US": en_default, "zh,zh-CN": zh_cn_default, }) var lang = navigator.language var locale if (lang === "zh-TW" || lang === "zh-HK") { locale = "zh-TW" } else if (lang.includes("zh")) { locale = "zh-CN" } else { locale = "en" } var relatedExtensions = [ { id: "utags", title: i("settings.extensions.utags.title"), url: "https://greasyfork.org/".concat( locale, "/scripts/460718-utags-add-usertags-to-links" ), }, { id: "links-helper", title: i("settings.extensions.links-helper.title"), description: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00\u7B2C\u4E09\u65B9\u7F51\u7AD9\u94FE\u63A5\uFF0C\u56FE\u7247\u94FE\u63A5\u8F6C\u56FE\u7247\u6807\u7B7E\u7B49", url: "https://greasyfork.org/".concat( locale, "/scripts/464541-links-helper" ), }, { id: "v2ex.rep", title: i("settings.extensions.v2ex.rep.title"), url: "https://greasyfork.org/".concat( locale, "/scripts/466589-v2ex-rep-%E4%B8%93%E6%B3%A8%E6%8F%90%E5%8D%87-v2ex-%E4%B8%BB%E9%A2%98%E5%9B%9E%E5%A4%8D%E6%B5%8F%E8%A7%88%E4%BD%93%E9%AA%8C" ), }, { id: "v2ex.min", title: i("settings.extensions.v2ex.min.title"), url: "https://greasyfork.org/".concat( locale, "/scripts/463552-v2ex-min-v2ex-%E6%9E%81%E7%AE%80%E9%A3%8E%E6%A0%BC" ), }, { id: "replace-ugly-avatars", title: i("settings.extensions.replace-ugly-avatars.title"), url: "https://greasyfork.org/".concat( locale, "/scripts/472616-replace-ugly-avatars" ), }, { id: "more-by-pipecraft", title: i("settings.extensions.more-by-pipecraft.title"), url: "https://greasyfork.org/".concat(locale, "/users/1030884-pipecraft"), }, ] var getInstalledExtesionList = () => { return $(".extension_list_container .installed_extension_list") } var getRelatedExtesionList = () => { return $(".extension_list_container .related_extension_list") } var isInstalledExtension = (id) => { const list = getInstalledExtesionList() if (!list) { return false } const installed = $('[data-extension-id="'.concat(id, '"]'), list) return Boolean(installed) } var addCurrentExtension = (extension) => { const list = getInstalledExtesionList() if (!list) { return } if (isInstalledExtension(extension.id)) { return } const element = createInstalledExtension(extension) list.append(element) const list2 = getRelatedExtesionList() if (list2) { updateRelatedExtensions(list2) } } var activeExtension = (id) => { const list = getInstalledExtesionList() if (!list) { return false } for (const element of $$(".active", list)) { removeClass(element, "active") } const installed = $('[data-extension-id="'.concat(id, '"]'), list) if (installed) { addClass(installed, "active") } } var activeExtensionList = () => { const extensionListContainer = $(".extension_list_container") if (extensionListContainer) { addClass(extensionListContainer, "bes_active") } } var deactiveExtensionList = () => { const extensionListContainer = $(".extension_list_container") if (extensionListContainer) { removeClass(extensionListContainer, "bes_active") } } var createInstalledExtension = (installedExtension) => { const div = createElement("div", { class: "installed_extension", "data-extension-id": installedExtension.id, }) const a = addElement2(div, "a", { onclick: installedExtension.onclick, }) addElement2(a, "span", { textContent: installedExtension.title, }) const svg = addElement2(a, "svg") svg.outerHTML = createHTML(openButton) return div } var updateRelatedExtensions = (container) => { const relatedExtensionElements = $$("[data-extension-id]", container) if (relatedExtensionElements.length > 0) { for (const relatedExtensionElement of relatedExtensionElements) { if ( isInstalledExtension( relatedExtensionElement.dataset.extensionId || "noid" ) ) { relatedExtensionElement.remove() } } } else { container.innerHTML = createHTML("") } for (const relatedExtension of relatedExtensions) { if ( isInstalledExtension(relatedExtension.id) || $('[data-extension-id="'.concat(relatedExtension.id, '"]'), container) ) { continue } if ($$("[data-extension-id]", container).length >= 4) { return } const div4 = addElement2(container, "div", { class: "related_extension", "data-extension-id": relatedExtension.id, }) const a = addElement2(div4, "a", { href: relatedExtension.url, target: "_blank", }) addElement2(a, "span", { textContent: relatedExtension.title, }) const svg = addElement2(a, "svg") svg.outerHTML = createHTML(openInNewTabButton) } } function createExtensionList(installedExtensions) { const div = createElement("div", { class: "extension_list_container thin_scrollbar", }) addElement2(div, "h1", { textContent: i("settings.title") }) const div2 = addElement2(div, "div", { class: "installed_extension_list", }) for (const installedExtension of installedExtensions) { if (isInstalledExtension(installedExtension.id)) { continue } const element = createInstalledExtension(installedExtension) div2.append(element) } addElement2(div, "h2", { textContent: i("settings.otherExtensions") }) const div3 = addElement2(div, "div", { class: "related_extension_list", }) updateRelatedExtensions(div3) return div } var prefix = "browser_extension_settings_" var randomId = String(Math.round(Math.random() * 1e4)) var settingsContainerId = prefix + "container_" + randomId var settingsElementId = prefix + "main_" + randomId var getSettingsElement = () => $("#" + settingsElementId) var getSettingsStyle = () => style_default .replaceAll(/browser_extension_settings_container/gm, settingsContainerId) .replaceAll(/browser_extension_settings_main/gm, settingsElementId) var storageKey = "settings" var settingsOptions var settingsTable = {} var settings = {} async function getSettings() { var _a return (_a = await getValue(storageKey)) != null ? _a : {} } async function saveSettingsValue(key, value) { const settings2 = await getSettings() settings2[key] = settingsTable[key] && settingsTable[key].defaultValue === value ? void 0 : value await setValue(storageKey, settings2) } function getSettingsValue(key) { var _a return Object.hasOwn(settings, key) ? settings[key] : (_a = settingsTable[key]) == null ? void 0 : _a.defaultValue } var closeModal = () => { const settingsContainer = getSettingsContainer() if (settingsContainer) { settingsContainer.style.display = "none" } removeEventListener(document, "click", onDocumentClick, true) removeEventListener(document, "keydown", onDocumentKeyDown, true) } var onDocumentClick = (event) => { const target = event.target if ( target == null ? void 0 : target.closest(".".concat(prefix, "container")) ) { return } closeModal() } var onDocumentKeyDown = (event) => { if (event.defaultPrevented) { return } if (event.key === "Escape") { closeModal() event.preventDefault() } } async function updateOptions() { if (!getSettingsElement()) { return } for (const key in settingsTable) { if (Object.hasOwn(settingsTable, key)) { const item = settingsTable[key] const type = item.type || "switch" switch (type) { case "switch": { const checkbox = $( "#" .concat( settingsElementId, ' .option_groups .switch_option[data-key="' ) .concat(key, '"] input') ) if (checkbox) { checkbox.checked = getSettingsValue(key) } break } case "select": { const options = $$( "#" .concat( settingsElementId, ' .option_groups .select_option[data-key="' ) .concat(key, '"] .bes_select option') ) for (const option of options) { option.selected = option.value === String(getSettingsValue(key)) } break } case "textarea": { const textArea = $( "#" .concat( settingsElementId, ' .option_groups textarea[data-key="' ) .concat(key, '"]') ) if (textArea) { textArea.value = getSettingsValue(key) } break } default: { break } } } } if (typeof settingsOptions.onViewUpdate === "function") { const settingsMain = createSettingsElement() settingsOptions.onViewUpdate(settingsMain) } } function getSettingsContainer() { const container = $(".".concat(prefix, "container")) if (container) { const theVersion = parseInt10(container.dataset.besVersion, 0) if (theVersion < besVersion) { container.id = settingsContainerId container.dataset.besVersion = String(besVersion) } return container } return addElement2(doc.body, "div", { id: settingsContainerId, class: "".concat(prefix, "container"), "data-bes-version": besVersion, style: "display: none;", }) } function getSettingsWrapper() { const container = getSettingsContainer() return ( $(".".concat(prefix, "wrapper"), container) || addElement2(container, "div", { class: "".concat(prefix, "wrapper"), }) ) } function initExtensionList() { const wrapper = getSettingsWrapper() if (!$(".extension_list_container", wrapper)) { const list = createExtensionList([]) wrapper.append(list) } addCurrentExtension({ id: settingsOptions.id, title: settingsOptions.title, onclick: showSettings, }) } function createSettingsElement() { let settingsMain = getSettingsElement() if (!settingsMain) { const wrapper = getSettingsWrapper() for (const element of $$(".".concat(prefix, "main"))) { element.remove() } settingsMain = addElement2(wrapper, "div", { id: settingsElementId, class: "".concat(prefix, "main thin_scrollbar"), }) addElement2(settingsMain, "a", { textContent: "Settings", class: "navigation_go_previous", onclick() { activeExtensionList() }, }) if (settingsOptions.title) { addElement2(settingsMain, "h2", { textContent: settingsOptions.title }) } const optionGroups = [] const getOptionGroup = (index) => { if (index > optionGroups.length) { for (let i3 = optionGroups.length; i3 < index; i3++) { optionGroups.push( addElement2(settingsMain, "div", { class: "option_groups", }) ) } } return optionGroups[index - 1] } for (const key in settingsTable) { if (Object.hasOwn(settingsTable, key)) { const item = settingsTable[key] const type = item.type || "switch" const group = item.group || 1 const optionGroup = getOptionGroup(group) switch (type) { case "switch": { const switchOption = createSwitchOption(item.icon, item.title, { async onchange(event) { const checkbox = event.target if (checkbox) { let result = true if (typeof item.onConfirmChange === "function") { result = item.onConfirmChange(checkbox.checked) } if (result) { await saveSettingsValue(key, checkbox.checked) } else { checkbox.checked = !checkbox.checked } } }, }) switchOption.dataset.key = key addElement2(optionGroup, switchOption) break } case "textarea": { let timeoutId const div = addElement2(optionGroup, "div", { class: "bes_textarea", }) addElement2(div, "textarea", { "data-key": key, placeholder: item.placeholder || "", onkeyup(event) { const textArea = event.target if (timeoutId) { clearTimeout(timeoutId) timeoutId = void 0 } timeoutId = setTimeout(async () => { if (textArea) { await saveSettingsValue(key, textArea.value.trim()) } }, 100) }, }) break } case "action": { addElement2(optionGroup, "a", { class: "action", textContent: item.title, onclick: item.onclick, }) break } case "externalLink": { const div4 = addElement2(optionGroup, "div", { class: "bes_external_link", }) addElement2(div4, "a", { textContent: item.title, href: item.url, target: "_blank", }) break } case "select": { const div = addElement2(optionGroup, "div", { class: "select_option bes_option", "data-key": key, }) if (item.icon) { addElement2(div, "img", { src: item.icon, class: "bes_icon" }) } addElement2(div, "span", { textContent: item.title, class: "bes_title", }) const select = addElement2(div, "select", { class: "bes_select", async onchange() { await saveSettingsValue(key, select.value) }, }) for (const option of Object.entries(item.options)) { addElement2(select, "option", { textContent: option[0], value: option[1], }) } break } case "tip": { const tip = addElement2(optionGroup, "div", { class: "bes_tip", }) addElement2(tip, "a", { class: "bes_tip_anchor", textContent: item.title, }) const tipContent = addElement2(tip, "div", { class: "bes_tip_content", innerHTML: createHTML(item.tipContent), }) break } } } } if (settingsOptions.footer) { const footer = addElement2(settingsMain, "footer") footer.innerHTML = createHTML( typeof settingsOptions.footer === "string" ? settingsOptions.footer : '
Made with \u2764\uFE0F by\n \n Pipecraft\n
' ) } } return settingsMain } function addSideMenu() { if (!getSettingsValue("displaySettingsButtonInSideMenu")) { return } const menu = $("#browser_extension_side_menu") || addElement2(doc.body, "div", { id: "browser_extension_side_menu", "data-bes-version": besVersion, }) const button = $("button[data-bes-version]", menu) if (button) { const theVersion = parseInt10(button.dataset.besVersion, 0) if (theVersion >= besVersion) { return } button.remove() } addElement2(menu, "button", { type: "button", "data-bes-version": besVersion, title: i("settings.menu.settings"), onclick() { setTimeout(showSettings, 1) }, innerHTML: settingButton, }) } function addCommonSettings(settingsTable3) { let maxGroup = 0 for (const key in settingsTable3) { if (Object.hasOwn(settingsTable3, key)) { const item = settingsTable3[key] const group = item.group || 1 if (group > maxGroup) { maxGroup = group } } } settingsTable3.displaySettingsButtonInSideMenu = { title: i("settings.displaySettingsButtonInSideMenu"), defaultValue: !( typeof GM === "object" && typeof GM.registerMenuCommand === "function" ), group: maxGroup + 1, } } function handleShowSettingsUrl() { if (location.hash === "#bes-show-settings") { setTimeout(showSettings, 100) } } async function showSettings() { const settingsContainer = getSettingsContainer() const settingsMain = createSettingsElement() await updateOptions() settingsContainer.style.display = "block" addEventListener(document, "click", onDocumentClick, true) addEventListener(document, "keydown", onDocumentKeyDown, true) activeExtension(settingsOptions.id) deactiveExtensionList() } var initSettings = async (options) => { settingsOptions = options settingsTable = options.settingsTable || {} addCommonSettings(settingsTable) addValueChangeListener(storageKey, async () => { settings = await getSettings() await updateOptions() addSideMenu() if (typeof options.onValueChange === "function") { options.onValueChange() } }) settings = await getSettings() runWhenHeadExists(() => { addStyle(getSettingsStyle()) }) runWhenDomReady(() => { initExtensionList() addSideMenu() }) registerMenuCommand(i("settings.menu.settings"), showSettings, "o") handleShowSettingsUrl() } var content_default = '#TOFIX_uFEFF{display:block}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul:not(.utags_ul)[data-utags_key],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ol:not(.utags_ul)[data-utags_key]{display:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity)[data-utags=off] .utags_ul{display:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul{box-sizing:border-box !important;display:inline-flex !important;flex-direction:row !important;flex-wrap:wrap !important;align-content:flex-start;justify-content:flex-start;overflow:visible;white-space:normal;list-style-type:none !important;margin:0 !important;padding:0 !important;vertical-align:text-bottom !important;line-height:normal !important;background-color:rgba(0,0,0,0);border:none !important;box-shadow:none !important;max-width:100% !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul>li{box-sizing:border-box !important;display:inline-flex !important;align-items:center !important;float:none !important;overflow:visible;width:unset !important;height:unset !important;border:none !important;padding:0 !important;margin:0 !important;vertical-align:top !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul>li:first-child .utags_text_tag{margin-left:3px !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul>li:last-child .utags_text_tag{margin-right:3px !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul>li::before,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul>li::after{content:none}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag{box-sizing:border-box !important;display:block !important;border:var(--utags-text-tag-border-width) solid var(--utags-text-tag-border-color);color:var(--utags-text-tag-color) !important;border-radius:3px !important;padding:1px 3px !important;margin:0 1px !important;font-size:var(--utags-text-tag-font-size) !important;font-family:var(--utags-text-tag-font-family) !important;letter-spacing:0 !important;line-height:1 !important;height:unset !important;width:unset !important;font-weight:normal !important;text-decoration:none !important;text-align:center !important;text-shadow:none !important;min-width:unset !important;min-height:unset !important;max-width:unset !important;max-height:unset !important;background:unset !important;background-color:var(--utags-text-tag-background-color) !important;cursor:pointer;z-index:0;pointer-events:auto}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag:link{cursor:pointer}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag[data-utags_tag]::before{content:attr(data-utags_tag);display:block;font-size:var(--utags-text-tag-font-size);line-height:1;height:unset;width:unset;max-width:var(--utags-text-tag-max-width);white-space:var(--utags-text-tag-white-space);overflow:hidden;text-overflow:ellipsis;border-radius:unset;border:unset;background:unset;margin:unset;padding:unset}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag[data-utags_tag]::after{display:none}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag[data-utags_tag=":visited"]{height:var(--utags-visited-tag-size) !important;width:var(--utags-visited-tag-size) !important;border-radius:var(--utags-visited-tag-size) !important;--utags-text-tag-background-color: var( --utags-visited-tag-background-color );--utags-text-tag-border-color: var(--utags-visited-tag-background-color);--utags-text-tag-border-width: 0px;margin-left:2px !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_text_tag[data-utags_tag=":visited"]::before{display:none}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_emoji_tag{--utags-text-tag-background-color: var( --utags-emoji-tag-background-color );--utags-text-tag-font-size: var(--utags-emoji-tag-font-size);--utags-text-tag-font-family: var(--utags-emoji-tag-font-family);--utags-text-tag-border-width: var(--utags-emoji-tag-border-width);--utags-text-tag-border-color: var(--utags-emoji-tag-border-color)}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2{width:var(--utags-captain-tag-size) !important;height:var(--utags-captain-tag-size) !important;padding:1px 0 0 1px !important;background:none !important;color:var(--utags-captain-tag-color) !important;border:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag::before,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2::before{content:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag svg,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2 svg{fill:currentColor !important;vertical-align:-3px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag *,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2 *{color:inherit !important;fill:currentColor !important;width:unset;height:unset}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag{opacity:1%;position:absolute;top:var(--utags-notag-captain-tag-top, 0);left:var(--utags-notag-captain-tag-left, 0);padding:0 !important;margin:0 !important;width:4px !important;height:4px !important;font-size:1px !important;background-color:var(--utags-captain-tag-background-color) !important;transition:all 0s .3s !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag:hover,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag:focus,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2:hover,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul .utags_captain_tag2:focus{color:var(--utags-captain-tag-hover-color) !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul.utags_ul_0{margin:0 !important;display:var(--utags-notag-ul-disply, inline) !important;float:var(--utags-notag-ul-float, none);height:var(--utags-notag-ul-height, unset);width:var(--utags-notag-ul-width, unset) !important;position:var(--utags-notag-ul-position, unset);top:var(--utags-notag-ul-top, unset)}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul.utags_ul_0>li{position:relative !important;height:var(--utags-captain-tag-size) !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_captain_tag:focus,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) *:hover+.utags_ul .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_fit_content]:hover .utags_ul .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_ul:hover .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_show_all .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) :not(a):not([data-utags_node_type=link])+.utags_ul .utags_captain_tag{opacity:100%;width:calc(var(--utags-captain-tag-size) + 8px) !important;height:calc(var(--utags-captain-tag-size) + 8px) !important;padding:5px 4px 4px 5px !important;transition:all 0s .1s !important;z-index:90}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_hide_all .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_show_all .utags_captain_tag{transition:unset !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal{position:fixed;top:0;left:0;height:0;width:0;z-index:200000}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_modal_wrapper{position:fixed;display:flex;align-items:flex-start;justify-content:center;width:100%;inset:0px;padding-top:5vh;background-color:hsla(0,0%,100%,.1);z-index:200000}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_modal_content{box-sizing:border-box;display:flex;flex-direction:column;max-width:94%;max-height:100%;overflow:hidden;overflow:auto;color:#000;background-color:#fff;border-radius:5px;padding:14px;margin:0 auto;-webkit-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);-moz-box-shadow:0px 10px 39px 10px rgba(62,66,66,.22);box-shadow:0px 10px 39px 10px rgba(62,66,66,.22)}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_title{display:block;color:#000;margin-bottom:10px;font-size:14px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_buttons_wrapper{display:flex;flex-direction:row;justify-content:end;padding:10px 0 10px 0}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_buttons_wrapper button{font-size:14px;height:32px;min-width:80px;font-weight:600;padding:0 8px;border-radius:2px;color:var(--utags-button-text-color);border:1px solid var(--utags-button-border-color);background-color:var(--utags-button-bg-color);text-shadow:none;text-align:center;font-family:revert}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_buttons_wrapper button:hover{background-color:var(--utags-button-hover-bg-color);border-color:var(--utags-button-hover-border-color)}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_buttons_wrapper button:not(:first-child){margin-left:10px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_buttons_wrapper button.utags_primary{--utags-button-text-color: var(--utags-action-button-text-color);--utags-button-bg-color: var(--utags-action-button-bg-color);--utags-button-border-color: var(--utags-action-button-border-color);--utags-button-hover-bg-color: var( --utags-action-button-hover-bg-color );--utags-button-hover-border-color: var( --utags-action-button-hover-border-color )}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_prompt input{-webkit-appearance:none;background-color:var(--utags-button-hover-bg-color);border:none;border-bottom:2px solid var(--utags-button-hover-bg-color);border-radius:4px;box-sizing:border-box;caret-color:var(--cr-input-focus-color);color:var(--cr-input-color);font-family:var(--utags-text-tag-font-family) !important;font-weight:inherit;line-height:inherit;min-height:var(--cr-input-min-height, auto);outline:0;padding-bottom:var(--cr-input-padding-bottom, 6px);padding-inline-end:var(--cr-input-padding-end, 8px);padding-inline-start:var(--cr-input-padding-start, 8px);padding-top:var(--cr-input-padding-top, 6px);text-align:left;text-overflow:ellipsis;width:100%;margin:0;font-size:12px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_prompt input:focus,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_prompt input:focus-visible{outline:0;border-bottom:2px solid var(--utags-action-button-hover-border-color)}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_modal .utags_prompt .utags_link_settings{font-size:12px;text-decoration:underline;cursor:pointer;color:#374151}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_current_tags_wrapper{display:flex;justify-content:space-between}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_current_tags_wrapper .utags_button_copy{cursor:pointer;font-size:10px;line-height:1;height:18px;padding:0 6px;border-radius:2px;color:var(--utags-action-button-text-color);background-color:var(--utags-action-button-bg-color);border:1px solid var(--utags-action-button-border-color);text-shadow:none;text-align:center;font-family:revert}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_current_tags{list-style-type:none;margin:0;padding:0 0 10px 0 !important;display:flex !important;flex-direction:row;flex-wrap:wrap}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_current_tags:empty,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_current_tags:empty+button{display:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_current_tags li .utags_text_tag:hover{--utags-text-tag-color: #000;--utags-text-tag-border-color: #000;--utags-text-tag-background-color: unset;opacity:.5;text-decoration:line-through !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_current_tags li .utags_text_tag[data-utags_tag=":visited"]:hover{--utags-text-tag-background-color: var( --utags-visited-tag-background-color );--utags-text-tag-border-color: var(--utags-visited-tag-background-color);opacity:.3}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) .utags_list_wrapper{display:flex;justify-content:space-between;max-height:200px;overflow-y:auto}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list{flex-grow:1;list-style-type:none;margin:0;padding:10px 0 10px 0}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list:empty{display:none !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list:not(:first-child){margin-left:4px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list::before{content:attr(data-utags_list_name);position:sticky;top:0;display:block;font-size:12px;font-weight:600;text-align:left;padding:0 2px 0 8px;cursor:default;background-color:#f8fafe}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list li{box-sizing:border-box;cursor:pointer;font-size:12px;height:16px;display:flex;align-items:center;padding:0 2px 0 8px;margin:0;max-width:150px;overflow:hidden;text-overflow:ellipsis}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list li.utags_active,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list li.utags_active2{background-color:#fef2f2}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) ul.utags_select_list li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--utags-text-tag-font-family) !important;font-size:12px;line-height:1}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) textarea[data-key=customStyleValue]{height:250px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) textarea[data-key^=customStyleValue_]{height:250px}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u6807\u9898\u515A,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u63A8\u5E7F,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u65E0\u804A,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5FFD\u7565,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",ignore,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",clickbait,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",promotion,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",sb,"]{opacity:10%}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5DF2\u9605,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5DF2\u8BFB,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u65B0\u7528\u6237,"]{opacity:50%}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",hide,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u9690\u85CF,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5C4F\u853D,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u4E0D\u518D\u663E\u793A,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",block,"]{opacity:5%;display:none}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u70ED\u95E8,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u6536\u85CF,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u91CD\u8981,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5173\u6CE8,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u7A0D\u540E\u9605\u8BFB,"]{background-image:linear-gradient(to right, rgba(255, 255, 255, 0), #fefce8) !important;opacity:100% !important;display:var(--utags-list-node-display) !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u70ED\u95E8,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u6536\u85CF,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u91CD\u8981,"],:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node*=",\u5173\u6CE8,"]{background-image:linear-gradient(to right, rgba(255, 255, 255, 0), #fef2f2) !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_list_node]:hover{opacity:99.99% !important}:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_other="1"]+ul.utags_ul .utags_captain_tag,:not(#utags_should_has_higher_specificity):not(#utags_should_has_higher_specificity) [data-utags_other="1"]+ul.utags_ul .utags_captain_tag2{color:#ff0 !important}[data-utags_display-effect-of-the-visited-content="4"] [data-utags_list_node*=",:visited,"] [data-utags_condition_node][data-utags_visited="1"]{color:var(--utags-visited-title-color)}[data-utags_display-effect-of-the-visited-content="2"] [data-utags_list_node*=",:visited,"]{opacity:var(--utags-visited-opacity)}[data-utags_display-effect-of-the-visited-content="3"] [data-utags_list_node*=",:visited,"]{opacity:5%;display:none}.utags_no_hide [data-utags_list_node*=","]{display:var(--utags-list-node-display) !important}.utags_no_opacity_effect [data-utags_list_node*=","]{opacity:100% !important}textarea[data-key=emojiTags]{font-family:var(--utags-text-tag-font-family)}:root{--utags-list-node-display: block;--utags-captain-tag-background-color: #ffffffb3;--utags-captain-tag-background-color-overlap: #ffffffdd;--utags-captain-tag-color: #ff6361;--utags-captain-tag-hover-color: #256cf1;--utags-captain-tag-size: 14px;--utags-text-tag-color: red;--utags-text-tag-border-color: red;--utags-text-tag-background-color: unset;--utags-text-tag-font-size: 10px;--utags-text-tag-border-width: 1px;--utags-text-tag-max-width: 90px;--utags-text-tag-white-space: nowrap;--utags-text-tag-font-family: "helvetica neue", "Helvetica", "microsoft yahei", "Arial", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "noto color emoji", "android emoji", "emojisymbols", "emojione mozilla", "twemoji mozilla", "Segoe UI", "Noto Sans";--utags-emoji-tag-border-color: #fff0;--utags-emoji-tag-background-color: #fff0;--utags-emoji-tag-font-size: 12px;--utags-emoji-tag-border-width: 0;--utags-emoji-tag-font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "noto color emoji", "android emoji", "emojisymbols", "emojione mozilla", "twemoji mozilla", "Segoe UI", "Noto Sans";--utags-visited-tag-background-color: #bdbdbd;--utags-visited-tag-size: 11px;--utags-visited-title-color: #aaa;--utags-visited-opacity: 10%;--utags-button-text-color: #1a73e8;--utags-button-bg-color: #ffffff;--utags-button-border-color: #dadce0;--utags-button-hover-bg-color: #4285f40a;--utags-button-hover-border-color: #d2e3fc;--utags-action-button-text-color: #ffffff;--utags-action-button-bg-color: #1a73e8;--utags-action-button-border-color: #1a73e8;--utags-action-button-hover-bg-color: #1a73e8e6;--utags-action-button-hover-border-color: #1a73e8e6;--utags-notag-ul-disply-1: inline;--utags-notag-ul-float-1: none;--utags-notag-ul-height-1: unset;--utags-notag-ul-width-1: unset;--utags-notag-ul-position-1: unset;--utags-notag-ul-top-1: unset;--utags-notag-captain-tag-top-1: 0;--utags-notag-captain-tag-left-1: 0;--utags-notag-ul-disply-2: block;--utags-notag-ul-height-2: 0;--utags-notag-ul-width-2: 0;--utags-notag-ul-position-2: unset;--utags-notag-ul-top-2: unset;--utags-notag-captain-tag-top-2: -22px;--utags-notag-captain-tag-left-2: -4px;--utags-notag-ul-disply-3: block;--utags-notag-ul-height-3: 0;--utags-notag-ul-width-3: 0;--utags-notag-ul-position-3: absolute;--utags-notag-ul-top-3: 0;--utags-notag-captain-tag-top-3: 0;--utags-notag-captain-tag-left-3: -4px;--utags-notag-ul-disply-4: block;--utags-notag-ul-height-4: 0;--utags-notag-ul-width-4: 0;--utags-notag-ul-position-4: absolute;--utags-notag-ul-top-4: unset;--utags-notag-captain-tag-top-4: 0;--utags-notag-captain-tag-left-4: -4px;--utags-notag-ul-disply-5: block;--utags-notag-ul-height-5: 0;--utags-notag-ul-width-5: 0;--utags-notag-ul-position-5: absolute;--utags-notag-ul-top-5: -9999px;--utags-notag-captain-tag-top-5: 0;--utags-notag-captain-tag-left-5: -4px;--utags-notag-ul-disply: var(--utags-notag-ul-disply-1);--utags-notag-ul-float: var(--utags-notag-ul-float-1);--utags-notag-ul-height: var(--utags-notag-ul-height-1);--utags-notag-ul-width: var(--utags-notag-ul-width-1);--utags-notag-ul-position: var(--utags-notag-ul-position-1);--utags-notag-ul-top: var(--utags-notag-ul-top-1);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-1);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-1)}[data-utags_darkmode="1"]{--utags-visited-title-color: #666}' function createTag(tagName, options) { const a = createElement("a", { title: tagName, class: options.isEmoji ? "utags_text_tag utags_emoji_tag" : "utags_text_tag", }) if (options.enableSelect) { a.textContent = tagName } else { a.dataset.utags_tag = tagName } if (!options.noLink) { a.setAttribute( "href", "https://utags.pipecraft.net/tags/#" + encodeURIComponent(tagName) ) a.setAttribute("target", "_blank") } return a } var messages3 = { "settings.enableCurrentSite": "Enable UTags on the current website", "settings.showHidedItems": "Show hidden items (tags with 'block', 'hide')", "settings.noOpacityEffect": "No opacity mask effect (tags with 'ignore', 'clickbait', 'promotion')", "settings.useVisitedFunction": "Enable browsing content tagging on the current website", "settings.displayEffectOfTheVisitedContent": "The display effect of the browsed content", "settings.displayEffectOfTheVisitedContent.recordingonly": "Save records only, no mark display", "settings.displayEffectOfTheVisitedContent.showtagonly": "Only display marks", "settings.displayEffectOfTheVisitedContent.changecolor": "Change the title color", "settings.displayEffectOfTheVisitedContent.translucent": "Translucent", "settings.displayEffectOfTheVisitedContent.hide": "Hide", "settings.pinnedTags": "Add the tags you want to pin, separated by commas.", "settings.pinnedTagsDefaultValue": "block, hide, ignore, clickbait, promotion", "settings.pinnedTagsPlaceholder": "foo, bar", "settings.emojiTags": "Add the emoji tags, separated by commas", "settings.customStyle": "Enable custom style for all websites", "settings.customStyleCurrentSite": "Enable custom style for the current website", "settings.customStyleDefaultValue": "/* Custom style */\nbody {\n /* Tag text color */\n --utags-text-tag-color: white;\n /* Tag border color */\n --utags-text-tag-border-color: red;\n /* Tag background color */\n --utags-text-tag-background-color: red;\n}\n\n/* The tag style for the tag with the label 'TEST' */\n.utags_text_tag[data-utags_tag=\"TEST\"] {\n /* Tag text color */\n --utags-text-tag-color: white;\n /* Tag border color */\n --utags-text-tag-border-color: orange;\n /* Tag background color */\n --utags-text-tag-background-color: orange;\n}", "settings.customStyleExamples": "Examples", "settings.customStyleExamplesContent": 'Custom style examples
\n\n
/* Custom style */\nbody {\n /* Tag text color */\n --utags-text-tag-color: white;\n /* Tag border color */\n --utags-text-tag-border-color: red;\n /* Tag background color */\n --utags-text-tag-background-color: red;\n}\n\n/* The tag style for the tag with the label \'TEST\' */\n.utags_text_tag[data-utags_tag="TEST"] {\n /* Tag text color */\n --utags-text-tag-color: white;\n /* Tag border color */\n --utags-text-tag-border-color: orange;\n /* Tag background color */\n --utags-text-tag-background-color: orange;\n}\n\ndata-utags_list_node*=",bar,"] {\n /* The background color of the entries\n in the list that contain the \'bar\' tag */\n background-color: aqua;\n}\n\nbody {\n /* The title color of viewed posts */\n --utags-visited-title-color: red;\n}\n\n/* Dark mode */\n[data-utags_darkmode="1"] body {\n /* The title color of viewed posts */\n --utags-visited-title-color: yellow;\n}\n\n \n \n ', "settings.useSimplePrompt": "Use simple prompt method to add tags", "settings.openTagsPage": "Open the tag list page", "settings.openDataPage": "Open the import data/export data page", "settings.title": "\u{1F3F7}\uFE0F UTags - Add usertags to links", "settings.information": "After changing the settings, reload the page to take effect", "settings.report": "Report and Issue...", "prompt.addTags": "[UTags] Please enter tags, multiple tags are separated by commas", "prompt.pinnedTags": "Pinned", "prompt.mostUsedTags": "Recently commonly used", "prompt.recentAddedTags": "Newly added", "prompt.emojiTags": "Emoji", "prompt.copy": "Copy", "prompt.cancel": "Cancle", "prompt.ok": "OK", "prompt.settings": "Settings", } var en_default2 = messages3 var messages4 = { "settings.enableCurrentSite": "\u5728\u5F53\u524D\u7F51\u7AD9\u542F\u7528\u5C0F\u9C7C\u6807\u7B7E", "settings.showHidedItems": "\u663E\u793A\u88AB\u9690\u85CF\u7684\u5185\u5BB9 (\u6DFB\u52A0\u4E86 'block', 'hide', '\u9690\u85CF'\u7B49\u6807\u7B7E\u7684\u5185\u5BB9)", "settings.noOpacityEffect": "\u53BB\u9664\u534A\u900F\u660E\u6548\u679C (\u6DFB\u52A0\u4E86 'sb', '\u5FFD\u7565', '\u6807\u9898\u515A'\u7B49\u6807\u7B7E\u7684\u5185\u5BB9)", "settings.useVisitedFunction": "\u5728\u5F53\u524D\u7F51\u7AD9\u542F\u7528\u6D4F\u89C8\u5185\u5BB9\u6807\u8BB0\u529F\u80FD", "settings.displayEffectOfTheVisitedContent": "\u5F53\u524D\u7F51\u7AD9\u7684\u5DF2\u6D4F\u89C8\u5185\u5BB9\u7684\u5C55\u793A\u6548\u679C", "settings.displayEffectOfTheVisitedContent.recordingonly": "\u53EA\u4FDD\u5B58\u8BB0\u5F55\uFF0C\u4E0D\u663E\u793A\u6807\u8BB0", "settings.displayEffectOfTheVisitedContent.showtagonly": "\u53EA\u663E\u793A\u6807\u8BB0", "settings.displayEffectOfTheVisitedContent.changecolor": "\u66F4\u6539\u6807\u9898\u989C\u8272", "settings.displayEffectOfTheVisitedContent.translucent": "\u534A\u900F\u660E", "settings.displayEffectOfTheVisitedContent.hide": "\u9690\u85CF", "settings.pinnedTags": "\u5728\u4E0B\u9762\u6DFB\u52A0\u8981\u7F6E\u9876\u7684\u6807\u7B7E\uFF0C\u4EE5\u9017\u53F7\u5206\u9694", "settings.pinnedTagsDefaultValue": "\u6536\u85CF, block, sb, \u5C4F\u853D, \u9690\u85CF, \u5DF2\u9605, \u5FFD\u7565, \u6807\u9898\u515A, \u63A8\u5E7F, \u5173\u6CE8", "settings.pinnedTagsPlaceholder": "foo, bar", "settings.emojiTags": "\u5728\u4E0B\u9762\u6DFB\u52A0\u8868\u60C5\u7B26\u53F7\u6807\u7B7E\uFF0C\u4EE5\u9017\u53F7\u5206\u9694", "settings.customStyle": "\u542F\u7528\u5168\u5C40\u81EA\u5B9A\u4E49\u6837\u5F0F", "settings.customStyleCurrentSite": "\u542F\u7528\u5F53\u524D\u7F51\u7AD9\u7684\u81EA\u5B9A\u4E49\u6837\u5F0F", "settings.customStyleDefaultValue": "/* \u81EA\u5B9A\u4E49\u6837\u5F0F */\nbody {\n /* \u6807\u7B7E\u6587\u5B57\u989C\u8272 */\n --utags-text-tag-color: white;\n /* \u6807\u7B7E\u8FB9\u6846\u989C\u8272 */\n --utags-text-tag-border-color: red;\n /* \u6807\u7B7E\u80CC\u666F\u989C\u8272 */\n --utags-text-tag-background-color: red;\n}\n\n/* \u6807\u7B7E\u4E3A 'TEST' \u7684\u6807\u7B7E\u6837\u5F0F */\n.utags_text_tag[data-utags_tag=\"TEST\"] {\n /* \u6807\u7B7E\u6587\u5B57\u989C\u8272 */\n --utags-text-tag-color: white;\n /* \u6807\u7B7E\u8FB9\u6846\u989C\u8272 */\n --utags-text-tag-border-color: orange;\n /* \u6807\u7B7E\u80CC\u666F\u989C\u8272 */\n --utags-text-tag-background-color: orange;\n}", "settings.customStyleExamples": "\u793A\u4F8B", "settings.customStyleExamplesContent": '
\u81EA\u5B9A\u4E49\u6837\u5F0F\u793A\u4F8B
\n\n
/* \u81EA\u5B9A\u4E49\u6837\u5F0F */\nbody {\n /* \u6807\u7B7E\u6587\u5B57\u989C\u8272 */\n --utags-text-tag-color: white;\n /* \u6807\u7B7E\u8FB9\u6846\u989C\u8272 */\n --utags-text-tag-border-color: red;\n /* \u6807\u7B7E\u80CC\u666F\u989C\u8272 */\n --utags-text-tag-background-color: red;\n}\n\n/* \u6807\u7B7E\u4E3A \'TEST\' \u7684\u6807\u7B7E\u6837\u5F0F */\n.utags_text_tag[data-utags_tag="TEST"] {\n /* \u6807\u7B7E\u6587\u5B57\u989C\u8272 */\n --utags-text-tag-color: white;\n /* \u6807\u7B7E\u8FB9\u6846\u989C\u8272 */\n --utags-text-tag-border-color: orange;\n /* \u6807\u7B7E\u80CC\u666F\u989C\u8272 */\n --utags-text-tag-background-color: orange;\n}\n\ndata-utags_list_node*=",bar,"] {\n /* \u5217\u8868\u4E2D\u542B\u6709 \'bar\' \u6807\u7B7E\u7684\u6761\u76EE\u7684\u80CC\u666F\u8272 */\n background-color: aqua;\n}\n\nbody {\n /* \u6D4F\u89C8\u8FC7\u7684\u5E16\u5B50\u7684\u6807\u9898\u989C\u8272 */\n --utags-visited-title-color: red;\n}\n\n/* \u6DF1\u8272\u6A21\u5F0F */\n[data-utags_darkmode="1"] body {\n /* \u6D4F\u89C8\u8FC7\u7684\u5E16\u5B50\u7684\u6807\u9898\u989C\u8272 */\n --utags-visited-title-color: yellow;\n}\n\n \n \n ', "settings.useSimplePrompt": "\u4F7F\u7528\u7B80\u5355\u65B9\u5F0F\u6DFB\u52A0\u6807\u7B7E", "settings.openTagsPage": "\u6807\u7B7E\u5217\u8868", "settings.openDataPage": "\u5BFC\u51FA\u6570\u636E/\u5BFC\u5165\u6570\u636E", "settings.title": "\u{1F3F7}\uFE0F \u5C0F\u9C7C\u6807\u7B7E (UTags) - \u4E3A\u94FE\u63A5\u6DFB\u52A0\u7528\u6237\u6807\u7B7E", "settings.information": "\u66F4\u6539\u8BBE\u7F6E\u540E\uFF0C\u91CD\u65B0\u52A0\u8F7D\u9875\u9762\u5373\u53EF\u751F\u6548", "settings.report": "\u53CD\u9988\u95EE\u9898", "prompt.addTags": "[UTags] \u8BF7\u8F93\u5165\u6807\u7B7E\uFF0C\u591A\u4E2A\u6807\u7B7E\u4EE5\u9017\u53F7\u5206\u9694", "prompt.pinnedTags": "\u7F6E\u9876", "prompt.mostUsedTags": "\u6700\u8FD1\u5E38\u7528", "prompt.recentAddedTags": "\u6700\u65B0\u6DFB\u52A0", "prompt.emojiTags": "\u7B26\u53F7", "prompt.copy": "\u590D\u5236", "prompt.cancel": "\u53D6\u6D88", "prompt.ok": "\u786E\u8BA4", "prompt.settings": "\u8BBE\u7F6E", } var zh_cn_default2 = messages4 var i2 = initI18n({ "en,en-US": en_default2, "zh,zh-CN": zh_cn_default2, }) function trimTitle(title) { return title ? title.replaceAll(/\s+/gm, " ").trim() : "" } function getTrimmedTitle(element) { return trimTitle(element.textContent) } function splitTags(text) { if (!text) { return [] } return [ ...new Set( text .replaceAll(/[\n\r\t\s]+/g, " ") .split(/[,,]/) .map((tag) => tag.trim()) .filter(Boolean) ), ] } var extensionVersion = "0.8.0" var databaseVersion = 2 var storageKey2 = "extension.utags.urlmap" var storageKeyRecentTags = "extension.utags.recenttags" var storageKeyMostUsedTags = "extension.utags.mostusedtags" var storageKeyRecentAddedTags = "extension.utags.recentaddedtags" var cachedUrlMap async function getUrlMap() { return (await getValue(storageKey2)) || {} } async function getUrlMapVesion1() { return getValue("plugin.utags.tags.v1") } async function getCachedUrlMap() { if (!cachedUrlMap) { cachedUrlMap = await getUrlMap() } return cachedUrlMap } function getTags(key) { return (cachedUrlMap && cachedUrlMap[key]) || { tags: [] } } async function saveTags(key, tags, meta) { const urlMap = await getUrlMap() urlMap.meta = Object.assign({}, urlMap.meta, { extensionVersion, databaseVersion, }) const newTags = mergeTags(tags, []) let oldTags = [] if (newTags.length === 0) { delete urlMap[key] } else { const now = Date.now() const data = urlMap[key] || {} oldTags = data.tags const newMeta = Object.assign({}, data.meta, meta, { updated: now, }) newMeta.created = newMeta.created || now urlMap[key] = { tags: newTags, meta: newMeta, } } await setValue(storageKey2, urlMap) await addRecentTags(newTags, oldTags) } function getScore(weight = 1) { return (Math.floor(Date.now() / 1e3) / 1e9) * weight } async function addRecentTags(newTags, oldTags) { if (newTags.length === 0) { return } newTags = oldTags && oldTags.length > 0 ? newTags.filter((v) => !oldTags.includes(v)) : newTags if (newTags.length > 0) { const recentTags = (await getValue(storageKeyRecentTags)) || [] const score = getScore() for (const tag of newTags) { recentTags.push({ tag, score, }) } if (recentTags.length > 1e3) { recentTags.splice(0, 100) } await setValue(storageKeyRecentTags, recentTags) await generateMostUsedAndRecentAddedTags(recentTags) } } async function generateMostUsedAndRecentAddedTags(recentTags) { const mostUsed = {} for (const recentTag of recentTags) { if (!recentTag.tag) { continue } if (mostUsed[recentTag.tag]) { mostUsed[recentTag.tag].score += recentTag.score } else if (recentTag.tag) { mostUsed[recentTag.tag] = { tag: recentTag.tag, score: recentTag.score, } } } const mostUsedTags2 = Object.values(mostUsed) .filter((v) => v.score > getScore(1.5)) .sort((a, b) => { return b.score - a.score }) .map((v) => v.tag) .slice(0, 200) const uniqSet = /* @__PURE__ */ new Set() const recentAddedTags2 = recentTags .map((v) => v.tag) .reverse() .filter((v) => v && !uniqSet.has(v) && uniqSet.add(v)) .slice(0, 200) await setValue(storageKeyMostUsedTags, mostUsedTags2) await setValue(storageKeyRecentAddedTags, recentAddedTags2) } async function getMostUsedTags() { return (await getValue(storageKeyMostUsedTags)) || [] } async function getRecentAddedTags() { return (await getValue(storageKeyRecentAddedTags)) || [] } async function getPinnedTags() { return splitTags(getSettingsValue("pinnedTags") || "") } async function getEmojiTags() { return splitTags(getSettingsValue("emojiTags") || "") } function addTagsValueChangeListener(func) { addValueChangeListener(storageKey2, func) } addTagsValueChangeListener(async () => { cachedUrlMap = void 0 await checkVersion() }) async function reload() { console.log("Current extionsion is outdated, need reload page") const urlMap = await getUrlMap() urlMap.meta = urlMap.meta || {} await setValue(storageKey2, urlMap) location.reload() } async function checkVersion() { cachedUrlMap = await getUrlMap() const meta = cachedUrlMap.meta || {} if (meta.extensionVersion !== extensionVersion) { console.log( "Previous extension version:", meta.extensionVersion, "current extension version:", extensionVersion ) if (meta.extensionVersion > extensionVersion) { } } if (meta.databaseVersion !== databaseVersion) { console.log( "Previous database version:", meta.databaseVersion, "current database version:", databaseVersion ) if (meta.databaseVersion > databaseVersion) { await reload() return false } } return true } function isValidKey(key) { return isUrl(key) } function isValidTags(tags) { return Array.isArray(tags) } function mergeTags(tags, tags2) { tags = tags || [] tags2 = tags2 || [] return uniq( tags .concat(tags2) .map((v) => (v ? String(v).trim() : v)) .filter(Boolean) ) } async function migrationData(urlMap) { console.log("Before migration", JSON.stringify(urlMap)) const meta = urlMap.meta || {} const now = Date.now() const meta2 = { created: now, updated: now } if (!meta.databaseVersion) { meta.databaseVersion = 1 } if (meta.databaseVersion === 1) { for (const key in urlMap) { if (!Object.hasOwn(urlMap, key)) { continue } if (!isValidKey(key)) { continue } const tags = urlMap[key] if (!isValidTags(tags)) { throw new Error("Invaid data format.") } const newTags = mergeTags(tags, []) if (newTags.length > 0) { urlMap[key] = { tags: newTags, meta: meta2 } } else { delete urlMap[key] } } meta.databaseVersion = 2 } if (meta.databaseVersion === 2) { } urlMap.meta = meta console.log("After migration", JSON.stringify(urlMap)) return urlMap } async function mergeData(urlMapNew) { if (typeof urlMapNew !== "object") { throw new TypeError("Invalid data format") } let numberOfLinks = 0 let numberOfTags = 0 const urlMap = await getUrlMap() if ( !urlMapNew.meta || urlMapNew.meta.databaseVersion !== urlMap.meta.databaseVersion ) { urlMapNew = await migrationData(urlMapNew) } if (urlMapNew.meta.databaseVersion !== urlMap.meta.databaseVersion) { throw new Error("Invalid database version") } for (const key in urlMapNew) { if (!Object.hasOwn(urlMapNew, key)) { continue } if (!isValidKey(key)) { continue } const tags = urlMapNew[key].tags || [] const meta = urlMapNew[key].meta || {} if (!isValidTags(tags)) { throw new Error("Invaid data format.") } const orgData = urlMap[key] || { tags: [] } const orgTags = orgData.tags || [] const newTags = mergeTags(orgTags, tags) const now = Date.now() if (newTags.length > 0) { const orgMeta = orgData.meta || {} const created = Math.min(orgMeta.created || now, meta.created || now) const updated = Math.max( orgMeta.updated || 0, meta.updated || 0, created ) const newMata = Object.assign({}, orgMeta, meta, { created, updated }) urlMap[key] = Object.assign({}, orgData, { tags: newTags, meta: newMata, }) numberOfTags += Math.max(newTags.length - orgTags.length, 0) if (orgTags.length === 0) { numberOfLinks++ } } else { delete urlMap[key] } } await setValue(storageKey2, urlMap) console.log( "\u6570\u636E\u5DF2\u6210\u529F\u5BFC\u5165\uFF0C\u65B0\u589E " .concat(numberOfLinks, " \u6761\u94FE\u63A5\uFF0C\u65B0\u589E ") .concat(numberOfTags, " \u6761\u6807\u7B7E\u3002") ) return { numberOfLinks, numberOfTags } } async function migration() { const result = await checkVersion() if (!result) { return } cachedUrlMap = await getUrlMap() const meta = cachedUrlMap.meta || {} if (meta.databaseVersion !== databaseVersion) { meta.databaseVersion = meta.databaseVersion || 1 if (meta.databaseVersion < databaseVersion) { console.log("Migration start") await saveTags("any", []) console.log("Migration done") } } const urlMapVer1 = await getUrlMapVesion1() if (urlMapVer1) { console.log( "Migration start: database version 1 to database version", databaseVersion ) const result2 = await mergeData(urlMapVer1) if (result2) { await setValue("plugin.utags.tags.v1", null) } } } async function outputData() { if ( /^(utags\.pipecraft\.net|localhost|127\.0\.0\.1)$/.test(location.hostname) ) { const urlMap = await getUrlMap() const textarea = createElement("textarea") textarea.id = "utags_output" textarea.setAttribute("style", "display:none") textarea.value = JSON.stringify(urlMap) doc.body.append(textarea) textarea.addEventListener("click", async () => { if (textarea.dataset.utags_type === "export") { const urlMap2 = await getUrlMap() textarea.value = JSON.stringify(urlMap2) textarea.dataset.utags_type = "export_done" textarea.click() } else if (textarea.dataset.utags_type === "import") { const data = textarea.value try { const result = await mergeData(JSON.parse(data)) textarea.value = JSON.stringify(result) textarea.dataset.utags_type = "import_done" textarea.click() } catch (error) { console.error(error) textarea.value = JSON.stringify(error) textarea.dataset.utags_type = "import_failed" textarea.click() } } }) } } function getFirstHeadElement(tagName = "h1") { for (const element of $$(tagName)) { if (element.closest(".browser_extension_settings_container")) { continue } return element } return void 0 } function sortTags(tags, privilegedTags) { return tags.sort((a, b) => { const pA = privilegedTags.includes(a) const pB = privilegedTags.includes(b) if (pA && pB) { return 0 } if (pA) { return -1 } if (pB) { return 1 } return 0 }) } function filterTags(tags, removed) { if (typeof removed === "string") { removed = [removed] } if (removed.length === 0) { return tags } return tags.filter((value) => { return !removed.includes(value) }) } async function copyText(data) { const textArea = createElement("textarea", { style: "position: absolute; left: -100%;", contentEditable: "true", }) textArea.value = data.replaceAll("\xA0", " ") document.body.append(textArea) textArea.select() await navigator.clipboard.writeText(textArea.value) textArea.remove() } function deleteUrlParameters(urlString, keys, excepts) { const url = new URL(urlString) if (keys === "*") { if (excepts && excepts.length > 0) { const parameters2 = new URLSearchParams(url.search) keys = [] for (const key of parameters2.keys()) { if (!excepts.includes(key)) { keys.push(key) } } } else { url.search = "" return url.toString() } } if (typeof keys === "string") { keys = [keys] } const parameters = new URLSearchParams(url.search) for (const key of keys) { parameters.delete(key) } url.search = parameters.size === 0 ? "" : "?" + parameters.toString() return url.toString() } function getUrlParameters(urlString, keys, allowEmpty = false) { const url = new URL(urlString) if (typeof keys === "string") { keys = [keys] } const result = {} const parameters = new URLSearchParams(url.search) for (const key of keys) { if (key) { const value = parameters.get(key) if ( (allowEmpty && value !== void 0 && value !== null) || (!allowEmpty && value) ) { result[key] = value } } } return result } function createModal(attributes) { const div = createElement("div", { class: "utags_modal", }) const wrapper = addElement2(div, "div", { class: "utags_modal_wrapper", }) const content = addElement2(wrapper, "div", attributes) addClass(content, "utags_modal_content") let removed = false return { remove() { if (!removed) { removed = true div.remove() } }, append(element) { ;(element || doc.body).append(div) }, getContentElement() { return content }, } } var pinnedTags var mostUsedTags var recentAddedTags var emojiTags var displayedTags = /* @__PURE__ */ new Set() var currentTags = /* @__PURE__ */ new Set() function onSelect(selected, input) { if (selected) { input.value = "" const tags = splitTags(selected) for (const tag of tags) { currentTags.add(tag) } updateLists() } } function removeTag(tag) { if (tag) { tag = tag.trim() currentTags.delete(tag) updateLists() } } function updateLists(container) { displayedTags = /* @__PURE__ */ new Set() const ul1 = $(".utags_modal_content ul.utags_current_tags", container) if (ul1) { updateCurrentTagList(ul1) } const ul = $( ".utags_modal_content ul.utags_select_list.utags_pined_list", container ) if (ul) { updateCandidateTagList(ul, pinnedTags) } const ul4 = $( ".utags_modal_content ul.utags_select_list.utags_emoji_list", container ) if (ul4) { updateCandidateTagList(ul4, emojiTags, 1e3) } const ul2 = $( ".utags_modal_content ul.utags_select_list.utags_most_used", container ) if (ul2) { updateCandidateTagList(ul2, mostUsedTags) } const ul3 = $( ".utags_modal_content ul.utags_select_list.utags_recent_added", container ) if (ul3) { updateCandidateTagList(ul3, recentAddedTags) } } function updateCandidateTagList(ul, candidateTags, limitSize) { ul.textContent = "" let index = 0 for (const text of candidateTags) { if (displayedTags.has(text)) { continue } displayedTags.add(text) const li = addElement2(ul, "li", {}) addElement2(li, "span", { textContent: text, }) index++ if (index >= (limitSize || 50)) { break } } } function getNextList(parentElement) { let parentNext = parentElement.nextElementSibling while (parentNext && parentNext.children.length === 0) { parentNext = parentNext.nextElementSibling } return parentNext } function getPreviousList(parentElement) { let parentPrevious = parentElement.previousElementSibling while (parentPrevious && parentPrevious.children.length === 0) { parentPrevious = parentPrevious.previousElementSibling } return parentPrevious } function updateCurrentTagList(ul) { ul.textContent = "" const sortedTags = sortTags([...currentTags], emojiTags) for (const tag of sortedTags) { displayedTags.add(tag) const li = addElement2(ul, "li") const a = createTag(tag, { isEmoji: emojiTags.includes(tag), noLink: true, }) li.append(a) } } function removeAllActive(type) { if (type !== 2) { const selector = ".utags_modal_content ul.utags_select_list .utags_active" for (const li of $$(selector)) { removeClass(li, "utags_active") } } if (type !== 1) { const selector = ".utags_modal_content ul.utags_select_list .utags_active2" for (const li of $$(selector)) { removeClass(li, "utags_active2") } } } async function copyCurrentTags(input) { const value = sortTags([...currentTags], emojiTags).join(", ") await copyText(value) input.value = value input.focus() input.select() } function stopEventPropagation(event) { event.preventDefault() event.stopPropagation() event.stopImmediatePropagation() } function createPromptView(message, value, resolve) { const modal = createModal({ class: "utags_prompt" }) const content = modal.getContentElement() value = value || "" addElement2(content, "span", { class: "utags_title", textContent: message, }) const currentTagsWrapper = addElement2(content, "div", { class: "utags_current_tags_wrapper", }) addElement2(currentTagsWrapper, "span", { textContent: "", style: "display: none;", "data-utags": "", }) addElement2(currentTagsWrapper, "ul", { class: "utags_current_tags utags_ul", }) const input = addElement2(content, "input", { type: "text", placeholder: "foo, bar", onblur(event) { if (event.relatedTarget) { input.focus() stopEventPropagation(event) } setTimeout(() => { if (doc.activeElement === doc.body) { closeModal2() } }, 1) }, }) setTimeout(() => { input.focus() input.select() }) addElement2(currentTagsWrapper, "button", { type: "button", class: "utags_button_copy", textContent: i2("prompt.copy"), async onclick() { await copyCurrentTags(input) }, }) const listWrapper = addElement2(content, "div", { class: "utags_list_wrapper", }) addElement2(listWrapper, "ul", { class: "utags_select_list utags_pined_list", "data-utags_list_name": i2("prompt.pinnedTags"), }) addElement2(listWrapper, "ul", { class: "utags_select_list utags_most_used", "data-utags_list_name": i2("prompt.mostUsedTags"), }) addElement2(listWrapper, "ul", { class: "utags_select_list utags_recent_added", "data-utags_list_name": i2("prompt.recentAddedTags"), }) addElement2(listWrapper, "ul", { class: "utags_select_list utags_emoji_list", "data-utags_list_name": i2("prompt.emojiTags"), }) updateLists(content) const buttonWrapper = addElement2(content, "div", { class: "utags_buttons_wrapper", }) let closed = false const closeModal2 = (value2) => { if (closed) { return } closed = true removeEventListener(input, "keydown", keydonwHandler, true) removeEventListener(doc, "keydown", keydonwHandler, true) removeEventListener(doc, "mousedown", mousedownHandler, true) removeEventListener(doc, "click", clickHandler, true) removeEventListener(doc, "mouseover", mouseoverHandler, true) setTimeout(() => { modal.remove() }) resolve(value2 == null ? null : value2) } const okHandler = () => { closeModal2(Array.from(currentTags).join(",")) } addElement2(buttonWrapper, "button", { type: "button", textContent: i2("prompt.cancel"), onclick() { closeModal2() }, }) addElement2(buttonWrapper, "button", { type: "button", class: "utags_primary", textContent: i2("prompt.ok"), onclick() { onSelect(input.value.trim(), input) okHandler() }, }) const keydonwHandler = (event) => { if (event.defaultPrevented || !$(".utags_modal_content")) { return } let current = $(".utags_modal_content ul.utags_select_list .utags_active") switch (event.key) { case "Escape": { stopEventPropagation(event) closeModal2() break } case "Enter": { stopEventPropagation(event) input.focus() if (current) { onSelect(current.textContent, input) } else if (input.value.trim()) { onSelect(input.value.trim(), input) } else { okHandler() } break } case "Tab": { stopEventPropagation(event) input.focus() break } case "ArrowDown": { stopEventPropagation(event) input.focus() current = $( ".utags_modal_content ul.utags_select_list .utags_active,.utags_modal_content ul.utags_select_list .utags_active2" ) if (current) { const next = current.nextElementSibling if (next) { next.scrollIntoView({ block: "end" }) removeAllActive() addClass(next, "utags_active") } } else { const next = $(".utags_modal_content ul.utags_select_list li") if (next) { next.scrollIntoView({ block: "end" }) removeAllActive() addClass(next, "utags_active") } } break } case "ArrowUp": { stopEventPropagation(event) input.focus() current = $( ".utags_modal_content ul.utags_select_list .utags_active,.utags_modal_content ul.utags_select_list .utags_active2" ) if (current) { const previous = current.previousElementSibling if (previous) { previous.scrollIntoView({ block: "end" }) removeAllActive() addClass(previous, "utags_active") } } break } case "ArrowLeft": { stopEventPropagation(event) input.focus() current = $( ".utags_modal_content ul.utags_select_list .utags_active,.utags_modal_content ul.utags_select_list .utags_active2" ) if (current) { const parentElement = current.parentElement const index = Array.prototype.indexOf.call( parentElement.children, current ) const parentPrevious = getPreviousList(parentElement) if (parentPrevious) { removeAllActive() const newIndex = Math.min( parentPrevious.children.length - 1, index ) const next = parentPrevious.children[newIndex] next.scrollIntoView({ block: "end" }) addClass(next, "utags_active") } } break } case "ArrowRight": { stopEventPropagation(event) input.focus() current = $( ".utags_modal_content ul.utags_select_list .utags_active,.utags_modal_content ul.utags_select_list .utags_active2" ) if (current) { const parentElement = current.parentElement const index = Array.prototype.indexOf.call( parentElement.children, current ) const parentNext = getNextList(parentElement) if (parentNext) { removeAllActive() const newIndex = Math.min(parentNext.children.length - 1, index) const next = parentNext.children[newIndex] next.scrollIntoView({ block: "end" }) addClass(next, "utags_active") } } break } default: { removeAllActive() break } } } addEventListener(input, "keydown", keydonwHandler, true) addEventListener(doc, "keydown", keydonwHandler, true) const mousedownHandler = (event) => { if (event.defaultPrevented || !$(".utags_modal_content")) { return } const target = event.target if (!target) { return } if (target.closest(".utags_modal_content")) { if (target === input) { return } event.preventDefault() input.focus() } else { event.preventDefault() input.focus() } } addEventListener(doc, "mousedown", mousedownHandler, true) const clickHandler = (event) => { if (event.defaultPrevented || !$(".utags_modal_content")) { return } const target = event.target if (!target) { return } if ( !target.closest(".utags_modal_content button") && !target.closest(".utags_modal_content .utags_footer a") ) { stopEventPropagation(event) } if (target.closest(".utags_modal_content")) { input.focus() if (target.closest(".utags_modal_content ul.utags_select_list li")) { onSelect(target.textContent, input) } if (target.closest(".utags_modal_content ul.utags_current_tags li a")) { removeTag(target.dataset.utags_tag) } } else { closeModal2() } } addEventListener(doc, "click", clickHandler, true) const mouseoverHandler = (event) => { const target = event.target if (!(target == null ? void 0 : target.closest(".utags_modal_content"))) { return } const li = target.closest("ul.utags_select_list li") if (li) { removeAllActive() addClass(li, "utags_active2") } else { removeAllActive(2) } } addEventListener(doc, "mousemove", mouseoverHandler, true) const footer = addElement2(content, "div", { class: "utags_footer", }) addElement2(footer, "a", { class: "utags_link_settings", textContent: i2("prompt.settings"), async onclick() { closeModal2() setTimeout(showSettings, 1) }, }) modal.append() } async function advancedPrompt(message, value) { pinnedTags = await getPinnedTags() mostUsedTags = await getMostUsedTags() recentAddedTags = await getRecentAddedTags() emojiTags = await getEmojiTags() currentTags = new Set(splitTags(value)) return new Promise((resolve) => { createPromptView(message, value, resolve) }) } async function simplePrompt(message, value) { return prompt(message, value) } var prefix2 = location.origin + "/" var host = location.host var useVisitedFunction = false var displayMark = false var isAvailable = false var cache = {} function setPrefix(newPrefix) { prefix2 = newPrefix } function isAvailableOnCurrentSite() { return isAvailable } function setVisitedAvailable(value) { isAvailable = value } function onSettingsChange() { useVisitedFunction = getSettingsValue("useVisitedFunction_".concat(host)) displayMark = getSettingsValue("displayEffectOfTheVisitedContent_".concat(host)) !== "0" } function getVisitedLinks() { if (!useVisitedFunction) { return [] } return JSON.parse(localStorage.getItem("utags_visited") || "[]") || [] } function saveVisitedLinks(newVisitedLinks) { if (useVisitedFunction) { localStorage.setItem("utags_visited", JSON.stringify(newVisitedLinks)) } } function convertKey(url) { if (url.includes(prefix2)) { return url.slice(prefix2.length) } return url } var TAG_VISITED = ":visited" function addVisited(key) { if (key && !cache[key]) { cache[key] = 1 } else { return } key = convertKey(key) const visitedLinks = getVisitedLinks() if (!visitedLinks.includes(key)) { visitedLinks.push(key) saveVisitedLinks(visitedLinks) } } function removeVisited(key) { key = convertKey(key) const visitedLinks = getVisitedLinks() if (visitedLinks.includes(key)) { const newVisitedLinks = visitedLinks.filter((value) => { return value !== key }) saveVisitedLinks(newVisitedLinks) } } function isVisited(key) { if (!displayMark) { return false } key = convertKey(key) const visitedLinks = getVisitedLinks() return visitedLinks.includes(key) } function markElementWhetherVisited(key, element) { if (isVisited(key)) { element.dataset.utags_visited = "1" } else if (element.dataset.utags_visited === "1") { delete element.dataset.utags_visited } } var numberLimitOfShowAllUtagsInArea = 10 var lastShownArea var isPromptShown = false function hideAllUtagsInArea(target) { const element = $(".utags_show_all") if (!element) { return } if (element === target || element.contains(target)) { return } if (!target) { lastShownArea = void 0 } for (const element2 of $$(".utags_show_all")) { addClass(element2, "utags_hide_all") removeClass(element2, "utags_show_all") setTimeout(() => { removeClass(element2, "utags_hide_all") }) } } function showAllUtagsInArea(element) { if (!element) { return false } const utags = $$(".utags_ul", element) if (utags.length > 0 && utags.length <= numberLimitOfShowAllUtagsInArea) { addClass(element, "utags_show_all") return true } return false } function findElementToShowAllUtags(target) { hideAllUtagsInArea(target) if (!target) { return } const targets = [] let width let height do { targets.push(target) const tagName = target.tagName const style = getComputedStyle(target) if ( style.position === "fixed" || style.position === "sticky" || /^(BODY|TABLE|UL|OL|NAV|ARTICLE|SECTION|ASIDE)$/.test(tagName) ) { break } target = target.parentElement if (target) { width = target.offsetWidth || target.clientWidth height = target.offsetHeight || target.clientHeight } else { width = 0 height = 0 } } while (targets.length < 8 && target && width > 20 && height > 10) while (targets.length > 0) { const area = targets.pop() if (showAllUtagsInArea(area)) { if (lastShownArea === area) { hideAllUtagsInArea() return } lastShownArea = area return } } hideAllUtagsInArea() lastShownArea = void 0 } function bindDocumentEvents() { const eventType = isTouchScreen() ? "touchstart" : "click" addEventListener( doc, eventType, (event) => { const target = event.target if (!target) { return } if (target.closest(".utags_prompt")) { return } if (target.closest(".utags_ul")) { const captainTag = target.closest( ".utags_captain_tag,.utags_captain_tag2" ) const textTag = target.closest(".utags_text_tag") if (captainTag) { event.preventDefault() event.stopPropagation() event.stopImmediatePropagation() if (!captainTag.dataset.utags_key || isPromptShown) { return } isPromptShown = true setTimeout(async () => { const key = captainTag.dataset.utags_key const tags = captainTag.dataset.utags_tags || "" const meta = captainTag.dataset.utags_meta ? JSON.parse(captainTag.dataset.utags_meta) : void 0 const myPrompt = getSettingsValue("useSimplePrompt") ? simplePrompt : advancedPrompt const newTags = await myPrompt(i2("prompt.addTags"), tags) isPromptShown = false captainTag.focus() if (key && newTags != void 0) { const emojiTags3 = await getEmojiTags() const newTagsArray = sortTags( filterTags(splitTags(newTags), TAG_VISITED), emojiTags3 ) if ( tags.includes(TAG_VISITED) && !newTags.includes(TAG_VISITED) ) { removeVisited(key) } else if ( !tags.includes(TAG_VISITED) && newTags.includes(TAG_VISITED) ) { addVisited(key) } await saveTags(key, newTagsArray, meta) } }) } else if (textTag) { event.stopPropagation() event.stopImmediatePropagation() } return } setTimeout(() => { findElementToShowAllUtags(target) }, 100) }, true ) addEventListener( doc, "keydown", (event) => { if (event.defaultPrevented) { return } if (event.key === "Escape" && $(".utags_show_all")) { hideAllUtagsInArea() event.preventDefault() } }, true ) addEventListener( doc, "mousedown", (event) => { const target = event.target if (target == null ? void 0 : target.closest(".utags_ul")) { event.preventDefault() event.stopPropagation() event.stopImmediatePropagation() } }, true ) addEventListener( doc, "mouseup", (event) => { const target = event.target if (target == null ? void 0 : target.closest(".utags_ul")) { event.preventDefault() event.stopPropagation() event.stopImmediatePropagation() } }, true ) } function extendHistoryApi2() { let url = location.href setInterval(() => { const url2 = location.href if (url !== url2) { url = url2 globalThis.dispatchEvent(new Event("locationchange")) } }, 100) } function bindWindowEvents() { extendHistoryApi() extendHistoryApi2() addEventListener(globalThis, "locationchange", function () { hideAllUtagsInArea() }) } var default_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:100% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}" var default_default2 = /* @__PURE__ */ (() => { return { matches: /.*/, matchedNodesSelectors: ["a[href]:not(.utags_text_tag)"], validate(element) { return true }, excludeSelectors: [], getCanonicalUrl: (url) => deleteUrlParameters(url, ["utm_campaign", "utm_source", "utm_medium"]), getStyle: () => default_default, } })() var v2ex_default = ':not(#a):not(#b):not(#c) .header h1+.utags_ul_0{object-position:0% 200%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: 10px;--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5)}:not(#a):not(#b):not(#c) .header h1+.utags_ul_0+.votes{margin-left:24px}:not(#a):not(#b):not(#c) .title .node-breadcrumb[data-utags_fit_content="1"]{display:inline-block !important;max-width:fit-content !important}:not(#a):not(#b):not(#c) .title .node-breadcrumb+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: 2px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .title .node-breadcrumb+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .box .header>span[data-utags_flag=tag_page]+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: 2px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .box .header>span[data-utags_flag=tag_page]+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px}' var v2ex_default2 = (() => { function getCanonicalUrl2(url) { if (url.startsWith("https://links.pipecraft")) { url = url.replace("https://links.pipecraft.net/", "https://") } if (url.includes("v2ex.com")) { return url .replace(/[?#].*/, "") .replace(/(\w+\.)?v2ex.com/, "www.v2ex.com") } if (url.includes("v2ex.co")) { return url .replace(/[?#].*/, "") .replace(/(\w+\.)?v2ex.co/, "www.v2ex.com") } return url } function cloneWithoutCitedReplies(element) { const newElement = element.cloneNode(true) for (const cell of $$(".cell", newElement)) { cell.remove() } return newElement } return { matches: /v2ex\.com|v2hot\.|v2ex\.co/, preProcess() { setVisitedAvailable(true) setPrefix("https://www.v2ex.com/") }, listNodesSelectors: [".box .cell", ".my-box .comment"], conditionNodesSelectors: [ ".box .cell .topic-link", ".item_hot_topic_title a", '.box .cell .topic_info strong:first-of-type a[href*="/member/"]', ".box .cell .topic_info .node", '.box .cell strong a.dark[href*="/member/"]', ".box .cell .ago a", ".box .cell .fade.small a", ".comment .username", ".comment .ago", ], matchedNodesSelectors: [ 'a[href*="/t/"]', 'a[href*="/member/"]', 'a[href*="/go/"]', 'a[href^="https://"]:not([href*="v2ex.com"])', 'a[href^="http://"]:not([href*="v2ex.com"])', ".box .cell .fr .tag", ".box .inner .tag", ], excludeSelectors: [ ...default_default2.excludeSelectors, ".site-nav a", ".cell_tabs a", ".tab-alt-container a", "#SecondaryTabs a", "a.page_normal,a.page_current", "a.count_livid", ".post-item a.post-content", ], addExtraMatchedNodes(matchedNodesSet) { if (location.pathname.includes("/member/")) { const profile = $(".content h1") if (profile) { const username = profile.textContent if (username) { const key = "https://www.v2ex.com/member/".concat(username) const meta = { title: username, type: "user" } profile.utags = { key, meta } matchedNodesSet.add(profile) } } } if (location.pathname.includes("/t/")) { const header = $(".header h1") if (header) { const key = getCanonicalUrl2( "https://www.v2ex.com" + location.pathname ) const title = $("h1").textContent const meta = { title, type: "topic" } header.utags = { key, meta } matchedNodesSet.add(header) addVisited(key) markElementWhetherVisited(key, header) } const main2 = $("#Main") || $(".content") const replyElements = $$( '.box .cell[id^="r_"],.box .cell[id^="related_r_"]', main2 ) for (const reply of replyElements) { const replyId = reply.id.replace("related_", "") const floorNoElement = $(".no", reply) const replyContentElement = $(".reply_content", reply) const agoElement = $(".ago,.fade.small", reply) if ( replyId && floorNoElement && replyContentElement && agoElement ) { let newAgoElement = $("a", agoElement) if (!newAgoElement) { newAgoElement = createElement("a", { textContent: agoElement.textContent, href: "#" + replyId, }) agoElement.textContent = "" agoElement.append(newAgoElement) } const floorNo = parseInt10(floorNoElement.textContent, 1) const pageNo = Math.floor((floorNo - 1) / 100) + 1 const key = getCanonicalUrl2("https://www.v2ex.com" + location.pathname) + "?p=" + String(pageNo) + "#" + replyId const title = cloneWithoutCitedReplies(replyContentElement).textContent const meta = { title, type: "reply" } newAgoElement.utags = { key, meta } matchedNodesSet.add(newAgoElement) } } } if (location.pathname.includes("/go/")) { const header = $(".title .node-breadcrumb") if (header) { const key = getCanonicalUrl2( "https://www.v2ex.com" + location.pathname ) const title = header.textContent.replaceAll(/\s+/g, " ").trim() const meta = { title, type: "node" } header.utags = { key, meta } matchedNodesSet.add(header) } } if (location.pathname.includes("/tag/")) { const header = $(".box .header > span") if (header) { const key = getCanonicalUrl2( "https://www.v2ex.com" + location.pathname ) const title = header.textContent.replaceAll(/\s+/g, " ").trim() const meta = { title, type: "tag" } header.utags = { key, meta } header.dataset.utags_flag = "tag_page" matchedNodesSet.add(header) } } }, getStyle: () => v2ex_default, getCanonicalUrl: getCanonicalUrl2, postProcess() { for (const element of $$('a[href*="/t/"]')) { const key = getCanonicalUrl2(element.href) markElementWhetherVisited(key, element) } }, } })() var greasyfork_org_default = ":not(#a):not(#b):not(#c) .discussion-title+.utags_ul_0{display:block !important;height:0}:not(#a):not(#b):not(#c) .discussion-title+.utags_ul_0 .utags_captain_tag{top:-26px;background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) .discussion-title+.utags_ul_1{display:block !important;margin-top:-12px !important;margin-bottom:8px !important}:not(#a):not(#b):not(#c) .discussion-meta .script-link+.utags_ul_0{display:block !important;height:0}:not(#a):not(#b):not(#c) .discussion-meta .script-link+.utags_ul_0 .utags_captain_tag{top:-22px;background-color:hsla(0,0%,100%,.8666666667) !important}" var greasyfork_org_default2 = (() => { function getScriptUrl(url) { return getCanonicalUrl2(url.replace(/(scripts\/\d+)(.*)/, "$1")) } function getCanonicalUrl2(url) { if (/(greasyfork|sleazyfork)\.org/.test(url)) { url = url.replace( /((greasyfork|sleazyfork)\.org\/)(\w{2}(-\w{2})?)(\/|$)/, "$1" ) if (url.includes("/scripts/")) { return url.replace(/(scripts\/\d+)([^/]*)/, "$1") } if (url.includes("/users/")) { return url.replace(/(users\/\d+)(.*)/, "$1") } } return url } return { matches: /(greasyfork|sleazyfork)\.org/, listNodesSelectors: [".script-list > li", ".discussion-list-container"], conditionNodesSelectors: [ ".script-list li .script-link", ".script-list li .script-list-author a", ".discussion-list-container .script-link", ".discussion-list-container .discussion-title", ".discussion-list-container .discussion-meta-item:nth-child(2) > a", ], excludeSelectors: [ ...default_default2.excludeSelectors, ".sidebar", ".pagination", ".sign-out-link,.sign-in-link", ".with-submenu", "#script-links.tabs", "#install-area", ".history_versions .version-number", 'a[href*="show_all_versions"]', 'a[href*="/reports/new"]', 'a[href*="/conversations/new"]', 'a[href*="/discussions/mark_all_read"]', 'a[href*="/discussions/new"]', "div.sidebarred-main-content > p:nth-child(3) > a", ], addExtraMatchedNodes(matchedNodesSet) { if (location.pathname.includes("/scripts/")) { const element = $("#script-info header h2") if (element) { const title = element.textContent if (title) { const key = getScriptUrl(location.href) const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } } else if (location.pathname.includes("/users/")) { const element = $("#about-user h2") if (element) { const title = element.textContent if (title) { const key = getCanonicalUrl2(location.href) const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getCanonicalUrl: getCanonicalUrl2, getStyle: () => greasyfork_org_default, } })() var news_ycombinator_com_default = (() => { function cloneComment(element) { const newElement = element.cloneNode(true) for (const node of $$(".reply", newElement)) { node.remove() } return newElement } return { matches: /news\.ycombinator\.com/, listNodesSelectors: [".script-list li", ".discussion-list-container"], conditionNodesSelectors: [], excludeSelectors: [ ...default_default2.excludeSelectors, ".pagetop", ".morelink", ".hnpast", ".clicky", ".navs > a", 'a[href^="login"]', 'a[href^="logout"]', 'a[href^="forgot"]', 'a[href^="vote"]', 'a[href^="submit"]', 'a[href^="hide"]', 'a[href^="fave"]', 'a[href^="reply"]', 'a[href^="context"]', 'a[href^="newcomments"]', 'a[href^="#"]', '.subline > a[href^="item"]', ], addExtraMatchedNodes(matchedNodesSet) { if (location.pathname === "/item") { const comments = $$(".comment-tree .comtr[id]") for (const comment of comments) { const commentText = $(".commtext", comment) const target = $(".age a", comment) if (commentText && target) { const key = target.href const title = cloneComment(commentText).textContent if (key && title) { const meta = { title, type: "comment" } target.utags = { key, meta } matchedNodesSet.add(target) } } } const fatitem = $(".fatitem") if (fatitem) { const titleElement = $(".titleline a", fatitem) const commentText = titleElement || $(".commtext", fatitem) const type = titleElement ? "topic" : "comment" const target = $(".age a", fatitem) if (commentText && target) { const key = target.href const title = cloneComment(commentText).textContent if (key && title) { const meta = { title, type } target.utags = { key, meta } matchedNodesSet.add(target) } } } } else if (location.pathname === "/newcomments") { const comments = $$(".athing[id]") for (const comment of comments) { const commentText = $(".commtext", comment) const target = $(".age a", comment) if (commentText && target) { const key = target.href const title = cloneComment(commentText).textContent if (key && title) { const meta = { title, type: "comment" } target.utags = { key, meta } matchedNodesSet.add(target) } } } } else { const topics = $$(".athing[id]") for (const topic of topics) { const titleElement = $(".titleline a", topic) const subtext = topic.nextElementSibling if (subtext) { const target = $(".age a", subtext) if (titleElement && target) { const key = target.href const title = titleElement.textContent if (key && title) { const meta = { title, type: "topic" } target.utags = { key, meta } matchedNodesSet.add(target) } } } } } }, } })() var lobste_rs_default = (() => { return { matches: /lobste\.rs|dto\.pipecraft\.net|tilde\.news|journalduhacker\.net/, listNodesSelectors: [], conditionNodesSelectors: [], excludeSelectors: [ ...default_default2.excludeSelectors, "#nav", "#header", "#subnav", ".mobile_comments", ".description_present", ".morelink", ".user_tree", ".dropdown_parent", 'a[href^="/login"]', 'a[href^="/logout"]', 'a[href^="/u#"]', 'a[href$="/save"]', 'a[href$="/hide"]', 'a[href$="/suggest"]', ], } })() var github_com_default = ':not(#a):not(#b):not(#c) .search-title .utags_ul_0,:not(#a):not(#b):not(#c) .d-flex.flex-justify-between a[href^="/topics/"]+.utags_ul_0,:not(#a):not(#b):not(#c) .d-md-flex.flex-justify-between a[href^="/topics/"].d-flex+.utags_ul_0,:not(#a):not(#b):not(#c) [id=user-starred-repos] a[href^="/topics/"].flex-items-center+.utags_ul_0,:not(#a):not(#b):not(#c) ul.f4 a[href^="/topics/"].d-flex+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-4);--utags-notag-ul-height: var(--utags-notag-ul-height-4);--utags-notag-ul-position: var(--utags-notag-ul-position-4);--utags-notag-ul-top: var(--utags-notag-ul-top-4);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-4);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-4);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .search-title .utags_ul_0{--utags-notag-captain-tag-top: -10px}:not(#a):not(#b):not(#c) .d-flex.flex-justify-between a[href^="/topics/"]+.utags_ul_0{--utags-notag-captain-tag-top: 6px;--utags-notag-captain-tag-left: 76px}:not(#a):not(#b):not(#c) .d-md-flex.flex-justify-between a[href^="/topics/"].d-flex+.utags_ul_0{--utags-notag-captain-tag-top: 20px;--utags-notag-captain-tag-left: 76px}:not(#a):not(#b):not(#c) ul.f4 a[href^="/topics/"].d-flex+.utags_ul_0{--utags-notag-captain-tag-top: -24px;--utags-notag-captain-tag-left: -2px}:not(#a):not(#b):not(#c) div[id=repo-title-component] strong[itemprop=name] a+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-4);--utags-notag-ul-height: var(--utags-notag-ul-height-4);--utags-notag-ul-position: var(--utags-notag-ul-position-4);--utags-notag-ul-top: var(--utags-notag-ul-top-4);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-4);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-4)}' var github_com_default2 = (() => { const noneUsers = /* @__PURE__ */ new Set([ "about", "pricing", "security", "login", "logout", "signup", "explore", "topics", "trending", "collections", "events", "sponsors", "features", "enterprise", "team", "customer-stories", "readme", "premium-support", "sitemap", "git-guides", "open-source", "marketplace", "codespaces", "issues", "pulls", "discussions", "dashboard", "account", "new", "notifications", "settings", "feedback", "organizations", "github-copilot", "search", ]) const prefix3 = "https://github.com/" function getUserProfileUrl(href) { if (href.startsWith(prefix3)) { const href2 = href.slice(19) let username = "" if (/^[\w-]+$/.test(href2)) { username = /^([\w-]+)$/.exec(href2)[1] } if (/(author%3A|author=)[\w-]+/.test(href2)) { username = /(author%3A|author=)([\w-]+)/.exec(href2)[2] } if (username && !noneUsers.has(username)) { return prefix3 + username } } return void 0 } function getRepoUrl(href) { if (href.startsWith(prefix3)) { const href2 = href.slice(19) if (/^[\w-]+\/[\w-.]+(\?.*)?$/.test(href2)) { const username = /^([\w-]+)/.exec(href2)[1] if (username && !noneUsers.has(username)) { return prefix3 + href2.replace(/(^[\w-]+\/[\w-.]+).*/, "$1") } } } return void 0 } function getTopicsUrl(href) { if (href.startsWith(prefix3)) { const href2 = href.slice(19) if (/^topics\/[\w-.]+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/(^topics\/[\w-.]+).*/, "$1") } } return void 0 } function getIssuesUrl(href) { if (href.startsWith(prefix3)) { const href2 = href.slice(19) if ( /^[\w-]+\/[\w-.]+\/(issues|pull|discussions)\/\d+(\?.*)?$/.test(href2) ) { const username = /^([\w-]+)/.exec(href2)[1] if (username && !noneUsers.has(username)) { return ( prefix3 + href2.replace( /(^[\w-]+\/[\w-.]+\/(issues|pull|discussions)\/\d+).*/, "$1" ) ) } } } return void 0 } return { matches: /github\.com/, listNodesSelectors: [], conditionNodesSelectors: [], validate(element) { const href = element.href if (href.startsWith(prefix3)) { if (/since|until/.test(href)) { return false } let key = getUserProfileUrl(href) if (key) { const username = /^https:\/\/github\.com\/([\w-]+)$/.exec(key)[1] const title = username const meta = { title, type: "user" } element.utags = { key, meta } return true } key = getRepoUrl(href) if (key) { const title = key.replace(prefix3, "") const meta = { title, type: "repo" } element.utags = { key, meta } return true } key = getTopicsUrl(href) if (key) { const text = element.textContent.trim() if (text === "#") { return false } const title = "#" + key.replace(prefix3 + "topics/", "") const meta = { title, type: "topic" } element.utags = { key, meta } return true } key = getIssuesUrl(href) if (key) { const meta = { type: "issue" } element.utags = { key, meta } return true } return false } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, 'section[aria-label~="User"] .Link--secondary', ".Popover-message .Link--secondary", ".IssueLabel", ".subnav-links", ".btn", ".filter-item", ".js-github-dev-shortcut", ".js-github-dev-new-tab-shortcut", ".js-skip-to-content", ], validMediaSelectors: ["svg.octicon-repo"], getStyle: () => github_com_default, } })() var reddit_com_default = '#TOFIX_uFEFF{display:block}:not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) shreddit-comment [slot=commentMeta]{position:relative}:not(#a):not(#b):not(#c) [data-testid=user-hover-card]{position:relative}:not(#a):not(#b):not(#c) div[slot=content]{position:relative}:not(#a):not(#b):not(#c) div[slot=comment]{position:relative}:not(#a):not(#b):not(#c) article:hover a[slot=title]+.utags_ul .utags_captain_tag,:not(#a):not(#b):not(#c) [slot=post-media-container]:hover a+.utags_ul .utags_captain_tag{opacity:100%;width:calc(var(--utags-captain-tag-size) + 8px) !important;height:calc(var(--utags-captain-tag-size) + 8px) !important;padding:5px 4px 4px 5px !important;transition:all 0s .1s !important;z-index:0}:not(#a):not(#b):not(#c) article a[slot=title][data-utags_fit_content="1"],:not(#a):not(#b):not(#c) recent-posts a[data-utags_fit_content="1"]{min-width:unset !important;width:fit-content !important}:not(#a):not(#b):not(#c) article a[slot=title][data-utags_fit_content="1"] *:not(svg),:not(#a):not(#b):not(#c) recent-posts a[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) article a[slot=title]+.utags_ul_0,:not(#a):not(#b):not(#c) recent-posts a+.utags_ul_0{object-position:100% 50%}:not(#a):not(#b):not(#c) article a[slot=title]+.utags_ul_1,:not(#a):not(#b):not(#c) recent-posts a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:-4px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) h1[slot=title][data-utags_fit_content="1"]{min-width:unset !important;width:fit-content !important}:not(#a):not(#b):not(#c) h1[slot=title][data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) h1[slot=title]+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) h1[slot=title]+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) [data-utags_list_node*=",hide,"],:not(#a):not(#b):not(#c) [data-utags_list_node*=",\u9690\u85CF,"],:not(#a):not(#b):not(#c) [data-utags_list_node*=",\u5C4F\u853D,"],:not(#a):not(#b):not(#c) [data-utags_list_node*=",\u4E0D\u518D\u663E\u793A,"],:not(#a):not(#b):not(#c) [data-utags_list_node*=",block,"]{opacity:1%;display:block !important}' var reddit_com_default2 = (() => { const prefix3 = "https://www.reddit.com/" function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { let href2 = getUserProfileUrl(url, true) if (href2) { return href2 } href2 = getCommunityUrl(url, true) if (href2) { return href2 } href2 = getCommentsUrl(url, true) if (href2) { return href2 } } return url } function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (exact) { if (/^(user|u)\/[\w-]+\/?([?#].*)?$/.test(href2)) { return ( prefix3 + "user/" + href2.replace(/^(user|u)\/([\w-]+).*/, "$2") + "/" ) } } else if (/^(user|u)\/[\w-]+/.test(href2)) { return ( prefix3 + "user/" + href2.replace(/^(user|u)\/([\w-]+).*/, "$2") + "/" ) } } return void 0 } function getCommunityUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (exact) { if (/^r\/\w+\/?(#.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(r\/\w+).*/, "$1") + "/" } } else if (/^r\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(r\/\w+).*/, "$1") + "/" } } return void 0 } function getCommentsUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (exact) { if (/^(r\/\w+\/comments\/\w+(\/([^/]*\/?)?)?)$/.test(href2)) { return ( prefix3 + href2.replace(/^(r\/\w+\/comments\/\w+(\/([^/]*)?)?).*/, "$1") + "/" ) } } else if (/^(r\/\w+\/comments\/\w+(\/([^/]*)?)?).*/.test(href2)) { return ( prefix3 + href2.replace(/^(r\/\w+\/comments\/\w+(\/([^/]*)?)?).*/, "$1") + "/" ) } } return void 0 } return { matches: /reddit\.com/, listNodesSelectors: [ "shreddit-feed article", "shreddit-feed shreddit-ad-post", "shreddit-comment", ], conditionNodesSelectors: [ 'shreddit-feed article a[data-testid="subreddit-name"]', 'shreddit-feed article a[slot="title"]', 'shreddit-feed article [slot="authorName"] a', "shreddit-feed shreddit-ad-post a", "shreddit-comment faceplate-hovercard a", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } if ($("time,faceplate-number", element)) { return false } let key = getUserProfileUrl(href, true) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } key = getCommunityUrl(href, true) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "community", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } key = getCommentsUrl(href, true) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "comments", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, 'a[data-testid="comment_author_icon"]', "#shreddit-skip-link", 'a[slot="text-body"]', 'a[slot="full-post-link"]', '[slot="post-media-container"] a.inset-0', '[bundlename="shreddit_sort_dropdown"]', '[slot="tabs"]', ], addExtraMatchedNodes(matchedNodesSet) { let element = $('[data-testid="profile-main"] .w-full p') if (element) { const title = element.textContent.trim() const key = getUserProfileUrl(location.href) if (title && key) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } element = $(".w-full h1") if (element) { const title = element.textContent.trim() const key = getCommunityUrl(location.href) if (title && key) { const meta = { title, type: "community" } element.utags = { key, meta } matchedNodesSet.add(element) } } element = $('h1[slot="title"]') if (element) { const title = element.textContent.trim() const key = getCommentsUrl(location.href, true) if (title && key) { const meta = { title, type: "comments" } element.utags = { key, meta } matchedNodesSet.add(element) } } }, getStyle: () => reddit_com_default, postProcess() { setTimeout(() => { for (const element of $$( '[data-utags_list_node*=",hide,"],\n [data-utags_list_node*=",\u9690\u85CF,"],\n [data-utags_list_node*=",\u5C4F\u853D,"],\n [data-utags_list_node*=",\u4E0D\u518D\u663E\u793A,"],\n [data-utags_list_node*=",block,"]' )) { element.setAttribute("collapsed", "") } }, 1e3) }, getCanonicalUrl: getCanonicalUrl2, } })() var twitter_com_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .css-175oi2r.r-xoduu5:hover{z-index:2 !important}:not(#a):not(#b):not(#c) [data-testid=User-Name]:hover .utags_ul .utags_captain_tag,:not(#a):not(#b):not(#c) [data-testid=HoverCard]:hover .utags_ul .utags_captain_tag,:not(#a):not(#b):not(#c) [data-testid=UserCell]:hover .utags_ul .utags_captain_tag{opacity:100%;width:calc(var(--utags-captain-tag-size) + 8px) !important;height:calc(var(--utags-captain-tag-size) + 8px) !important;padding:5px 4px 4px 5px !important;transition:all 0s .1s !important;z-index:0}" var twitter_com_default2 = /* @__PURE__ */ (() => { const prefix3 = "https://x.com/" const prefix22 = "https://twitter.com/" return { matches: /x\.com|twitter\.com/, listNodesSelectors: ['[data-testid="cellInnerDiv"]'], conditionNodesSelectors: [ '[data-testid="cellInnerDiv"] [data-testid="User-Name"] a', ], validate(element) { const href = element.href if (href.startsWith(prefix3) || href.startsWith(prefix22)) { const href2 = href.startsWith(prefix22) ? href.slice(20) : href.slice(14) if (/^\w+$/.test(href2)) { if ( /^(home|explore|notifications|messages|tos|privacy)$/.test(href2) ) { return false } const textContent = element.textContent || "" if (!textContent.startsWith("@")) { return false } const parent = element.parentElement setStyle(parent, { zIndex: "1" }) const meta = { type: "user" } element.utags = { meta } return true } } return false }, addExtraMatchedNodes(matchedNodesSet) { const elements = $$('[data-testid="UserName"] span') for (const element of elements) { const title = element.textContent.trim() if (!title || !title.startsWith("@")) { continue } const key = prefix3 + title.slice(1) const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } }, getStyle: () => twitter_com_default, } })() var mp_weixin_qq_com_default = /* @__PURE__ */ (() => { function getCanonicalUrl2(url) { if (url.startsWith("http://mp.weixin.qq.com")) { url = url.replace(/^http:/, "https:") } if (url.startsWith("https://mp.weixin.qq.com/s/")) { url = url.replace(/(\/s\/[\w-]+).*/, "$1") } if (url.startsWith("https://mp.weixin.qq.com/") && url.includes("#")) { url = url.replace(/#.*/, "") } return url } return { matches: /mp\.weixin\.qq\.com/, addExtraMatchedNodes(matchedNodesSet) { const element = $("h1.rich_media_title") if (element) { const title = element.textContent.trim() if (title) { const key = getCanonicalUrl2(location.href) const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } }, getCanonicalUrl: getCanonicalUrl2, } })() var instagram_com_default = ":not(#a):not(#b):not(#c) [data-utags_node_type=notag_relative]+.utags_ul_0 .utags_captain_tag{position:relative !important;width:14px !important;height:14px !important;padding:1px 0 0 1px !important}" var instagram_com_default2 = (() => { return { matches: /instagram\.com/, validate(element) { const href = element.href if (href.startsWith("https://www.instagram.com/")) { const href2 = href.slice(26) if (/^[\w.]+\/$/.test(href2)) { if (/^(explore|reels)\/$/.test(href2)) { return false } if ($("div span", element)) { element.dataset.utags_node_type = "notag_relative" } const meta = { type: "user" } element.utags = { meta } return true } } return false }, excludeSelectors: [...default_default2.excludeSelectors], getStyle: () => instagram_com_default, } })() var threads_net_default = ':not(#a):not(#b):not(#c) a[href^="/@"][data-utags]+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-4);--utags-notag-ul-height: var(--utags-notag-ul-height-4);--utags-notag-ul-position: var(--utags-notag-ul-position-4);--utags-notag-ul-top: var(--utags-notag-ul-top-4);--utags-notag-captain-tag-top: -22px;--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-4)}' var threads_net_default2 = (() => { function getUserProfileUrl(url) { if (url.startsWith("https://www.threads.net/")) { const href2 = url.slice(24) if (/^@[\w.]+/.test(href2)) { return ( "https://www.threads.net/" + href2.replace(/(^@[\w.]+).*/, "$1").toLowerCase() ) } } return void 0 } return { matches: /threads\.net/, validate(element) { const href = element.href if (href.startsWith("https://www.threads.net/")) { const href2 = href.slice(24) if (/^@[\w.]+$/.test(href2)) { const meta = { type: "user" } element.utags = { meta } return true } } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, '[role="tablist"]', ], addExtraMatchedNodes(matchedNodesSet) { const element = $("h1+div>div>span,h2+div>div>span") if (element) { const title = element.textContent.trim() const key = getUserProfileUrl(location.href) if (title && key && key === "https://www.threads.net/@" + title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } }, getStyle: () => threads_net_default, } })() var facebook_com_default = ":not(#a):not(#b):not(#c) a[data-utags_flag=username_with_avatar]+.utags_ul_0{object-position:0% 100%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: -2px;--utags-notag-captain-tag-left: 0px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) h1+ul.utags_ul{margin-bottom:16px !important;display:inline-flex !important}" var facebook_com_default2 = (() => { const prefix3 = location.origin + "/" function getUserProfileUrl(href, exact = false) { if (href.startsWith(prefix3)) { const href2 = href.slice(prefix3.length).toLowerCase() if (href2.startsWith("profile.php")) { const parameters = getUrlParameters(href, ["id", "sk"]) if (parameters.id && !parameters.sk) { return "https://www.facebook.com/profile.php?id=" + parameters.id } } else if (/^\d+\/?([?#].*)?$/.test(href2)) { return ( "https://www.facebook.com/profile.php?id=" + href2.replace(/^(\d+).*/, "$1") ) } else if (/^messages\/t\/\d+\/?([?#].*)?$/.test(href2)) { return ( "https://www.facebook.com/profile.php?id=" + href2.replace(/^messages\/t\/(\d+).*/, "$1") ) } else if ( href2.startsWith("friends/requests/?profile_id=") || href2.startsWith("friends/suggestions/?profile_id=") ) { const parameters = getUrlParameters(href, ["profile_id"]) if (parameters.profile_id) { return ( "https://www.facebook.com/profile.php?id=" + parameters.profile_id ) } } else if ( ((exact && /^[\w.]+([?#].*)?$/.test(href2)) || (!exact && /^[\w.]+/.test(href2))) && !/^(policies|events|ads|business|privacy|help|friends|messages|profile\.php|permalink\.php|photo\.php|\w+\.php)\b/.test( href2 ) ) { return ( "https://www.facebook.com/" + href2.replace(/(^[\w.]+).*/, "$1") ) } } return void 0 } return { matches: /^(www|m)\.facebook\.com$/, validate(element) { const href = element.href if ( !href.startsWith("https://www.facebook.com/") && !href.startsWith("https://m.facebook.com/") && !href.startsWith("https://l.facebook.com/") ) { return true } const key = getUserProfileUrl(href, true) if (key) { const title = element.textContent.trim() if (!title) { return false } if ($("svg,img", element)) { element.dataset.utags_flag = "username_with_avatar" } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, 'div[data-pagelet="ProfileTabs"]', ], addExtraMatchedNodes(matchedNodesSet) { const element = getFirstHeadElement('div[role="main"] h1') if (element) { const title = element.textContent.trim() const key = getUserProfileUrl(location.href) if (title && key) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } }, getStyle: () => facebook_com_default, } })() var youtube_com_default = ":not(#a):not(#b):not(#c) ytd-rich-item-renderer h3.ytd-rich-grid-media .utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-2);--utags-notag-ul-height: var(--utags-notag-ul-height-2);--utags-notag-ul-position: var(--utags-notag-ul-position-2);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-2);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-2);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) ytd-rich-item-renderer yt-formatted-string[ellipsis-truncate-styling] .utags_ul_0 .utags_captain_tag{left:-20px}:not(#a):not(#b):not(#c) ytd-video-renderer.ytd-item-section-renderer h3 .utags_ul_0,:not(#a):not(#b):not(#c) ytd-video-renderer.ytd-vertical-list-renderer h3 .utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-2);--utags-notag-ul-height: var(--utags-notag-ul-height-2);--utags-notag-ul-position: var(--utags-notag-ul-position-2);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-2);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-2);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) ytd-video-renderer.ytd-item-section-renderer yt-formatted-string.ytd-channel-name .utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) ytd-video-renderer.ytd-vertical-list-renderer yt-formatted-string.ytd-channel-name .utags_ul_0 .utags_captain_tag{left:-20px}:not(#a):not(#b):not(#c) .watch-active-metadata ytd-channel-name yt-formatted-string .utags_ul_0,:not(#a):not(#b):not(#c) ytd-comment-thread-renderer h3.ytd-comment-renderer .utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-2);--utags-notag-ul-height: var(--utags-notag-ul-height-2);--utags-notag-ul-position: var(--utags-notag-ul-position-2);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-2);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-2);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .ytd-shorts ytd-reel-video-renderer ytd-channel-name yt-formatted-string .utags_ul_0 .utags_captain_tag{left:-24px}:not(#a):not(#b):not(#c) [hidden]+.utags_ul{display:none !important}" var youtube_com_default2 = (() => { const prefix3 = "https://www.youtube.com/" const prefix22 = "https://m.youtube.com/" function getUserProfileUrl(href) { if (href.startsWith(prefix3) || href.startsWith(prefix22)) { const href2 = href.startsWith(prefix22) ? href.slice(22) : href.slice(24) if (/^@[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(^@[\w-]+).*/, "$1") } if (/^channel\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(^channel\/[\w-]+).*/, "$1") } } return void 0 } function getVideoUrl(href) { if (href.startsWith(prefix3) || href.startsWith(prefix22)) { const href2 = href.startsWith(prefix22) ? href.slice(22) : href.slice(24) if (href2.includes("&lc=")) { return void 0 } if (/^watch\?v=[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(watch\?v=[\w-]+).*/, "$1") } if (/^shorts\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(^shorts\/[\w-]+).*/, "$1") } } return void 0 } return { matches: /youtube\.com/, validate(element) { const hrefAttr = getAttribute(element, "href") if (!hrefAttr || hrefAttr === "null" || hrefAttr === "#") { return false } const href = element.href if (href.startsWith(prefix3) || href.startsWith(prefix22)) { const pathname = element.pathname if (/^\/@[\w-]+$/.test(pathname)) { const key2 = prefix3 + pathname.slice(1) const meta = { type: "user" } element.utags = { key: key2, meta } return true } if (/^\/channel\/[\w-]+$/.test(pathname)) { const key2 = prefix3 + pathname.slice(1) const meta = { type: "channel" } element.utags = { key: key2, meta } return true } const key = getVideoUrl(href) if (key) { let title const titleElement = $("#video-title", element) if (titleElement) { title = titleElement.textContent } const meta = title ? { title, type: "video" } : { type: "video" } element.utags = { key, meta } return true } } return false }, excludeSelectors: [...default_default2.excludeSelectors], addExtraMatchedNodes(matchedNodesSet) { let key = getUserProfileUrl(location.href) if (key) { const element = $( "#inner-header-container #container.ytd-channel-name #text" ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getVideoUrl(location.href) if (key) { const element = $( "#title h1.ytd-watch-metadata,ytd-reel-video-renderer[is-active] h2.title" ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "video" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => youtube_com_default, } })() var bilibili_com_default = ':not(#a):not(#b):not(#c) .bili-video-card__info--right a[href*="/video/"]+.utags_ul_0,:not(#a):not(#b):not(#c) .bili-video-card__info--right h3.bili-video-card__info--tit+.utags_ul_0,:not(#a):not(#b):not(#c) .video-page-card-small a[href*="/video/"]+.utags_ul_0,:not(#a):not(#b):not(#c) .video-page-card-small h3.bili-video-card__info--tit+.utags_ul_0,:not(#a):not(#b):not(#c) .video-page-operator-card-small a[href*="/video/"]+.utags_ul_0,:not(#a):not(#b):not(#c) .video-page-operator-card-small h3.bili-video-card__info--tit+.utags_ul_0{display:block !important;height:0}:not(#a):not(#b):not(#c) .bili-video-card__info--right a[href*="/video/"]+.utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) .bili-video-card__info--right h3.bili-video-card__info--tit+.utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) .video-page-card-small a[href*="/video/"]+.utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) .video-page-card-small h3.bili-video-card__info--tit+.utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) .video-page-operator-card-small a[href*="/video/"]+.utags_ul_0 .utags_captain_tag,:not(#a):not(#b):not(#c) .video-page-operator-card-small h3.bili-video-card__info--tit+.utags_ul_0 .utags_captain_tag{top:-22px;background-color:hsla(0,0%,100%,.8666666667) !important}' var bilibili_com_default2 = /* @__PURE__ */ (() => { const prefix3 = "https://www.bilibili.com/" const prefix22 = "https://space.bilibili.com/" const prefix32 = "https://m.bilibili.com/" function getUserProfileUrl(href) { if (href.startsWith(prefix22)) { const href2 = href.slice(27) if (/^\d+/.test(href2)) { return prefix22 + href2.replace(/(^\d+).*/, "$1") } } if (href.startsWith(prefix32 + "space/")) { const href2 = href.slice(29) if (/^\d+/.test(href2)) { return prefix22 + href2.replace(/(^\d+).*/, "$1") } } return void 0 } function getVideoUrl(href) { if ( href.startsWith(prefix3 + "video/") || href.startsWith(prefix32 + "video/") ) { const href2 = href.startsWith(prefix32) ? href.slice(23) : href.slice(25) if (/^video\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(video\/\w+).*/, "$1") } } return void 0 } return { matches: /bilibili\.com|biligame\.com/, excludeSelectors: ["*"], addExtraMatchedNodes(matchedNodesSet) { if (location.href.startsWith(prefix3 + "video/")) { if ($(".bpx-state-loading")) { return } const img = $(".bpx-player-follow-face") const img2 = $("img.video-capture-img") if ( !(img == null ? void 0 : img.src) || !(img2 == null ? void 0 : img2.src) ) { return } } const elements = $$( ".user-name[data-user-id],.sub-user-name[data-user-id],.jump-link.user[data-user-id]" ) for (const element2 of elements) { const userId = element2.dataset.userId if (!userId) { return false } const title = element2.textContent.trim() const key = prefix22 + userId const meta = { title, type: "user" } element2.utags = { key, meta } element2.dataset.utags_node_type = "link" matchedNodesSet.add(element2) } const elements2 = $$(".upname a,a.bili-video-card__info--owner") for (const element2 of elements2) { const href = element2.href if (href.startsWith(prefix22)) { const key = getUserProfileUrl(href) if (key) { const nameElement = $( ".name,.bili-video-card__info--author", element2 ) if (nameElement) { const title = nameElement.textContent const meta = { title, type: "user" } nameElement.utags = { key, meta } nameElement.dataset.utags_node_type = "link" matchedNodesSet.add(nameElement) } } } } const elements3 = $$( [ "a.up-name", "a.card-user-name", ".usercard-wrap .user .name", ".comment-list .user .name", ".user-card .user .name", "a[data-usercard-mid]", "a.user-name", ".user-name a", 'a[href^="https://space.bilibili.com/"]', "a.staff-name", ].join(",") ) for (const element2 of elements3) { const href = element2.href if (href.startsWith(prefix22)) { const key = getUserProfileUrl(href) if (key) { let title = element2.textContent.trim() if (title) { title = title.replace(/^@/, "") const meta = { title, type: "user" } element2.utags = { key, meta } matchedNodesSet.add(element2) } } } } if ( location.href.startsWith(prefix22) || location.href.startsWith(prefix32 + "space/") ) { const element2 = $("#h-name,.m-space-info .name") if (element2) { const title = element2.textContent.trim() const key = getUserProfileUrl(location.href) if (title && key) { const meta = { title, type: "user" } element2.utags = { key, meta } matchedNodesSet.add(element2) } } } const element = $("h1.video-title,h1.title-text") if (element) { const title = element.textContent.trim() const key = getVideoUrl(location.href) if (title && key) { const meta = { title, type: "video" } element.utags = { key, meta } matchedNodesSet.add(element) } } const elements4 = $$( ".bili-video-card__info--right a,.video-page-card-small .info a,.video-page-operator-card-small .info a" ) for (const element2 of elements4) { const key = getVideoUrl(element2.href) if (key) { const title = element2.textContent.trim() const target = element2.parentElement.tagName === "H3" ? element2.parentElement : element2 if (title) { const meta = { title, type: "video" } target.utags = { key, meta } target.dataset.utags_node_type = "link" matchedNodesSet.add(target) } } } }, getStyle: () => bilibili_com_default, } })() var tiktok_com_default = ':not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .css-e2j6y6-StyledLink+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -4px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .css-e2j6y6-StyledLink+.utags_ul_1{position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .css-1gstnae-DivCommentItemWrapper{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) .css-1gstnae-DivCommentItemWrapper a[href^="/@"] p{display:inline}:not(#a):not(#b):not(#c) .css-ulyotp-DivCommentContentContainer{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) .css-1asahzr-DivBroadcastTitleWrapper a[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .css-1asahzr-DivBroadcastTitleWrapper a[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .css-1asahzr-DivBroadcastTitleWrapper a+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .css-c5ejjw-DivProfileContainer[data-e2e=user-profile-card] a[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .css-c5ejjw-DivProfileContainer[data-e2e=user-profile-card] a[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .css-8c0sl4-AName[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important;height:fit-content !important}:not(#a):not(#b):not(#c) .css-8c0sl4-AName[data-utags_fit_content="1"] *:not(svg){width:fit-content !important;height:fit-content !important}:not(#a):not(#b):not(#c) .css-8c0sl4-AName+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -4px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .css-8c0sl4-AName+.utags_ul_1{position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) [data-e2e=recommend-card] a+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -2px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) [data-e2e=recommend-card] a+.utags_ul_1{position:absolute;top:-9999px;margin-top:2px !important;margin-left:0px !important}' var tiktok_com_default2 = (() => { const prefix3 = "https://www.tiktok.com/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(23) if (exact) { if (/^@[\w.-]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/(^@[\w.-]+).*/, "$1") } } else if (/^@[\w.-]+/.test(href2)) { return prefix3 + href2.replace(/(^@[\w.-]+).*/, "$1") } } return void 0 } return { matches: /tiktok\.com/, listNodesSelectors: [ ".css-ulyotp-DivCommentContentContainer", ".css-1gstnae-DivCommentItemWrapper", ".css-x6y88p-DivItemContainerV2", ], conditionNodesSelectors: [ '.css-ulyotp-DivCommentContentContainer a[href^="/@"]', '.css-1gstnae-DivCommentItemWrapper a[href^="/@"]', '.css-x6y88p-DivItemContainerV2 a[href^="/@"]', ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } const key = getUserProfileUrl(href, true) if (key) { const titleElement = $('h3,[data-e2e="browse-username"]', element) const title = titleElement ? titleElement.textContent.trim() : element.textContent.trim() if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } return true } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, ".avatar-anchor", '[data-e2e*="avatar"]', '[data-e2e="user-card-nickname"]', ], validMediaSelectors: [ '[data-e2e="browse-bluev"]', '[data-e2e="recommend-card"]', ], addExtraMatchedNodes(matchedNodesSet) { const element = $('h1[data-e2e="user-title"]') if (element) { const title = element.textContent.trim() const key = getUserProfileUrl(location.href) if (title && key) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } }, getStyle: () => tiktok_com_default, } })() var pojie_cn_default = ".fl cite,.tl cite{white-space:break-spaces}.favatar .pi .authi a{line-height:16px}.favatar .pi{height:auto}" var pojie_cn_default2 = (() => { return { matches: /52pojie\.cn/, matchedNodesSelectors: [ 'a[href*="home.php?mod=space&uid="]', 'a[href*="home.php?mod=space&username="]', ], excludeSelectors: [ ...default_default2.excludeSelectors, "#hd", "#pt", "#pgt", "#jz52top", ], getStyle: () => pojie_cn_default, } })() var juejin_cn_default = (() => { const prefix3 = "https://juejin.cn/" function getUserProfileUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(18) if (/^user\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(user\/\d+).*/, "$1") } } return void 0 } return { matches: /juejin\.cn/, validate(element) { if ($(".avatar", element)) { return false } const href = element.href if (href.startsWith(prefix3)) { const key = getUserProfileUrl(href) if (key) { const titleElement = $(".name", element) let title if (titleElement) { title = titleElement.textContent } const meta = { type: "user" } if (title) { meta.title = title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, ".list-header", ".sub-header", ".next-page", ".follow-item", ".more-item", ], addExtraMatchedNodes(matchedNodesSet) { const key = getUserProfileUrl(location.href) if (key) { const element2 = $("h1.username") if (element2) { const title = element2.textContent.trim() if (title) { const meta = { title, type: "user" } element2.utags = { key, meta } matchedNodesSet.add(element2) } } } const element = $(".sidebar-block.author-block a .username") if (element) { const anchor = element.closest("a") if (anchor) { const key2 = getUserProfileUrl(anchor.href) if (key2) { const titleElement = $(".name", element) const title = titleElement ? titleElement.textContent : element.textContent if (title) { const meta = { title, type: "user" } element.utags = { key: key2, meta } matchedNodesSet.add(element) } } } } }, } })() var zhihu_com_default = (() => { const prefix3 = "https://www.zhihu.com/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(22) if (exact) { if (/^people\/[\w-]+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(people\/[\w-]+).*/, "$1") } } else if (/^people\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(people\/[\w-]+).*/, "$1") } } return void 0 } return { matches: /zhihu\.com/, validate(element) { if ($(".avatar", element)) { return false } const href = element.href if (!href.includes("zhihu.com")) { return true } if (href.startsWith(prefix3 + "people/")) { const key = getUserProfileUrl(href, true) if (key) { const titleElement = $(".name", element) let title if (titleElement) { title = titleElement.textContent } const meta = { type: "user" } if (title) { meta.title = title } element.utags = { key, meta } return true } } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, ".NumberBoard", ".ProfileMain-tabs", ".Profile-lightList", ], addExtraMatchedNodes(matchedNodesSet) { const key = getUserProfileUrl(location.href) if (key) { const element = $("h1.ProfileHeader-title .ProfileHeader-name") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, } })() var xiaohongshu_com_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:0% 100%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 100%;background-color:var(--utags-captain-tag-background-color) !important;border-radius:3px !important}:not(#a):not(#b):not(#c) .author-container .author-wrapper .name+.utags_ul_0{--utags-notag-captain-tag-top: 6px;--utags-notag-captain-tag-left: 8px}:not(#a):not(#b):not(#c) .author-container .author-wrapper .name+.utags_ul_1{position:absolute;top:-9999px;margin-top:4px !important;margin-left:8px !important}:not(#a):not(#b):not(#c) .note-text{position:relative}:not(#a):not(#b):not(#c) .note-text .utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-1);--utags-notag-ul-height: var(--utags-notag-ul-height-1);--utags-notag-ul-position: var(--utags-notag-ul-position-1);--utags-notag-ul-top: var(--utags-notag-ul-top-1);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-1);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-1);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .comments-container .author-wrapper .author{align-items:flex-start;flex-direction:column}:not(#a):not(#b):not(#c) .comments-container .author-wrapper .author .name+.utags_ul_0{object-position:200% 50%}:not(#a):not(#b):not(#c) .note-content-user+.utags_ul_0{--utags-notag-captain-tag-top: 0px;--utags-notag-captain-tag-left: 20px}:not(#a):not(#b):not(#c) .tooltip-content .user-content .avatar-info+.utags_ul_0{--utags-notag-captain-tag-top: 6px;--utags-notag-captain-tag-left: 46px}:not(#a):not(#b):not(#c) .tooltip-content .user-content .avatar-info+.utags_ul_1{position:absolute;top:-9999px;margin-top:6px !important;margin-left:46px !important}:not(#a):not(#b):not(#c) .note-item .cover+.utags_ul_0{--utags-notag-captain-tag-top: 18px;--utags-notag-captain-tag-left: -8px}:not(#a):not(#b):not(#c) .note-item .cover+.utags_ul_1{position:absolute;top:-9999px;margin-top:14px !important;margin-left:-4px !important}:not(#a):not(#b):not(#c) .note-item .author-wrapper .author+.utags_ul_0{--utags-notag-captain-tag-top: 16px;--utags-notag-captain-tag-left: 20px}:not(#a):not(#b):not(#c) .note-item .author-wrapper .author+.utags_ul_1{position:absolute;top:-9999px;margin-top:12px !important;margin-left:22px !important}:not(#a):not(#b):not(#c) #userPageContainer .user-info .user-nickname{align-items:flex-start;flex-direction:column}:not(#a):not(#b):not(#c) #userPageContainer .user-info .user-nickname .user-name+.utags_ul_0{object-position:0% 200%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: 0px;--utags-notag-captain-tag-left: 0px}" var xiaohongshu_com_default2 = (() => { const prefix3 = "https://www.xiaohongshu.com/" function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.startsWith("search_result") && href2.includes("keyword")) { return ( prefix3 + "search_result/?" + href2.replace(/.*?(keyword=[^&]*).*/, "$1") + "&type=54" ) } } return url } function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(28) if (exact) { if (/^user\/profile\/\w+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(user\/profile\/\w+).*/, "$1") } } else if (/^user\/profile\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(user\/profile\/\w+).*/, "$1") } } return void 0 } function getPostUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(28) if (/^explore\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(explore\/\w+).*/, "$1") } if (/^user\/profile\/\w+\/\w+/.test(href2)) { return ( prefix3 + "explore/" + href2.replace(/^user\/profile\/\w+\/(\w+).*/, "$1") ) } if (/^search_result\/\w+/.test(href2)) { return ( prefix3 + "explore/" + href2.replace(/^search_result\/(\w+).*/, "$1") ) } } return void 0 } return { matches: /www\.xiaohongshu\.com/, listNodesSelectors: [".feeds-container section", ".comment-item"], conditionNodesSelectors: [ ".feeds-container section .author-wrapper .author", ".feeds-container section .cover", ".comment-item .author-wrapper .author a", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } let key = getUserProfileUrl(href, true) if (key) { const titleElement = (hasClass(element, "name") ? element : $(".name", element)) || element let title if (titleElement) { title = titleElement.textContent.trim() } if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } key = getPostUrl(href) if (key) { const meta = { type: "post" } if (hasClass(element, "cover")) { const sibling = element.nextElementSibling if (sibling && hasClass(sibling, "footer")) { const titleElement = $(".title span", sibling) if (titleElement) { const title = titleElement.textContent.trim() if (title) { meta.title = title } } element.dataset.utags = element.dataset.utags || "" } } element.utags = { key, meta } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, ".side-bar", ".dropdown-nav", ".dropdown-container", ".interaction-info", ], addExtraMatchedNodes(matchedNodesSet) { let key = getUserProfileUrl(location.href) if (key) { const element = $(".user-info .user-name") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } element.dataset.utags_node_type = "link" matchedNodesSet.add(element) } } } key = getPostUrl(location.href) if (key) { const element = $(".note-content .title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getCanonicalUrl: getCanonicalUrl2, getStyle: () => xiaohongshu_com_default, } })() var weibo_com_default = (() => { const prefix3 = "https://weibo.com/" const prefix22 = "https://m.weibo.cn/" function getCanonicalUrl2(url) { if (url.startsWith(prefix3) || url.startsWith(prefix22)) { const href2 = getUserProfileUrl(url, true) if (href2) { return href2 } } return url } function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3) || url.startsWith(prefix22)) { const href2 = url.startsWith(prefix22) ? url.slice(19) : url.slice(18) if (exact) { if (/^u\/\d+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(u\/\d+).*/, "$1") } if (/^profile\/\d+(\?.*)?$/.test(href2)) { return prefix3 + "u/" + href2.replace(/^profile\/(\d+).*/, "$1") } if (/^\d+(\?.*)?$/.test(href2)) { return prefix3 + "u/" + href2.replace(/^(\d+).*/, "$1") } } else { if (/^u\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(u\/\d+).*/, "$1") } if (/^profile\/\d+/.test(href2)) { return prefix3 + "u/" + href2.replace(/^profile\/(\d+).*/, "$1") } if (/^\d+/.test(href2)) { return prefix3 + "u/" + href2.replace(/^(\d+).*/, "$1") } } } return void 0 } return { matches: /weibo\.com|weibo\.cn/, validate(element) { const href = element.href if (!href.includes("weibo.com") && !href.includes("weibo.cn")) { return true } const key = getUserProfileUrl(href, true) if (key) { const meta = { type: "user" } element.utags = { key, meta } if ($(".m-icon.vipicon", element)) { element.dataset.utags = element.dataset.utags || "" } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, '[class^="Frame_side_"]', 'a[href*="promote.biz.weibo.cn"]', ], addExtraMatchedNodes(matchedNodesSet) { const key = getUserProfileUrl(location.href) if (key) { const element = $( '[class^="ProfileHeader_name_"],.profile-cover .mod-fil-name .txt-shadow' ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getCanonicalUrl: getCanonicalUrl2, } })() var sspai_com_default = ":not(#a):not(#b):not(#c) #article-title+.utags_ul{display:block !important;margin-top:-30px !important;margin-bottom:20px !important}:not(#a):not(#b):not(#c) .user__info__card__center .utags_ul{display:block !important;margin-bottom:5px !important}:not(#a):not(#b):not(#c) .pai_title .utags_ul{float:left}" var sspai_com_default2 = (() => { const prefix3 = "https://sspai.com/" const excludeLinks = [ "https://sspai.com/prime", "https://sspai.com/matrix", "https://sspai.com/page/about-us", "https://sspai.com/page/agreement", "https://sspai.com/page/bussiness", "https://sspai.com/post/37793", "https://sspai.com/page/client", "https://sspai.com/s/J71e", "https://sspai.com/mall", ] function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { const href = url.slice(18) if (href.startsWith("u/")) { return prefix3 + href.replace(/^(u\/\w+).*/, "$1") } } return url } function getUserProfileUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(18) if (/^u\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(u\/\w+).*/, "$1") } } return void 0 } function getPostUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(18) if (/^post\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(post\/\d+).*/, "$1") } } return void 0 } return { matches: /sspai\.com/, validate(element) { const href = element.href for (const link of excludeLinks) { if (href.includes(link)) { return false } } if ( hasClass(element, "ss__user__nickname__wrapper") || element.closest('.card_bottom > a[href^="/u/"]') ) { element.dataset.utags = element.dataset.utags || "" return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "header", "footer", ".pai_abstract", ".pai_title .link", ], addExtraMatchedNodes(matchedNodesSet) { let key = getPostUrl(location.href) if (key) { const element = $(".article-header .title") if (element && !element.closest(".pai_title")) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getUserProfileUrl(location.href) if (key) { const element = $( ".user_content .user__info__card .ss__user__card__nickname" ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getCanonicalUrl: getCanonicalUrl2, getStyle: () => sspai_com_default, } })() var douyin_com_default = ':not(#a):not(#b):not(#c) [data-e2e=comment-item] .utags_ul_0 .utags_captain_tag{left:-26px}:not(#a):not(#b):not(#c) [data-e2e=detail-video-info] .utags_ul[data-utags_key*="/video/"]{display:block !important;margin-top:0px !important;margin-bottom:2px !important}:not(#a):not(#b):not(#c) [data-e2e=detail-video-info] .utags_ul[data-utags_key*="/video/"].utags_ul_0{height:0}:not(#a):not(#b):not(#c) [data-e2e=detail-video-info] .utags_ul[data-utags_key*="/video/"].utags_ul_0 .utags_captain_tag{top:-26px;background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) [data-e2e=related-video] .utags_ul_0[data-utags_key*="/video/"]{display:block !important;height:0}:not(#a):not(#b):not(#c) [data-e2e=related-video] .utags_ul_0[data-utags_key*="/video/"] .utags_captain_tag{top:-26px;background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) [data-e2e=related-video] .utags_ul_0[data-utags_key*="/user/"]{display:block !important;height:0px;width:0px}:not(#a):not(#b):not(#c) [data-e2e=related-video] .utags_ul_0[data-utags_key*="/user/"] .utags_captain_tag{top:-22px;background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) [data-e2e=user-info] a+.utags_ul_0[data-utags_key*="/user/"]{display:block !important;height:0px;width:0px}:not(#a):not(#b):not(#c) [data-e2e=user-info] a+.utags_ul_0[data-utags_key*="/user/"] .utags_captain_tag{top:-22px;background-color:hsla(0,0%,100%,.8666666667) !important}' var douyin_com_default2 = (() => { const prefix3 = "https://www.douyin.com/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(23) if (exact) { if (/^user\/[\w-]+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(user\/[\w-]+).*/, "$1") } } else if (/^user\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(user\/[\w-]+).*/, "$1") } } return void 0 } function getVideoUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(23) if (/^video\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(video\/\w+).*/, "$1") } } return void 0 } function getNoteUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(23) if (/^note\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(note\/\w+).*/, "$1") } } return void 0 } return { matches: /www\.douyin\.com/, validate(element) { const href = element.href if (!href.includes("www.douyin.com")) { return true } let key = getUserProfileUrl(href, true) if (key) { const meta = { type: "user" } element.utags = { key, meta } return true } key = getVideoUrl(href) if (key) { const meta = { type: "video" } element.utags = { key, meta } return true } key = getNoteUrl(href) if (key) { const meta = { type: "post" } element.utags = { key, meta } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, '[data-e2e="douyin-navigation"]', ], validMediaSelectors: ['img[src*="twemoji"]'], addExtraMatchedNodes(matchedNodesSet) { let key = getUserProfileUrl(location.href) if (key) { const element = getFirstHeadElement("h1") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getVideoUrl(location.href) if (key) { const element = getFirstHeadElement("h1") if (element) { const title = element.textContent.trim() const target = element.parentElement.parentElement if (title) { const meta = { title, type: "video" } target.utags = { key, meta } target.dataset.utags_node_type = "link" matchedNodesSet.add(target) } } } key = getNoteUrl(location.href) if (key) { const element = getFirstHeadElement("h1") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => douyin_com_default, } })() var podcasts_google_com_default = "" var podcasts_google_com_default2 = (() => { const prefix3 = "https://podcasts.google.com/" function getEpisodeUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(28) if (exact) { if (/^feed\/\w+\/episode\/\w+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(feed\/\w+\/episode\/\w+).*/, "$1") } } else if (/^feed\/\w+\/episode\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(feed\/\w+\/episode\/\w+).*/, "$1") } } return void 0 } function getFeedUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(28) if (/^feed\/\w+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(feed\/\w+).*/, "$1") } } return void 0 } function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { let url2 = getFeedUrl(url) if (url2) { return url2 } url2 = getEpisodeUrl(url) if (url2) { return url2 } } return url } return { matches: /podcasts\.google\.com/, excludeSelectors: [ ...default_default2.excludeSelectors, "header", "gm-coplanar-drawer", ], addExtraMatchedNodes(matchedNodesSet) { let key = getEpisodeUrl(location.href) if (key) { const element = $("h5") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "episode" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getFeedUrl(location.href) if (key) { for (const container of $$("[data-encoded-feed]")) { if (isVisible(container)) { const element = $( "div:first-child > div:first-child > div:first-child > div:first-child", container ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "feed" } element.utags = { key, meta } matchedNodesSet.add(element) } } } } } for (const element of $$('a[role="listitem"]')) { const key2 = getEpisodeUrl(element.href) const titleElement = $( 'div[role="navigation"] div div[role="presentation"]', element ) if (key2 && titleElement) { const title = titleElement.textContent const meta = { title, type: "episode" } titleElement.utags = { key: key2, meta } titleElement.dataset.utags_node_type = "link" matchedNodesSet.add(titleElement) } } for (const element of $$( 'a[href^="./feed/"]:not(a[href*="/episode/"])' )) { if (!isVisible(element)) { continue } const key2 = getFeedUrl(element.href) const titleElement = $("div > div", element) if (titleElement) { const title = titleElement.textContent const meta = { title, type: "feed" } titleElement.utags = { key: key2, meta } titleElement.dataset.utags_node_type = "link" matchedNodesSet.add(titleElement) } } }, getCanonicalUrl: getCanonicalUrl2, getStyle: () => podcasts_google_com_default, } })() var rebang_today_default = ":not(#a):not(#b):not(#c) .w-screen ul{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) .w-screen ul .flex-1:not(.relative)>.utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul .flex.flex-col.relative .flex-1 .utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul .relative>.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-3);--utags-notag-ul-height: var(--utags-notag-ul-height-3);--utags-notag-ul-position: var(--utags-notag-ul-position-3);--utags-notag-ul-top: var(--utags-notag-ul-top-3);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-3);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-3);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .w-screen ul .flex.flex-col.relative .flex-1 .utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul .flex-1:not(.relative)>.utags_ul_0{--utags-notag-captain-tag-top: 18px}:not(#a):not(#b):not(#c) .w-screen ul .text-base .block+.utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul h1 .utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul li>div.overflow-hidden:nth-of-type(2):not(.relative)>a+.utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul li>a+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-2);--utags-notag-ul-height: var(--utags-notag-ul-height-2);--utags-notag-ul-position: var(--utags-notag-ul-position-2);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-2);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-2);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .w-screen ul .text-base .block+.utags_ul_0{--utags-notag-captain-tag-top: -24px}:not(#a):not(#b):not(#c) .w-screen ul h1 .utags_ul_0{--utags-notag-captain-tag-top: -28px}:not(#a):not(#b):not(#c) .w-screen ul li>a+.utags_ul_0{--utags-notag-captain-tag-left: 26px}:not(#a):not(#b):not(#c) .w-screen ul .flex.flex-col .text-base+.utags_ul_0,:not(#a):not(#b):not(#c) .w-screen ul li>a.text-base+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-4);--utags-notag-ul-height: var(--utags-notag-ul-height-4);--utags-notag-ul-position: var(--utags-notag-ul-position-4);--utags-notag-ul-top: var(--utags-notag-ul-top-4);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-4);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-4);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .w-screen ul li>a.text-base+.utags_ul_0{--utags-notag-captain-tag-top: -10px;--utags-notag-captain-tag-left: 14px}:not(#a):not(#b):not(#c) .w-screen ul .truncate .utags_ul_0{--utags-notag-captain-tag-left: -22px}:not(#a):not(#b):not(#c) aside{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) aside .select-none .utags_ul_0{--utags-notag-captain-tag-left: -22px}:not(#a):not(#b):not(#c) aside .select-none .arco-tag .utags_ul_0{--utags-notag-captain-tag-left: -6px}:not(#a):not(#b):not(#c) #markdown-body.markdown-body a+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-1);--utags-notag-ul-height: var(--utags-notag-ul-height-1);--utags-notag-ul-width: var(--utags-notag-ul-width-1);--utags-notag-ul-position: var(--utags-notag-ul-position-1);--utags-notag-ul-top: var(--utags-notag-ul-top-1);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-1);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-1)}" var rebang_today_default2 = (() => { const nodeNameMap = { 知乎: "zhihu", 微博: "weibo", IT之家: "ithome", 虎扑: "hupu", 豆瓣社区: "douban-community", 虎嗅: "huxiu", 少数派: "sspai", 网易新闻: "ne-news", 澎湃新闻: "thepaper", 小红书: "xiaohongshu", "36\u6C2A": "36kr", 今日头条: "toutiao", 爱范儿: "ifanr", 豆瓣书影音: "douban-media", 什么值得买: "smzdm", 百度: "baidu", 百度贴吧: "baidu-tieba", 吾爱破解: "52pojie", 观风闻: "guancha-user", 雪球: "xueqiu", 东方财富: "eastmoney", 新浪财经: "sina-fin", 蓝点网: "landian", 小众软件: "appinn", 反斗限免: "apprcn", NGA社区: "nga", 游民星空: "gamersky", 喷嚏网: "penti", 沙雕新闻: "shadiao-news", 抖音: "douyin", 哔哩哔哩: "bilibili", 直播吧: "zhibo8", 掘金: "juejin", 技术期刊: "journal-tech", 开发者头条: "toutiaoio", GitHub: "github", AcFun: "acfun", 宽带山: "kds", V2EX: "v2ex", 格隆汇: "gelonghui", 第一财经: "diyicaijing", InfoQ: "infoq", CSDN: "csdn", } return { matches: /rebang\.today/, preProcess() { const nodes = $$(":not(a) > .arco-tag-content") for (const node of nodes) { const name = node.textContent if (name && !node.closest("a")) { const nodeId = nodeNameMap[name] if (nodeId) { const a = createElement("a", { href: "https://rebang.today/home?tab=" + nodeId, }) node.after(a) a.append(node) } } } }, listNodesSelectors: [ ".w-screen ul:not(.utags_ul) > li", "aside .w-full .select-none", ], conditionNodesSelectors: [ '[data-utags_list_node] [data-utags]:not([href^="https://www.v2ex.com/member/"])', '[data-utags_list_node] a[href^="https://www.v2ex.com/member/"][data-utags].hidden', ], excludeSelectors: [ ...default_default2.excludeSelectors, "header", ".absolute.rounded-xl", "ul li h1 + p a", ], validMediaSelectors: [ ".text-text-100", ".items-center .rounded-full", 'a[href^="https://github.com/"] svg', 'a[href^="https://space.bilibili.com/"] img', 'a[href^="https://toutiao.io/subjects/"] img', "svg.arco-icon", ], getStyle: () => rebang_today_default, } })() var myanimelist_net_default = ":not(#a):not(#b):not(#c) tbody.list-item td.title{--utags-notag-captain-tag-top: -6px;--utags-notag-captain-tag-left: -24px}" var myanimelist_net_default2 = (() => { return { matches: /myanimelist\.net/, listNodesSelectors: [], conditionNodesSelectors: [], excludeSelectors: [ ...default_default2.excludeSelectors, "#headerSmall", "#menu", "#nav", ".header", "#status-menu", 'a[href^="/sns/register/"]', 'a[href^="/logout"]', 'a[href*="/membership?"]', 'a[href*="/login.php"]', 'a[href*="/register.php"]', 'a[href*="/dbchanges.php"]', 'a[href*="/editprofile.php"]', 'a[href*="go=write"]', 'a[href^="/ownlist/anime/add?"]', '[class*="btn-"]', '[class*="icon-"]', '[rel*="sponsored"]', ], getStyle: () => myanimelist_net_default, } })() var douban_com_default = (() => { function getCanonicalUrl2(url) { if (url.includes("douban.com")) { return deleteUrlParameters(url, [ "ref", "dcs", "dcm", "from", "from_", "dt_time_source", "target_user_id", "_dtcc", "_i", ]) } return url } return { matches: /douban\.com/, listNodesSelectors: [], conditionNodesSelectors: [], excludeSelectors: [ ...default_default2.excludeSelectors, ".tabs", 'a[href*="/accounts/login?"]', 'a[href*="/passport/login?"]', 'a[href*="/register?"]', ], getCanonicalUrl: getCanonicalUrl2, } })() var pixiv_net_default = "" var pixiv_net_default2 = /* @__PURE__ */ (() => { const prefix3 = "https://www.pixiv.net/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { let href2 = url.slice(22) if (href2.startsWith("en/")) { href2 = href2.slice(3) } if (exact) { if (/^users\/\d+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(users\/\d+).*/, "$1") } } else if (/^users\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(users\/\d+).*/, "$1") } } return void 0 } return { matches: /pixiv\.net/, validate(element) { const href = element.href if (!href.includes("www.pixiv.net")) { return true } const key = getUserProfileUrl(href, true) if (key) { const title = element.textContent if ( !title || /プロフィールを見る|View Profile|프로필 보기|查看个人资料|查看個人資料|ホーム|Home|홈|主页|首頁/.test( title ) ) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return false }, addExtraMatchedNodes(matchedNodesSet) { const key = getUserProfileUrl(location.href) if (key) { const element = $("h1") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => pixiv_net_default, } })() var discourse_default = ':not(#a):not(#b):not(#c) *+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) *+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .topic-list{--utags-list-node-display: table-row}:not(#a):not(#b):not(#c) .topic-list .main-link a.title+.utags_ul_1{margin-bottom:4px !important}:not(#a):not(#b):not(#c) .topic-list .discourse-tag+.utags_ul_0{--utags-notag-captain-tag-top: 1px}:not(#a):not(#b):not(#c) .topic-list .discourse-tag+.utags_ul_1{margin-top:3px !important}:not(#a):not(#b):not(#c) .topic-list .posters a:first-of-type+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-left: -6px}:not(#a):not(#b):not(#c) .topic-list .posters a:first-of-type+.utags_ul_1{position:absolute;top:-9999px;margin-top:4px !important;margin-left:-2px !important}:not(#a):not(#b):not(#c) header .header-title a.topic-link+.utags_ul_1{object-position:100% 200%;position:absolute;top:-9999px;margin-bottom:4px !important}:not(#a):not(#b):not(#c) header .header-title a.topic-link[data-utags_flag=inline]+.utags_ul_1{position:unset;margin-bottom:4px !important}:not(#a):not(#b):not(#c) header .badge-category__wrapper+.utags_ul_1{margin-top:2px !important}:not(#a):not(#b):not(#c) #topic-title a.fancy-title+.utags_ul_1{margin-bottom:8px !important}:not(#a):not(#b):not(#c) #topic-title .discourse-tag+.utags_ul_1{margin-top:5px !important}:not(#a):not(#b):not(#c) .topic-body .topic-meta-data .names[data-utags_fit_content="1"],:not(#a):not(#b):not(#c) .topic-body .names[data-utags_fit_content="1"]{max-width:max-content !important}:not(#a):not(#b):not(#c) .topic-body .topic-meta-data .names[data-utags_fit_content="1"] *:not(svg),:not(#a):not(#b):not(#c) .topic-body .names[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .topic-body .topic-meta-data .names a+.utags_ul_1,:not(#a):not(#b):not(#c) .topic-body .names a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;z-index:100}:not(#a):not(#b):not(#c) .post-links-container .post-links .track-link[data-utags_fit_content="1"]{max-width:max-content !important;max-height:max-content !important}:not(#a):not(#b):not(#c) .user-card .names[data-utags_fit_content="1"]{max-width:max-content !important;max-height:max-content !important}:not(#a):not(#b):not(#c) .user-card .names a.user-profile-link+.utags_ul_0{object-position:200% 0%;margin-top:6px !important}:not(#a):not(#b):not(#c) .user-card .names a.user-profile-link+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-left:16px !important}:not(#a):not(#b):not(#c) .column .category-list .category-title-link+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .column .latest-topic-list .main-link .title+.utags_ul_1{margin-bottom:4px !important}:not(#a):not(#b):not(#c) .column .latest-topic-list .main-link .badge-category__wrapper+.utags_ul_1{padding-top:3px !important}:not(#a):not(#b):not(#c) .column .latest-topic-list .main-link .discourse-tag+.utags_ul_1{margin-top:4px !important}:not(#a):not(#b):not(#c) .column .latest-topic-list .topic-poster a+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: 13px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .column .latest-topic-list .topic-poster a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:17px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .search-container{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) .search-container .search-link[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .search-container .search-link[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .search-container .search-link+.utags_ul_1{object-position:0% 0%;position:absolute;top:-9999px;margin-top:-14px !important}:not(#a):not(#b):not(#c) .search-container .search-results .author a+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: 13px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .search-container .search-results .author a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:17px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .user-info .user-detail .name-line a[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .user-info .user-detail .name-line a[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .bookmark-list.topic-list tr a.avatar+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: 6px}:not(#a):not(#b):not(#c) .bookmark-list.topic-list tr a.avatar+.utags_ul_1{position:absolute;top:-9999px;margin-top:10px !important}:not(#a):not(#b):not(#c) .user-content .user-stream-item__header a.avatar-link+.utags_ul_0,:not(#a):not(#b):not(#c) .user-content .filter-1 .post-list-item .post-list-item__header a.avatar-link+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -4px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .user-content .user-stream-item__header a.avatar-link+.utags_ul_1,:not(#a):not(#b):not(#c) .user-content .filter-1 .post-list-item .post-list-item__header a.avatar-link+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:2px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .search-menu .results{position:relative}:not(#a):not(#b):not(#c) .search-menu .results .search-link+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -14px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .user-profile-names [data-utags][data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .user-profile-names [data-utags][data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .leaderboard .winner{padding-bottom:50px}:not(#a):not(#b):not(#c) .leaderboard .winner .winner__avatar[data-user-card]+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -56px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .leaderboard .winner .winner__avatar[data-user-card]+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:-56px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .notification a[data-utags_fit_content="1"]{display:inline-flex !important;width:fit-content !important}:not(#a):not(#b):not(#c) .notification a[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) .notification a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:-6px !important;margin-left:42px !important}:not(#a):not(#b):not(#c) [data-utags_list_node]:last-of-type{display:var(--utags-list-node-display) !important}:not(#a):not(#b):not(#c) .user-menu.revamped .menu-tabs-container{z-index:91;background-color:var(--secondary)}.mobile-view:not(#a):not(#b):not(#c) .topic-list a[data-user-card]+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: 14px;--utags-notag-captain-tag-left: -8px}.mobile-view:not(#a):not(#b):not(#c) .topic-list a[data-user-card]+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:18px !important;margin-left:-4px !important;max-width:58px !important}.mobile-view:not(#a):not(#b):not(#c) .topic-body .topic-meta-data .names a+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -4px;--utags-notag-captain-tag-left: -4px}.mobile-view:not(#a):not(#b):not(#c) .topic-body .topic-meta-data .names a+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;z-index:100}' var discourse_default2 = (() => { const prefix3 = location.origin + "/" const getUserProfileUrl = (url, exact = false) => { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^u\/[\w.-]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w.-]+).*/, "$1") } } else if (/^u\/[\w.-]+/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w.-]+).*/, "$1") } } return void 0 } function getPostUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^t\/[^/]+\/\d+(\/\d+)?([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(t\/[^/]+\/\d+).*/, "$1") } } else if (/^t\/[^/]+\/\d+?/.test(href2)) { return prefix3 + href2.replace(/^(t\/[^/]+\/\d+).*/, "$1") } } return void 0 } function getCategoryUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^c\/[\w-]+(\/[\w-]+)?\/\d+([?#].*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^(c\/[\w-]+(\/[\w-]+)?\/\d+).*/, "$1") ) } } else if (/^c\/[\w-]+(\/[\w-]+)?\/\d+?/.test(href2)) { return prefix3 + href2.replace(/^(c\/[\w-]+(\/[\w-]+)?\/\d+).*/, "$1") } } return void 0 } function getTagUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^tag\/[^/?#]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(tag\/[^/?#]+).*/, "$1") } } else if (/^tag\/[^/?#]+?/.test(href2)) { return prefix3 + href2.replace(/^(tag\/[^/?#]+).*/, "$1") } } return void 0 } return { matches: /meta\.discourse\.org|linux\.do|meta\.appinn\.net|community\.openai\.com|community\.cloudflare\.com|community\.wanikani\.com|forum\.cursor\.com/, preProcess() { setVisitedAvailable(true) }, listNodesSelectors: [ ".topic-list .topic-list-body tr", ".topic-area .topic-post", ".search-results .fps-result", ".column .latest-topic-list .latest-topic-list-item", ], conditionNodesSelectors: [ ".topic-list .topic-list-body tr .title", ".topic-list .topic-list-body tr .badge-category__wrapper", ".topic-list .topic-list-body tr .discourse-tag", ".topic-list .topic-list-body tr .posters a:first-of-type", ".mobile-view .topic-list a[data-user-card]", ".topic-area .topic-post:nth-of-type(n+2) .topic-meta-data:not(.embedded-reply) .names a", ".search-results .fps-result .search-link", ".search-results .fps-result .badge-category__wrapper", ".search-results .fps-result .discourse-tag", ".column .latest-topic-list .latest-topic-list-item .main-link .title", ".column .latest-topic-list .latest-topic-list-item .main-link .badge-category__wrapper", ".column .latest-topic-list .latest-topic-list-item .main-link .discourse-tag", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } let key = getUserProfileUrl(href, true) if (key) { const titleElement = $("span.username", element) const title = getTrimmedTitle(titleElement || element) if ( !title && !element.closest(".topic-list tr .posters a:first-of-type") && !element.closest(".bookmark-list tr a.avatar") && // https://linux.do/u/neo/activity/reactions !element.closest( ".user-content .user-stream-item__header a.avatar-link" ) && // https://linux.do/u/neo/activity/likes-given !element.closest( ".user-content .filter-1 .post-list-item .post-list-item__header a.avatar-link" ) && !element.closest(".column .latest-topic-list .topic-poster a") && !element.closest(".search-results .author a") ) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" if (element.closest(".topic-body .names a")) { element.dataset.utags_position_selector = ".topic-body .names" } else if (element.closest(".user-card .names a")) { element.dataset.utags_position_selector = ".user-card .names" } else if ($("span.username", element)) { element.dataset.utags_position_selector = "span.username" } return true } key = getPostUrl(href) if (key) { const title = element.textContent.trim() if ( element.closest(".mobile-view .topic-list a[data-user-card]") && element.dataset.userCard ) { const title2 = element.dataset.userCard key = prefix3 + "u/" + title2.toLowerCase() const meta2 = { type: "user", title: title2 } element.utags = { key, meta: meta2 } element.dataset.utags = element.dataset.utags || "" return true } if (!title) { return false } if ( element.closest("header .topic-link") && getComputedStyle(element).display === "inline" ) { element.dataset.utags_flag = "inline" } const meta = { type: "post", title } element.utags = { key, meta } markElementWhetherVisited(key, element) element.dataset.utags = element.dataset.utags || "" return true } key = getCategoryUrl(href) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "category", title } element.utags = { key, meta } if (element.closest(".column .category-list .category-title-link")) { element.dataset.utags_position_selector = ".category-text-title .category-name" } return true } key = getTagUrl(href) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "tag", title } element.utags = { key, meta } return true } return true }, excludeSelectors: [ ".topic-map", ".names .second", ".post-activity", ".topic-last-activity", ".topic-item-stats .activity", ".topic-post-badges", ".topic-excerpt", ".topic-list-category-expert-tags", ".list-vote-count", ".post-date", ".category__badges", ".badge-posts", ".topic-timeline", ".with-timeline", ".sidebar-wrapper", ".topic-meta-data .post-link-arrow", "#skip-link", "#navigation-bar", ".user-navigation", ".search-menu", "footer.category-topics-count", '[role="tablist"]', ".nav.nav-pills", ".btn", ".custom-header-links", ".chat-time", ], validMediaSelectors: [ "a img.emoji", "a svg.svg-string", ".category-title-link", ".topic-list tr .posters a:first-of-type", ".search-results .author a .avatar", ], addExtraMatchedNodes(matchedNodesSet) { var _a const isDarkMode = doc.documentElement.dataset.themeType === "dark" || // linux.do ((_a = $("header picture > source")) == null ? void 0 : _a.media) === "all" doc.documentElement.dataset.utags_darkmode = isDarkMode ? "1" : "0" let key = getUserProfileUrl(location.href) if (key) { let index = 0 for (const element2 of $$( ".user-profile-names .username,.user-profile-names .user-profile-names__primary,.user-profile-names .user-profile-names__secondary" )) { index++ if (key !== element2.dataset.utags_key || index === 2) { delete element2.dataset.utags delete element2.utags } } const element = $(".user-profile-names .username") || $( ".user-profile-names .user-profile-names__primary,.user-profile-names .user-profile-names__secondary" ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } element.dataset.utags_key = key matchedNodesSet.add(element) } } } key = getPostUrl(location.href) if (key) { addVisited(key) } for (const element of $$(".leaderboard div[data-user-card]")) { const title = element.dataset.userCard if (title) { key = prefix3 + "u/" + title.toLowerCase() const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" element.dataset.utags_node_type = "link" element.dataset.utags_position_selector = element.closest(".winner") ? ".winner" : ".user__name" matchedNodesSet.add(element) } } for (const element of $$(".chat-message span[data-user-card]")) { const title = element.dataset.userCard if (title) { key = prefix3 + "u/" + title.toLowerCase() const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" element.dataset.utags_node_type = "link" matchedNodesSet.add(element) } } }, getStyle: () => discourse_default, } })() var nga_cn_default = "" var nga_cn_default2 = (() => { const prefix3 = location.origin + "/" function getUserProfileUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (/^nuke\.php\?func=ucp&uid=\d+/.test(href2)) { return ( prefix3 + href2.replace(/^(nuke\.php\?func=ucp&uid=\d+).*/, "$1") ) } } return void 0 } return { matches: /bbs\.nga\.cn|nga\.178\.com|ngabbs\.com/, validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } const key = getUserProfileUrl(href) if (key) { const title = element.textContent if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, ".xxxxxxxxxx", ".xxxxxxxxxx", ], addExtraMatchedNodes(matchedNodesSet) { const key = getUserProfileUrl(location.href) if (key) { const label = $( "#ucpuser_info_blockContent > div > span > div:nth-child(2) > div:nth-child(3) > label" ) if (label) { const title = label.textContent.trim() if (title === "\u7528\u2002\u6237\u2002\u540D") { const element = label.nextElementSibling if (element) { const title2 = element.textContent.trim() if (title2) { const meta = { title: title2, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } } } }, getStyle: () => nga_cn_default, } })() var dlsite_com_default = ':not(#a):not(#b):not(#c) *+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) *+.utags_ul_1{object-position:0% 200%;background-color:var(--utags-captain-tag-background-color) !important;border-radius:3px !important;--utags-emoji-tag-background-color: #fff0}:not(#a):not(#b):not(#c) .n_worklist a.work_name,:not(#a):not(#b):not(#c) .n_worklist dt.work_name,:not(#a):not(#b):not(#c) .recommend_list a.work_name,:not(#a):not(#b):not(#c) .recommend_list dt.work_name,:not(#a):not(#b):not(#c) .genre_ranking a.work_name,:not(#a):not(#b):not(#c) .genre_ranking dt.work_name{width:fit-content}:not(#a):not(#b):not(#c) .n_worklist a.work_name+.utags_ul_0,:not(#a):not(#b):not(#c) .n_worklist dt.work_name+.utags_ul_0,:not(#a):not(#b):not(#c) .recommend_list a.work_name+.utags_ul_0,:not(#a):not(#b):not(#c) .recommend_list dt.work_name+.utags_ul_0,:not(#a):not(#b):not(#c) .genre_ranking a.work_name+.utags_ul_0,:not(#a):not(#b):not(#c) .genre_ranking dt.work_name+.utags_ul_0{object-position:200% 0%}:not(#a):not(#b):not(#c) .n_worklist .maker_name,:not(#a):not(#b):not(#c) .recommend_list .maker_name,:not(#a):not(#b):not(#c) .genre_ranking .maker_name{white-space:wrap;-webkit-line-clamp:unset;height:unset}:not(#a):not(#b):not(#c) h1#work_name[data-utags_fit_content="1"]{max-width:max-content !important}' var dlsite_com_default2 = (() => { const prefix3 = "https://www.dlsite.com/" function getProductUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.includes("=/product_id/")) { return prefix3 + href2.replace(/^(.+\.html).*/, "$1") } } return void 0 } function getMakerUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.includes("/profile/=/maker_id/")) { return prefix3 + href2.replace(/^(.+\.html).*/, "$1") } } return void 0 } return { matches: /dlsite\.com/, validate(element) { if (element.tagName !== "A") { return true } const href = element.href if (!href.startsWith(prefix3)) { return true } if (href.includes("/=/")) { return true } return false }, map(element) { if ( element.tagName === "A" && element.closest( ".n_worklist .work_name,.recommend_list dt.work_name,.genre_ranking .work_name" ) ) { const key = getProductUrl(element.href) const title = element.textContent.trim() if (!key || !title) { return } const parentElement = element.parentElement const meta = { title } parentElement.utags = { key, meta } parentElement.dataset.utags_node_type = "link" return parentElement } }, excludeSelectors: [ ...default_default2.excludeSelectors, "header", "#top_header", "#header", ".topicpath", ".link_dl_ch", ".floating_cart_box", "#work_buy_box_wrapper", ".pagetop_block", ".matome_btn", ".review_all", ".review_report", ".work_cart", ".work_favorite", ".title_01", ".search_more", ".btn_category_sample", ".btn_cart", ".btn_favorite", ".btn_follow", ".btn_default", ".btn_sample", ".left_module", ".more_work_btn", ".heading_link", ".work_edition", ".work_btn_list", ".trans_work_btn", ".work_feature", ".work_review", ".work_rating", ".work_category", ".work_btn_link", ".sort_box", ".search_condition_box", ".global_pagination", ".page_bottom_link", ".trial_download", ".btn_trial", ".work_win_only", ".cp_overview_btn", ".cp_overview_list", ".option_tab_item", ".dc_work_group_footer", ".new_worklist_more", "#work_win_only", "#index2_header", ".floor_link", ".floor_link_creator", ".floor_guide", ".l-header", ".hd_drawer", ".index_header", ".index_footer", ".left_module_comipo", "div#left", ".footer_floor_nav", ".prof_label_list", ".type_btn", ], addExtraMatchedNodes(matchedNodesSet) { let key = getProductUrl(location.href) if (key) { const element = $("h1#work_name") if (element) { const title = element.textContent.trim() if (title) { const meta = { title } element.utags = { key, meta } element.dataset.utags_node_type = "link" matchedNodesSet.add(element) } } } key = getMakerUrl(location.href) if (key) { const element = $(".prof_maker_name") if (element) { const title = element.textContent.trim() if (title) { const meta = { title } element.utags = { key, meta } element.dataset.utags_node_type = "link" matchedNodesSet.add(element) } } } }, getStyle: () => dlsite_com_default, } })() var keylol_com_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .frame-tab .dxb_bc .module{position:relative}:not(#a):not(#b):not(#c) .favatar .pi{height:unset}:not(#a):not(#b):not(#c) .ratl td:first-of-type{white-space:normal}" var keylol_com_default2 = (() => { const prefix3 = location.origin + "/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^\?\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^\?(\d+).*/, "home.php?mod=space&uid=$1") ) } if (/^suid-\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^suid-(\d+).*/, "home.php?mod=space&uid=$1") ) } if (/^home\.php\?mod=space&uid=\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace( /^home\.php\?mod=space&uid=(\d+).*/, "home.php?mod=space&uid=$1" ) ) } } else if (/^u\/[\w.-]+/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w.-]+).*/, "$1") } } return void 0 } return { matches: /keylol\.com/, validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } const key = getUserProfileUrl(href, true) if (key) { const title = element.textContent if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, "nav", "header", "#pgt", "#fd_page_bottom", "#visitedforums", "#pt", ], getStyle: () => keylol_com_default, } })() var tampermonkey_net_cn_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .favatar .authi a+.utags_ul_1{position:absolute;top:-9999px;z-index:100;margin-top:0px !important;margin-left:-64px !important}:not(#a):not(#b):not(#c) .comiis_irbox a+.utags_ul_0{object-position:100% 0%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .comiis_irbox a+.utags_ul_1{object-position:0% 0%;position:absolute;top:-9999px;z-index:100;margin-top:18px !important;margin-left:0px !important}" var tampermonkey_net_cn_default2 = (() => { const prefix3 = "https://bbs.tampermonkey.net.cn/" function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { let href2 = getUserProfileUrl(url, true) if (href2) { return href2 } href2 = getPostUrl(url, true) if (href2) { return href2 } } return url } function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { url = deleteUrlParameters(url, "do") const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^\?\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^\?(\d+).*/, "home.php?mod=space&uid=$1") ) } if (/^space-uid-\d+\.html([?#].*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^space-uid-(\d+).*/, "home.php?mod=space&uid=$1") ) } if (/^home\.php\?mod=space&uid=\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace( /^home\.php\?mod=space&uid=(\d+).*/, "home.php?mod=space&uid=$1" ) ) } } else if (/^u\/[\w.-]+/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w.-]+).*/, "$1") } } return void 0 } function getPostUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (/^thread(?:-\d+){3}\.html([?#].*)?$/.test(href2)) { return ( prefix3 + href2.replace(/^thread-(\d+).*/, "forum.php?mod=viewthread&tid=$1") ) } if (/^forum\.php\?mod=redirect&tid=\d+([].*)?$/.test(href2)) { return ( prefix3 + href2.replace( /^forum\.php\?mod=redirect&tid=(\d+).*/, "forum.php?mod=viewthread&tid=$1" ) ) } if (/^forum\.php\?mod=viewthread&tid=\d+(#.*)?$/.test(href2)) { return ( prefix3 + href2.replace( /^forum\.php\?mod=viewthread&tid=(\d+).*/, "forum.php?mod=viewthread&tid=$1" ) ) } } return void 0 } return { matches: /bbs\.tampermonkey\.net\.cn/, preProcess() { setVisitedAvailable(true) }, listNodesSelectors: [ // "#threadlist table tbody", "#postlist .comiis_vrx", ], conditionNodesSelectors: [ // "#threadlist table tbody h2 a", "#threadlist table tbody .km_user a", "#postlist .comiis_vrx .authi a", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } let key = getUserProfileUrl(href, true) if (key) { let title2 = element.textContent.trim() if (!title2) { return false } if (/^https:\/\/bbs\.tampermonkey\.net\.cn\/\?\d+$/.test(title2)) { const titleElement = $("#uhd h2") if (titleElement) { title2 = titleElement.textContent.trim() } } if ( /^\d+$/.test(title2) && element.parentElement.parentElement.textContent.includes( "\u79EF\u5206" ) ) { return false } const meta = href === title2 ? { type: "user" } : { type: "user", title: title2 } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } key = getPostUrl(href) if (key) { const title2 = element.textContent.trim() if (!title2) { return false } if ( title2 === "New" || title2 === "\u7F6E\u9876" || /^\d+$/.test(title2) || /^\d{4}(?:-\d{1,2}){2} \d{2}:\d{2}$/.test(title2) ) { return false } if ($('span[title^="20"]', element)) { return false } if ( element.parentElement.textContent.includes( "\u6700\u540E\u56DE\u590D\u4E8E" ) ) { return false } const meta = href === title2 ? { type: "post" } : { type: "post", title: title2 } element.utags = { key, meta } markElementWhetherVisited(key, element) return true } const title = element.textContent.trim() if (!title) { return false } if ( title === "New" || title === "\u7F6E\u9876" || /^\d+$/.test(title) ) { return false } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "#hd", ".comiis_pgs", "#scrolltop", "#fd_page_bottom", "#visitedforums", "#pt", ".tps", ".pgbtn", ".pgs", "#f_pst", 'a[href*="member.php?mod=logging"]', 'a[href*="member.php?mod=register"]', 'a[href*="login/oauth/"]', 'a[href*="mod=spacecp&ac=usergroup"]', 'a[href*="home.php?mod=spacecp"]', "#gadmin_menu", "#guser_menu", "#gupgrade_menu", "#gmy_menu", ".showmenu", "ul.tb.cl", ".comiis_irbox_tit", "#thread_types", "#filter_special_menu", 'a[title="RSS"]', ".fa_fav", ".p_pop", ".comiis_topinfo", ".bm .bm_h .kmfz", "td.num a", "td.plc .pi", "td.plc .po.hin", "td.pls .tns", "ul.comiis_o", 'a[onclick*="showMenu"]', 'a[onclick*="showWindow"]', ".toplist_7ree", ], addExtraMatchedNodes(matchedNodesSet) { let key = getUserProfileUrl(location.href) if (key) { const element = $(".user-profile-names .username") || $( ".user-profile-names .user-profile-names__primary,.user-profile-names .user-profile-names__secondary" ) if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getPostUrl(location.href) if (key) { addVisited(key) const element = $("#thread_subject") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => tampermonkey_net_cn_default, getCanonicalUrl: getCanonicalUrl2, } })() var flarum_default = ':not(#a):not(#b):not(#c) *+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) *+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) a.DiscussionListItem-main+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) a.DiscussionListItem-author+.utags_ul_0{object-position:0% 0%;--utags-notag-captain-tag-top: -22px}:not(#a):not(#b):not(#c) a.DiscussionListItem-author+.utags_ul_1{object-position:0% 0%;position:absolute;top:-9999px;margin-top:-18px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .DiscussionList--searchResults a.DiscussionListItem-main+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -18px}:not(#a):not(#b):not(#c) .DiscussionList--searchResults a.DiscussionListItem-main+.utags_ul_1{object-position:0% 200%;position:absolute;top:-9999px;margin-top:-14px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .TagTiles a.TagTile-info+.utags_ul_0{object-position:0% 0%}:not(#a):not(#b):not(#c) .TagTiles a.TagTile-info+.utags_ul_1{object-position:0% 0%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .TagTiles a.TagTile-lastPostedDiscussion+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) h1.Hero-title[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) h1.Hero-title[data-utags_fit_content="1"] *:not(svg){width:fit-content !important}:not(#a):not(#b):not(#c) h1.Hero-title+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) h1.Hero-title+.utags_ul_1{object-position:200% 50%;position:absolute;top:-9999px;margin-top:0px !important;margin-left:0px !important}:not(#a):not(#b):not(#c) .PostStream .PostStream-item[data-index="0"]{display:block !important}:not(#a):not(#b):not(#c) .UserBio .UserBio-content p{position:relative}' var flarum_default2 = (() => { const prefix3 = location.origin + "/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^u\/[\w-]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w-]+).*/, "$1") } } else if (/^u\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(u\/[\w-]+).*/, "$1") } } return void 0 } function getPostUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^d\/\d+(?:-[^/?]+)?(?:\/\d+)?([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(d\/\d+).*/, "$1") } } else if (/^d\/\d+(?:-[^/?]+)?/.test(href2)) { return prefix3 + href2.replace(/^(d\/\d+).*/, "$1") } } return void 0 } function getTagUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^t\/[\w-]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(t\/[\w-]+).*/, "$1") } } else if (/^t\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(t\/[\w-]+).*/, "$1") } } return void 0 } return { matches: /discuss\.flarum\.org|discuss\.flarum\.org\.cn|www\.nodeloc\.com|freesmth\.net|freesmth\.uk|veryfb\.com|kater\.me|bbs\.viva-la-vita\.org/, preProcess() { setVisitedAvailable(true) }, listNodesSelectors: [ "ul.DiscussionList-discussions li", ".hotDiscussion-content ul li", ".PostStream .PostStream-item", ], conditionNodesSelectors: [ "ul.DiscussionList-discussions li a", ".hotDiscussion-content ul li a", ".PostStream .PostStream-item .PostUser-name a", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } let key = getUserProfileUrl(href, true) if (key) { const titleElement = $(".GroupList-UserList-user .username", element) const title = (titleElement || element).textContent.trim() const meta = { type: "user", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" if (titleElement) { element.dataset.utags_position_selector = ".GroupList-UserList-user .username" } else if (element.closest(".PostUser .PostUser-name")) { element.dataset.utags_position_selector = ".PostUser" } return true } key = getPostUrl(href, true) if (key) { const titleElement = $(".DiscussionListItem-title", element) || $(".TagTile-lastPostedDiscussion-title", element) const title = (titleElement || element).textContent.trim() if (!title) { return false } const meta = { type: "post", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" markElementWhetherVisited(key, element) if (titleElement) { element.dataset.utags_position_selector = hasClass( element, "TagTile-lastPostedDiscussion" ) ? "time" : ".item-terminalPost" } return true } key = getTagUrl(href) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "tag", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "header.App-header", ".sideNav", ".PostMention", ".Post-mentionedBy", ".Post-mentionedBy-preview", ".PostMention-preview", ".Dropdown-menu", ".Button", ], addExtraMatchedNodes(matchedNodesSet) { var _a const isDarkMode = ((_a = $('meta[name="color-scheme"]')) == null ? void 0 : _a.content) === "dark" doc.documentElement.dataset.utags_darkmode = isDarkMode ? "1" : "0" let key = getPostUrl(location.href) if (key) { addVisited(key) const element = $(".item-title h1") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } element.dataset.utags_node_type = "link" matchedNodesSet.add(element) markElementWhetherVisited(key, element) } } } key = getTagUrl(location.href) if (key) { const element = $("h1.Hero-title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "tag" } element.utags = { key, meta } element.dataset.utags_node_type = "link" matchedNodesSet.add(element) } } } }, getStyle: () => flarum_default, } })() var nodeseek_com_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) ul.post-list li.post-list-item{--utags-list-node-display: flex}:not(#a):not(#b):not(#c) ul.post-list li.post-list-item a.post-category+.utags_ul_0{object-position:-100% 50%}:not(#a):not(#b):not(#c) ul.post-list li.post-list-item a.post-category+.utags_ul_1{object-position:-100% 50%;position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .nsk-post-wrapper .author-info ul.utags_ul_1{vertical-align:middle !important}:not(#a):not(#b):not(#c) .nsk-post-wrapper .author-info ul.utags_ul_1 a.utags_text_tag{height:15px !important}:not(#a):not(#b):not(#c) .hover-user-card{z-index:100}" var nodeseek_com_default2 = (() => { const prefix3 = location.origin + "/" function getUserProfileUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^space\/\d+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(space\/\d+).*/, "$1") } } else if (/^space\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(space\/\d+).*/, "$1") } } return void 0 } function getPostUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^post-\d+-\d+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(post-\d+)-.*/, "$1") + "-1" } } else if (/^post-\d+-\d+/.test(href2)) { return prefix3 + href2.replace(/^(post-\d+)-.*/, "$1") + "-1" } } return void 0 } function getCategoryUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (exact) { if (/^categories\/[\w-]+([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(categories\/[\w-]+).*/, "$1") } } else if (/^categories\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(categories\/[\w-]+).*/, "$1") } } return void 0 } return { matches: /www\.nodeseek\.com/, preProcess() { setVisitedAvailable(true) }, listNodesSelectors: [ "ul.post-list li.post-list-item", "ul.comments li.content-item", ], conditionNodesSelectors: [ "ul.post-list li.post-list-item .post-title a", "ul.post-list li.post-list-item .info-author a", "ul.post-list li.post-list-item a.post-category", "ul.comments li.content-item a.author-name", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } let key = getUserProfileUrl(href, true) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "user", title } element.utags = { key, meta } return true } key = getPostUrl(href, true) if (key) { const title = element.textContent.trim() if (!title || /^#\d+$/.test(title)) { return false } const meta = { type: "post", title } element.utags = { key, meta } markElementWhetherVisited(key, element) return true } key = getCategoryUrl(href) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "category", title } element.utags = { key, meta } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "header", '[aria-label="pagination"]', 'a[href="/signIn.html"]', 'a[href="/register.html"]', 'a[href^="/notification"]', ".info-last-comment-time", ".floor-link", ".avatar-wrapper", ".select-item", ".card-item", ".nsk-new-member-board", ".hover-user-card .user-stat", ".btn", ], validMediaSelectors: ["svg.iconpark-icon"], addExtraMatchedNodes(matchedNodesSet) { const isDarkMode = hasClass(doc.body, "dark-layout") doc.documentElement.dataset.utags_darkmode = isDarkMode ? "1" : "0" let key = getUserProfileUrl(location.href) if (key) { const element = $("h1.username") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getPostUrl(location.href) if (key) { addVisited(key) } }, getStyle: () => nodeseek_com_default, } })() var inoreader_com_default = ':not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .article_tile_footer_feed_title a+.utags_ul_1{position:absolute;top:-9999px;margin-top:-4px !important}:not(#a):not(#b):not(#c) .article_tile[data-utags_list_node^=","] .article_tile_content_wraper{position:unset}:not(#a):not(#b):not(#c) .ar .column_view_title a[data-utags_fit_content="1"],:not(#a):not(#b):not(#c) .article_tile a.article_title_link[data-utags_fit_content="1"],:not(#a):not(#b):not(#c) .article_magazine a.article_magazine_title_link[data-utags_fit_content="1"],:not(#a):not(#b):not(#c) .ar.article_card .article-details a.article_title_link[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .article_full_contents div.article_title+.utags_ul_0{object-position:0% -100%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) .article_full_contents div.article_title+.utags_ul_1{object-position:0% -100%;position:absolute;top:-9999px;margin-top:0px !important}:not(#a):not(#b):not(#c) #search_content a.featured_category+.utags_ul_1{position:absolute;top:-9999px;z-index:100;margin-top:2px !important}:not(#a):not(#b):not(#c) #search_content a.search_feed_article+.utags_ul_1{position:absolute;top:-9999px;z-index:100;margin-top:2px !important}' var inoreader_com_default2 = (() => { const prefix3 = location.origin + "/" function getArticleUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length).toLowerCase() if (/^article\/\w+(-[^?#]*)?([?#].*)?$/.test(href2)) { return prefix3 + href2.replace(/^(article\/\w+)-.*/, "$1") } } return void 0 } return { matches: /\w+\.inoreader\.com/, listNodesSelectors: [".ar"], conditionNodesSelectors: [ ".article_tile .article_tile_footer_feed_title a", ".article_tile a.article_title_link", ".article_magazine .article_magazine_feed_title a", ".article_magazine a.article_magazine_title_link", ".ar .column_view_title a", ".ar .article_title_wrapper a", ".ar.article_card .article_sub_title a", ".ar.article_card a.article_title_link", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } if (element.closest("#search_content .featured_category")) { element.dataset.utags_position_selector = "span" } const key = getArticleUrl(href) if (key) { const title = element.textContent.trim() if (!title) { return false } const meta = { type: "article", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" if (element.closest(".search_feed_article")) { element.dataset.utags_position_selector = "h6" } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "#side-nav", 'a[href^="/preferences"]', 'a[href^="/upgrade"]', 'a[href^="/login"]', 'a[href^="/signup"]', 'a[href^="/sign_up"]', 'a[href^="/forgot-password"]', "#preference-section-content", "#preference-section-settings", ".inno_tabs_tab", ".profile_checklist", ".gadget_overview_feed_title", ".header_name", ], addExtraMatchedNodes(matchedNodesSet) { const key = getArticleUrl(location.href) if (key) { const element = $(".article_full_contents div.article_title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "article" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, postProcess() { const isDarkMode = hasClass(doc.body, "theme_dark") doc.documentElement.dataset.utags_darkmode = isDarkMode ? "1" : "0" }, getStyle: () => inoreader_com_default, } })() var zhipin_com_default = ':not(#a):not(#b):not(#c) *+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) *+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .sub-li a.job-info+.utags_ul_1{position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .sub-li .sub-li-bottom a+.utags_ul_1{position:absolute;top:-9999px;margin-top:-2px !important}:not(#a):not(#b):not(#c) .hot-company-wrapper a.company-info-top+.utags_ul_1{position:absolute;top:-9999px;margin-top:-16px !important;width:inherit}:not(#a):not(#b):not(#c) .hot-company-wrapper .company-job-item a.job-info+.utags_ul_1{position:absolute;top:-9999px;margin-top:0px !important;width:inherit}:not(#a):not(#b):not(#c) .job-recommend-result .job-info .job-title a.job-name[data-utags_fit_content="1"]{display:inline-block !important;max-width:fit-content !important}:not(#a):not(#b):not(#c) .job-recommend-result .job-info .job-title a.job-name+.utags_ul_1{position:absolute;top:-9999px;margin-top:-2px !important}:not(#a):not(#b):not(#c) .job-recommend-result .job-card-footer a.boss-info+.utags_ul_1{position:absolute;top:-9999px;margin-top:-2px !important}:not(#a):not(#b):not(#c) .search-job-result .job-card-body a.job-card-left+.utags_ul_1{position:absolute;top:-9999px;margin-top:34px !important}:not(#a):not(#b):not(#c) .search-job-result .job-card-body .job-card-right .company-name{max-width:290px;height:unset}:not(#a):not(#b):not(#c) .company-search a.company-info h4[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .company-search a.company-info+.utags_ul_1{position:absolute;top:-9999px;margin-top:34px !important;width:194px}:not(#a):not(#b):not(#c) .company-search a.about-info+.utags_ul_1{position:absolute;top:-9999px;margin-top:-14px !important;width:214px}:not(#a):not(#b):not(#c) .job-banner .info-primary .name[data-utags_fit_content="1"],:not(#a):not(#b):not(#c) .smallbanner .company-info .name[data-utags_fit_content="1"]{display:inline-block !important;width:fit-content !important}:not(#a):not(#b):not(#c) .job-sider .sider-company .company-info a+.utags_ul_1{position:absolute;top:-9999px;margin-top:-2px !important;width:194px}:not(#a):not(#b):not(#c) .job-sider .sider-company [ka=job-detail-brandindustry][data-utags_fit_content="1"]{display:inline-flex !important;max-width:fit-content !important}:not(#a):not(#b):not(#c) .job-sider ul.similar-job-list li>a+.utags_ul_1{position:absolute;top:-9999px;margin-top:0px !important;width:260px}:not(#a):not(#b):not(#c) .job-sider ul.similar-job-list li>a .similar-job-attr{flex-wrap:wrap}:not(#a):not(#b):not(#c) .job-sider ul.similar-job-list li>a .similar-job-attr span.similar-job-company[data-url]+.utags_ul_1{width:100%;order:1}:not(#a):not(#b):not(#c) .job-detail .more-job-section ul.look-job-list{display:flex;flex-wrap:wrap}:not(#a):not(#b):not(#c) .job-detail .more-job-section ul.look-job-list li a{height:unset}:not(#a):not(#b):not(#c) .job-detail .more-job-section ul.look-job-list li a+.utags_ul_1{position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .job-detail .more-job-section ul.look-job-list li .info-company{flex-wrap:wrap}:not(#a):not(#b):not(#c) .job-detail .more-job-section ul.look-job-list li .info-company div[data-url]+.utags_ul_1{width:100%;order:1}:not(#a):not(#b):not(#c) .company-new .company-hotjob a+.utags_ul_1{position:absolute;top:-9999px}:not(#a):not(#b):not(#c) .page-company-position ul.position-job-list .job-title{height:unset;flex-wrap:wrap}:not(#a):not(#b):not(#c) .page-company-position ul.position-job-list .job-title .job-name[data-utags_fit_content="1"]{display:inline-flex !important;max-width:fit-content !important}:not(#a):not(#b):not(#c) .page-company-position ul.position-job-list .job-title .job-name+.utags_ul_1{width:100%;order:1}:not(#a):not(#b):not(#c) .page-company-position ul.similar-job-list{display:flex;flex-wrap:wrap}:not(#a):not(#b):not(#c) .page-company-position ul.similar-job-list .company-info{flex-wrap:wrap}:not(#a):not(#b):not(#c) .page-company-position ul.similar-job-list .company-info a.company-logo+.utags_ul_1{width:100%;order:1}:not(#a):not(#b):not(#c) .job-detail-card{z-index:91}:not(#a):not(#b):not(#c) ul li .sub-li{position:relative}' var zhipin_com_default2 = (() => { const prefix3 = "https://www.zhipin.com/" function getCanonicalUrl2(url) { if (url.includes(prefix3)) { return url.replace(/[?#].*/, "") } return url } function getCompanyUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^gongsi\/[\w-~]+\.html/.test(href2)) { return prefix3 + href2.replace(/^(gongsi\/[\w-~]+\.html).*/, "$1") } } return void 0 } function getJobDetailUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^job_detail\/[\w-~]+\.html/.test(href2)) { return prefix3 + href2.replace(/^(job_detail\/[\w-~]+\.html).*/, "$1") } } return void 0 } return { matches: /www\.zhipin\.com/, listNodesSelectors: [ ".common-tab-box ul li", ".hot-company-wrapper ul li", ".hot-company-wrapper ul li .company-job-list li", ".job-recommend-result .job-card-wrap", ".search-job-result .job-card-wrapper", ".history-job-list li", ".company-search ul li", ".company-hotjob ul li", ".page-company-position ul.position-job-list li", "ul.similar-job-list li", "ul.look-job-list li", ], conditionNodesSelectors: [ ".common-tab-box ul li .sub-li a.job-info", ".common-tab-box ul li .sub-li-bottom a.user-info", ".hot-company-wrapper ul li .company-info-top", ".hot-company-wrapper ul li .company-job-list li a.job-info", ".job-recommend-result .job-card-wrap .job-info .job-title a.job-name", ".job-recommend-result .job-card-wrap .job-card-footer .boss-info", ".search-job-result .job-card-wrapper a.job-card-left", ".search-job-result .job-card-wrapper .job-card-right .company-name a", ".history-job-list li a", ".company-search ul li a.company-info", ".company-hotjob ul li > a", ".page-company-position ul.position-job-list li .job-title .job-name", "ul.similar-job-list li a.job-info", "ul.similar-job-list li > a", "ul.similar-job-list li .company-info a.company-logo", "ul.similar-job-list li .similar-job-attr span.similar-job-company[data-url]", "ul.look-job-list li > a", "ul.look-job-list li .info-company div[data-url]", ], matchedNodesSelectors: [ ...default_default2.matchedNodesSelectors, ".info-company div[data-url]", ".similar-job-list .similar-job-company[data-url]", ], preProcess() { setVisitedAvailable(true) for (const element of $$( ".info-company div[data-url],.similar-job-list .similar-job-company[data-url]" )) { if (element.dataset.url) { element.href = location.origin + element.dataset.url.replace("/job/", "/") element.dataset.utags_node_type = "link" } } }, validate(element) { const href = element.href if (!href) { return false } if (!href.startsWith(prefix3)) { return true } if (element.closest(".common-tab-box")) { element.dataset.utags_ul_type = "ol" } let key = getCompanyUrl(href) if (key) { const titleElement = $( ".name,.company-info-top h3,.card-desc .title,h4", element ) const title = getTrimmedTitle(titleElement || element) if (!title) { return false } const meta = { type: "company", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" if (element.closest(".sub-li-bottom a.user-info")) { element.dataset.utags_position_selector = "a > p" } else if (element.closest(".company-search a.company-info")) { element.dataset.utags_position_selector = "h4" } return true } key = getJobDetailUrl(href) if (key) { const titleElement = $( ".job-title .job-name,.job-info-top,.info-primary .name b,.info-job,.similar-job-info,.sub-li-top,a.about-info u.h", element ) let title = getTrimmedTitle(titleElement || element) if (!title) { return false } title = title.replace(" \u5728\u7EBF ", "") const meta = { type: "job-detail", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" element.dataset.utags_position_selector = ".job-title .job-name,.info-primary .name b,.info-job,.similar-job-info,.sub-li-top,a.about-info u.h" markElementWhetherVisited(key, element) return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, "#header", ".look-all", ".more-job-btn", ".look-more", ".all-jobs-hot", ".view-more", ".link-more", "h3:not(.company-name):not(.name)", ".compare-btn", ".job_pk", ".search-hot", ".filter-box", ".sign-form", ".login-card-wrapper", ".login-entry-page", ".btn", ".footer-icon", ".company-tab", ".school-type-box", ".search-condition-wrapper", ".filter-select-box", 'a[href*="/web/geek/job"]', ".page", ], addExtraMatchedNodes(matchedNodesSet) { let key = getCompanyUrl(location.href) if (key) { const element = $(".company-banner h1") if (element) { const title = element.childNodes[0].textContent.trim() if (title) { const meta = { title, type: "company" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getJobDetailUrl(location.href) if (key) { addVisited(key) let element = $(".job-banner .info-primary .name") if (element) { const title = getTrimmedTitle(element) if (title) { const meta = { title, type: "job-detail" } element.utags = { key, meta } matchedNodesSet.add(element) markElementWhetherVisited(key, element) } } element = $(".smallbanner .company-info .name") if (element) { const title = getTrimmedTitle(element) if (title) { const meta = { title, type: "job-detail" } element.utags = { key, meta } matchedNodesSet.add(element) markElementWhetherVisited(key, element) } } } }, postProcess() { const isDarkMode = hasClass(doc.body, "theme_dark") doc.documentElement.dataset.utags_darkmode = isDarkMode ? "1" : "0" }, getStyle: () => zhipin_com_default, getCanonicalUrl: getCanonicalUrl2, } })() var pornhub_com_default = ':not(#a):not(#b):not(#c) .usernameWrap .utags_ul_0 .utags_captain_tag{left:-20px}:not(#a):not(#b):not(#c) .usernameWrap .utags_ul_1::before{content:"";display:block}:not(#a):not(#b):not(#c) .vidTitleWrapper .title .utags_ul_0{display:block !important;height:0;position:absolute;top:0}:not(#a):not(#b):not(#c) .vidTitleWrapper .title .utags_ul_0 .utags_captain_tag{background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) .vidTitleWrapper .title .utags_ul_1{display:block !important;height:0;position:absolute;bottom:0}:not(#a):not(#b):not(#c) ul.videos .thumbnail-info-wrapper{position:relative}:not(#a):not(#b):not(#c) ul.videos .thumbnail-info-wrapper .title .utags_ul_0{display:block !important;height:0;position:absolute;top:0}:not(#a):not(#b):not(#c) ul.videos .thumbnail-info-wrapper .title .utags_ul_0 .utags_captain_tag{background-color:hsla(0,0%,100%,.8666666667) !important}:not(#a):not(#b):not(#c) ul.videos .thumbnail-info-wrapper .title .utags_ul_1{display:block !important;height:0;position:absolute;bottom:0}' var pornhub_com_default2 = (() => { const prefix3 = "https://www.pornhub.com/" function getUserProfileUrl(href, exact = false) { if (href.includes("pornhub.com")) { const index = href.indexOf("pornhub.com") + 12 const href2 = href.slice(index) if (exact) { if (/^(model|users)\/[\w-]+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/(^(model|users)\/[\w-]+).*/, "$1") } } else if (/^(model|users)\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(^(model|users)\/[\w-]+).*/, "$1") } } return void 0 } function getChannelUrl(href, exact = false) { if (href.includes("pornhub.com")) { const index = href.indexOf("pornhub.com") + 12 const href2 = href.slice(index) if (exact) { if (/^channels\/[\w-]+(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/(^channels\/[\w-]+).*/, "$1") } } else if (/^channels\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/(^channels\/[\w-]+).*/, "$1") } } return void 0 } function getVideoUrl(href) { if (href.includes("pornhub.com")) { const index = href.indexOf("pornhub.com") + 12 const href2 = href.slice(index) if (/^view_video.php\?viewkey=\w+/.test(href2)) { return ( prefix3 + href2.replace(/(view_video.php\?viewkey=\w+).*/, "$1") ) } } return void 0 } return { matches: /pornhub\.com/, validate(element) { const hrefAttr = getAttribute(element, "href") if (!hrefAttr || hrefAttr === "null" || hrefAttr === "#") { return false } const href = element.href let key = getChannelUrl(href, true) if (key) { const meta = { type: "channel" } element.utags = { key, meta } return true } key = getUserProfileUrl(href, true) if (key) { const meta = { type: "user" } element.utags = { key, meta } return true } key = getVideoUrl(href) if (key) { let title const titleElement = $("#video-title", element) if (titleElement) { title = titleElement.textContent } const meta = title ? { title, type: "video" } : { type: "video" } element.utags = { key, meta } return true } return true }, excludeSelectors: [ ...default_default2.excludeSelectors, ".networkBarWrapper", "#headerWrapper", "#headerMenuContainer", "#mainMenuProfile", "#mainMenuAmateurModelProfile", "#countryRedirectMessage", "aside#leftMenu", ".profileSubNav", ".subFilterList", ".greyButton", ".orangeButton", ], addExtraMatchedNodes(matchedNodesSet) { let key = getUserProfileUrl(location.href) if (key) { const element = $(".name h1") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getChannelUrl(location.href) if (key) { const element = $(".title h1") if (element && !$("a", element)) { const title = element.textContent.trim() if (title) { const meta = { title, type: "channel" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getVideoUrl(location.href) if (key) { const element = $("h1.title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "video" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => pornhub_com_default, } })() var e_hentai_org_default = ":not(#a):not(#b):not(#c) div.gt a+.utags_ul_0,:not(#a):not(#b):not(#c) div.gtl a+.utags_ul_0,:not(#a):not(#b):not(#c) div.gtw a+.utags_ul_0,:not(#a):not(#b):not(#c) div.gl4e.glname .glink+.utags_ul_0,:not(#a):not(#b):not(#c) .gltm .glname a+.utags_ul_0,:not(#a):not(#b):not(#c) .gltc .glname a+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-3);--utags-notag-ul-height: var(--utags-notag-ul-height-3);--utags-notag-ul-position: var(--utags-notag-ul-position-3);--utags-notag-ul-top: var(--utags-notag-ul-top-3);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-3);--utags-notag-captain-tag-left: 24px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap );z-index:200}:not(#a):not(#b):not(#c) div.gl1t a+.utags_ul_0{--utags-notag-ul-disply: var(--utags-notag-ul-disply-4);--utags-notag-ul-height: var(--utags-notag-ul-height-4);--utags-notag-ul-position: var(--utags-notag-ul-position-4);--utags-notag-ul-top: var(--utags-notag-ul-top-4);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-4);--utags-notag-captain-tag-left: 24px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}" var e_hentai_org_default2 = (() => { const prefix3 = "https://e-hentai.org/" const prefix22 = "https://exhentai.org/" function getPostUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(21) if (/^g\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(g\/\w+\/\w+\/).*/, "$1") } } if (url.startsWith(prefix22)) { const href2 = url.slice(21) if (/^g\/\w+/.test(href2)) { return prefix22 + href2.replace(/^(g\/\w+\/\w+\/).*/, "$1") } } return void 0 } function isImageViewUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(21) return /^s\/\w+/.test(href2) } if (url.startsWith(prefix22)) { const href2 = url.slice(21) return /^s\/\w+/.test(href2) } return false } return { matches: /e-hentai\.org|exhentai\.org/, validate(element) { if (element.tagName !== "A") { return true } const href = element.href if (href && (href.startsWith(prefix3) || href.startsWith(prefix22))) { const key = getPostUrl(href) if (key) { const titleElement = $(".glink", element) let title if (titleElement) { title = titleElement.textContent } const meta = { type: "post" } if (title) { meta.title = title } element.utags = { key, meta } return true } if (isImageViewUrl(href)) { return false } } return true }, map(element) { const titleElement = $(".gl4e.glname .glink", element) if (titleElement) { titleElement.utags = element.utags titleElement.dataset.utags = titleElement.dataset.utags || "" titleElement.dataset.utags_node_type = "link" return titleElement } return void 0 }, excludeSelectors: [ ...default_default2.excludeSelectors, "#nb", ".searchnav", ".gtb", 'a[href*="report=select"]', 'a[href*="act=expunge"]', ], addExtraMatchedNodes(matchedNodesSet) { const key = getPostUrl(location.href) if (key) { const element = getFirstHeadElement() if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => e_hentai_org_default, } })() var panda_chaika_moe_default = ":not(#a):not(#b):not(#c) h5+.utags_ul{display:block !important;margin-top:-4px !important;margin-bottom:6px !important}" var panda_chaika_moe_default2 = (() => { const prefix3 = "https://panda.chaika.moe/" function getPostUrl(url, exact = false) { if (url.startsWith(prefix3)) { const href2 = url.slice(25) if (exact) { if (/^archive\/\d+\/(\?.*)?$/.test(href2)) { return prefix3 + href2.replace(/^(archive\/\d+\/).*/, "$1") } } else if (/^archive\/\d+\//.test(href2)) { return prefix3 + href2.replace(/^(archive\/\d+\/).*/, "$1") } } return void 0 } return { matches: /panda\.chaika\.moe/, excludeSelectors: [ ...default_default2.excludeSelectors, ".navbar", "th", ".pagination", ".btn", ".caption", ], addExtraMatchedNodes(matchedNodesSet) { const key = getPostUrl(location.href) if (key) { const element = $("h5") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } for (const element of $$(".gallery a.cover")) { const key2 = element.href const titleElement = $(".cover-title", element) if (titleElement) { const title = titleElement.textContent const meta = { title, type: "post" } titleElement.utags = { key: key2, meta } titleElement.dataset.utags_node_type = "link" matchedNodesSet.add(titleElement) } } for (const element of $$('.td-extended > a[href^="/archive/"]')) { const key2 = element.href const titleElement = $("h5", element.parentElement.parentElement) if (titleElement) { const title = titleElement.textContent const meta = { title, type: "post" } titleElement.utags = { key: key2, meta } titleElement.dataset.utags_node_type = "link" matchedNodesSet.add(titleElement) } } }, getStyle: () => panda_chaika_moe_default, } })() var dmm_co_jp_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{background-color:var(--utags-captain-tag-background-color) !important;border-radius:3px !important;--utags-emoji-tag-background-color: #fff0}:not(#a):not(#b):not(#c) .mainList__item a+.utags_ul_0{object-position:0% 100%;--utags-notag-captain-tag-top: -90px;--utags-notag-captain-tag-left: 4px}:not(#a):not(#b):not(#c) .mainList__item a+.utags_ul_1{margin-top:6px !important;width:100%}:not(#a):not(#b):not(#c) .pickup .fn-responsiveImg a+.utags_ul_0{object-position:0% 100%;--utags-notag-captain-tag-top: -70px;--utags-notag-captain-tag-left: 4px}:not(#a):not(#b):not(#c) .pickup .fn-responsiveImg a+.utags_ul_1{margin-top:6px !important;width:100%}:not(#a):not(#b):not(#c) .productList .tileListTtl__txt{height:unset}:not(#a):not(#b):not(#c) .productList .tileListTtl__txt--author{white-space:normal}:not(#a):not(#b):not(#c) #l-areaRecommendProduct a+.utags_ul_0{object-position:0% 100%;--utags-notag-captain-tag-top: -80px;--utags-notag-captain-tag-left: 4px}:not(#a):not(#b):not(#c) #l-areaRecommendProduct a+.utags_ul_1{margin-top:6px !important;width:100%}" var dmm_co_jp_default2 = (() => { const prefix3 = "https://www.dmm.co.jp/" function getCanonicalUrl2(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.includes("/=/")) { return prefix3 + href2.replace(/\?.*/, "") } } return url } function getProductUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.includes("/detail/=/cid=")) { return prefix3 + href2.replace(/\?.*/, "") } } return void 0 } function getMakerUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (href2.includes("/list/=/article=maker/id=")) { return prefix3 + href2.replace(/\?.*/, "") } } return void 0 } return { matches: /dmm\.co\.jp/, validate(element) { const href = element.href if (!href.startsWith(prefix3)) { return true } if (href.includes("/=/")) { const key = getProductUrl(href) if (key) { const titleElement = $( ".mainListLinkWork__txt,.responsive-name", element ) const title = titleElement ? getTrimmedTitle(titleElement) : getTrimmedTitle(element) if (title) { const meta = { title, type: "product" } element.utags = { key, meta } } } return true } return false }, excludeSelectors: [ ...default_default2.excludeSelectors, "header", ".localNav-list", ".m-leftNavigation", ".l-areaSideNavColumn", ".top-leftcolumn", ".top-rightcolumn", ".d-btn-xhi-st", ".headingTitle__txt--more", ".recommendCapt__txt", ".circleFanButton__content", ".displayFormat", ".pageNationList", ".nav-text-container", ".sub-nav-link", ".m-listHeader", ".dcd-review__rating_map", ".dcd-review_boxpagenation", ".sampleButton", ".right_navi_link", ], validMediaSelectors: [ ".mainList", ".pickup .fn-responsiveImg", "#l-areaRecommendProduct", ], addExtraMatchedNodes(matchedNodesSet) { let key = getProductUrl(location.href) if (key) { const element = $("h1.productTitle__txt") if (element) { const title = element.textContent.trim() if (title) { const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getMakerUrl(location.href) if (key) { const element = $(".circleProfile__name span") if (element) { const title = element.textContent.trim() if (title) { const meta = { title } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getCanonicalUrl: getCanonicalUrl2, getStyle: () => dmm_co_jp_default, } })() var kemono_su_default = ":not(#a):not(#b):not(#c) a.user-header__avatar+.utags_ul_0,:not(#a):not(#b):not(#c) a.user-card+.utags_ul_0,:not(#a):not(#b):not(#c) .post-card a+.utags_ul_0{object-position:0% 100%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: -4px;--utags-notag-captain-tag-left: 2px;--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap );transition:top ease .1s,left ease .1s}:not(#a):not(#b):not(#c) a.user-header__avatar+.utags_ul_1,:not(#a):not(#b):not(#c) a.user-card+.utags_ul_1,:not(#a):not(#b):not(#c) .post-card a+.utags_ul_1{object-position:0% 100%;position:absolute;top:-9999px;z-index:100;margin-top:-6px !important;margin-left:4px !important;transition:top ease .1s,left ease .1s}:not(#a):not(#b):not(#c) a.user-header__avatar+.utags_ul_1 .utags_text_tag,:not(#a):not(#b):not(#c) a.user-card+.utags_ul_1 .utags_text_tag,:not(#a):not(#b):not(#c) .post-card a+.utags_ul_1 .utags_text_tag{--utags-text-tag-background-color: yellow}" var kemono_su_default2 = (() => { const prefix3 = location.origin + "/" function getPostUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^\w+\/user\/\w+\/post\/\w+/.test(href2)) { return prefix3 + href2.replace(/^(\w+\/user\/\w+\/post\/\w+).*/, "$1") } } return void 0 } return { matches: /kemono\.su|coomer\.su|nekohouse\.su/, validate(element) { const hrefAttr = getAttribute(element, "href") if (hrefAttr.startsWith("#")) { return false } const href = element.href if (!href.startsWith(prefix3)) { return true } if ( hasClass(element, "user-card") || hasClass(element, "user-header__avatar") || element.closest(".post-card") ) { element.dataset.utags = element.dataset.utags || "" } return true }, validMediaSelectors: [ ".user-header .user-header__avatar", ".user-header .user-header__profile", ".user-card", ".post-card__image", ".post-card", ], excludeSelectors: [ ...default_default2.excludeSelectors, ".global-sidebar", ".paginator", ".post__nav-links", ".scrape__nav-links", ".tabs", ".user-header__actions", ".posts-board__sidebar", "#add-new-link", 'a[href^="/authentication/"]', ], addExtraMatchedNodes(matchedNodesSet) { const key = getPostUrl(location.href) if (key) { const element = $("h1.post__title,h1.scrape__title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "post" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => kemono_su_default, } })() var rule34video_com_default = ":not(#a):not(#b):not(#c) a+.utags_ul_0{object-position:200% 50%;--utags-notag-ul-disply: var(--utags-notag-ul-disply-5);--utags-notag-ul-height: var(--utags-notag-ul-height-5);--utags-notag-ul-position: var(--utags-notag-ul-position-5);--utags-notag-ul-top: var(--utags-notag-ul-top-5);--utags-notag-captain-tag-top: var(--utags-notag-captain-tag-top-5);--utags-notag-captain-tag-left: var(--utags-notag-captain-tag-left-5);--utags-captain-tag-background-color: var( --utags-captain-tag-background-color-overlap )}:not(#a):not(#b):not(#c) a+.utags_ul_1{object-position:0% 200%}:not(#a):not(#b):not(#c) .thumbs .thumb a+.utags_ul_0{object-position:0% 200%;--utags-notag-captain-tag-top: -2px;--utags-notag-captain-tag-left: -4px}:not(#a):not(#b):not(#c) .list_items .item a.wrap_item+.utags_ul_0,:not(#a):not(#b):not(#c) .aside_wrap a.item+.utags_ul_0{object-position:100% 50%}" var rule34video_com_default2 = (() => { const prefix3 = location.origin + "/" function getModelUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^models\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(models\/[\w-]+).*/, "$1") + "/" } } return void 0 } function getMemberUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^members\/\d+/.test(href2)) { return prefix3 + href2.replace(/^(members\/\d+).*/, "$1") + "/" } } return void 0 } function getCategoryUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^categories\/[\w-]+/.test(href2)) { return prefix3 + href2.replace(/^(categories\/[\w-]+).*/, "$1") + "/" } } return void 0 } function getVideoUrl(url) { if (url.startsWith(prefix3)) { const href2 = url.slice(prefix3.length) if (/^video\/\d+(\/[\w-]+)?/.test(href2)) { return ( prefix3 + href2.replace(/^(video\/\d+(\/[\w-]+)?).*/, "$1") + "/" ) } } return void 0 } return { matches: /rule34video\.com|rule34gen\.com/, listNodesSelectors: [ // ".list-comments .item", ".thumbs .item", ], conditionNodesSelectors: [ // ".list-comments .item .comment-info .inner a", ".thumbs .item a.th", ], validate(element) { const href = element.href if (!href.startsWith(prefix3)) { if ($("header", element.parentElement)) { const key2 = href.replace(/(https?:\/\/[^/]+\/).*/, "$1") const meta = { type: "AD", title: "AD" } element.utags = { key: key2, meta } element.dataset.utags = element.dataset.utags || "" } return true } const key = getVideoUrl(href) if (key) { const titleElement = $(".thumb_title", element) const title = titleElement ? titleElement.textContent.trim() : element.textContent.trim() if (!title) { return false } const meta = { type: "video", title } element.utags = { key, meta } element.dataset.utags = element.dataset.utags || "" return true } element.dataset.utags = element.dataset.utags || "" return true }, excludeSelectors: [ ...default_default2.excludeSelectors, ".header", ".btn_more", ".tabs-menu", ".pagination", ".headline", ".prev", ".next", ".btn", ".all", ".tag_item_suggest", 'a[href*="download"]', ".list-comments .wrap_image", ], addExtraMatchedNodes(matchedNodesSet) { let key = getModelUrl(location.href) if (key) { const element = $(".brand_inform .title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "model" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getMemberUrl(location.href) if (key) { const element = $(".channel_logo .title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "user" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getCategoryUrl(location.href) if (key) { const element = $(".brand_inform .title") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "category" } element.utags = { key, meta } matchedNodesSet.add(element) } } } key = getVideoUrl(location.href) if (key) { const element = $("h1.title_video") if (element) { const title = element.textContent.trim() if (title) { const meta = { title, type: "video" } element.utags = { key, meta } matchedNodesSet.add(element) } } } }, getStyle: () => rule34video_com_default, } })() var sites = [ github_com_default2, v2ex_default2, twitter_com_default2, reddit_com_default2, greasyfork_org_default2, news_ycombinator_com_default, lobste_rs_default, mp_weixin_qq_com_default, instagram_com_default2, threads_net_default2, facebook_com_default2, youtube_com_default2, bilibili_com_default2, tiktok_com_default2, pojie_cn_default2, juejin_cn_default, zhihu_com_default, xiaohongshu_com_default2, weibo_com_default, sspai_com_default2, douyin_com_default2, podcasts_google_com_default2, rebang_today_default2, myanimelist_net_default2, douban_com_default, pixiv_net_default2, discourse_default2, nga_cn_default2, keylol_com_default2, tampermonkey_net_cn_default2, flarum_default2, nodeseek_com_default2, inoreader_com_default2, zhipin_com_default2, pornhub_com_default2, e_hentai_org_default2, panda_chaika_moe_default2, dlsite_com_default2, dmm_co_jp_default2, kemono_su_default2, rule34video_com_default2, ] var getCanonicalUrlFunctionList = [default_default2, ...sites] .map((site) => site.getCanonicalUrl) .filter((v) => typeof v === "function") function matchedSite(hostname2) { for (const s of sites) { if (s.matches.test(hostname2)) { return s } } if (false) { return siteForExtensions(hostname2) } return default_default2 } function joinSelectors(selectors) { return selectors ? selectors.join(",") : void 0 } var hostname = location.hostname var currentSite = matchedSite(hostname) var listNodesSelector = joinSelectors(currentSite.listNodesSelectors) var conditionNodesSelector = joinSelectors( currentSite.conditionNodesSelectors ) var matchedNodesSelector = joinSelectors( currentSite.matchedNodesSelectors || (currentSite.matches ? default_default2.matchedNodesSelectors : void 0) ) var excludeSelector = joinSelectors(currentSite.excludeSelectors) var validMediaSelector = joinSelectors(currentSite.validMediaSelectors) var validateFunction = currentSite.validate || default_default2.validate var mappingFunction = typeof currentSite.map === "function" ? currentSite.map : void 0 function getListNodes() { if (typeof currentSite.preProcess === "function") { currentSite.preProcess() } if (typeof currentSite.getStyle === "function" && !$("#utags_site_style")) { const styleText = currentSite.getStyle() if (styleText) { addElement2("style", { textContent: styleText, id: "utags_site_style", }) } } return listNodesSelector ? $$(listNodesSelector) : [] } function getConditionNodes() { return conditionNodesSelector ? $$(conditionNodesSelector) : [] } function getCanonicalUrl(url) { if (!url) { return void 0 } for (const getCanonicalUrlFunc of getCanonicalUrlFunctionList) { if (getCanonicalUrlFunc) { url = getCanonicalUrlFunc(url) } } return url } var preValidate = (element) => { if (!element) { return false } if (element.tagName === "A") { let href = getAttribute(element, "href") if (!href) { return false } href = href.trim() if (href.length === 0 || href === "#") { return false } const protocol = element.protocol if (protocol !== "http:" && protocol !== "https:") { return false } } if ( element.closest( ".utags_text_tag,.browser_extension_settings_container,a a" ) ) { return false } return true } var isValidUtagsElement = (element) => { if (element.dataset.utags !== void 0) { return true } if (!element.textContent) { return false } if (!element.textContent.trim()) { return false } const media = $( 'img,svg,audio,video,button,.icon,[style*="background-image"]', element ) if (media) { if (!validMediaSelector) { return false } if (!media.closest(validMediaSelector)) { return false } } return true } var isExcludedUtagsElement = (element) => { return excludeSelector ? Boolean(element.closest(excludeSelector)) : false } var addMatchedNodes = (matchedNodesSet) => { if (!matchedNodesSelector) { return } const elements = $$(matchedNodesSelector) if (elements.length === 0) { return } const process2 = (element) => { var _a if (!preValidate(element) || !validateFunction(element)) { delete element.utags return } if (mappingFunction) { const newElement = mappingFunction(element) if (newElement && newElement !== element) { process2(newElement) return } } if (isExcludedUtagsElement(element) || !isValidUtagsElement(element)) { delete element.utags return } const utags = element.utags || {} const key = utags.key || getCanonicalUrl(element.href) if (!key) { return } const title = getTrimmedTitle(element) const meta = {} if (title && !isUrl(title)) { meta.title = title } if ((_a = utags.meta) == null ? void 0 : _a.title) { utags.meta.title = trimTitle(utags.meta.title) } element.utags = { key, meta: utags.meta ? Object.assign(meta, utags.meta) : meta, } matchedNodesSet.add(element) } for (const element of elements) { try { process2(element) } catch (error) { console.error(error) } } } function matchedNodes() { const matchedNodesSet = /* @__PURE__ */ new Set() addMatchedNodes(matchedNodesSet) if (typeof currentSite.addExtraMatchedNodes === "function") { currentSite.addExtraMatchedNodes(matchedNodesSet) } if (typeof currentSite.postProcess === "function") { currentSite.postProcess() } return [...matchedNodesSet] } var config = { run_at: "document_start", matches: ["https://*/*"], all_frames: false, } var emojiTags2 var host2 = location.host var isEnabledByDefault = () => { if (host2.includes("www.bilibili.com")) { return false } return true } var isTagManager = location.href.includes("utags.pipecraft.net/tags/") var groupNumber = 1 var settingsTable2 = { ["enableCurrentSite_".concat(host2)]: { title: i2("settings.enableCurrentSite"), defaultValue: isEnabledByDefault(), }, showHidedItems: { title: i2("settings.showHidedItems"), defaultValue: false, group: ++groupNumber, }, noOpacityEffect: { title: i2("settings.noOpacityEffect"), defaultValue: false, group: groupNumber, }, ["useVisitedFunction_".concat(host2)]: { title: i2("settings.useVisitedFunction"), defaultValue: false, group: ++groupNumber, }, ["displayEffectOfTheVisitedContent_".concat(host2)]: { title: i2("settings.displayEffectOfTheVisitedContent"), type: "select", defaultValue: "2", options: { [i2("settings.displayEffectOfTheVisitedContent.recordingonly")]: "0", [i2("settings.displayEffectOfTheVisitedContent.showtagonly")]: "1", [i2("settings.displayEffectOfTheVisitedContent.changecolor")]: "4", [i2("settings.displayEffectOfTheVisitedContent.translucent")]: "2", [i2("settings.displayEffectOfTheVisitedContent.hide")]: "3", }, group: groupNumber, }, pinnedTagsTitle: { title: i2("settings.pinnedTags"), type: "action", async onclick() { const input = $('textarea[data-key="pinnedTags"]') if (input) { input.scrollIntoView({ block: "start" }) input.selectionStart = input.value.length input.selectionEnd = input.value.length input.focus() } }, group: ++groupNumber, }, pinnedTags: { title: i2("settings.pinnedTags"), defaultValue: i2("settings.pinnedTagsDefaultValue"), placeholder: i2("settings.pinnedTagsPlaceholder"), type: "textarea", group: groupNumber, }, emojiTagsTitle: { title: i2("settings.emojiTags"), type: "action", async onclick() { const input = $('textarea[data-key="emojiTags"]') if (input) { input.scrollIntoView({ block: "start" }) input.selectionStart = input.value.length input.selectionEnd = input.value.length input.focus() } }, group: groupNumber, }, emojiTags: { title: i2("settings.emojiTags"), defaultValue: "\u{1F44D}, \u{1F44E}, \u2764\uFE0F, \u2B50, \u{1F31F}, \u{1F525}, \u{1F4A9}, \u26A0\uFE0F, \u{1F4AF}, \u{1F44F}, \u{1F437}, \u{1F4CC}, \u{1F4CD}, \u{1F3C6}, \u{1F48E}, \u{1F4A1}, \u{1F916}, \u{1F4D4}, \u{1F4D6}, \u{1F4DA}, \u{1F4DC}, \u{1F4D5}, \u{1F4D7}, \u{1F9F0}, \u26D4, \u{1F6AB}, \u{1F534}, \u{1F7E0}, \u{1F7E1}, \u{1F7E2}, \u{1F535}, \u{1F7E3}, \u2757, \u2753, \u2705, \u274C", placeholder: "\u{1F44D}, \u{1F44E}", type: "textarea", group: groupNumber, }, customStyle: { title: i2("settings.customStyle"), defaultValue: false, group: ++groupNumber, }, customStyleValue: { title: "Custom style value", defaultValue: i2("settings.customStyleDefaultValue"), placeholder: i2("settings.customStyleDefaultValue"), type: "textarea", group: groupNumber, }, customStyleTip: { title: i2("settings.customStyleExamples"), type: "tip", tipContent: i2("settings.customStyleExamplesContent"), group: groupNumber, }, ["customStyle_".concat(host2)]: { title: i2("settings.customStyleCurrentSite"), defaultValue: false, group: ++groupNumber, }, ["customStyleValue_".concat(host2)]: { title: "Custom style value", defaultValue: "", placeholder: i2("settings.customStyleDefaultValue"), type: "textarea", group: groupNumber, }, useSimplePrompt: { title: i2("settings.useSimplePrompt"), defaultValue: false, group: ++groupNumber, }, openTagsPage: { title: i2("settings.openTagsPage"), type: "externalLink", url: "https://utags.pipecraft.net/tags/", group: ++groupNumber, }, openDataPage: { title: i2("settings.openDataPage"), type: "externalLink", url: "https://utags.pipecraft.net/data/", group: groupNumber, }, } var addUtagsStyle = () => { const style = addStyle(content_default) style.id = "utags_style" } function updateCustomStyle() { const customStyleValue = getSettingsValue("customStyleValue") || "" if (getSettingsValue("customStyle") && customStyleValue) { if ($("#utags_custom_style")) { $("#utags_custom_style").textContent = customStyleValue } else { addElement2("style", { id: "utags_custom_style", textContent: customStyleValue, }) if ($("#utags_custom_style_2")) { $("#utags_custom_style_2").remove() } } } else if ($("#utags_custom_style")) { $("#utags_custom_style").remove() } const customStyleValue2 = getSettingsValue("customStyleValue_".concat(host2)) || "" if (getSettingsValue("customStyle_".concat(host2)) && customStyleValue2) { if ($("#utags_custom_style_2")) { $("#utags_custom_style_2").textContent = customStyleValue2 } else { addElement2("style", { id: "utags_custom_style_2", textContent: customStyleValue2, }) } } else if ($("#utags_custom_style_2")) { $("#utags_custom_style_2").remove() } } function onSettingsChange2() { if (getSettingsValue("showHidedItems")) { addClass(doc.documentElement, "utags_no_hide") } else { removeClass(doc.documentElement, "utags_no_hide") } if (getSettingsValue("noOpacityEffect")) { addClass(doc.documentElement, "utags_no_opacity_effect") } else { removeClass(doc.documentElement, "utags_no_opacity_effect") } doc.documentElement.dataset.utags_displayEffectOfTheVisitedContent = getSettingsValue("displayEffectOfTheVisitedContent_".concat(host2)) if (getSettingsValue("enableCurrentSite_".concat(host2))) { doc.documentElement.dataset.utags = "".concat(host2) displayTagsThrottled() updateCustomStyle() } else { doc.documentElement.dataset.utags = "off" if ($("#utags_custom_style")) { $("#utags_custom_style").remove() } if ($("#utags_custom_style_2")) { $("#utags_custom_style_2").remove() } if ($("#utags_site_style")) { $("#utags_site_style").remove() } } } var start = 0 if (start) { start = Date.now() } function appendTagsToPage(element, key, tags, meta) { const utagsUl = element.nextSibling if (hasClass(utagsUl, "utags_ul")) { if ( element.dataset.utags === tags.join(",") && key === getAttribute(utagsUl, "data-utags_key") ) { return } utagsUl.remove() } const tagName = element.dataset.utags_ul_type === "ol" ? "ol" : "ul" const ul = createElement(tagName, { class: tags.length === 0 ? "utags_ul utags_ul_0" : "utags_ul utags_ul_1", "data-utags_key": key, }) let li = createElement("li") const a = createElement("button", { type: "button", title: "Add tags", "data-utags_tag": "\u{1F3F7}\uFE0F", "data-utags_key": key, "data-utags_tags": tags.join(", "), "data-utags_meta": meta ? JSON.stringify(meta) : "", class: tags.length === 0 ? "utags_text_tag utags_captain_tag" : "utags_text_tag utags_captain_tag2", }) const svg = '\n' a.innerHTML = createHTML(svg) li.append(a) ul.append(li) for (const tag of tags) { li = createElement("li") const a2 = createTag(tag, { isEmoji: emojiTags2.includes(tag), noLink: isTagManager, enableSelect: isTagManager, }) li.append(a2) ul.append(li) } element.after(ul) element.dataset.utags = tags.join(",") setTimeout(() => { const style = getComputedStyle(element) const zIndex = style.zIndex if (zIndex && zIndex !== "auto") { setStyle(ul, { zIndex }) } }, 200) } function cleanUnusedUtags() { const utagsUlList = $$(".utags_ul,ul[data-utags_key],ol[data-utags_key]") for (const utagsUl of utagsUlList) { const element = utagsUl.previousSibling if (element && getAttribute(element, "data-utags") !== null) { continue } utagsUl.remove() } } async function displayTags() { if (start) { console.error("start of displayTags", Date.now() - start) } emojiTags2 = await getEmojiTags() const listNodes = getListNodes() for (const node of listNodes) { node.dataset.utags_list_node = "" } if (start) { console.error("before matchedNodes", Date.now() - start) } const nodes = matchedNodes() if (start) { console.error("after matchedNodes", Date.now() - start, nodes.length) } await getCachedUrlMap() for (const node of nodes) { const utags = node.utags if (!utags) { continue } const key = utags.key if (!key) { continue } const object = getTags(key) const tags = (object.tags || []).slice() if (node.dataset.utags_visited === "1") { tags.push(TAG_VISITED) } appendTagsToPage(node, key, tags, utags.meta) setTimeout(() => { updateTagPosition(node) }) } if (start) { console.error("after appendTagsToPage", Date.now() - start) } const conditionNodes = getConditionNodes() for (const node of conditionNodes) { if (getAttribute(node, "data-utags") !== null) { node.dataset.utags_condition_node = "" } } for (const node of listNodes) { const conditionNodes2 = $$("[data-utags_condition_node]", node) const tagsArray = [] for (const node2 of conditionNodes2) { if (!node2.dataset.utags) { continue } if (node2.closest("[data-utags_list_node]") !== node) { continue } tagsArray.push(node2.dataset.utags) } if (tagsArray.length === 1) { node.dataset.utags_list_node = "," + tagsArray[0] + "," } else if (tagsArray.length > 1) { node.dataset.utags_list_node = "," + uniq(tagsArray.join(",").split(",")).join(",") + "," } } cleanUnusedUtags() if (start) { console.error("end of displayTags", Date.now() - start) } } var displayTagsThrottled = throttle(displayTags, 500) async function initStorage() { await migration() addTagsValueChangeListener(() => { if (!doc.hidden) { setTimeout(displayTags) } }) } var validNodeNames = { A: true, H1: true, H2: true, H3: true, H4: true, H5: true, H6: true, DIV: true, SPAN: true, P: true, UL: true, OL: true, LI: true, SECTION: true, } function shouldUpdateUtagsWhenNodeUpdated(nodeList) { const length = nodeList.length for (let i3 = 0; i3 < length; i3++) { const node = nodeList[i3] if ( validNodeNames[node.nodeName] && !hasClass(node, "utags_ul") && !hasClass(node, "utags_modal") ) { return true } } return false } function getOutermostOffsetParent(element1, element2) { if ( !(element1 instanceof HTMLElement) || !(element2 instanceof HTMLElement) ) { throw new TypeError("Both arguments must be valid HTMLElements.") } const offsetParent1 = element1.offsetParent const offsetParent2 = element2.offsetParent if (offsetParent1 && offsetParent2) { if (offsetParent1.contains(offsetParent2)) { return offsetParent1 } if (offsetParent2.contains(offsetParent1)) { return offsetParent2 } return void 0 } return offsetParent1 || offsetParent2 } function getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) { let maxOffsetRight if (offsetParent && offsetParent.offsetWidth > 0) { if (offsetParent === utags.offsetParent) { maxOffsetRight = offsetParent.offsetWidth } else { maxOffsetRight = offsetParent.offsetWidth - getOffsetPosition(utags.offsetParent, offsetParent).left } } else { maxOffsetRight = document.body.offsetWidth - getOffsetPosition(utags.offsetParent).left - 2 } return maxOffsetRight - utags.clientWidth - utagsSizeFix } function updateTagPosition(element) { const utags = element.nextElementSibling if (!utags || !hasClass(utags, "utags_ul")) { return } if (!utags.offsetParent && !utags.offsetHeight && !utags.offsetWidth) { return } const style = getComputedStyle(utags) if (style.position !== "absolute") { return } if (element.dataset.utags_position_selector) { element = $(element.dataset.utags_position_selector, element) || element.closest(element.dataset.utags_position_selector) || element } element.dataset.utags_fit_content = "1" const utagsSizeFix = hasClass(utags, "utags_ul_0") ? 22 : 0 const offsetParent = element.offsetParent === utags.offsetParent ? element.offsetParent : getOutermostOffsetParent(element, utags) const offset = getOffsetPosition(element, offsetParent || doc.body) if (offsetParent !== utags.offsetParent) { const offset2 = getOffsetPosition( utags.offsetParent, offsetParent || doc.body ) offset.top -= offset2.top offset.left -= offset2.left } if (!element.offsetWidth && !element.clientWidth) { return } const objectPosition = style.objectPosition switch (objectPosition) { case "-100% 50%": { utags.style.left = Math.max(offset.left - utags.clientWidth - utagsSizeFix, 0) + "px" utags.style.top = offset.top + ((element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix) / 2 + "px" break } case "0% -100%": { utags.style.left = offset.left + "px" utags.style.top = offset.top - utags.clientHeight - utagsSizeFix + "px" break } case "0% 0%": { utags.style.left = offset.left + "px" utags.style.top = offset.top + "px" break } case "0% 100%": { utags.style.left = offset.left + "px" utags.style.top = offset.top + (element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix + "px" break } case "0% 200%": { utags.style.left = offset.left + "px" utags.style.top = offset.top + (element.clientHeight || element.offsetHeight) + "px" break } case "100% -100%": { utags.style.left = offset.left + (element.clientWidth || element.offsetWidth) - utags.clientWidth - utagsSizeFix + "px" utags.style.top = offset.top - utags.clientHeight - utagsSizeFix + "px" break } case "100% 0%": { let offsetLeft = (element.clientWidth || element.offsetWidth) - utags.clientWidth - utagsSizeFix if (offsetLeft < 100) { offsetLeft = element.clientWidth || element.offsetWidth } utags.style.left = Math.min( offset.left + offsetLeft, getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + "px" break } case "100% 50%": { let offsetLeft = (element.clientWidth || element.offsetWidth) - utags.clientWidth - utagsSizeFix if (offsetLeft < 100) { offsetLeft = element.clientWidth || element.offsetWidth } utags.style.left = Math.min( offset.left + offsetLeft, getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + ((element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix) / 2 + "px" break } case "100% 100%": { let offsetLeft = (element.clientWidth || element.offsetWidth) - utags.clientWidth - utagsSizeFix if (offsetLeft < 100) { offsetLeft = element.clientWidth || element.offsetWidth } utags.style.left = Math.min( offset.left + offsetLeft, getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + (element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix + "px" break } case "100% 200%": { utags.style.left = offset.left + (element.clientWidth || element.offsetWidth) - utags.clientWidth - utagsSizeFix + "px" utags.style.top = offset.top + (element.clientHeight || element.offsetHeight) + "px" break } case "200% 0%": { utags.style.left = Math.min( offset.left + (element.clientWidth || element.offsetWidth), getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + "px" break } case "200% 50%": { utags.style.left = Math.min( offset.left + (element.clientWidth || element.offsetWidth), getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + ((element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix) / 2 + "px" break } case "200% 100%": { utags.style.left = Math.min( offset.left + (element.clientWidth || element.offsetWidth), getMaxOffsetLeft(offsetParent, utags, utagsSizeFix) ) + "px" utags.style.top = offset.top + (element.clientHeight || element.offsetHeight) - utags.clientHeight - utagsSizeFix + "px" break } default: { break } } element.dataset.utags_fit_content = "0" } async function main() { addUtagsStyle() await initSettings({ id: "utags", title: i2("settings.title"), footer: "\n
" .concat( i2("settings.information"), '
\n\n \n ' ) .concat( i2("settings.report"), '\n
\nMade with \u2764\uFE0F by\n \n Pipecraft\n
' ), settingsTable: settingsTable2, async onValueChange() { onSettingsChange() onSettingsChange2() }, onViewUpdate(settingsMainView) { let item = $( '[data-key="useVisitedFunction_'.concat(host2, '"]'), settingsMainView ) if (!isAvailableOnCurrentSite() && item) { item.style.display = "none" item.parentElement.style.display = "none" } item = $( '[data-key="displayEffectOfTheVisitedContent_'.concat(host2, '"]'), settingsMainView ) if (item) { item.style.display = getSettingsValue( "useVisitedFunction_".concat(host2) ) ? "flex" : "none" } item = $('[data-key="customStyleValue"]', settingsMainView) if (item) { item.parentElement.style.display = getSettingsValue("customStyle") ? "block" : "none" } item = $(".bes_tip", settingsMainView) if (item) { item.style.display = getSettingsValue("customStyle") ? "block" : "none" } item = $( '[data-key="customStyleValue_'.concat(host2, '"]'), settingsMainView ) if (item) { item.parentElement.style.display = getSettingsValue( "customStyle_".concat(host2) ) ? "block" : "none" } }, }) if (!getSettingsValue("enableCurrentSite_".concat(host2))) { return } await initStorage() setTimeout(outputData, 1) onSettingsChange() onSettingsChange2() await displayTags() addEventListener(doc, "visibilitychange", async () => { if (!doc.hidden) { await displayTags() } }) bindDocumentEvents() bindWindowEvents() const observer = new MutationObserver(async (mutationsList) => { let shouldUpdate = false for (const mutationRecord of mutationsList) { if (shouldUpdateUtagsWhenNodeUpdated(mutationRecord.addedNodes)) { shouldUpdate = true break } if (shouldUpdateUtagsWhenNodeUpdated(mutationRecord.removedNodes)) { shouldUpdate = true break } } if (shouldUpdate) { cleanUnusedUtags() displayTagsThrottled() } if ($("#vimiumHintMarkerContainer")) { addClass(doc.body, "utags_show_all") addClass(doc.documentElement, "utags_vimium_hint") } else if (hasClass(doc.documentElement, "utags_vimium_hint")) { removeClass(doc.documentElement, "utags_vimium_hint") hideAllUtagsInArea() } }) observer.observe(doc, { childList: true, subtree: true, }) addEventListener(doc, "mouseover", (event) => { const target = event.target if ( target && (target.tagName === "A" || target.dataset.utags !== void 0) ) { displayTagsThrottled() } }) } runWhenHeadExists(async () => { if (doc.documentElement.dataset.utags === void 0) { doc.documentElement.dataset.utags = "".concat(host2) await main() } }) })()