Greasy Fork is available in English.

解除网站不允许复制的限制(优化版)🔥🔥🔥

解除部分网站不允许复制的限制,文本选中后点击复制按钮即可复制,主要用于:百度文库|道客巴巴|腾讯文档|豆丁网|无忧考网|学习啦|蓬勃范文|思否社区|力扣|知乎|语雀|QQ文档|360doc|17k|CSDN等,在原脚本的基础上,优化了部分功能,如有补充请留言反馈~

// ==UserScript==
// @name        解除网站不允许复制的限制(优化版)🔥🔥🔥
// @name:zh-TW  解除網站不允許複製的限制(優化版)🔥🔥🔥
// @name:en     Remove the restriction on websites not allowing copying 🔥🔥🔥
// @description 解除部分网站不允许复制的限制,文本选中后点击复制按钮即可复制,主要用于:百度文库|道客巴巴|腾讯文档|豆丁网|无忧考网|学习啦|蓬勃范文|思否社区|力扣|知乎|语雀|QQ文档|360doc|17k|CSDN等,在原脚本的基础上,优化了部分功能,如有补充请留言反馈~
// @description:zh-TW 解除部分網站不允許複製的限制,文本選中後點擊複製按鈕即可複製,主要用於:百度文庫|道客巴巴|騰訊文檔|豆丁網|無憂考網|學習啦|蓬勃範文|思否社區|力扣|知乎|語雀|QQ文檔|360doc|17k|CSDN等,在原指令碼或直譯式程式的基礎上,優化了部分功能,如有補充請留言反饋~
// @description:en    Remove the restriction on copying from the website. If there are any supplements, please leave a message for feedback~
// @namespace   picassoTX_lifting_restrictions
// @version     1.0.3
// @author      WindrunnerMax,picassoTX
// @icon        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAWtJREFUaEPtmeERwiAMhYuuo87QzqAr6LmF7RZeXcHO0M6grqPxaq2HnC0BA8IZ/woh33sJekEkkX9E5Pkn/wMwW21TAddd55hI3TgHzbk6ZCax0Q7MlxswCWy/1gwCBbBYbXKA5Km+fWr4nXiIoACESApZKBCT7HLcN2PgQQG0CT86DG51n7QOIjiAVvHuwsBBvAHIjSqT++oBVe35cl33N15bXqdjmavlFDRAm6wOIngAHURQANhr9lyVr7wZAKsa5Tp2gFJNm1jsgKyarIaNmkN7xn48SR1ggAELvDlAWTbYWKQlhD2Uch0D8C2EqCdvTRz9NYoQk3wJNzG5pIYBSR2IvgcYgP8LSQr8erCF7WXSJsYeSrnOGECdVVImYxPLGKCbjvl64BhHUmekqMFWH9LXkPczAjQgpoX6XmAEYGO36z0M4FphXfxBB3QbXX8/9KChnssArpywcsBVMi7jol4pXSbwbezoAe60/xRPTdKM8AAAAABJRU5ErkJggg==
// @match       *://wenku.baidu.com/view/*
// @match       *://wenku.baidu.com/share/*
// @match       *://wenku.baidu.com/link*
// @match       *://wenku.baidu.com/aggs/*
// @match       *://wenku.baidu.com/ndPureView/*
// @match       *://www.51test.net/show/*
// @match       *://www.xuexi.la/*
// @match       *://www.xuexila.com/*
// @match       *://www.cspengbo.com/*
// @match       *://*.doc88.com/*
// @match       *://segmentfault.com/*
// @match       *://wk.baidu.com/view/*
// @match       *://leetcode-cn.com/problems/*
// @match       *://*.zhihu.com/*
// @match       *://z.30edu.com.cn/*
// @match       *://docs.qq.com/doc/*
// @match       *://docs.qq.com/sheet/*
// @match       *://boke112.com/post/*
// @match       *://*.yuque.com/*
// @match       *://www.commandlinux.com/*
// @match       *://*.diyifanwen.com/*
// @match       *://*.mbalib.com/*
// @match       *://*.cnitpm.com/*
// @match       *://bbs.mihoyo.com/ys/*
// @match       *://*.ruiwen.com/*
// @match       *://www.uemeds.cn/*
// @match       *://www.oh100.com/*
// @match       *://www.aiyuke.com/news/*
// @match       *://www.fwsir.com/*
// @match       *://www.wenxm.cn/*
// @match       *://www.unjs.com/*
// @match       *://www.ahsrst.cn/*
// @match       *://*.yjbys.com/*
// @match       *://*.qidian.com/*
// @match       *://*.zongheng.com/*
// @match       *://*.17k.com/*
// @match       *://*.ciweimao.com/*
// @match       *://book.qq.com/*
// @match       *://*.360doc.com/content/*
// @match       *://*.850500.com/news/*
// @match       *://utaten.com/lyric/*
// @match       *://*.jianbiaoku.com/*
// @match       *://*.kt250.com/*
// @match       *://www.kejudati.com/*
// @match       *://*.xiaohongshu.com/discovery/*
// @match       *://*.baibeike.com/*
// @match       *://*.blog.csdn.net/*
// @match       *://*.bilibili.com/read/*
// @match       *://*.cnki.net/KXReader/*
// @match       *://*.cnrencai.com/*
// @match       *://*.kodiplayer.cn/*
// @match       *://tongxiehui.net/*
// @match       *://*.jianshu.com/p/*
// @match       *://*.linovelib.com/novel/*
// @match       *://*.wjx.cn/*
// @match       *://*.wjx.top/*
// @match       *://*.chazidian.com/*
// @match       *://*.juejin.cn/post/*
// @match       *://*.zgbk.com/ecph/*
// @match       *://*.wenmi.com/article/*
// @match       *://yuedu.baidu.com/*
// @match       *://www.inrrp.com.cn/*
// @match       *://fanyi.baidu.com/mtpe/*
// @match       *://www.shubaoc.com/*
// @match       *://blog.51cto.com/*
// @match       *://www.ximalaya.com/*
// @match       *://*.tianqi.com/*
// @match       *://*.xiexiebang.com/*
// @match       *://*.docin.com/*
// @match       *://*.ddwk8.cn/*
// @match       *://*.php.cn/*
// @match       *://cooco.net.cn/*
// @match       *://fanqienovel.com/*
// @match       *://*.mobiletrain.org/*
// @match       *://*.examcoo.com/*
// @match       *://*.rrdynb.com/*
// @match       *://*.fuwu7.com/*
// @match       *://*.xiangqiqipu.com/*
// @match       *://note.youdao.com/*
// @match       *://*.163.com/*
// @match       *://*.aipiaxi.com/*
// @match       *://wenku.csdn.net/*
// @match       *://www.kdocs.cn/*
// @match       *://www.xiaoyuzhoufm.com/*
// @match       *://*.mcmod.cn/*
// @supportURL  https://github.com/WindrunnerMax/TKScript/issues
// @license     MIT
// @orign-license MIT
// @run-at      document-start
// @connect     res3.doc88.com
// @grant       unsafeWindow
// @grant       GM_xmlhttpRequest
// ==/UserScript==
(function() {
	
	/**
	 * 版权说明:原脚本https://github.com/WindrunnerMax/TKScript/ 采用MIT开源协议
	 * 
	 * MIT协议是一种开放源代码软件授权协议,全称为Massachusetts Institute of Technology License。
	 * 该协议允许自由地使用、复制、修改、合并、发布、分发、再授权和销售软件及其副本的任何部分。
	 * MIT协议要求在软件的所有副本中包含版权声明和许可声明
	 * 
	 * 特此声明!
	 */

	const DOM_STAGE = {
		START: "document-start",
		END: "document-end"
	};
	const DOM_READY = "DOMContentLoaded";
	const PAGE_LOADED = "load";
	const MOUSE_UP = "mouseup";
	const MOUSE_DOWN = "mousedown";
	const MOUSE_MOVE = "mousemove";
	const COPY = "copy";
	const SELECT_START = "selectstart";
	const CONTEXT_MENU = "contextmenu";
	const KEY_DOWN = "keydown";

	const commonUtils = {
		isString: function(value) {
			return Object.prototype.toString.call(value) === "[object String]";
		}
	}

	const domUtils = {
		query: function(selector) {
			return document.querySelector(selector);
		},
		attr: function(selector, attr, value) {
			const dom2 = document.querySelector(selector);
			dom2 && dom2.setAttribute(attr, value);
		},
		append: function(selector, content) {
			const container = document.createElement("div");
			if (commonUtils.isString(content)) {
				container.innerHTML = content;
			} else {
				container.appendChild(content);
			}
			const targetDOM = document.querySelector(selector);
			targetDOM && targetDOM.append(container);
			return container;
		},
		remove: function(selector) {
			const targetDOM = document.querySelector(selector);
			targetDOM && targetDOM.remove();
		}
	};

	const initBaseEvent = (websiteConfig) => {
		window.addEventListener(DOM_READY, () => {
			if (websiteConfig.initCopyEvent) {
				document.oncopy = (e) => e.stopPropagation();
				document.body.oncopy = (e) => e.stopPropagation();
				document.addEventListener(COPY, (e) => e.stopPropagation());
				document.body.addEventListener(COPY, (e) => e.stopPropagation());
			}
		});
	};

	const initBaseStyle = () => {
		var copy_btn_css = `
			.__copied-button {
				align-items:center;
				background: rgba(0, 0, 0);
				border-radius:3px;
				color:#fff;
				cursor:pointer;
				display:flex;
				font-size:12px;
				padding:4px 10px;
				justify-content:center;
				opacity:0;
				position:absolute;
				transition:opacity .3s;
				z-index:-1000;
			}
		`;
		var otner_css = `
			#select-tooltip, #sfModal, .modal-backdrop, div[id^=reader-helper] {
				display:none!important
			}
			.modal-open {
				overflow:auto!important
			}
			._sf_adjust_body {
				padding-right:0!important
			}
		`;
		window.addEventListener(DOM_READY, () => {
			domUtils.append("head", `<style>${copy_btn_css}</style>`);
			domUtils.append("head", `<style>${otner_css}</style>`);
		});
	};

	/*!
	 * 外部引用`static.doc88.com`声明
	 * 此部分是在处理`doc88.com`才会加载的资源文件,此资源文件由该网站加载时提供
	 */
	let path = "";
	const website_rule_doc88 = {
		regexp: /.*doc88\.com\/.+/,
		init: () => {
			domUtils.append(
				"body",
				`<style id="copy-element-hide">#left-menu{display: none !important;}</style>`
			);
			GM_xmlhttpRequest({
				method: "GET",
				url: "https://res3.doc88.com/resources/js/modules/main-v2.min.js?v=2.56",
				onload: function(response) {
					const result = /\("#cp_textarea"\).val\(([\S]*?)\);/.exec(response.responseText);
					if (result) {
						path = result[1];
					}
				}
			});
			window.addEventListener("load", () => {
				const cpFn = unsafeWindow.copyText.toString();
				const fnResult = /<textarea[\s\S]*?>'\+([\S]*?)\+"<\/textarea>/.exec(cpFn);
				if (fnResult) {
					path = fnResult[1];
				}
			});
		},
		getSelectedText: () => {
			let select = unsafeWindow;
			path.split(".")
				.forEach((v) => {
					select = select[v];
				});
			if (!select) {
				unsafeWindow.Config.vip = 1;
				unsafeWindow.Config.logined = 1;
				domUtils.remove("#copy-element-hide");
			}
			return select;
		}
	};

	const website_rule_segmentfault = {
		regexp: /.*segmentfault\.com\/.+/,
		init: function() {
			const body = domUtils.query("body");
			if (body) {
				body.classList.add("_sf_adjust_body");
				body.onclick = () => {
					body.style.paddingRight = "0";
				};
			}
		}
	};

	const TEXT_PLAIN = "text/plain";
	const TEXT_HTML = "text/html";
	const downgradeCopy = (data) => {
		const textarea = document.createElement("textarea");
		textarea.addEventListener(
			COPY,
			(event) => {
				for (const [key, value] of Object.entries(data)) {
					event.clipboardData && event.clipboardData.setData(key, value);
				}
				event.stopPropagation();
				event.preventDefault();
			},
			true
		);
		textarea.style.position = "fixed";
		textarea.style.left = "-999px";
		textarea.style.top = "-999px";
		textarea.value = data[TEXT_PLAIN];
		document.body.appendChild(textarea);
		textarea.select();
		document.execCommand("copy");
		document.body.removeChild(textarea);
	};
	const isEmptyContent = (data) => {
		if (!data){
			return true;
		}
		return commonUtils.isString(data) ? !data : !data[TEXT_PLAIN];
	};
	const copy = (data) => {
		const params = commonUtils.isString(data) ? {
			[TEXT_PLAIN]: data
		} : data;
		const plainText = params[TEXT_PLAIN];
		if (!plainText){
			return false;
		}
		if (navigator.clipboard && window.ClipboardItem) {
			const dataItems = {};
			for (const [key, value] of Object.entries(params)) {
				const blob = new Blob([value], {
					type: key
				});
				dataItems[key] = blob;
			}
			navigator.clipboard.write([new ClipboardItem(dataItems)])
				.catch(() => {
					downgradeCopy(params);
				});
		} else {
			downgradeCopy(params);
		}
		return true;
	};

	let dom = null;
	let isReadyToHidden = false;
	const instance = {
		id: "__copied",
		className: "__copied-button",
		init: function(name) {
			const container = document.createElement("div");
			container.id = this.id;
			container.className = this.className;
			container.innerText = name || "复制";
			container.addEventListener("mouseup", (e) => e.stopPropagation(), true);
			container.addEventListener("mousedown", (e) => e.stopPropagation(), true);
			dom = container;
			document.body.appendChild(dom);
		},
		getInstance: function() {
			if (dom === null) {
				this.init();
			}
			return dom;
		},
		show: function(event) {
			if (isReadyToHidden){
				return void 0;
			}
			const dom2 = this.getInstance();
			dom2.style.left = `${event.pageX + 10}px`;
			dom2.style.top = `${event.pageY + 10}px`;
			dom2.style.opacity = "0.8";
			dom2.style.zIndex = "99999";
		},
		hide: function(keep = 350) {
			const dom2 = this.getInstance();
			dom2.style.opacity = "0";
			if (keep) {
				isReadyToHidden = true;
				setTimeout(() => {
					dom2.style.zIndex = "-10000";
					isReadyToHidden = false;
				}, keep);
			}
		},
		onCopy: function(content, event) {
			const dom2 = this.getInstance();
			this.show(event);
			dom2.onclick = () => {
				copy(content);
				this.hide();
			};
		},
		enable: function() {
			const dom2 = this.getInstance();
			dom2.style.display = "flex";
		},
		disable: function() {
			const dom2 = this.getInstance();
			dom2.style.display = "none";
		},
		destroy: function() {
			const el = this.getInstance();
			el.remove();
			dom = null;
		}
	};

	const stopNativePropagation = (event) => {
		event.stopPropagation();
	};
	const utils = {
		hideButton: () => {
			instance.disable();
		},
		showButton: () => {
			instance.enable();
		},
		removeAttributes: (selector, attr = []) => {
			const dom = isString(selector) ? document.querySelector(selector) : selector;
			dom && attr.forEach((item) => dom.removeAttribute(item));
		},
		enableUserSelectByCSS: () => {
			const css = "*{user-select: auto !important;-webkit-user-select: auto !important;}";
			const style = document.createElement("style");
			style.innerText = css;
			const head = document.getElementsByTagName("head")[0];
			if (head) {
				head.appendChild(style);
			} else {
				window.addEventListener(
					PAGE_LOADED,
					() => document.getElementsByTagName("head")[0].appendChild(style)
				);
			}
		},
		enableOnSelectStart: (selector) => {
			const dom = document.querySelector(selector);
			dom && dom.addEventListener(SELECT_START, stopNativePropagation);
		},
		enableOnContextMenu: (selector) => {
			const dom = document.querySelector(selector);
			dom && dom.addEventListener(CONTEXT_MENU, stopNativePropagation);
		},
		enableOnCopy: (selector) => {
			const dom = document.querySelector(selector);
			dom && dom.addEventListener(COPY, stopNativePropagation);
		},
		enableOnKeyDown: (selector) => {
			const dom = document.querySelector(selector);
			dom && dom.addEventListener(KEY_DOWN, (e) => {
				if (e.key === "c" && e.ctrlKey)
					return e.stopPropagation();
			});
		},
		enableOnSelectStartByCapture: () => {
			window.addEventListener(SELECT_START, stopNativePropagation, true);
			document.addEventListener(SELECT_START, stopNativePropagation, true);
		},
		enableOnContextMenuByCapture: () => {
			window.addEventListener(CONTEXT_MENU, stopNativePropagation, true);
			document.addEventListener(CONTEXT_MENU, stopNativePropagation, true);
		},
		enableOnCopyByCapture: () => {
			window.addEventListener(COPY, stopNativePropagation, true);
			document.addEventListener(COPY, stopNativePropagation, true);
		},
		enableOnKeyDownByCapture: () => {
			document.addEventListener(
				KEY_DOWN,
				(e) => e.ctrlKey && e.key.toLocaleUpperCase() === "C" && e.stopPropagation(),
				true
			);
		}
	};

	const website_rule_wenku$baidu = {
		regexp: /.*wk\.baidu\.com\/view\/.+/,
		init: function() {
			utils.hideButton();
			utils.enableOnSelectStartByCapture();
			window.onload = () => {
				domUtils.attr(".sf-edu-wenku-vw-container", "style", "");
			};
		}
	};

	const website_rule_zhihu = {
		regexp: /.*zhihu\.com\/.*/,
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopyByCapture();
			if (location.hostname === "zhuanlan.zhihu.com") {
				const removeFocalPointModal = (mutationsList) => {
					for (const mutation of mutationsList) {
						const addedNodes = mutation.addedNodes;
						for (let i = 0; i < addedNodes.length; i++) {
							const target = addedNodes[i];
							if (target.nodeType != 1)
								return void 0;
							if (target instanceof HTMLDivElement && target.querySelector("[data-focus-scope-start]")) {
								const element = target.querySelector("[data-focus-scope-start]");
								element && element.parentElement && element.parentElement.textContent && element.parentElement.textContent.indexOf("立即登录/注册") > -1 && element.parentElement.parentElement && element.parentElement.parentElement.removeChild(element.parentElement);
							}
						}
					}
				};
				const observer = new MutationObserver(removeFocalPointModal);
				observer.observe(document, {
					childList: true,
					subtree: true
				});
			}
		}
	};

	const website_rule_30edu = {
		regexp: /.*30edu\.com\.cn\/.+/,
		init: function() {
			window.onload = () => {
				var _a;
				const iframes = document.getElementsByTagName("iframe");
				if (iframes.length === 2) {
					const body = (_a = iframes[1].contentWindow) == null ? void 0 : _a.document.querySelector("body");
					body && utils.removeAttributes(body, ["oncopy", "oncontextmenu", "onselectstart"]);
				}
			};
		}
	};

	const website_rule_docs$qq = {
		regexp: /.*docs\.qq\.com\/.+/,
		config: {
			initCopyEvent: false,
			captureInstance: true,
			delay: 100
		},
		init: function() {
			window.onload = () => {
				utils.hideButton();
			};
		},
		getSelectedText: function() {
			var _a;
			if (unsafeWindow.pad && unsafeWindow.pad.editor && !unsafeWindow.pad.editor.isCopyable()) {
				utils.showButton();
				const editor = unsafeWindow.pad.editor;
				if (editor.getCopyContent) {
					const content = editor.getCopyContent() || {};
					const plainText = content.plain || "";
					const htmlText = content.html || "";
					return {
						[TEXT_PLAIN]: plainText,
						[TEXT_HTML]: htmlText
					};
				} else {
					editor._docEnv.copyable = true;
					editor.clipboardManager.copy();
					const plainText = editor.clipboardManager.customClipboard.plain || "";
					const htmlText = editor.clipboardManager.customClipboard.html || "";
					editor._docEnv.copyable = false;
					return {
						[TEXT_PLAIN]: plainText,
						[TEXT_HTML]: htmlText
					};
				}
			} else if (unsafeWindow.SpreadsheetApp && unsafeWindow.SpreadsheetApp.permissions && unsafeWindow.SpreadsheetApp.permissions.sheetStatus && unsafeWindow.SpreadsheetApp.permissions.sheetStatus.canCopy === false && unsafeWindow.SpreadsheetApp.permissions.sheetStatus.canEdit && unsafeWindow.SpreadsheetApp.permissions.sheetStatus.canEdit() === false) {
				utils.showButton();
				const SpreadsheetApp = unsafeWindow.SpreadsheetApp;
				const [selection] = SpreadsheetApp.view.getSelectionRanges();
				if (selection) {
					const text = [];
					const {
						startColIndex,
						startRowIndex,
						endColIndex,
						endRowIndex
					} = selection;
					for (let i = startRowIndex; i <= endRowIndex; i++) {
						for (let k = startColIndex; k <= endColIndex; k++) {
							const cell = SpreadsheetApp.workbook.activeSheet.getCellDataAtPosition(i, k);
							if (!cell)
								continue;
							text.push(" ", ((_a = cell.formattedValue) == null ? void 0 : _a.value) || cell.value || "");
						}
						i !== endRowIndex && text.push("\n");
					}
					const str = text.join("");
					return /^\s*$/.test(str) ? "" : str;
				}
				return "";
			}
			return "";
		}
	};

	const website_rule_boke112 = {
		regexp: new RegExp(".+://boke112.com/post/.+"),
		init: function() {
			utils.enableOnCopyByCapture();
			const template = `
	        <style>
	            :not(input):not(textarea)::selection {
	                background-color: #2440B3 !important;
	                color: #fff !important;
	            }
	 
	            :not(input):not(textarea)::-moz-selection {
	                background-color: #2440B3 !important;
	                color: #fff !important;
	            }
	        </style>
	    `;
			domUtils.append("head", template);
		}
	};

	const website_rule_diyifanwen = {
		regexp: /diyifanwen/,
		init: function() {
			utils.hideButton();
			utils.enableOnCopyByCapture();
			utils.enableOnKeyDownByCapture();
		}
	};

	const website_rule_mbalib = {
		regexp: /mbalib/,
		init: function() {
			window.onload = () => {
				utils.removeAttributes("fullScreenContainer", ["oncopy", "oncontextmenu", "onselectstart"]);
			};
		}
	};

	const website_rule_cnitpm = {
		regexp: /cnitpm/,
		init: function() {
			utils.hideButton();
			window.onload = () => {
				utils.removeAttributes("body", ["oncopy", "oncontextmenu", "onselectstart"]);
			};
		}
	};

	const website_rule_mihoyo = {
		regexp: new RegExp(".+bbs.mihoyo.com/.+"),
		init: function() {
			utils.hideButton();
			utils.enableOnCopyByCapture();
			utils.enableOnSelectStartByCapture();
			utils.enableUserSelectByCSS();
		}
	};

	const website_rule_uemeds = {
		regexp: new RegExp(".+www.uemeds.cn/.+"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
		}
	};

	const website_rule_aiyuke = {
		regexp: new RegExp(".+aiyuke.com/news/.+"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
		}
	};

	const website_rule_qidian = {
		regexp: new RegExp("qidian"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopy(".main-read-container");
			utils.enableOnContextMenu(".main-read-container");
		}
	};

	const website_rule_zongheng = {
		regexp: new RegExp("zongheng"),
		init: function() {
			utils.removeAttributes(".reader_box", ["style", "unselectable", "onselectstart"]);
			utils.removeAttributes(".reader_main", ["style", "unselectable", "onselectstart"]);
			utils.hideButton();
			utils.enableOnKeyDown("body");
			utils.enableUserSelectByCSS();
			utils.enableOnCopy(".content");
			utils.enableOnContextMenu("body");
			utils.enableOnSelectStart(".content");
		}
	};

	const website_rule_17k = {
		regexp: new RegExp("17k"),
		init: () => {
			utils.hideButton();
			utils.enableOnCopy(".readAreaBox .p");
		}
	};

	const website_rule_ciweimao = {
		regexp: new RegExp("ciweimao"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopy("#J_BookCnt");
			utils.enableOnContextMenu("body");
			utils.enableOnSelectStart("#J_BookCnt");
		}
	};

	const website_rule_book$qq = {
		regexp: new RegExp("book\\.qq"),
		init: function() {
			utils.hideButton();
			utils.enableOnCopy("body");
			utils.enableUserSelectByCSS();
			utils.enableOnContextMenu("body");
			utils.enableOnSelectStart("body");
		}
	};

	const website_rule_utaten = {
		regexp: new RegExp("utaten"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnSelectStartByCapture();
		}
	};

	const website_rule_wenku$baidu_2 = {
		config: {
			runAt: "document-start"
		},
		regexp: new RegExp("wenku.baidu.com/(view|link|aggs).*"),
		init: function() {
			domUtils.append("head", `<style>@media print { body{ display:block; } }</style>`);
			let canvasDataGroup = [];
			const originObject = {
				context2DPrototype: unsafeWindow.document.createElement("canvas")
					.getContext("2d")
					.__proto__
			};
			document.createElement = new Proxy(document.createElement, {
				apply: function(target, thisArg, argumentsList) {
					const element = Reflect.apply(target, thisArg, argumentsList);
					if (argumentsList[0] === "canvas") {
						const tmpData = {
							canvas: element,
							data: []
						};
						element.getContext("2d")
							.fillText = function(...args) {
								tmpData.data.push(args);
								originObject.context2DPrototype.fillText.apply(this, args);
							};
						canvasDataGroup.push(tmpData);
					}
					return element;
				}
			});
			let pageData = {};
			Object.defineProperty(unsafeWindow, "pageData", {
				set: (v) => pageData = v,
				get: function() {
					if (!pageData.vipInfo)
						return pageData.vipInfo = {};
					pageData.vipInfo.global_svip_status = 1;
					pageData.vipInfo.global_vip_status = 1;
					pageData.vipInfo.isVip = 1;
					pageData.vipInfo.isWenkuVip = 1;
					return pageData;
				}
			});
			const templateCSS = [
				"<style id='copy-template-css'>",
				"body{overflow: hidden !important}",
				"#copy-template-html{position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: flex; align-items: center; justify-content: center;z-index: 999999; background: rgba(0,0,0,0.5);}",
				"#copy-template-html > .template-container{height: 80%; width: 80%; background: #fff; }",
				".template-container > .title-container{display: flex; align-items: center; justify-content: space-between;padding: 10px;border-bottom: 1px solid #eee;}",
				"#copy-template-text{height: 100%; width: 100%;position: relative; overflow: auto;background: #fff;}",
				"#copy-template-html #template-close{cursor: pointer;}",
				"</style>"
			].join("");
			const render = () => {
				canvasDataGroup = canvasDataGroup.filter((item) => item.canvas.id);
				var templateText = canvasDataGroup.map((canvasData, index) => {
					const computedTop = index * Number(canvasData.canvas.clientHeight);
					const textItem = canvasData.data.map(
						(item) => `<div style="position: absolute; left: ${item[1]}px; top: ${item[2] + computedTop}px">${item[0]}</div>`
					);
					return textItem.join("");
				});
				
				const editorView = document.querySelector("#editor-view");
				if(editorView){
					templateText = [editorView.innerHTML];
				}
		
				const templateHTML = [
					"<div id='copy-template-html'>",
					"<div class='template-container'>",
					"<div class='title-container'>",
					"<div>请自行复制</div>",
					"<div id='template-close'>关闭</div>",
					"</div>",
					"<div id='copy-template-text'>",
					templateText.join(""),
					"</div>",
					"</div>",
					"</div>"
				].join("");
				domUtils.append("body", templateHTML);
				domUtils.append("body", templateCSS);
				const closeButton = document.querySelector("#copy-template-html #template-close");
				const close = () => {
					domUtils.remove("#copy-template-html");
					domUtils.remove("#copy-template-css");
					closeButton && closeButton.removeEventListener("click", close);
				};
				closeButton && closeButton.addEventListener("click", close);
			};
			document.addEventListener("DOMContentLoaded", () => {
				domUtils.append(
					"head",
					`<style>#copy-btn-wk{padding: 10px; background: rgba(0,0,0,0.5);position: fixed; left:0; top: 40%;cursor: pointer;color: #fff; z-index: 99999;}</style>`
				);
				domUtils.append("body", "<div id='copy-btn-wk'>复制</div>");
				const btn = domUtils.query("#copy-btn-wk");
				btn && (btn.onclick = render);
			});
		},
		getSelectedText: () => {
			if (window.getSelection && (window.getSelection() || "")
				.toString()) {
				return (window.getSelection() || "")
					.toString();
			}
			const result = /查看全部包含“([\s\S]*?)”的文档/.exec(document.body.innerHTML);
			if (result)
				return result[1];
			return "";
		}
	};

	const website_rule_xiaohongshu = {
		regexp: new RegExp("xiaohongshu"),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnKeyDownByCapture();
		}
	};

	const website_rule_leetcode = {
		regexp: new RegExp("leetcode"),
		init: function() {
			utils.hideButton();
			utils.enableOnCopy("#lc-home");
		}
	};

	const website_rule_csdn = {
		regexp: /csdn/,
		init: function() {
			utils.hideButton();
			utils.enableOnCopyByCapture();
			utils.enableUserSelectByCSS();
		}
	};

	const website_rule_bilibili = {
		regexp: new RegExp("bilibili"),
		init: function() {
			utils.hideButton();
			utils.enableOnCopyByCapture();
		}
	};

	const website_rule_cnki = {
		regexp: new RegExp("cnki"),
		init: function() {
			utils.hideButton();
			utils.enableOnContextMenuByCapture();
			utils.enableOnKeyDownByCapture();
			utils.enableOnCopyByCapture();
		}
	};

	const website_rule_docin = {
		regexp: new RegExp("docin.com/.*"),
		config: {
			initCopyEvent: false,
			captureInstance: true,
			delay: 100
		},
		init: function() {
			window.addEventListener(PAGE_LOADED, () => {
				var _a;
				return (_a = domUtils.query("#j_select")) == null ? void 0 : _a.click();
			});
			domUtils.append("head", "<style>#reader-copy-el{display: none;}</style>");
		},
		getSelectedText: function() {
			if (unsafeWindow.docinReader && unsafeWindow.docinReader.st) {
				return unsafeWindow.docinReader.st;
			}
			return "";
		}
	};
	
	const website_rule_youdao = {
		config: {
			initCopyEvent: false
		},
		regexp: /note\.youdao\.com\/newEditorV1\/bulb\.html.*/,
		init: function() {
			utils.hideButton();
			if (window.parent && window.parent.location.href.indexOf("ynoteshare") > -1) {
				utils.enableUserSelectByCSS();
				document.addEventListener(MOUSE_DOWN, stopNativePropagation, true);
				document.addEventListener(MOUSE_MOVE, stopNativePropagation, true);
			}
		}
	};
	
	const website_rule_union = {
		regexp: new RegExp(
			[
				"commandlinux",
				"cnki",
				"ruiwen",
				"oh100",
				"fwsir",
				"wenxm",
				"unjs",
				"ahsrst",
				"yjbys",
				"360doc",
				"850500",
				"jianbiaoku",
				"kt250",
				"kejudati",
				"baibeike",
				"yuque",
				"cnrencai",
				"kodiplayer",
				"tongxiehui",
				"ndPureView",
				"jianshu",
				"linovelib",
				"chazidian",
				"juejin",
				"zgbk",
				"wenmi",
				"yuedu\\.baidu",
				"inrrp",
				"shubaoc",
				"51cto",
				"ximalaya",
				"xiexiebang",
				"ddwk8",
				"php\\.cn",
				"fanqienovel\\.com/reader",
				"cooco\\.net\\.cn",
				"mobiletrain",
				"xiangqiqipu",
				"m\\.163\\.com",
				"aipiaxi",
				"wenku\\.csdn\\.net",
				"xiaoyuzhoufm\\.com",
				"mcmod\\.cn"
			].join("|")
		),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopyByCapture();
		}
	};

	const website_rule_union_1 = {
		regexp: new RegExp(["wjx", "fanyi\\.baidu", "tianqi", "rrdynb", "fuwu7"].join("|")),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopyByCapture();
			utils.enableOnKeyDownByCapture();
			utils.enableOnSelectStartByCapture();
			utils.enableOnContextMenuByCapture();
		}
	};

	const website_rule_examcoo = {
		config: {
			runAt: DOM_STAGE.START
		},
		regexp: new RegExp(["examcoo"].join("|")),
		init: function() {
			utils.hideButton();
			utils.enableUserSelectByCSS();
			utils.enableOnCopyByCapture();
			utils.enableOnKeyDownByCapture();
			utils.enableOnSelectStartByCapture();
			utils.enableOnContextMenuByCapture();
		}
	};

	const website_rule_kdoc = {
		config: {
			runAt: DOM_STAGE.START
		},
		regexp: new RegExp("kdocs"),
		init: function() {
			const patch = () => {
				unsafeWindow.APP && (unsafeWindow.APP.canCopy = () => true);
			};
			if (unsafeWindow.APP) {
				patch();
			} else {
				let APP = void 0;
				Object.defineProperty(unsafeWindow, "APP", {
					configurable: false,
					set: (value) => {
						APP = value;
						value && patch();
					},
					get: () => APP
				});
			}
		}
	};

	const websites = [
		website_rule_segmentfault,
		website_rule_wenku$baidu,
		website_rule_zhihu,
		website_rule_30edu,
		website_rule_docs$qq,
		website_rule_boke112,
		website_rule_diyifanwen,
		website_rule_mbalib,
		website_rule_cnitpm,
		website_rule_mihoyo,
		website_rule_uemeds,
		website_rule_aiyuke,
		website_rule_qidian,
		website_rule_zongheng,
		website_rule_17k,
		website_rule_ciweimao,
		website_rule_book$qq,
		website_rule_utaten,
		website_rule_wenku$baidu_2,
		website_rule_xiaohongshu,
		website_rule_doc88,
		website_rule_leetcode,
		website_rule_csdn,
		website_rule_bilibili,
		website_rule_cnki,
		website_rule_docin,
		website_rule_youdao,
		website_rule_kdoc,
		website_rule_union,
		website_rule_union_1,
		website_rule_examcoo
	];

	let siteGetSelectedText = null;
	const initWebsite = () => {
		let websiteConfig = {
			initCopyEvent: true,
			runAt: DOM_STAGE.END,
			captureInstance: false,
			delay: 0
		};
		const mather = (regex, website) => {
			if (regex.test(window.location.href)) {
				if (website.config)
					websiteConfig = Object.assign(websiteConfig, website.config);
				if (websiteConfig.runAt === DOM_STAGE.END) {
					window.addEventListener(DOM_READY, () => website.init());
				} else {
					website.init();
				}
				if (website.getSelectedText){
					siteGetSelectedText = website.getSelectedText;
				}
				return true;
			}
			return false;
		};
		websites.some((website) => mather(website.regexp, website));
		return websiteConfig;
	};
	const getSelectedText = () => {
		if (siteGetSelectedText){
			return siteGetSelectedText();
		}
		if (window.getSelection){
			return (window.getSelection() || "").toString();
		}
		if (document.getSelection){
			return (document.getSelection() || "").toString();
		}
		if (document.selection){
			return document.selection.createRange().text;
		}	
		return "";
	};

	(function() {
		const websiteConfig = initWebsite();
		initBaseEvent(websiteConfig);
		initBaseStyle();
		window.addEventListener(MOUSE_UP, (e) => {
				const handler = () => {
					const content = getSelectedText();
					if (isEmptyContent(content) || content==" ") {
						instance.hide();
						return "";
					}
					instance.onCopy(content, e);
				};
				websiteConfig.delay ? setTimeout(handler, websiteConfig.delay) : handler();
			},
			websiteConfig.captureInstance
		);
	})();
	
})();