Greasy Fork

Greasy Fork is available in English.

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

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

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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
		);
	})();
	
})();