acwing-helper

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

目前为 2023-03-11 提交的版本。查看 最新版本

// ==UserScript==
// @name         acwing-helper
// @namespace    https://github.com/tonngw
// @version      1.1.5
// @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;
	}

	/* 一键填写样例功能 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: " 填入样例"; /* 悬停时显示的文本 */
		}
    `)

	// 获取元素的数量
	var sz = $(".hljs").length;
	// 插入填入样例按钮,并设置位置
	$(".hljs").each(function(index) {
		// console.log(index);
		if (index == sz - 4 || sz - 5 == 0) return false;
		if (index % 2 == 1) return true;
		  $(this).before(
			"<button class='fillSmapleBtn'><span class='glyphicon glyphicon-arrow-down'></span></button>"
		  );
	  });

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

	// 为填入样例按钮绑定点击事件
	$(".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);
		// 当页面风格为 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;
	}
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址