from sys import argv,exit
import re
APP = argv[0].split("/")[-1]
def usage():
global APP
print("Usage: {} <-d|-e> [-s separator] [-f file]".format(APP))
exit()
latin_alphabet = {
'a': ".-" , 'b': "-..." , 'c': "-.-." , 'd': "-.." , 'e': "." , 'f': "..-." , 'g': "--." ,
'h': "...." , 'i': ".." , 'j': ".---" , 'k': "-.-" , 'l': ".-.." , 'm': "--" , 'n': "-." ,
'o': "---" , 'p': ".--." , 'q': "--.-" , 'r': ".-." , 's': "..." , 't': "-" , 'u': "..-" ,
'v': "...-" , 'w': ".--" , 'x': "-..-" , 'y': "-.--" , 'z': "--.." ,
'1': ".----" , '2': "..---" , '3': "...--" , '4': "....-" , '5': "....." ,
'6': "-...." , '7': "--..." , '8': "---.." , '9': "----." , '0': "-----"
}
morse_alphabet = {
".-" : 'a' , "-..." : 'b' , "-.-." : 'c' , "-.." : 'd' , "." : 'e' , "..-.": 'f' , "--.":'g' ,
"...." : 'h' , ".." : 'i' , ".---" : 'j' , "-.-" : 'k' , ".-.." : 'l' , "--" : 'm' , "-." :'n' ,
"---" : 'o' , ".--." : 'p' , "--.-" : 'q' , ".-." : 'r' , "..." : 's' , "-" : 't' , "..-":'u' ,
"...-" : 'v' , ".--" : 'w' , "-..-" : 'x' , "-.--" : 'y' , "--.." : 'z' ,
".----": '1' , "..---": '2' , "...--": '3' , "....-": '4' , ".....": '5' ,
"-....": '6' , "--...": '7' , "---..": '8' , "----.": '9' , "-----": '0'
}
"""
Morse.latin_alphabet
dictionnary with latin letter as index
Morse.morse_alphabet
dictionnary with morse code as index
Exemples:
morse_encode("sos")
morse_decode("... --- ...")
"""
def detect_dash(text):
"""
detect dash
detect_dash("--- ... ---")
"-"
detect_dash("___ ... ___")
"_"
detect_dash("——— ... ———")
"—"
"""
for dash in ['-', '_', '—']:
if dash+' ' in text and ('.'+dash in text or dash+'.' in text or dash+dash in text):
return(dash)
return('-')
def morse_encode(text,suffix=" ",line="-"):
"""
encode latin text to morse text :
encode("sos")
"... --- ..."
encode("sos",suffix=" / ",line="=")
"... / === / ..."
"""
result = ""
global latin_alphabet
alphabet = latin_alphabet
for letter in text:
if letter in alphabet:
result += alphabet[letter] + suffix
else:
result += letter + suffix
return(result.replace("-",line))
def morse_decode(text,separator=" ",suffix="",line="-"):
"""
decode morse text to latin text :
decode("... --- ...")
"sos"
decode("... --- ..."," ")
"s o s"
decode("... --- ..."," / ")
"s / o / s"
decode(".../___/...",separator="/",suffix=" - ",line="_")
s - o - s
"""
result = ""
global morse_alphabet
alphabet = morse_alphabet
if "/" in text:
separator = "/"
for letter in text.split(separator):
letter = letter.replace(line,"-")
if letter in alphabet:
result += alphabet[letter] + suffix
else:
result += letter + suffix + separator
if suffix:
return(result[:-1*len(suffix)])
result = re.sub(r"\s+"," ",result)
return(result)
operation, infile, intext, txt, sep = "encode", "", "", "", " "
for i in range(len(argv)):
if argv[i] == "-f":
infile = argv[i+1]
if argv[i] == "-s":
sep = argv[i+1]
if argv[i] == "-d":
operation = "decode"
if argv[i] == "-e":
operation = "encode"
if argv[i] == "-h":
usage()
exit()
if infile:
try:
txt = open(infile).read().replace("\n"," ")
except:
print("Error: something went wrong while reading file '%s'" % infile)
exit(2)
elif intext:
txt = intext
else:
txt = open("/dev/stdin").read().replace("\n"," ")
if operation == "decode":
print( morse_decode(txt,separator=sep,line=detect_dash(txt)) )
elif operation == "encode":
print( morse_encode(txt.lower(),suffix=sep) )
else:
usage()