/** * Morse Code translation operations. * * @author tlwr [toby@toby.codes] * @copyright Crown Copyright 2017 * @license Apache-2.0 * * @namespace */ var MorseCode = { /** * @constant * @default */ FORMAT_OPTIONS: ["-/.", "_/.", "Dash/Dot", "DASH/DOT", "dash/dot"], /** * @constant * @default */ LETTER_DELIM_OPTIONS: ["space", "line feed", "crlf"], /** * @constant * @default */ WORD_DELIM_OPTIONS: ["line feed", "crlf", "space"], /** * @constant * @default */ OPTION_TABLE: { "space": " ", "line feed": "\n", "crlf": "\r\n" }, /** * @constant * @default */ MORSE_TABLE: { "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": "", }, /** * To Morse Code operation. * * @param {number} input * @param {Object[]} args * @returns {string} */ translateTo: function(input, args) { var format = args[0].split("/"); var dash = format[0]; var dot = format[1]; var letter_delim = MorseCode.OPTION_TABLE[args[1]]; var word_delim = MorseCode.OPTION_TABLE[args[2]]; input = input.split(/\r?\n/); input = Array.prototype.map.call(input, function(line) { var words = line.split(/ +/); words = Array.prototype.map.call(words, function(word) { var letters = Array.prototype.map.call(word, function(character) { var letter = character.toUpperCase(); if(typeof MorseCode.MORSE_TABLE[letter] == "undefined") { return ""; } return MorseCode.MORSE_TABLE[letter]; }); return letters.join(""); }); line = words.join(""); return line; }); input = input.join("\n"); input = input.replace( /|||/g, function(match) { switch(match) { case "": return dash; case "": return dot; case "": return letter_delim; case "": return word_delim; } } ); return input; }, /** * From Morse Code operation. * * @param {string} input * @param {Object[]} args * @returns {string} */ translateFrom: (function() { var reversedTable = null; var reverseTable = function() { reversedTable = {}; for(var letter in MorseCode.MORSE_TABLE) { var signal = MorseCode.MORSE_TABLE[letter]; reversedTable[signal] = letter; } }; return function(input, args) { if(reversedTable === null) { reverseTable(); } var letter_delim = MorseCode.OPTION_TABLE[args[0]]; var word_delim = MorseCode.OPTION_TABLE[args[1]]; input = input.replace(/-|_|dash/ig, "") input = input.replace(/\.|dot/ig, "") var words = input.split(word_delim); words = Array.prototype.map.call(words, function(word) { var signals = word.split(letter_delim); var letters = signals.map(function(signal) { return reversedTable[signal]; }); var word = letters.join(""); return word; }); words = words.join(" "); return words; }; })(), };