#!/usr/bin/env python
#
# l33t.py - Turn the the input string to l33t-speak.  Provide a way
#           to do the inverse
#
# Copyright (C) 2007 Michael Davies <michael@the-davies.net>
#
# e.g. Encoding example:
# fluorine:bin mdavies$ ./l33t.py enc "the quick brown fox jumped over the lazy dog"
7 # 3 . q u 1 [ X . 8 ? 0 w n . f 0 % . j u m 9 3 ) . 0 v 3 ? . 7 # 3 . | 4 2 y . ) 0 6
#
# e.g. Decoding example
# fluorine:bin mdavies$ ./l33t.py dec "7 # 3 . q u 1 [ X . 8 ? 0 w n . f 0 % . j u m 9 3 ) . 0 v 3 ? . 7 # 3 . | 4 2 y . ) 0 6"
# the quick brown fox jumped over the lazy dog
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
import re
import sys
import string

def encode(strings):
    # nested string comprehension, I love python :-)
    return " . ".join([" ".join([_enc(string.lower(ch)) for ch in list(str)]) for str in strings])

def _enc(ch):
    if (ch) == 'a':
        return '4'
    elif (ch) == 'b':
        return '8'
    elif (ch) == 'c':
        return '['
    elif (ch) == 'd':
        return ')'
    elif (ch) == 'e':
        return '3'
    elif (ch) == 'f':
        return 'f'
    elif (ch) == 'g':
        return '6'
    elif (ch) == 'h':
        return '#'
    elif (ch) == 'i':
        return '1'
    elif (ch) == 'j':
        return 'j'
    elif (ch) == 'k':
        return 'X'
    elif (ch) == 'l':
        return '|'
    elif (ch) == 'm':
        return 'm'
    elif (ch) == 'n':
        return 'n'
    elif (ch) == 'o':
        return '0'
    elif (ch) == 'p':
        return '9'
    elif (ch) == 'q':
        return 'q'
    elif (ch) == 'r':
        return '?'
    elif (ch) == 's':
        return '5'
    elif (ch) == 't':
        return '7'
    elif (ch) == 'u':
        return 'u'
    elif (ch) == 'v':
        return 'v'
    elif (ch) == 'w':
        return 'w'
    elif (ch) == 'x':
        return '%'
    elif (ch) == 'y':
        return 'y'
    elif (ch) == 'z':
        return '2'
    elif (ch) == '1':
        return '1'
    elif (ch) == '2':
        return '2'
    elif (ch) == '3':
        return '3'
    elif (ch) == '4':
        return '4'
    elif (ch) == '5':
        return '5'
    elif (ch) == '6':
        return '6'
    elif (ch) == '7':
        return '7'
    elif (ch) == '8':
        return '8'
    elif (ch) == '9':
        return '9'
    elif (ch) == '0':
        return '0'
    elif (ch) == ' ':
        return '.'
    else:
        return ch

def decode(strings):
    # nested string comprehension, I love python :-)
    return " ".join(["".join([_dec(atom) for atom in str.split()]) for str in strings])

def _dec(ch):
    if (ch) == '4':
        return 'a'
    elif (ch) == '8':
        return 'b'
    elif (ch) == '[':
        return 'c'
    elif (ch) == ')':
        return 'd'
    elif (ch) == '3':
        return 'e'
    elif (ch) == 'f':
        return 'f'
    elif (ch) == '6':
        return 'g'
    elif (ch) == '#':
        return 'h'
    elif (ch) == '1':
        return 'i'
    elif (ch) == 'j':
        return 'j'
    elif (ch) == 'X':
        return 'k'
    elif (ch) == '|':
        return 'l'
    elif (ch) == 'm':
        return 'm'
    elif (ch) == 'n':
        return 'n'
    elif (ch) == '0':
        return 'o'
    elif (ch) == '9':
        return 'p'
    elif (ch) == 'q':
        return 'q'
    elif (ch) == '?':
        return 'r'
    elif (ch) == '5':
        return 's'
    elif (ch) == '7':
        return 't'
    elif (ch) == 'u':
        return 'u'
    elif (ch) == 'v':
        return 'v'
    elif (ch) == 'w':
        return 'w'
    elif (ch) == '%':
        return 'x'
    elif (ch) == 'y':
        return 'y'
    elif (ch) == '2':
        return 'z'
    elif (ch) == '1':
        return '1'
    elif (ch) == '2':
        return '2'
    elif (ch) == '3':
        return '3'
    elif (ch) == '4':
        return '4'
    elif (ch) == '5':
        return '5'
    elif (ch) == '6':
        return '6'
    elif (ch) == '7':
        return '7'
    elif (ch) == '8':
        return '8'
    elif (ch) == '9':
        return '9'
    elif (ch) == '0':
        return '0'
    elif (ch) == '.':
        return ' '
    else:
        return ch

if __name__ == "__main__":
    if (len(sys.argv) == 1):
        pass
    elif (sys.argv[1] == "enc") or (sys.argv[1] == "encode"):
        print encode(sys.argv[2:])
    elif (sys.argv[1] == "dec") or (sys.argv[1] == "decode"):
        print decode(sys.argv[2:])
    elif (sys.argv[0] == "l33t.py"):
        print decode(sys.argv[1:])
    else:
        print encode(sys.argv[1:])
# This file has been zigned!  See http://michaeldavies.org/zign-tools
# zign-version: 0.9.4
# zign-hashes: MD5, SHA-1
# -----BEGIN PGP SIGNED MESSAGE-----
# Hash: SHA1
# 
# 7c6c13897e33a4bcf17f87117a3462241c9ae4cbf4d856bcd6df7486f02ff00c8685ac36
# -----BEGIN PGP SIGNATURE-----
# Version: GnuPG v1.4.7 (Darwin)
# 
# iD8DBQFHmzko7kkvCQqp1vwRAuSmAJ9JW1fIyORHNmYp3HCLSyNrM7C3KgCfQQdA
# x+L2L5zP290RBj3yJQCTpQM=
# =Oub5
# -----END PGP SIGNATURE-----
# zign: Protecting you since 2007 :-)
# 