var Utils = require("../Utils.js"); /** * Morse Code translation operations. * * @author tlwr [toby@toby.codes] * @copyright Crown Copyright 2017 * @license Apache-2.0 * * @namespace */ var MorseCode = module.exports = { /** * @constant * @default */ FORMAT_OPTIONS: ["-/.", "_/.", "Dash/Dot", "DASH/DOT", "dash/dot"], /** * @constant * @default */ LETTER_DELIM_OPTIONS: ["Space", "Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"], /** * @constant * @default */ WORD_DELIM_OPTIONS: ["Line feed", "CRLF", "Forward slash", "Backslash", "Comma", "Semi-colon", "Colon"], /** * @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} */ runTo: function(input, args) { var format = args[0].split("/"); var dash = format[0]; var dot = format[1]; var letterDelim = Utils.charRep[args[1]]; var wordDelim = Utils.charRep[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 letterDelim; case "": return wordDelim; } } ); return input; }, /** * From Morse Code operation. * * @param {string} input * @param {Object[]} args * @returns {string} */ runFrom: (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 letterDelim = Utils.charRep[args[0]]; var wordDelim = Utils.charRep[args[1]]; input = input.replace(/-|‐|−|_|–|—|dash/ig, ""); //hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash input = input.replace(/\.|·|dot/ig, ""); var words = input.split(wordDelim); words = Array.prototype.map.call(words, function(word) { var signals = word.split(letterDelim); var letters = signals.map(function(signal) { return reversedTable[signal]; }); return letters.join(""); }); words = words.join(" "); return words; }; })(), };