您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
To better display Leetcode ProblemSet Stat; to hide and dismiss the locked problems.
您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
- // ==UserScript==
- // @name Leetcode ProblemSet Stat Better Display
- // @description To better display Leetcode ProblemSet Stat; to hide and dismiss the locked problems.
- // @version 0.2.1
- // @author pcm
- // @match https://leetcode.com/problemset/*
- // @match https://leetcode.com/tag/*
- // @run-at document-start
- // @grant GM_xmlhttpRequest
- // @connect leetcode.com
- // @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
- // @require https://greatest.deepsurf.us/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012
- // @namespace
- // ==/UserScript==
- // some global configuration
- var CONF = {
- 'SVG_HEIGHT': 1000,
- 'SVG_WIDTH': 300,
- 'COLOR_AC': '#7bc96f',
- 'COLOR_NOTAC': '#08c',
- 'COLOR_TODO': '#ebedf0',
- 'CELL_HEIGHT': 10,
- 'CELL_WIDTH': 10,
- 'CELL_MARGIN': 2,
- 'CELL_W_COUNT': 25,
- }
- // if switchHideLockedProblems == true, hide all locked problems in problemset
- function statDifficulty(problemTable, switchHideLockedProblems, switchDrawProgressBar) {
- var res = {
- 'num_total_easy': 0,
- 'num_total_normal': 0,
- 'num_total_hard': 0,
- 'num_total': 0,
- 'num_ac_easy': 0,
- 'num_ac_normal': 0,
- 'num_ac_hard': 0,
- 'num_ac': 0,
- }
- // find all related indices
- var index = {}
- var thead = problemTable.getElementsByTagName('thead')[0];
- var ths = thead.getElementsByTagName("th");
- for (var i = 0; i < ths.length; i++) {
- var th = ths[i];
- if (th.textContent == 'Difficulty') index.difficulty = i;
- if (th.textContent == '\xa0') index.status = i;
- if (th.textContent == 'Title') index.title = i;
- if (th.textContent == '#') index.id = i;
- }
- if (Object.keys(index).indexOf('status') == -1) index.status = 0;
- if (Object.keys(index).indexOf('id') == -1) index.id = 1;
- var tbody = problemTable.getElementsByTagName('tbody')[0];
- var trs = tbody.getElementsByTagName("tr");
- // make the ids of problemset ascendent
- var id1 = parseInt(trs[0].getElementsByTagName("td")[1].textContent);
- var thead_id = document.getElementsByClassName('reactable-th-question_id');
- if (!thead_id[0]) {
- thead_id = document.getElementsByClassName('reactable-th-id');
- }
- thead_id[0].click();
- var id2 = parseInt(trs[0].getElementsByTagName("td")[1].textContent);
- id1 = Math.min(id1, id2);
- if (parseInt(trs[0].getElementsByTagName("td")[1].textContent) != id1) {
- thead_id[0].click();
- }
- for ( var j = 0; j < trs.length; j++) {
- var tds = trs[j].getElementsByTagName("td");
- var td_status = tds[index.status];
- var td_title = tds[index.title];
- var td_difficulty = tds[index.difficulty];
- var td_number = tds[index.id];
- // dismiss locked problems
- var locked = td_title.getElementsByClassName('fa-lock');
- if (locked[0]) {
- if (switchHideLockedProblems) {
- trs[j].innerHTML = "";
- }
- continue;
- }
- // stat difficulty
- var hard = td_difficulty.getElementsByClassName('label-danger');
- var normal = td_difficulty.getElementsByClassName('label-warning');
- var easy = td_difficulty.getElementsByClassName('label-success');
- var ac = td_status.getElementsByClassName('fa-check');
- var notac = td_status.getElementsByClassName('fa-question');
- if (switchDrawProgressBar) {
- var title = td_number.textContent + ' ' + td_title.firstChild.firstChild.textContent;
- drawOneCell(res.num_total, ac[0] ? true : false, notac[0] ? true : false, title);
- }
- if (hard[0]) {
- res.num_total_hard++;
- if (ac[0]) res.num_ac_hard++;
- }
- else if (normal[0]) {
- res.num_total_normal++;
- if (ac[0]) res.num_ac_normal++;
- }
- else if (easy[0]) {
- res.num_total_easy++;
- if (ac[0]) res.num_ac_easy++;
- }
- res.num_total++;
- if (ac[0]) res.num_ac++;
- }
- return res;
- }
- function updateStatBar(welcomes) {
- var statBar = document.getElementById('welcome');
- if (!statBar) {
- var div = document.getElementsByClassName('header__2ZIe')[0];
- var p = div.getElementsByTagName('p')[1];
- p.innerHTML = '<div id="welcome"><span><span class="label label-primary round">Solved</span> - <span class="label label-success round"></span> <span class="label label-warning round"></span> <span class="label label-danger round"></span></span></div>';
- statBar = document.getElementById('welcome');
- }
- var total = statBar.getElementsByClassName('label-primary')[0];
- var hard = statBar.getElementsByClassName('label-danger')[0];
- var normal = statBar.getElementsByClassName('label-warning')[0];
- var easy = statBar.getElementsByClassName('label-success')[0];
- total.textContent = welcomes.num_ac.toString() + '/' + welcomes.num_total.toString() + ' Solved';
- hard.textContent = 'Hard ' + welcomes.num_ac_hard.toString() + '/' + welcomes.num_total_hard.toString();
- normal.textContent = 'Medium ' + welcomes.num_ac_normal.toString() + '/' + welcomes.num_total_normal.toString();
- easy.textContent = 'Easy ' + welcomes.num_ac_easy.toString() + '/' + welcomes.num_total_easy.toString();
- }
- function drawOneCell(i, ac, notac, title) {
- var svg = document.getElementById('gm_progress_graph');
- var x = (i % CONF.CELL_W_COUNT) * (CONF.CELL_MARGIN + CONF.CELL_WIDTH);
- var y = Math.floor(i / CONF.CELL_W_COUNT) * (CONF.CELL_MARGIN + CONF.CELL_HEIGHT);
- var color = CONF.COLOR_TODO;
- if (ac) color = CONF.COLOR_AC;
- else if (notac) color = CONF.COLOR_NOTAC;
- var rectHTML =
- '<rect ' +
- 'width="' + CONF.CELL_WIDTH + '" ' +
- 'height="' + CONF.CELL_HEIGHT + '" ' +
- 'x="' + x.toString() + '" ' +
- 'y="' + y.toString() + '" ' +
- 'fill="' + color + '" ';
- if (ac || notac) {
- rectHTML += '>' +
- '<title>' + title + '</title>' +
- '</rect>'
- }
- else {
- rectHTML += '/>';
- }
- svg.insertAdjacentHTML('beforeend', rectHTML);
- svg.setAttribute('height', y + (CONF.CELL_MARGIN + CONF.CELL_HEIGHT));
- }
- function initDrawProgressGraph() {
- var div = document.getElementsByClassName('progress-panel-base');
- if (!div[0]) div = document.getElementsByClassName('header__2ZIe')[0];
- else div = div[0].firstChild;
- var svgHTML =
- '<div><svg ' +
- 'width="' + CONF.SVG_WIDTH + '" ' +
- 'height="' + CONF.SVG_HEIGHT + '" ' +
- 'id="gm_progress_graph" xmlns="http://www.w3.org/2000/svg"' +
- '>' +
- '<rect width="100%" height="100%" style="fill:white;/> ' +
- '</svg></div>'
- div.insertAdjacentHTML('afterend', svgHTML);
- return true;
- }
- function init() {
- // document.getElementsByTagName('select')[0].options[3].selected = true;
- }
- function changeStatInfo(jNode) {
- init();
- var problemTable = document.getElementsByClassName('question-list-table');
- if (!problemTable[0]) {
- problemTable = document.getElementsByClassName('table__XKyc');
- }
- if (problemTable[0]) {
- var switchHideLockedProblems = true;
- var switchDrawProgressBar = initDrawProgressGraph();
- var welcomes = statDifficulty(problemTable[0], switchHideLockedProblems, switchDrawProgressBar);
- updateStatBar(welcomes);
- }
- }
- waitForKeyElements(".question-list-table", changeStatInfo)
- waitForKeyElements(".table__XKyc", changeStatInfo)