From e069ae4991b5f3f7dd028d17a3023f2f37442a3e Mon Sep 17 00:00:00 2001 From: Vimal-Raghubir Date: Sun, 25 Mar 2018 19:49:17 -0400 Subject: [PATCH] Added Parsing to and from CSV --- src/core/config/Categories.js | 2 + src/core/config/OperationConfig.js | 34 +++++++- src/core/config/modules/CSVParser.js | 21 +++++ src/core/config/modules/OpModules.js | 4 +- src/core/operations/CSVParser.js | 48 +++++++++++ test/tests/operations/CSVParser.js | 123 +++++++++++++++++++++++++++ 6 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 src/core/config/modules/CSVParser.js create mode 100644 src/core/operations/CSVParser.js create mode 100644 test/tests/operations/CSVParser.js diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 6f04267f..a36d52aa 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..760380b9 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -38,6 +38,7 @@ import StrUtils from "../operations/StrUtils.js"; import Tidy from "../operations/Tidy.js"; import Unicode from "../operations/Unicode.js"; import URL_ from "../operations/URL.js"; +import CSVParser from "../operations/CSVParser.js"; /** @@ -4018,7 +4019,38 @@ 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..a378be27 --- /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; \ No newline at end of file diff --git a/src/core/config/modules/OpModules.js b/src/core/config/modules/OpModules.js index 9a5e3ff5..c9d6d227 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..bad0780c --- /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) { + var array = ""; + if (input) { + var 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) { + var 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; \ No newline at end of file diff --git a/test/tests/operations/CSVParser.js b/test/tests/operations/CSVParser.js new file mode 100644 index 00000000..7401d3bd --- /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: [','], + }, + ], + }, +]); \ No newline at end of file