#! /usr/bin/env python3

# Copyright (c)2013 Laurence Tratt <http://tratt.net/laurie>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

# This program takes in one or more file / directory names and recursively
# sanitises filenames, replacing unusual characters with safer ones, and
# lower-casing all characters. If a sanitised filename conflicts with an
# existing file, no change is made, and both files are left as-is.


import os, sys


CHARS_MAP = {
  " " : "_",
  "(" : "",
  ")" : "",
  "[" : "",
  "]" : "",
  "'" : "",
  "\"" : "",
  ">" : "",
  "," : "_",
  "?" : "_",
  "!" : "",
  "&" : "and",
  "´" : "'",
  ":" : "_",
  "#" : ""
}


def sanitise(dp):
    for l in os.listdir(dp):
        lp = os.path.join(dp, l)
        rl = l.lower()
        for k, v in CHARS_MAP.items():
            rl = rl.replace(k, v)
        if l != rl:
            rlp = os.path.join(dp, rl)
            if os.path.exists(rlp):
                sys.stderr.write("Can't rename %s to %s: latter exists." % (lp, rlp))
            else:
                os.renames(lp, rlp)
                l = rl
                lp = os.path.join(dp, l)

        if os.path.isdir(lp):
            sanitise(lp)

sanitise(sys.argv[1])
