Greasemonkey-Skript - farbige Makierungen nach Datum à la "ungelesene Foren makieren"
-
Hallo,
da schon mindestens zwei andere Scripte auf den Markt sind, kommt auch mal eins von mir:
Eine etwas erweiterte clientbasierte Version von "ungelesene Foren makieren".Zuerst muss nur einmal auf dem Link im Navigationsmenü (unter Login / Logout) geklickt werden und danach werden alle neueren Beiträge farbig von rot (ganz aktuell) bis grün (älter).
Wenn man keinen Unterscheid sieht, liegt es daran, dass noch keine neueren Berträge erschienen sind.Funktioniert, wenn im Profil als Datumsformat "H:i:s d.m.Y" angegeben ist. (Soweit ich weiß ist das der Standardwert und also für nicht Registrierte verwendbar)
// ==UserScript== // @name c-plusplus.net: Farblich markierte Beträge // @namespace c-plusplus.net // @description Hebtneue Beiträge farblich hervor. // @include http://*c-plusplus.net/forum/* // ==/UserScript== // Version 1.0.1 // + Wrapperfunktionen für Speicherung _***Value - d.h. funktionert nun auch mit Opera (und evtl. Chrome) // Version 1.0.2 // + bessere Referenzzeitveränderung möglich (um ganze Stunden veränderbar) // Version 1.0.3 // + Neue Verson wegen Änderungen im Forum // Version 1.0.4.1 // + ebd. + andere Zeilenerkennung // // Wrapperfunktionen // function _setValue(name, value) { if(typeof GM_setValue == "function") GM_setValue(name, value); else document.cookie = name + '=' + escape(value) + '; expires=' + (new Date(2036, 1, 1)).toGMTString() + ';'; } function _getValue(name) { if(typeof GM_getValue == "function") return GM_getValue(name); else { var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); if(value) return unescape(value[2]); return false; } } // // // Konstanten // // Schlüsselname: const KEY_TIME = "ref_time"; // Zeitzonendelta: (wird genutzt in parseDate) const TIMEZONE_OFFSET = new Date().getTimezoneOffset(); // Eine ganze Stunde: const ONE_HOUR = Date.UTC(2010, 0, 1, 1, 0, 0) - Date.UTC(2010, 0, 1, 0, 0, 0); // 60 * 60 * 1000 // // // Frage: Auf welche Zeit soll die Referenzzeit gesetzt werden, wenn man den ersten Hauptlink anklickt? // -> Soll er auf die aktuelle Systemzeitgesetzt werden? Oder ... // Vorteil: Einfacherer // Nachteil: Kann ungelesene Einträge "überspringen", wenn das aktuelle Fenster // -> auf die Zeit, als das Skript geladen wurde. // // // Funktionen // function insertCommandLinks() { // Navigationsmenü finden var path = "/html/body/table/tbody/tr/td/span/table/tbody/tr/td[3]"; var node = document.evaluate( path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE , null).singleNodeValue; if(node) { // Neuen Abschnitt erstellen node.appendChild(document.createElement("hr")); var time = Number( _getValue(KEY_TIME, 0)); node.appendChild(document.createTextNode("[ ")); _createCommandLinkAppend( node, "Referenzzeit festlegen", time > 0 ? new Date(time).toLocaleString() : null, touch); node.appendChild(document.createTextNode(" ]")); if(time > 0) { var refTime = new Date(time); node.appendChild(document.createTextNode(" [ ")); node.appendChild(document.createTextNode(" ")); _createCommandLinkAppend( node, "+", new Date(time + ONE_HOUR).toLocaleString(), add); node.appendChild(document.createTextNode(" ")); _createCommandLinkAppend( node, "-", new Date(time - ONE_HOUR).toLocaleString(), substract); node.appendChild(document.createTextNode(" ]")); } } } function _createCommandLinkAppend(parent, text, title, func) { if(parent) { var link = document.createElement("a"); link.appendChild(document.createTextNode(text)); link.setAttribute("href", "#"); link.setAttribute("title", title); link.addEventListener('click', func, false); parent.appendChild(link); } } function touch() { _setValue(KEY_TIME, String(Number(new Date()))); // Webseite aktualiseren filterDateTime(true); } function add() { var time = Number(_getValue(KEY_TIME, 0)); if(time > 0) { _setValue(KEY_TIME, String(time + ONE_HOUR)); filterDateTime(true); } } function substract() { var time = Number(_getValue(KEY_TIME, 0)); if(time > 0) { _setValue(KEY_TIME, String(time - ONE_HOUR)); filterDateTime(true); } } function colorize(/* bool */ reset, /* int */ min, /* int */ max, /* String */ path) { if(min > 0 && min < max) { var nodes = document.evaluate( path, document, null, XPathResult. UNORDERED_NODE_SNAPSHOT_TYPE, null); if(nodes) for(var i = 0; i < nodes.snapshotLength; ++i) { var node = nodes.snapshotItem(i); var value = parseDate(node.firstChild.textContent); value = (value - min) / (max - min); var color = ""; // leer damit es auch bei einem Reset weider gelöscht werden kann. var paint = reset == true; if(value > 0 && value < 1) { // Farbeinstellungen var r = value < 0.5 ? value * 2 : 1; var g = value < 0.5 ? 1 : 2 - value * 2; var color = "rgb(" + Math.floor(63 * r + 191) + ", " + Math.floor(63 * g + 191) + ", 191)"; paint |= true; } if(paint) // Jede Tabellenzelle in der aktuellen Tabellenreihe soll diese // Hintergrundfarbe erhalten. Es reicht nicht aus nur bei der // Tabellenreihe die Farbe einzustellen. if((node = node.parentNode)) do if(node.nodeType == 1) node.style.backgroundColor = color; while ((node = node.previousSibling)); } } } // Wenn reset == true ist, dann wird die Hintergrundfarbe der Zeile resettet function filterDateTime(reset) { // Es wird nur mit Millisekunden seit Anfang 1970 gerechnet var min = Number(_getValue(KEY_TIME), 0); var max = Number(new Date()); // Aktuelle Uhrzeit // Zeilenerkennung anhand von der entsprechenden HTML-Tabelle, // sollte stabiler sein als die absoluten Pfade. colorize(reset, min, max, "//table[@class=\"forumline\"]/tbody/tr/td[last()]/span"); } // // Gibt die Zeit in vergangen Millisekunden seit 1970 ab. function parseDate(value) { // Dieser Regex trifft nur zu wenn man im Profil als Datumsformat: // "H:i:s d.m.Y" eingetragen hat var expr = /(\d+):(\d+):(\d+) (\d+)\.(\d+)\.(\d+)/; var result = expr.exec(value); if(result != null) { return Date.UTC( result[6], result[5] - 1, // Monat - 1, weil nur dort das Zählen mit 0 beginnt result[4], result[1], result[2], result[3]) + TIMEZONE_OFFSET * 60 * 1000; // Leider kann man nicht die Zeitzone vom Server herausfinden, dehalb // wird die des Clients genommen. } return 0; } insertCommandLinks(); filterDateTime(false);
Was haltet ihr davon? Verbesserungsvorschläge? Anmerkungen?
Aktuelle Version: 1.0.4.1
-
Ich finds super, füg aber bitte für Opera User noch folgenden Code hinzu:
if(typeof GM_setValue!="function") { function GM_setValue(name, value) { document.cookie = name + '=' + escape(value) + '; expires=' + (new Date(2036, 1, 1)).toGMTString() + ';'; } function GM_getValue(name) { var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); if(value) return unescape(value[2]); return false; } }
-
Dank anderem Layout nun auch eine aktuallisierte Fassung? 1.0.4.1
^Kann jedoch bei Textvorschau die Titelleiste rot färben^