瀏覽代碼

Add initial functionality

Added "To Morse Code" and "From More Code" functions under the category
"Encryption / Encoding".

"To Morse Code" accepts 3 arguments:
1. Format options: e.g. ./- or Dot/Dash
2. Letter delimiter e.g. <space> or <newline>
3. Word delimiter e.g. <newline>

"From Morse Code" accepts 2 arguments:
1. Letter delimiter
2. Word delimiter
toby 8 年之前
父節點
當前提交
230ba5ff67
共有 3 個文件被更改,包括 212 次插入0 次删除
  1. 2 0
      src/js/config/Categories.js
  2. 41 0
      src/js/config/OperationConfig.js
  3. 169 0
      src/js/operations/MorseCode.js

+ 2 - 0
src/js/config/Categories.js

@@ -85,6 +85,8 @@ var Categories = [
             "Substitute",
             "Derive PBKDF2 key",
             "Derive EVP key",
+            "To Morse Code",
+            "From Morse Code",
         ]
     },
     {

+ 41 - 0
src/js/config/OperationConfig.js

@@ -2952,5 +2952,46 @@ var OperationConfig = {
                 value: Cipher.SUBS_CIPHERTEXT
             }
         ]
+    },
+    "To Morse Code": {
+        description: "Translates alphanumeric characters into International Morse Code.<br><br>Ignores non-Morse characters.<br><br>e.g. SOS becomes ... --- ...",
+        run: MorseCode.translateTo,
+        inputType: "string",
+        outputType: "string",
+        args: [
+            {
+                name: "Format options",
+                type: "option",
+                value: MorseCode.FORMAT_OPTIONS
+            },
+            {
+                name: "Letter delimiter",
+                type: "option",
+                value: MorseCode.LETTER_DELIM_OPTIONS
+            },
+            {
+                name: "Word delimiter",
+                type: "option",
+                value: MorseCode.WORD_DELIM_OPTIONS
+            }
+        ]
+    },
+    "From Morse Code": {
+        description: "Translates Morse Code into (upper case) alphanumeric characters.",
+        run: MorseCode.translateFrom,
+        inputType: "string",
+        outputType: "string",
+        args: [
+            {
+                name: "Letter delimiter",
+                type: "option",
+                value: MorseCode.LETTER_DELIM_OPTIONS
+            },
+            {
+                name: "Word delimiter",
+                type: "option",
+                value: MorseCode.WORD_DELIM_OPTIONS
+            }
+        ]
     }
 };

+ 169 - 0
src/js/operations/MorseCode.js

@@ -0,0 +1,169 @@
+/**
+ * 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": "<dot><dash>",
+        "B": "<dash><dot><dot><dot>",
+        "C": "<dash><dot><dash><dot>",
+        "D": "<dash><dot><dot>",
+        "E": "<dot>",
+        "F": "<dot><dot><dash><dot>",
+        "G": "<dash><dash><dot>",
+        "H": "<dot><dot><dot><dot>",
+        "I": "<dot><dot>",
+        "J": "<dot><dash><dash><dash>",
+        "K": "<dash><dot><dash>",
+        "L": "<dot><dash><dot><dot>",
+        "M": "<dash><dash>",
+        "N": "<dash><dot>",
+        "O": "<dash><dash><dash>",
+        "P": "<dot><dash><dash><dot>",
+        "Q": "<dash><dash><dot><dash>",
+        "R": "<dot><dash><dot>",
+        "S": "<dot><dot><dot>",
+        "T": "<dash>",
+        "U": "<dot><dot><dash>",
+        "V": "<dot><dot><dot><dash>",
+        "W": "<dot><dash><dash>",
+        "X": "<dash><dot><dot><dash>",
+        "Y": "<dash><dot><dash><dash>",
+        "Z": "<dash><dash><dot><dot>",
+        "1": "<dot><dash><dash><dash><dash>",
+        "2": "<dot><dot><dash><dash><dash>",
+        "3": "<dot><dot><dot><dash><dash>",
+        "4": "<dot><dot><dot><dot><dash>",
+        "5": "<dot><dot><dot><dot><dot>",
+        "6": "<dash><dot><dot><dot><dot>",
+        "7": "<dash><dash><dot><dot><dot>",
+        "8": "<dash><dash><dash><dot><dot>",
+        "9": "<dash><dash><dash><dash><dot>",
+        "0": "<dash><dash><dash><dash><dash>",
+    },
+
+
+    /**
+     * 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]];
+
+        var words = input.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("<ld>");
+        });
+
+        var morse = words.join("<wd>");
+        morse = morse.replace(/<dash>/g, dash);
+        morse = morse.replace(/<dot>/g, dot);
+        morse = morse.replace(/<ld>/g, letter_delim);
+        morse = morse.replace(/<wd>/g, word_delim);
+
+        return morse;
+    },
+    
+    
+    /**
+     * 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, "<dash>")
+            input = input.replace(/\.|dot/ig, "<dot>")
+
+            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;
+        };
+    })(),
+    
+};