[*] -  SecureInfo.eu, /Crypto/morse.py

Back


#!/usr/bin/env python3
#coding: utf-8

from sys import argv,exit
import re
APP = argv[0].split("/")[-1]

###################################################################################################
#
# Commun funcs
#
##

def usage():
  global APP
  print("Usage: {} <-d|-e> [-s separator] [-f file]".format(APP))
  exit()

###################################################################################################
#
# morse.py
#
# from morse import morse_decode, morse_encode
#
##

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)

###################################################################################################
#
# main
#
##

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()
⬆️ Top
admin