Merge branch 'tlwr-master'

This commit is contained in:
n1474335 2017-02-07 14:20:53 +00:00
commit 3b1c378e15
7 changed files with 236 additions and 26 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -82,6 +82,8 @@ var Categories = [
"XOR Brute Force",
"Vigenère Encode",
"Vigenère Decode",
"To Morse Code",
"From Morse Code",
"Substitute",
"Derive PBKDF2 key",
"Derive EVP key",

View File

@ -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. <code>SOS</code> becomes <code>... --- ...</code>",
run: MorseCode.runTo,
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.runFrom,
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
}
]
}
};

View File

@ -0,0 +1,167 @@
/**
* 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", "Comma", "Semi-colon", "Colon"],
/**
* @constant
* @default
*/
WORD_DELIM_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon"],
/**
* @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}
*/
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("<ld>");
});
line = words.join("<wd>");
return line;
});
input = input.join("\n");
input = input.replace(
/<dash>|<dot>|<ld>|<wd>/g,
function(match) {
switch(match) {
case "<dash>": return dash;
case "<dot>": return dot;
case "<ld>": return letterDelim;
case "<wd>": 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, "<dash>");
input = input.replace(/\.|dot/ig, "<dot>");
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;
};
})(),
};

View File

@ -1,21 +1,21 @@
211 source files
114840 lines
212 source files
115050 lines
4.3M size
141 JavaScript source files
105680 lines
3.7M size
142 JavaScript source files
105890 lines
3.8M size
83 third party JavaScript source files
86258 lines
3.0M size
58 first party JavaScript source files
19422 lines
732K size
59 first party JavaScript source files
19632 lines
740K size
3.4M uncompressed JavaScript size
1.9M compressed JavaScript size
15 categories
165 operations
167 operations