Benutzer:SlashMe/StockCar.py

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Mit diesem Python-Skript und den Daten aus der CSV-Datei unter Benutzer:SlashMe/StockCar.csv kann die Tabelle unter TV total Stock Car Crash Challenge#Medaillengewinner erstellt werden.

Inhalt der Datei

[Bearbeiten | Quelltext bearbeiten]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import csv, sys

"""
Formatiert und sortiert die Medaillengewinner der [[TV total Stock Car Crash Challenge]]

Aufruf: python StockCar.py <Tabelle.csv  >Wiki.txt
Tabelle sollte eine CSV-Datei sein, mit Tabs getrennt, mit " umschlossen.
In der ersten Zeile müssen die Spalten stehen:

"Name"	"Link"	"Land"	"von"	"bis"	"Gold"	"Silber"	"Bronze"	"Rodeo{{FN|1}}"

Link ist dabei die Zielseite, z.B. "Elton (Moderator)", kann leer gelassen werden, wenn identisch zum Namen.
"""

# Hilfsfunktionen für die Ausgabe
last_points = None
last_rank = None

def key_position(data, title, row_number):
	"Gibt den Platz des Teilnehmers aus. Mit last_points und last_rank wird bei gleichen Punktzahlen der gleiche Platz ausgegeben."
	global last_points, last_rank
	
	if row_value(data) == last_points:
		pos = last_rank
	else:
		pos = row_number+1
		last_points = row_value(data)
		last_rank = pos
	
	if pos < 10:
		return "{{0}}%s." % pos
	return "%s." % pos

def key_name(data, title, row_number):
	"Gibt den Namen aus, verlinkt und mit SortKey."
	name = data['Name']
	link = data['Link']
	sort = name.split(" ")
	sort.reverse()
	sort = ", ".join(sort)
	
	if link != "" and link != name:
		name = '%s|%s' % (link, name)
	
	return 'align="left" | {{SortKey|%s|[[%s]]}}' % (sort, name)

def key_country(data, title, row_number):
	"Gibt das Land des Teilnehmers über die entsprechende Vorlage aus."
	return 'align="left" | {{%s}}' % data['Land']

def key_sum(data, title, row_number):
	"Gibt die Anzahl der Gesamtsiege aus"
	return sum((int(data[i]) for i in ('Gold', 'Silber', 'Bronze', 'Rodeo{{FN|1}}')))

# Welche Spalten bestimmen die Reihenfolge und wie stark werden sie gewichtet?
ratings = \
{
	'Gold':         1000,
	'Silber':        100,
	'Bronze':         10,
	'Rodeo{{FN|1}}': 999
}

# Welche Spalten sollen ausgegeben werden?
# Bedeutung der Werte
# 0: Titel der Spalte
# 1: Farbe des Spaltenkopfs (leer für Standard)
# 2: Farbe der Spalte (leer für Standard)
# 3: Eine Funktion, die den Inhalt der Spalte formatieren/berechnen soll.
columns = \
(
	('Platz',         '',       '',       key_position),
	('Name',          '',       '',       key_name),
	('Land',          '',       '',       key_country),
	('von',           '',       '',       None),
	('bis',           '',       '',       None),
	('Gold',          'FFD700', 'F7F6A8', None),
	('Silber',        'C0C0C0', 'DCE5E5', None),
	('Bronze',        'CC9966', 'FFDAB9', None),
	('Rodeo{{FN|1}}', '',       '',       None),
	('Gesamt',        '',       '',       key_sum)
)

def row_value(row):
	"Berechnet die Punktzahl. Wird zur Sortierung benutzt"
	points = 0
	for i in ratings:
		points += ratings[i] * float(row[i])
	
	return -points # Sortierung umkehren
	

def format(fileIn, fileOut, key, columns, ratings):
	"""
Liest die CSV-Datei fileIn ein, sortiert sie und gibt das Wiki-Markup in fileOut aus.
"""
	reader = csv.DictReader(fileIn, delimiter='\t', quotechar='"')
	
	rows = sorted(reader, key=key)
	
	fileOut.write('<!-- Erstellt mit [[Benutzer:SlashMe/StockCar.py]] -->\n{| class="wikitable sortable center" width="100%"\n|-\n')
	
	for title, color_title, color_body, func in columns:
		if color_title:
			fileOut.write('! style="background-color:#%s" | %s\n' % (color_title, title))
		else:
			fileOut.write('! %s\n' % title)
	
	i = 0
	
	for row in rows:
		fileOut.write('|-\n');
		
		for title, color_title, color_body, func in columns:
			if color_body:
				fileOut.write('| bgcolor="#%s" | ' % color_body)
			else:
				fileOut.write('| ')
			
			if func:
				fileOut.write('%s\n' % func(row, title, i))
			else:
				fileOut.write('%s\n' % row[title])
		
		i += 1
	
	fileOut.write('|}\n')

if __name__ == '__main__':
	format(sys.stdin, sys.stdout, row_value, columns, ratings)