#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re
import sys
import getopt

"""
	Ersetzt alle deutschen Umlaute ä,ö und ü sowie ß in Dateinamen und Verzeichnissen durch ae, oe und ue sowie ss
	
	Optionen:
	-h: Anzeige des Hilfetextes
	-t: TestModus: Es werden keine verzeichnisse und Dateien umbenannt sondern nur Meldungen rausgeschrieben was getan würde wenn das Flag nicht angegeben wird
	-v: AusführlicherModus: Es werden Meldungen geschrieben, die es erlauben zu verfolgen welche Verzeichnisse gerade bearbeitet werden
	-f: ÜberschreibModus: Falls die umbenannten Verzeichnisse oder Dateien existieren werden sie überschrieben. Ohne dieses Flag wird eine Fehlermeldung geschrieben und nicht überschrieben.
	-d: Angabe des StartVerzeichnisses welches rekursive bearbeitet werden soll. Falls es nicht angegeben wird ist es das aktuelle Verzeichnis

	4.6.2011 framp at linux-tips-and-tricks.de

"""
VERSION="0.1"

reps = {'ä':'ae', 'ö':'oe', 'ü':'ue', 'Ä':'AE', 'Ö':'OE', 'Ü':'UE', 'ß':'ss'}

umlauts=""
for c in reps.keys():
	umlauts+=c

umlauts = "["+umlauts+"]"
umlautsRe = re.compile(umlauts)

renamedFiles=0
skippedFiles=0
overwrittenFiles=0

def usage():
	print "%s %s" % (os.path.basename(sys.argv[0]),VERSION)
	print
	print "	Ersetzt recursiv alle deutschen Umlaute und ß in Dateinamen und Verzeichnissen durch ae,oe,ue und ss"
	print '''Aufruf: %s [OPTIONEN]... [STARTVERZEICHNIS]
		       
		       Optionen: 
	
                       -h --hilfe
                       -t --test
                       -d Startverzeichnis --directory Startverzeichnis
                       -v --verbose
                       -f --force''' % (os.path.basename(sys.argv[0]))
	print
	print "Standard Startverzeichnis ist das aktuelle Verzeichnis"

def pluralize(number):
	if number > 1:
		return "e"
	else:
		return ""	

def replaceAll(text, dic):
	for i, j in dic.iteritems():
		text = text.replace(i, j)
	return text

def renameUmlauts(root, oldName):
	global renamedFiles, skippedFiles, overwrittenFiles

	newName = replaceAll(oldName, reps)
	if not os.path.exists(root+"/"+newName):
		print "%s--- %s wird zu %s umbenannt" % (testModeMessage,root+"/"+oldName,root+"/"+newName)
		renamedFiles+=1
		if not testMode:
			os.rename(root+"/"+oldName,root+"/"+newName)
	elif forceMode:
		print "%s!!! %s wird zu %s umbenannt und überschreibt eine existierende Datei" % (testModeMessage,root+"/"+oldName,root+"/"+newName)
		overwrittenFiles=+1
		if not testMode:
			os.rename(root+"/"+oldName,root+"/"+newName)		
	else:
		skippedFiles=+1
		print "%s??? %s kann nicht zu %s umbenannt werden da die neue Datei schon existiert" % (testModeMessage,root+"/"+oldName,root+"/"+newName)

testMode=False
testModeMessage=""
startDirectory="."
verbose=False
forceMode=False

try:
	opts, args = getopt.getopt(sys.argv[1:], "tvfhd:", 
  								["test",
								"verbose",
								"force",
								"help",
								"directory"]); 

except getopt.GetoptError, err:
	print str(err) # will print something like "option -a not recognized"
	usage()
	sys.exit(0)
		
for o, a in opts:
	if o in ("-t", "--test"):
		testMode = True
		testModeMessage="TESTMODE: "
	elif o in ("-d", "--directory"):
		startDirectory=a									
	elif o in ("-f", "--force"):
		forceMode=True								
	elif o in ("-v", "--verbose"):
		verbose=True								
	elif o in ("-h", "--help"):
		usage()
		sys.exit(0)								
	else:
		assert False, "Unhandled option " + o	
	
if not os.path.exists(startDirectory):
	print "??? Startverzeichnis %s existiert nicht" % (startDirectory)	
	sys.exit(2)

for root, dirs, files in os.walk(startDirectory,topdown=False):
	if verbose:
		print "%s--- Bearbeite Verzeichnis %s" % (testModeMessage,root)
	for file in files:
		if re.search(umlautsRe,file):
			renameUmlauts(root,file)
	for dir in dirs:
		if re.search(umlautsRe,dir):
			renameUmlauts(root,dir)

print "%s*** %d Element%s umbenannt" % (testModeMessage,renamedFiles-skippedFiles, pluralize(renamedFiles-skippedFiles))
if not forceMode:
	print "%s*** %d Element%s übersprungen" % (testModeMessage,skippedFiles, pluralize(skippedFiles))
else:
	print "%s*** %d Element%s überschrieben" % (testModeMessage,overwrittenFiles, pluralize(overwrittenFiles))

