diff --git a/package-lock.json b/package-lock.json index 70628a32..44f4a95f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2419,6 +2419,11 @@ "cssom": "0.3.2" } }, + "csv-string": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csv-string/-/csv-string-3.1.2.tgz", + "integrity": "sha512-JzjYuRSU/5y6H9BqwaJTNsF8dYlFql14n1GIOgu2QHFCoU20U2DaeMShyIZuvU7WS0n7u+AMhgUOuqRZ9eFhog==" + }, "ctph.js": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/ctph.js/-/ctph.js-0.0.5.tgz", diff --git a/package.json b/package.json index b9ef681a..04a9391c 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "bootstrap-switch": "^3.3.4", "crypto-api": "^0.8.0", "crypto-js": "^3.1.9-1", + "csv-string": "^3.1.2", "ctph.js": "0.0.5", "diff": "^3.4.0", "escodegen": "^1.9.1", diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 6f04267f..2328659f 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -331,6 +331,8 @@ const Categories = [ "Extract EXIF", "Numberwang", "XKCD Random Number", + "Parse CSV to string", + "Parse string to CSV" ] }, { diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 7eed4876..95cad160 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -4018,6 +4018,37 @@ const OperationConfig = { inputType: "string", outputType: "number", args: [] + }, + "CSV To String": { + module: "CSVParser", + description: "Function used to parse CSV string to a regular string.", + inputType: "string", + outputType: "string", + args: [ + { + name: "delimeter", + type: "string", + value: "," + }, + { + name: "quotes", + type: "string", + value: '"' + } + ] + }, + "String to CSV": { + module: "CSVParser", + description: "Function used to parse a string array to a CSV string.", + inputType: "string", + outputType: "string", + args: [ + { + name: "delimeter", + type: "string", + value: "," + } + ] } }; diff --git a/src/core/config/modules/CSVParser.js b/src/core/config/modules/CSVParser.js new file mode 100644 index 00000000..4ca120ae --- /dev/null +++ b/src/core/config/modules/CSVParser.js @@ -0,0 +1,21 @@ +import CSVParser from "../../operations/CSVParser.js"; + + +/** + * CSVParser module. + * + * Libraries: + * - csv-string + * + * @author VimalRaghubir [vraghubir0418@gmail.com] + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + */ +let OpModules = typeof self === "undefined" ? {} : self.OpModules || {}; + +OpModules.CSVParser = { + "Parse from CSV": CSVParser.csvToString, + "Parse to CSV": CSVParser.stringToCSV, +}; + +export default OpModules; diff --git a/src/core/config/modules/OpModules.js b/src/core/config/modules/OpModules.js index 9a5e3ff5..f8e45506 100644 --- a/src/core/config/modules/OpModules.js +++ b/src/core/config/modules/OpModules.js @@ -21,6 +21,7 @@ import PublicKeyModule from "./PublicKey.js"; import RegexModule from "./Regex.js"; import ShellcodeModule from "./Shellcode.js"; import URLModule from "./URL.js"; +import CSVModule from "./CSVParser.js"; Object.assign( OpModules, @@ -37,7 +38,8 @@ Object.assign( PublicKeyModule, RegexModule, ShellcodeModule, - URLModule + URLModule, + CSVModule ); export default OpModules; diff --git a/src/core/operations/CSVParser.js b/src/core/operations/CSVParser.js new file mode 100644 index 00000000..0ffb9303 --- /dev/null +++ b/src/core/operations/CSVParser.js @@ -0,0 +1,48 @@ +import { CSV } from "csv-string"; + +/** +* @author VimalRaghubir [vraghubir0418@gmail.com] +* @copyright Crown Copyright 2016 +* @license Apache-2.0 +* @namespace +*/ + + +const CSVParser = { + /** + * Parse from CSV + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + csvToString: function(input, args) { + let array = ""; + if (input) { + let detectedDelimeter = CSV.detect(input); + if (detectedDelimeter !== args[0]) { + args[0] = detectedDelimeter; + } + array = CSV.parse(input, args[0], args[1]); + } else { + array = "The passed in data is not a csv string. Please pass in a csv string."; + } + return array; + }, + /** + * Parse to CSV + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + stringToCSV: function(input, args) { + let string = ""; + if (input) { + string = CSV.stringify(input, args[0]); + } else { + string = "The passed in data is not a string that can be converted to a CSV."; + } + return string; + } +}; + +export default CSVParser; diff --git a/test/tests/operations/CSVParser.js b/test/tests/operations/CSVParser.js new file mode 100644 index 00000000..ddf7ef77 --- /dev/null +++ b/test/tests/operations/CSVParser.js @@ -0,0 +1,123 @@ +/** + * CSVParser tests. + * + * @author Vimal Raghubir + * + * @copyright Crown Copyright 2017 + * @license Apache-2.0 + */ + +import TestRegister from "../../TestRegister.js"; + +TestRegister.addTests([ + { + name: "Testing hello parsed to CSV", + input: "hello", + expectedOutput: "hello", + recipeConfig: [ + { + op: "String to CSV", + args: [","], + }, + ], + }, + { + name: "Testing hello world parsed to CSV", + input: "['hello', 'world']", + expectedOutput: "hello;world", + recipeConfig: [ + { + op: "String to CSV", + args: [";"], + }, + ], + }, + { + name: "Testing false parsed to CSV", + input: false, + expectedOutput: "The passed in data is not a string that can be converted to a CSV.", + recipeConfig: [ + { + op: "String to CSV", + args: [","], + }, + ], + }, + { + name: "Testing ||| parsed to CSV", + input: "|||", + expectedOutput: "|||||", + recipeConfig: [ + { + op: "String to CSV", + args: ["|"], + }, + ], + }, + { + name: "Testing 0 parsed to CSV", + input: 0, + expectedOutput: "The passed in data is not a string that can be converted to a CSV.", + recipeConfig: [ + { + op: "String to CSV", + args: [","], + }, + ], + }, + { + name: "Testing 1,2,3,\n1,2, parsed to String", + input: "1,2,3,\n,1,2,", + expectedOutput: "[[1,2,3],[1,2]]", + recipeConfig: [ + { + op: "CSV to String", + args: [","], + }, + ], + }, + { + name: "Testing \n\n\n parsed to String", + input: "\n\n\n", + expectedOutput: "[[],[],[]]", + recipeConfig: [ + { + op: "CSV to String", + args: [","], + }, + ], + }, + { + name: "Testing 1,2,3,4,5 parsed to String", + input: "1,2,3,4,5", + expectedOutput: "[[1,2,3,4,5]]", + recipeConfig: [ + { + op: "CSV to String", + args: ["|"], + }, + ], + }, + { + name: "Testing 0 parsed to CSV", + input: 0, + expectedOutput: "The passed in data is not a string that can be converted to a CSV.", + recipeConfig: [ + { + op: "CSV to String", + args: [","], + }, + ], + }, + { + name: "Testing false parsed to CSV", + input: false, + expectedOutput: "The passed in data is not a string that can be converted to a CSV.", + recipeConfig: [ + { + op: "CSV to String", + args: [","], + }, + ], + }, +]);