OS2.spielerhistorie: Unterschied zwischen den Versionen

Aus Online-Soccer-Wiki
Zur Navigation springen Zur Suche springen
(Geeignet für Greasemonkey 4.0/Firefox 57.0 Quantum, Header, @include-Pattern)
(→‎Quellcode: Installations- und Ansichtslink auf GitHub)
 
Zeile 37: Zeile 37:
Über die Tabellenbreite stellt man im Endeffekt die Breite der Spalten und deren scheinbaren Abstand voneinander ein.
Über die Tabellenbreite stellt man im Endeffekt die Breite der Spalten und deren scheinbaren Abstand voneinander ein.


== Quellcode ==
== [https://github.com/Eselce/OS2.scripts/blob/master/OS2.spielerhistorie.user.js Quellcode] [https://eselce.github.io/OS2.scripts/OS2.spielerhistorie.user.js INSTALLATION] ==
<pre>
<pre>
// ==UserScript==
// ==UserScript==

Aktuelle Version vom 19. November 2017, 15:15 Uhr

OS2.spielerhistorie
Dateiname os2.spielerhistorie.user.js
Version 0.1 (WebExtensions)
Autor Andreas Eckes, Strindheim BK
Beschreibung OS 2.0 - Zeigt absoluten und relativen MW-Zuwachs in Spielerhistorie an
Webseiten sp.php?s=*
Funktionalität Neue Spalten für absolute und relative MW-Differenz, Trennstriche zwischen Saisons
Letzte Änderung 19.11.2017

Hinweise[Bearbeiten]

Über vier Konfigurationsvariablen kann gesteuert werden

  • welche Titel die beiden neuen Spalten haben
  • welche Breite in Pixel die Tabelle der Spielerhistorie hat (OS-Standardwert ist 750)
  • wie die Text-Ausrichtung in den neuen Spalten ist (left, right oder center)

Über die Tabellenbreite stellt man im Endeffekt die Breite der Spalten und deren scheinbaren Abstand voneinander ein.

Quellcode INSTALLATION[Bearbeiten]

// ==UserScript==
// @name         OS2.spielerhistorie
// @namespace    http://os.ongapo.com/
// @version      0.1-SLC-WE
// @copyright    2013+
// @author       Andreas Eckes (Strindheim BK)
// @description  OS 2.0 - Zeigt absoluten und relativen MW-Zuwachs in Spielerhistorie an
// @include      /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/sp\.php\?s=\d+$/
// @grant        none
// ==/UserScript==

// Konfiguration ************************************************************************
var titelMwAbsolut = "\u0394MW abs."; // Titel der Spalte fuer die absolute MW-Differenz
var titelMwRelativ = "\u0394MW rel."; // Titel der Spalte fuer die relative MW-Differenz
var tabellenbreite = 600; // Breite der Tabelle in Pixel (standardmaessig 750)
var textAusrichtung = "right"; // Text-Ausrichtung in den neuen Spalten
// Konfiguration Ende *******************************************************************

var colorPos = "#00FF00";
var colorNeg = "#FF0000";
var borderString = "solid white 1px";
var offsetTop = 1;
var offsetBottom = 1;
var table = document.getElementById("e").getElementsByTagName("table")[0];
var offsets = [offsetTop, offsetBottom, 0, 0]; // 1 Zeilen oben, 1 Zeile unten ausschliessen
var colIdxMwSum = 2;

var mw = 0;
var mwPrev = 0;
var mwDiffAbsString = "";
var mwDiffRelString = "";
var color = "";

// Tabellenbreite
table.setAttribute("width", tabellenbreite);
// Ueberschriften
appendCell(table.rows[0], titelMwAbsolut, "", "center");
appendCell(table.rows[0], titelMwRelativ, "", "center");
// Werte berechnen und eintragen
for (var i = offsetTop; i < table.rows.length - offsetBottom; i++) {
	mw = stringToNumber(table.rows[i].cells[colIdxMwSum].textContent);
	mwPrev = stringToNumber(table.rows[i + 1].cells[colIdxMwSum].textContent);
	mwDiffAbsString = wholeNumberToString(mw - mwPrev);
	mwDiffRelString = decimalNumberToString((mw - mwPrev) / mwPrev, 2, true);
	color = (mw - mwPrev >= 0) ? colorPos : colorNeg;
	appendCell(table.rows[i], mwDiffAbsString, color, textAusrichtung);
	appendCell(table.rows[i], mwDiffRelString, color, textAusrichtung);
}
// Linien zeichnen
drawHorizontalLines(table, offsets, 1, 5);

// ****************************************************************************
// Hilfsfunktionen
// ****************************************************************************

// Zeichnet horizontale Linien in eine Tabelle (jeweils als unteren Rand von Zellen)
// table: zu bearbeitende Tabelle
// offsets[0]/[1]: Anzahl Zeilen oben/unten, die ignoriert werden; [2]/[3]: Anzahl Spalten links/rechts, die ignoriert werden
// mode = 1: Saisons trennen ("i != i + 1")
// mode = 2: Abrechnungsperioden trennen ("% 7 == 0")
// mode = 3: Abrechnungsperioden trennen ("% 6 == 0")
// colIdx: Index der Spalte, die die zu vergleichenden Werte enthaelt
function drawHorizontalLines(table, offsets, mode, colIdx) {
	for (var i = offsets[0]; i < table.rows.length - offsets[1]; i++) {
		switch (mode) {
			case 1: // Saisons trennen
				var value1 = parseInt(table.rows[i].cells[colIdx].textContent);
				var value2 = parseInt(table.rows[i + 1].cells[colIdx].textContent);
				if (value1 != value2) {
					for (var j = offsets[2]; j < table.rows[i].cells.length - offsets[3]; j++) {
						table.rows[i].cells[j].style.borderBottom = borderString;
					}
				}
				break;
			case 2: // Abrechnungsperioden trennen (Saison 1)
				var value = parseInt(table.rows[i].cells[colIdx].textContent);
				if (value % 7 == 0) {
					for (var j = offsets[2]; j < table.rows[i].cells.length - offsets[3]; j++) {
						table.rows[i].cells[j].style.borderBottom = borderString;
					}
				}
				break;
			case 3: // Abrechnungsperioden trennen (Saisons > 1)
				var value = parseInt(table.rows[i].cells[colIdx].textContent);
				if (value % 6 == 0) {
					for (var j = offsets[2]; j < table.rows[i].cells.length - offsets[3]; j++) {
						table.rows[i].cells[j].style.borderBottom = borderString;
					}
				}
				break;
		}
	}
}

// Fuegt eine Zelle am Ende einer Zeile hinzu, fuellt die Zelle und gibt sie (td-Tag) zurueck.
// row: Zeile, die verlaengert wird
// text: Textinhalt der neuen Zelle
// color: Schriftfarbe der neuen Zelle (z.B. "#FFFFFF" fuer weiss)
// alignment: Ausrichtung des Texts (left, center, right)
// Bei Aufruf ohne Farbe wird die Standardfarbe benutzt
function appendCell(row, content, color, alignment) {
	var returnValue = row.insertCell(-1);
	returnValue.textContent = content;
	returnValue.style.color = color;
	if (alignment != "") { returnValue.align = alignment; }
	return returnValue;
}

// Wandelt eine Dezimalzahl in einen String um ("." als Dezimalzeichen).
// Fuer Prozentzahlen wird der Wert verhundertfacht und " %" rechts angehaengt.
// number: Die Zahl, die umgewandelt werden soll
// decimalDigits: Anzahl der Nachkommastellen in der Ausgabe (werden erzwungen)
// percent: Ob die Zahl als Prozentwert dargestellt werden soll
function decimalNumberToString(number, decimalDigits, percent) {
	var returnValue = "";
	if (percent) { number *= 100; }
	number = number.toFixed(decimalDigits);
	returnValue = number.toString();
	if (percent) { returnValue += " %"; }
	return returnValue;
}

// Wandelt eine ganze Zahl in einen String um ("." als Tausenderzeichen).
// number: Die Zahl, die umgewandelt werden soll
function wholeNumberToString(number) {
	var returnValue = "";
	var temp = "";
	var counter = 0;
	for (var i = number.toString().length - 1; i >= 0; i--) {
		temp += number.toString().charAt(i);
		counter += 1;
		if (((counter % 3) == 0) && (i > 0) && (number.toString().charAt(i - 1) != "-")) { temp += "."; }
	}
	for (var i = temp.length - 1; i >= 0; i--) {
		returnValue += temp.charAt(i);
	}
	return returnValue;
}

// Wandelt einen String in eine Zahl um.
// Prozentzahlen-Strings werden als Zahl interpretiert (d.h. "100%" -> 1).
// Ganze Zahlen mit Tausenderpunkten werden erkannt, wenn sie mit "." gefolgt von 3 Ziffern enden.
// Dezimalzahlen werden erkannt, wenn sie mit "." gefolgt von beliebig vielen Ziffern enden.
// Da zuerst auf ganze Zahlen geprueft wird, koennen Dezimalzahlen nicht 3 Nachkommaziffern haben.
function stringToNumber(string) {
	// parseXXX interpretiert einen Punkt immer als Dezimaltrennzeichen
	var returnValue = "";
	var percent = false;
	// Buchstaben und Whitespaces entfernen
	string = string.replace(/[\sa-zA-Z]/g, "");
	// Auf % pruefen und % entfernen
	if (string.lastIndexOf("%") != -1) {
		percent = true;
		string = string.replace(/%/g, "");
	}
	var regexpWholeSimple = /^\d+$/;
	var regexpWholeWithDots = /^\d+(\.\d{3}){1,}$/;
	var regexpDecimal = /^\d*\.\d{1,}$/;
	if (regexpWholeSimple.test(string)) {
		// Einfache ganze Zahl
		returnValue = parseInt(string);
	} else if (regexpWholeWithDots.test(string)) {
		// Ganze Zahl mit Tausenderpunkten
		returnValue = parseInt(string.replace(/\./g, ""));
	} else if (regexpDecimal.test(string)) {
		// Dezimalzahl mit Punkt als Trennzeichen
		returnValue = parseFloat(string);
	} else {
		// Kein gueltiger String
		percent = false;
		returnValue = "";
	}
	if (percent) { returnValue /= 100; }
	return returnValue;
}