您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
save selection
// ==UserScript== // @name wirelyre select save // @namespace http://tampermonkey.net/ // @version 0.1 // @description save selection // @author 13pake // @match https://wirelyre.github.io/tetra-tools/pc-solver.html* // @icon https://www.google.com/s2/favicons?sz=64&domain=github.io // @grant GM_addStyle // @license MIT // ==/UserScript== (function() { 'use strict'; GM_addStyle("#solutions > a { border-radius: 4px; }"); GM_addStyle("#solutions { row-gap: 20px; }"); GM_addStyle("#select-save { background-color: rgba(0,0,0,0.2); color: #fff; border: 1px solid rgba(0,0,0,0.3); margin-left: 5px; }"); GM_addStyle("#label-save { margin-top: 10px; }"); // Constants var pieces = ['T', 'I', 'L', 'J', 'S', 'Z', 'O']; var colors = [ 'rgb(180, 81, 172)', // purple 'rgb(65, 175, 222)', // cyan 'rgb(239, 149, 54)', // orange 'rgb(24, 131, 191)', // blue 'rgb(102, 198, 92)', // green 'rgb(239, 98, 77)', // red 'rgb(247, 211, 62)', // yellow ]; window.onload = function() { // Add save selection var label = document.createElement('label'); label.id = 'label-save'; label.innerHTML = 'Save'; document.querySelectorAll('#query > div:nth-child(6)')[0].appendChild(label); var select = document.createElement('select'); label.appendChild(select); select.id = 'select-save'; var selectOptions = ['All', ...pieces]; for (var i = 0; i < selectOptions.length; i++) { var option = document.createElement('option'); option.value = selectOptions[i]; option.text = selectOptions[i]; select.appendChild(option); } // On select change select.onchange = function(event) { selectSave(event.target.value); } function selectSave(value) { if (value !== 'All') { document.querySelectorAll('#solutions > a').forEach(function(a) { a.style.display = 'none'; a.style.borderTopWidth = '0'; }); document.querySelectorAll('#solutions > a.' + value).forEach(function(a) { a.style.display = 'block'; }); } else if (value == 'All') { document.querySelectorAll('#solutions > a').forEach(function(a) { a.style.display = 'block'; a.style.borderTopWidth = '10px'; }); } } // Add listener for solutions var targetNode = document.getElementById('solutions'); var config = { // attributes: true, childList: true, subtree: true }; var observer = new MutationObserver(function(mutationsList) { var queue = document.getElementById('queue').value; // check if queue is just pieces var piecesOnlyMatch = queue.match(/^[TILJSZO]*$/); if (piecesOnlyMatch) { //console.log('good queue'); } else { return; } var queuePieces = pieces.map(function(piece) { return (queue.split(piece).length - 1); }); // We're just gonna assume the queue length is correct !!! //console.log('queue pieces', queuePieces); for (var mutation of mutationsList) { if (mutation.type == 'childList') { // console.log('A child node has been added or removed.', mutation.addedNodes[0]); try { var aNode = mutation.addedNodes[0]; var dataField = aNode.firstChild.getAttribute('data-field'); var solutionPieces = pieces.map(function(piece) { return (dataField.split(piece).length - 1) / 4; }); //console.log('pieces used', solutionPieces); // get difference between arrays var differentIndex = -1; for (let i = 0; i < queuePieces.length; i++) { if (queuePieces[i] !== solutionPieces[i]) { differentIndex = i; } } //console.log('saved piece', pieces[differentIndex]); aNode.style.borderTop = "10px solid " + colors[differentIndex]; aNode.classList.add(pieces[differentIndex]); } catch (e) { // do nothing lol } } } }); observer.observe(targetNode, config); } })();