issue#419

This commit is contained in:
John L 2021-12-17 12:48:51 +00:00
parent ae1b12c120
commit 46d40e961d
5 changed files with 171 additions and 1 deletions

Binary file not shown.

View file

@ -63,7 +63,8 @@
"JSON to CSV",
"Avro to JSON",
"CBOR Encode",
"CBOR Decode"
"CBOR Decode",
"Escape Smart Characters"
]
},
{

View file

@ -0,0 +1,146 @@
/**
* @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;
}
}
switch (outArg) {
case "Remove":
break;
case "Replace with '.'":
result += ".";
break;
default: { // Escape & no change are the same
result += output;
}
}
}
return result;
}
}
export default EscapeSmartCharacters;

View file

@ -107,6 +107,7 @@ import "./tests/CBORDecode.mjs";
import "./tests/JA3Fingerprint.mjs";
import "./tests/JA3SFingerprint.mjs";
import "./tests/HASSH.mjs";
import "./tests/EscapeSmartCharacters.mjs";
// Cannot test operations that use the File type yet

View file

@ -0,0 +1,22 @@
/**
* @author john19696 [john19696@protonmail.com]
* @copyright Crown Copyright 2021
* @license Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";
TestRegister.addTests([
{
name: "Escape Smart Characters",
input: "“”—‘’ →©…",
expectedOutput: "\"\"--'' -->(C)...",
recipeConfig: [
{
op: "Escape Smart Characters",
args: ["Escape"],
},
],
},
]);
g