您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Searches the games table for settable game names and highlights them.
当前为
// ==UserScript== // @name Game Highlighter // @author Timo Gebauer // @namespace [email protected] // @version 0.2.1 // @grant none // @include http://makemehost.com/games.php // @description Searches the games table for settable game names and highlights them. // ==/UserScript== /******************************************************************************/ // use MakeMeHosts jQuery version $ = unsafeWindow.jQuery; // Groß- und Kleinschreibung wird in den Suchtexten nicht beachtet // Treffer, die einen Sound abspielen, werden bis zur nächsten Aktualisierung mit farbigem Hintergrund hervorgehoben // nur in den Games Spalten suchen? var searchGamesOnly = false; // red, blue, cyan, purple, yellow, orange, green, pink, grey, CadetBlue, darkgreen, brown var highlights = []; var sounds = { s_solemn: 'http://www.oringz.com/oringz-uploads/sounds-882-solemn.mp3', s_comm: 'http://www.oringz.com/oringz-uploads/sounds-917-communication-channel.mp3' }; /******************************************************************************/ /* * Ajax Request "hijacken" nach jeder erfolgreichen Übertragung die Funktion highlightArray() ausführen * Das Ergebnis des Requests kann hier nicht abgefangen werden, da der Eventlistener erst aufgerufen wird, * nachdem der eigentliche Aufrufer das Ergebnis bereits verarbeitet hat */ // backup original "send" function reference XMLHttpRequest.prototype.oldSend = XMLHttpRequest.prototype.send; var newSend = function(a) { var xhr = this; var onload = function() { highlightArray(); }; xhr.addEventListener("load", onload, false); this.oldSend(a); }; XMLHttpRequest.prototype.send = newSend; /*******************************************************************************/ /* * TODO: * - highlights hoch und runterverschieben * - color-picker ? * - mute sound checkbox * - "mute" elements * - Rückgangig button * - erst beim schließen vollständig anwenden * - sound-fenster (neu, entfernen, etc..) */ function initGui() { // var html = "<div><button id=\"button_save\">Speichern</button></div>"; $('.refreshMe').next().after('<div align="center"><a class="changelink-unactive" id="btn_options"> Highlight Settings</a></div>'); document.getElementById('btn_options').addEventListener('click', showGui, true); $("body").append('<div id="popup_overlay" class="overlay"></div>'); $("body").append('<div id="popup" class="popup"></div>'); document.getElementById('popup_overlay').addEventListener('click', hideGui, true); // popup window var html = '<p>Auflistung aller aktiven Highlights<br>' + 'Groß- und Kleinschreibung wird in den Suchtexten nicht beachtet' + '<br>Treffer, die einen Sound abspielen, werden bis zur nächsten Aktualisierung mit farbigem Hintergrund hervorgehoben</p>' + '<button id="btn_add">New Highlight</button>' + '<button id="btn_load">Load (JSON)</button>' + '<button id="btn_save">Save (JSON)</button>' + '<button id="btn_remove_all">Remove all</button>' + '<div id="highlight_container"></div>'; $("#popup").append(html); // load / save $("#btn_load").click(function() { showInputDialog("", function() { highlights = JSON.parse($("#inputDialogInput").attr("value")); updateGui(); }); }); $("#btn_save").click(function() { alert("Save this stringified options somewhere \n\n" + JSON.stringify(highlights)); }); // add a new highlight $("#btn_add").click(function() { highlights.splice(0,0,{search:[]}); updateGui(); }); // remove all $("#btn_remove_all").click(function() { highlights = []; updateGui(); }); updateGui(); // append custom stylesheet $("head").append('<style type="text/css"><!--\n' + "#btn_options {" + "cursor: pointer;" + "font-size: 20px;" + "}" + ".overlay {" + "left: 0;" + "top: 0;" + "bottom: 0;" + "right: 0;" + "z-index: 100;" + "position: fixed;" + "background-color: #000;" + "filter: alpha(opacity=20);" + "opacity: 0.2;" + "cursor: pointer;" + "display: none;" + "}" + ".popup {" + "display: none;" + "background: #fff;" + "padding: 1%;" + "width: 50%;" + "position: fixed;" + "top: 10%;" + "left: 50%;" + "margin: 0 0 0 -20%;" /* add negative left margin for half the width to center the div */ + "cursor: default;" + "z-index: 200;" + "border-radius: 4px;" + "box-shadow: 0 0 5px rgba(0,0,0,0.9);" + "max-height: 80%;" + "overflow: auto;" + "}" + ".highlight_wrapper {" // + "background-color: red;" + "height: auto;" + "margin: 40px;" + "padding: 5px;" + "clear: both;" + "border: 1px solid grey;" // + "vertical-align: middle;" + "}" + ".index {" + "margin-right: 30px;" + "float:left;" + "}" + ".btn_color {" + "margin-right: 30px;" // + "float: left;" + "width: 20px;" + "height: 20px;" // + "vertical-align: top;" + "float:left;" +"}" + ".search_wrapper {" // + "font: helvetica, arial, san-serif;" // + "vertical-align: top;" + "width: 40%;" + "float:left;" + "}" + ".highlight_search {" + "resize: none;" + "float: left;" + "}" + ".end_wrapper {" + "clear:both;" + "}" + "#inputDialog {" + "display: none;" + "position: fixed;" + "top: 20%;" + "left: 50%;" + "margin-left: -10%;" + "z-index: 300;" + "}" + "#inputDialogOverlay {" + "z-index: 250;" + "}" + '\n--></style>'); // input dialog var html = '<div id="inputDialogOverlay" class="overlay"></div>' + '<div id="inputDialog">' + '<input id="inputDialogInput" type="text"></input>' + '<button id="inputDialogButton">Ok</button>' + '</div>'; $("body").append(html); $("#inputDialog").hide(); $("#inputDialogOverlay").click(function() { $("#inputDialog").hide(); $("#inputDialogOverlay").hide(); }); $("#inputDialogInput").focus(function(){ var that = this; setTimeout(function(){$(that).select();}, 10); }); $("#inputDialogInput").keypress(function(event){ if(event.keyCode == 13){ $("#inputDialogButton").click(); } }); } function updateGui() { // save changes saveLocalData(); // reset all previous highlights resetHighlights(); // apply new highlights highlightArray(); $("#highlight_container").empty(); $.each(highlights, function(index, elem) { var html = '<div class="highlight_wrapper">' + '<span class="index">' + index + '</span>' + ''; // make sure, elem.search is an array elem.search = elem.search instanceof Array ? elem.search : [elem.search]; var text = ""; $.each(elem.search, function(index, search_value) { if(index != 0) text += "\n"; text += search_value; }); html += '<textarea class="highlight_search" index="'+index+'" rows="' + elem.search.length + '">' + text + '</textarea>'; html += '<button class="btn_color" value="' + index + '" style="background-color:' + elem.color + ';"> </button>'; html += '<select class="sound_select" index="'+index+'">'; html += '<option' if(elem.sound === false) html += ' selected=selected'; html += '></option>'; $.each(sounds, function(sound, url) { html += '<option'; if(elem.sound === sound) html += ' selected=selected'; html += '>' + sound + '</option>'; }); html += '</select>'; html += '<button class="btn_remove" index="' + index + '">X</button>'; html += '<div class="end_wrapper"></div></div>'; $("#highlight_container").append(html); // $(".highlight_wrapper").css("background-color","red"); }); // register events $(".highlight_search").change(function() { highlights[$(this).attr("index")].search = cleanArray($(this).val().split("\n")) ; saveLocalData(); resetHighlights(); highlightArray(); }); $(".highlight_search").keyup(function(event) { // if(event.keyCode == 13) { // } $(this).attr("rows", $(this).val().split("\n").length); }); $(".btn_color").click(function() { var index = $(this).attr("value"); showInputDialog(highlights[index].color, function() { var color = $("#inputDialogInput").attr("value"); highlights[index].color = color; updateGui(); $('.btn_color[value="'+index+'"]').focus(); }); }); $(".sound_select").change(function(){ highlights[$(this).attr("index")].sound = $(this).val(); // no need to update the gui here, only save the changes saveLocalData(); }); $(".btn_remove").click(function() { highlights.splice($(this).attr("index"),1); updateGui(); }); } function showInputDialog(text, okFunction) { $("#inputDialogInput").attr("value", text); $("#inputDialogInput").focus(); $("#inputDialog").show(); $("#inputDialogOverlay").show(); $("#inputDialogButton").unbind("click") $("#inputDialogButton").click(function() { $("#inputDialog").hide(); $("#inputDialogOverlay").hide(); }); $("#inputDialogButton").click(okFunction); } function showGui() { $("#popup_overlay").show(); $("#popup").show(); } function hideGui() { $("#popup_overlay").css("display", "none"); $("#popup").css("display", "none"); } /******************************************************************************/ function saveLocalData() { localStorage.setItem("highlights", JSON.stringify(highlights)); } function loadLocalData() { // alert("load"); highlights = JSON.parse(localStorage.getItem("highlights")); if(highlights === null) { highlights = []; } // alert("afterLoad"); } /******************************************************************************/ $(document).ready(function () { // Riesigen Header entfernen $('#rt-header-overlay').remove(); // Sounds vorladen $.each(sounds, function(name, url) { $("body").append("<audio id='"+name+"' src='"+url+"' hidden=true preload=auto></audio>"); }); // Einstellungen laden loadLocalData(); // eigenes GUI einfügen initGui(); }); /******************************************************************************/ // enthalten die Namen der gefundenen Spiele var knownGames = {}; var foundGames = {}; function resetHighlights() { $("#mmh td").css({ backgroundColor: "transparent", color: "black" }); } function highlightArray() { foundGames = {}; $.each(highlights, function(index, elem) { if (elem === null) return; var color = elem.color; var sound = elem.sound; var arr = elem.search instanceof Array ? elem.search : [elem.search]; if(!(arr.length == 1 && arr[0] === "")) $.each(arr, function(index, text) { highlight(text, elem.color, elem.sound); }); }); knownGames = foundGames; } function highlight(search, color, sound) { getNodes(search).each(function(){ // Schrift färben? if(color) $(this).css("color", color); // Spiel unbekannt? if(!($(this).text() in knownGames)) { // Sound abspielen? if(sound) { document.getElementById(sound).play(); // neu gefundene Spiele kurzzeitig hervorheben $(this).css("background-color", "orange"); $(this).css("color", "black"); } } foundGames[$(this).text()] = $(this).text(); }); } function getNodes(text) { // Nur in Games Spalten suchen? if (searchGamesOnly) { var tds = $('#mmh table:first-child td:nth-child(4)') .add('#mmh table:last-child td:nth-child(2)'); } else { var tds = $('td'); } return tds.filter(':Contains(' + text + ')'); } /******************************************************************************/ /* * removes every "falsy" value: undefined, null, 0, false, NaN and '': */ function cleanArray(actual){ var newArray = new Array(); for(var i = 0; i<actual.length; i++){ if (actual[i]){ newArray.push(actual[i]); } } return newArray; } /******************************************************************************/ // jQuery :contains Case-Insensitive // http://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/ jQuery.expr[':'].Contains = function(a, i, m) { return jQuery(a).text().toUpperCase() .indexOf(m[3].toUpperCase()) >= 0; };