CyberChef/src/core/operations/EscapeSmartCharacters.mjs

151 lines
3.9 KiB
JavaScript
Raw Normal View History

2021-12-17 12:48:51 +00:00
/**
* @author john19696 [john19696@protonmail.com]
* @copyright Crown Copyright 2021
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
// import OperationError from "../errors/OperationError.mjs";
/**
* Escape Smart Characters operation
*/
class EscapeSmartCharacters extends Operation {
/**
* EscapeSmartCharacters constructor
*/
constructor() {
super();
this.name = "Escape Smart Characters";
this.module = "Default";
this.description = "An operation to convert smart characters (quotes, dashes, apostrophes, \
arrows, copyright signs, ellipses etc.) back to plain ASCII.\
<br>";
this.infoURL = "http://unicode.scarfboy.com/?s=quotation+mark";
this.inputType = "string";
this.outputType = "string";
this.args = [
/* Arguments. See the project wiki for full details.*/
{
name: "Second arg",
type: "option",
value: ["Escape", "Remove", "Replace with '.'"]
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const [outArg] = args;
/* JSON map of characters to escape
generated by EscapeSmartCharacters.xls in doc
*/
const ESCAPE_MAP = {
// Pasted from git:/doc/SmartEscape.xlsx
"‘": "'",
"’": "'",
"“": "\"",
"”": "\"",
"©": "(C)",
"®": "(R)",
"™": "(TM)",
"→": "-->",
"←": "<--",
"↔": "<->",
"": "-",
"": "-",
"": "-",
"": "-",
"—": "--",
"―": "--",
"‖": "||",
"‗": "==",
"": "'",
"": "'",
"": "'",
"": "'",
"“": "\"",
"”": "\"",
"„": "\"",
"‟": "\"",
"•": ".",
"‣": ">",
"": ".",
"‥": "..",
"…": "...",
"‧": ".",
"‰": "%0",
"‱": "%00",
"": "'",
"″": "''",
"‴": "'''",
"": "''",
"‶": "''",
"‷": "'''",
"‸": "^",
"": "<",
"": ">",
"‼": "!!",
"‽": "?!",
"": "-",
"": "/",
"⁅": "[-",
"⁆": "-]",
"⁇": "??",
"⁈": "?!",
"⁉": "!?",
"⁌": ".",
"⁍": ".",
"": "*",
"⁏": ";",
"⁒": "%",
"": "~",
"⁕": "*",
"⁗": "''''",
"": "*",
"": "+",
};
let output, result = "";
for (const char of input) {
if (Object.keys(ESCAPE_MAP).includes(char)) {
output = ESCAPE_MAP[char];
} else {
// Do Something Sensible with the rest of the arrows
const charCode = char.charCodeAt(0);
if (charCode >= 8592 && charCode <= 8703) {
output = "->";
} else {
output = char;
}
}
2021-12-17 16:12:16 +00:00
if (output == char) {
result += output;
} else {
switch (outArg) {
case "Remove":
break;
case "Replace with '.'":
result += ".";
break;
default: { // Escape & no change are the same
result += output;
}
2021-12-17 12:48:51 +00:00
}
}
}
return result;
}
}
export default EscapeSmartCharacters;