Greasy Fork

Greasy Fork is available in English.

acwing-helper

AcWing 助手,学算法就上 AcWing!| 题目复制 | 生成题解模板 | 切换页面风格 (AcWing <-> LeetCode) | 复制代码 | 题目直接跳转 | 一键填写样例

当前为 2023-04-15 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         acwing-helper
// @namespace    https://github.com/tonngw
// @version      1.1.6
// @description  AcWing 助手,学算法就上 AcWing!| 题目复制 | 生成题解模板 | 切换页面风格 (AcWing <-> LeetCode) | 复制代码 | 题目直接跳转 | 一键填写样例
// @author       tonngw
// @match        https://www.acwing.com/problem/content/*/
// @match        https://www.acwing.com/activity/content/*/
// @match        https://www.acwing.com/activity/content/punch_the_clock/*/
// @match        https://www.acwing.com/activity/content/code/content/*/
// @match        https://www.acwing.com/solution/*/
// @match        https://www.acwing.com/blog/*/
// @match		 https://www.acwing.com/community/*/
// @exclude		   https://www.acwing.com/problem/content/submission/*/
// @exclude		   https://www.acwing.com/problem/content/discussion/*/
// @exclude		   https://www.acwing.com/problem/content/solution/*/
// @exclude		   https://www.acwing.com/problem/content/video/*/
// @icon         data:image/x-icon;base64,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n+CgtWjSm6xZzsnPoOD/////29m36K2lVM6yo1POt6FSzrufUc7AnVDOxJtPzsmZTs7NmE2mQdNuvkXRbc6h5rPi9vz3/FPLas5XyWnOXMdozmDFZ85txm3Q8Pnv+PT69PrP6crs/v7+//X68/ru9en24+7b8uPt2PDt8uX27vPm9ubs2PDL1Kji9/jy+vb27/iurF/QraVUzrKjU863oVLOu59RzsCdUM7Em0/OyZlOzs2XTb5B027KRdFtzq7qvubq+e34U8tqzlfJac5cx2jOYMVnzmXDZc6h2Z7e/////9LqzOzw+O748vjv+Onz5PTl793y4+3Z8N/p0e7V4cDqxtOl4unt2/L/////zc+h4KmnVs6tpVTOsqNTzrehUs67n1HOwJ1QzsSbT87JmU7OzZdNzEHTbspF0W3Oruq+5ur57fhTy2rOV8lpzlzHaM5gxWfOZcNlzmrCZc7d8Nvy/P38/6DQkdrT6Mrs7PTn9uDs1/DL3rfmu9Gd3sLTo+Dl69fw//////X27viytnHUqadWzq2lVM6yo1POt6FSzrufUc7AnVDOxJtPzsmZTs7Nl03MQdNuvEXRbc6h5rPi9vz4/FPLas5XyWnOXMdozmDFZ85lw2XOasFkzonMgdb8/fz83u7Y8Hy6YM6IvGnQstGa3tXkxury9uz49fjw+vL16/j+/v7/0dau5Ofo0/C+vYDYraVUzrKjU863oVLOu59RzsCdUM7Em0/OyZlOzs2XTb5B0m6kRdFtzoTenNz/////atJ91FfJac5cx2jOYMVnzmXDZc5qwWTObsBjzsXkv+j/////qdGX3IC4X86Ftl7OibRdzo6yXM7C1KTi//////j58/r09ez4ycua4M7NnuC9tXTWsqNTzrehUs67n1HOwJ1QzsSbT87JmU7OzZhNpkLSbnxF0W3OWNN40v3+/f+b4KjgV8lpzlzHaM5gxWfOZcNlzmrBZM5uwGPOe8Js0PP58frv9uv4hLpk0IW2Xs6JtF3OkbRg0PD16vb2+PH6orJk0MDHkdzy8+j25uXO7rKqXtCyo1POt6FSzrufUc7AnVDOxJtPzsmZTs7MmE1+QtJuRkXRbc5Kz2zO1/Te8tby2/BXyWnOXMdozmDFZ85lw2XOasFkzm7AY85zvmLOrdeh3v/////B3LHkhbZezom0Xc7G2a3k/////8LP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
// @require      https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js
// @require      https://unpkg.com/sweetalert/dist/sweetalert.min.js
// @require      https://unpkg.com/turndown/dist/turndown.js
// @require      https://unpkg.com/turndown-plugin-gfm/dist/turndown-plugin-gfm.js
// @require      https://cdn.bootcdn.net/ajax/libs/bootstrap-switch/4.0.0-alpha.1/js/bootstrap-switch.min.js
// @grant        GM_registerMenuCommand
// @grant        GM_setClipboard
// @grant        GM_addStyle
// @license 	 MIT
// ==/UserScript==

(function () {
	"use strict";

	$("head").append($(`<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap-switch/4.0.0-alpha.1/css/bootstrap-switch.min.css" rel="stylesheet">`));

	// 使用 turndown-plugin-gfm 修复 <table> 标签解析错误,https://github.com/mixmark-io/turndown-plugin-gfm
	var gfm = turndownPluginGfm.gfm;
	// 初始化 html to markdown 转换工具
	var turndownService = new TurndownService();
	turndownService.use(gfm);

	const window = unsafeWindow;
	const description = ".row";
	var content = "";

	// 判断路径中是否包含 code, solution, blog, community,代码复制功能只在指定路径下下生效
	var url = window.location.href;
	if (url.includes("code") || url.includes("solution") || url.includes("blog") || url.includes("community")) {
		// 插入复制代码按钮,并设置位置
        $(".hljs").each(function() {
			$(this).before(
			  "<button class='copyCodeBtn' class='btn default'><span class='glyphicon glyphicon-file'></span></button>"
			);
		});

		// $(".copyCodeBtn").css("position", "absolute");
		// $(".copyCodeBtn").css("top", "10px");
		// $(".copyCodeBtn").css("right", "10px");
		// 去除按钮默认样式
		$(".copyCodeBtn").css("border", "none");
		$(".copyCodeBtn").css("background-color", "transparent");
		$(".copyCodeBtn").css("outline", "none");

        turndownService.addRule('strikethrough', {
                filter: ['pre'],
                replacement: function (content) {
                    return '' + content.trim() + ""
                }
            });
		// 为按钮绑定点击事件
		$(".copyCodeBtn").click(function() {
            let target = $(this).next();
            // console.log($(target).html());
            target.markdown = turndownService.turndown($(target)[0].outerHTML);
            GM_setClipboard(target.markdown);
            $(this).text("已复制到剪贴板");
          });
		return;
	}

	// 拦截带有 ? 的路径直接打开题目
	if (url.includes("?")) {
		// alert(url);
		// alert($(".label-info").get(0).href);
		location.href = $(".label-info").get(0).href;
		return;
	}

	// 在题目内容页面添加在当前页面打开题目按钮
	if (url.includes("activity/content/problem/content")) {
		var gotoHref = $(".label-info").get(0).href;
		// console.log(gotoHref);
		var gotoA = '&nbsp;&nbsp;&nbsp;&nbsp;<a href=' + gotoHref + ' title="跳转" one-link-mark="yes"><span class="glyphicon glyphicon-share-alt"></span></a></a>';
		$(".label-info").after(gotoA);
		return;
	}

	// 获取所有的打卡题目,并添加直达题目按钮
	if (url.includes("punch_the_clock") || url.includes("activity")) {
		$(".punch-line").each(function () {
			var gotoHref = $(this).children("a").get(0).href + '?';
			// console.log(gotoHref);
			var gotoA = '<a href=' + gotoHref + ' title="跳转" target="_blank" one-link-mark="yes"><span class="glyphicon glyphicon-share-alt"></span></a></a>';
			$(this).append(gotoA);
		});
		return;
	}

	// 题目页面的相关功能
	if (url.includes("problem/content")) {
		/* 一键填写样例功能 start */
		GM_addStyle(`
			.fillSmapleBtn {
				background-color: #5cb85c; /* 设置按钮背景颜色 */
				border: none; /* 去除边框 */
				color: white; /* 设置文字颜色 */
				text-align: center; /* 文字居中 */
				text-decoration: none; /* 去除下划线 */
				display: inline-block; /* 将按钮显示为行内元素 */
				font-size: 13px; /* 设置字体大小 */
				cursor: pointer; /* 鼠标悬停样式 */
				border-radius: 4px; /* 圆角设置 */
				transition-duration: 0.4s; /* 过渡动画时间 */
			}
			.fillSmapleBtn:hover {
				background-color: #3e8e41; /* 设置鼠标悬停时的背景颜色 */
				text: 填入样例;
			}
			.fillSmapleBtn:hover::after {
				content: " 填入样例"; /* 悬停时显示的文本 */
			}
		`)

		// 获取包含样例两个字的 <h4>
		var sz = $(".hljs").length;
		// 插入填入样例按钮,并设置位置
		$('h4:contains("输入样例")').filter(function() {
			return $(this).text().includes("输入样例");
		}).each(function() {
			$(this).after(
				"<button class='fillSmapleBtn'><span class='glyphicon glyphicon-arrow-down'></span></button>"
			);
		});
		$('h4:contains("样例输入")').filter(function() {
			return $(this).text().includes("样例输入");
		}).each(function() {
			$(this).after(
				"<button class='fillSmapleBtn'><span class='glyphicon glyphicon-arrow-down'></span></button>"
			);
		});

		turndownService.addRule('strikethrough', {
				filter: ['pre'],
				replacement: function (content) {
					return '' + content.trim() + ""
				}
			});

		// Auto resize input textarea height when user clicks fill smaple button.
		function autoResizeTextarea(textarea) {
			$(textarea).css('height', 'auto'); // Reset the height
			$(textarea).css('height', textarea.scrollHeight + 'px'); // Set the new height based on the content
		}

		// 为填入样例按钮绑定点击事件
		$(".fillSmapleBtn").click(function() {
			let target = $(this).next();
			target.markdown = turndownService.turndown($(target)[0].outerHTML);
			GM_setClipboard(target.markdown);
			// $(this).text("已复制到剪贴板");
			$("#run-code-stdin").val(target.markdown);
			autoResizeTextarea($('#run-code-stdin')[0]); // Call the autoResizeTextarea function with the DOM element
			// 当页面风格为 vertical 时才生效
			if (page_style == "vertical") {
				// 页面滑动到调试按钮位置
				$('html, body').animate({
					scrollTop: $("#submit_code_btn").offset().top
				}, 500);
			}
		});
		/* 一键填写样例功能 end */

		// 添加复制按钮
		console.log("acwing helper...");
		var copyBtn = document.createElement("button"); //创建一个 input 对象(提示框按钮)
		copyBtn.id = "copyBtn";
		copyBtn.textContent = "复制";
		copyBtn.style.width = "50px";
		copyBtn.style.height = "30px";
		copyBtn.style.align = "center";

		var x = document.getElementsByClassName("problem-content-sub-btn")[0];
		// 在浏览器控制台可以查看所有函数,ctrl+shift+I 调出控制台,在 Console 窗口进行实验测试
		x.appendChild(copyBtn);


		var page_style = "vertical";
		// 添加切换按钮
		$("#open_ac_saber_btn").after('<input name="switchBtn" type="checkbox" checked>');
		// name 值和 input 标签的 name 值一样
		$("[name='switchBtn']").bootstrapSwitch({
			onText : "Right",      // 设置ON文本
			offText : "Bottom&nbsp;&nbsp;",    // 设置OFF文本
			onColor : "success",// 设置ON文本颜色(info/success/warning/danger/primary)
			offColor : "info",  // 设置OFF文本颜色 (info/success/warning/danger/primary)
			size : "normal",    // 设置控件大小,从小到大  (mini/small/normal/large)
			// 当开关状态改变时触发
			onSwitchChange : function(event, state) {
				if (state == true){
					setTimeout(() => window.location.reload(), 100);
					page_style = "vertical";
				} else {
					page_style = "horizontal";
					switchPageStyle();
				}
			}
		});
		$(".bootstrap-switch-on").css("top", "10px");
		$(".bootstrap-switch-on").css("left", "10px");

		// 添加生成题解按钮
		var generateSolutionBtn = document.createElement("button"); // 创建一个input对象(提示框按钮)
		generateSolutionBtn.id = "generateSolutionBtn";
		generateSolutionBtn.textContent = "生成";
		generateSolutionBtn.style.width = "50px";
		generateSolutionBtn.style.height = "30px";
		generateSolutionBtn.style.align = "center";

		var y = document.getElementsByClassName("problem-content-sub-btn")[3];
		y.appendChild(generateSolutionBtn);

		// 监听键盘按键,为功能绑定快捷键
		unsafeWindow.addEventListener("keydown", (evt) => {
			// console.log('evt', evt);
			if (evt.altKey) {
				// Alt + T 复制题目
				if (evt.keyCode == 84) {
					copy();
				}
				// Alt + S 切换页面风格
				if (evt.keyCode == 83) {
					$("[name='switchBtn']").click();
				}
				// Alt + C 生成当前题目题解模板
				if (evt.keyCode == 67) {
					generateSolution();
				}
			}
			// F9 调试代码
			if (evt.keyCode == 120) {
				debugCode();
			}
			// F10 提交代码
			if (evt.keyCode == 121) {
				submitCode();
			}

			if (evt.keyCode == 119) {
				win = window.open();  //打开新的空白窗口
	win.document.write ("<h1>这是新打开的窗口</h1>");  //在新窗口中输出提示信息
	win.focus ();  //让原窗口获取焦点
	win.opener.document.write ("<h1>这是原来窗口</h1>");  //在原窗口中输出提示信息
	console.log(win.opener == window);  //检测window.opener属性值
			}
		});

		// 注入右键菜单
		GM_registerMenuCommand("复制 AcWing 题目为 Markdown,并存入剪切板", copy);
		GM_registerMenuCommand("切换页面风格", function(){$("[name='switchBtn']").click()});
		GM_registerMenuCommand("生成当前题目的题解模板,并存入剪切板", generateSolution);

		// 为复制按钮绑定点击功能
		copyBtn.onclick = function (e) {
			e.preventDefault();
			copy();
		};

		// 为复制题解按钮绑定按键点击功能
		generateSolutionBtn.onclick = function (e) {
			e.preventDefault();
			generateSolution();
		};
	}

	// 题目复制功能实现
	function copy() {
		copyImpl();
		swal({
			icon: "success",
			title: "复制成功",
		});
	}

	function copyImpl() {
		// 内容 Dom
		var contentDom = $(".section-martor")[0].outerHTML;
		// 将题目描述 html 转换为 markdown
		content = handleHtml(contentDom);
		var str =
			content/* +
			"\n" +
			"来源:AcWing\n" +
			"链接:" +
			window.location.href +
			"\n" +
			"著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。"*/;
		GM_setClipboard(str);
	}

	// 切换页面风格功能实现
	function switchPageStyle() {
		$(".col-sm-3").attr("id", "right");
		$(".col-sm-9").append($(".table-responsive"));
		$(".col-sm-9").attr("class", "col-sm-4 col-xs-12");
		$(".col-sm-3").attr("class", "col-sm-8");
		$(".container").css("width", "1430px");
		$("#right").html("");
		$("#right").append($("#code_tool_bar"));
		$("#right").append($("#code_editor"));
		$("#right").append($("#data-augmentation-div"));
		$("#right").append($("#submit_code_btn"));
		$("#right").append($("#run_code_btn"));
		$("#right").append($("#submit-code-status-block"));
		$("#right").append($("#run-code-status-block"));
	}

	// @Deprecated 复制代码功能实现
	function copyCode() {
		turndownService.addRule('pre', {
			filter: 'pre',
			replacement: function (content) {
			  return "\n" + content.trim() + "\n";
			}
		  });

		let target = $("div[data-tab='preview-tab-content']");
		console.log(target.html());
		target.markdown = turndownService.turndown($(target).html());
		GM_setClipboard(target.markdown);
		swal({
			icon: "success",
			title: "复制成功",
		});
	}

	// 生成题解功能实现
	function generateSolution() {
		generateSolutionImpl();
		swal({
			icon: "success",
			title: "生成成功",
		});
	}

	function generateSolutionImpl() {
		var solutionTemplate = "";
		var problemDescConst = "### 题目描述\n";
		copyImpl();
		var problemDesc = content;
		var splitLine = "\n\n---\n";
		var algorithmConst = "### 算法\n"
		var specificAlgorithmConst = "#### (暴力枚举)  $O(n^2)$";
		var solution = "\n\nwrite here...\n\n"
		var timeComplexityConst = "#### 时间复杂度";
		var timeComplexity = "\n\nwrite here...\n\n"
		var spaceComplexityConst = "#### 空间复杂度";
		var spaceComplexity = "\n\nwrite here...\n\n";
		var codeConst = "#### C++ 代码\n";
		var code = "```\n" + "my code...\n" + "```";
		solutionTemplate = problemDescConst + problemDesc + splitLine + algorithmConst + specificAlgorithmConst +
			solution + timeComplexityConst + timeComplexity + spaceComplexityConst + spaceComplexity + codeConst + code;
		GM_setClipboard(solutionTemplate);
	}

	// 调试代码
	function debugCode() {
		$("#run_code_btn").click();

	}

	// 提交代码
	function submitCode() {
		$("#submit_code_btn").click();
	}

	/**
	 * html 转 markdown
	 * @param html
	 * @returns {void|*}
	 */
	function handleHtml(html) {
		// 处理数学公式
		turndownService.addRule("strikethrough", {
			filter: ["script"],
			replacement: function (content) {
				return "$" + content + "$";
			},
		});
		// 跳过 span 标签,不进行处理
		turndownService.remove("span");
		var markdown = turndownService.turndown(html);
		return markdown;
	}
})();