From 116c0680a2af03b8badbe08867315fea413bbe8b Mon Sep 17 00:00:00 2001 From: toby Date: Tue, 2 May 2017 11:21:04 -0400 Subject: [PATCH] Make camel,etc smart and add tests --- src/core/config/Categories.js | 6 +- src/core/config/OperationConfig.js | 21 ++++- src/core/operations/Code.js | 80 +++++++++++++++++ src/core/operations/StrUtils.js | 41 --------- test/index.js | 1 + test/tests/operations/Code.js | 132 +++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+), 47 deletions(-) create mode 100644 test/tests/operations/Code.js diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index bfadfca..1de8ba5 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -181,9 +181,6 @@ const Categories = [ "Parse UNIX file permissions", "Swap endianness", "Parse colour code", - "To Snake case", - "To Camel case", - "To Kebab case", ] }, { @@ -274,6 +271,9 @@ const Categories = [ "CSS selector", "Strip HTML tags", "Diff", + "To Snake case", + "To Camel case", + "To Kebab case", ] }, { diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index fa2f5c0..af9ebad 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -3257,10 +3257,15 @@ const OperationConfig = { "

", "e.g. this_is_snake_case", ].join("\n"), - run: StrUtils.runToSnakeCase, + run: Code.runToSnakeCase, inputType: "string", outputType: "string", args: [ + { + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ] }, "To Camel case": { @@ -3271,10 +3276,15 @@ const OperationConfig = { "

", "e.g. thisIsCamelCase", ].join("\n"), - run: StrUtils.runToCamelCase, + run: Code.runToCamelCase, inputType: "string", outputType: "string", args: [ + { + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ] }, "To Kebab case": { @@ -3285,10 +3295,15 @@ const OperationConfig = { "

", "e.g. this-is-kebab-case", ].join("\n"), - run: StrUtils.runToKebabCase, + run: Code.runToKebabCase, inputType: "string", outputType: "string", args: [ + { + name: "Attempt to be context aware", + type: "boolean", + value: false, + }, ] }, }; diff --git a/src/core/operations/Code.js b/src/core/operations/Code.js index 613c6b4..7d59b4b 100755 --- a/src/core/operations/Code.js +++ b/src/core/operations/Code.js @@ -1,3 +1,5 @@ +import {camelCase, kebabCase, snakeCase} from "lodash"; + import Utils from "../Utils.js"; import vkbeautify from "vkbeautify"; import {DOMParser as dom} from "xmldom"; @@ -415,6 +417,84 @@ const Code = { .join(delimiter); }, + /** + * This tries to rename variable names in a code snippet according to a function. + * + * @param {string} input + * @param {function} replacer - this function will be fed the token which should be renamed. + * @returns {string} + */ + _replaceVariableNames(input, replacer) { + let tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/ig; + + return input.replace(tokenRegex, (...args) => { + let match = args[0], + quotes = args[1]; + + if (!quotes) { + return match; + } else { + return replacer(match); + } + }); + }, + + + /** + * Converts to snake_case. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + * + */ + runToSnakeCase(input, args) { + let smart = args[0]; + + if (smart) { + return Code._replaceVariableNames(input, snakeCase); + } else { + return snakeCase(input); + } + }, + + + /** + * Converts to camelCase. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + * + */ + runToCamelCase(input, args) { + let smart = args[0]; + + if (smart) { + return Code._replaceVariableNames(input, camelCase); + } else { + return camelCase(input); + } + }, + + + /** + * Converts to kebab-case. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + * + */ + runToKebabCase(input, args) { + let smart = args[0]; + + if (smart) { + return Code._replaceVariableNames(input, kebabCase); + } else { + return kebabCase(input); + } + }, }; export default Code; diff --git a/src/core/operations/StrUtils.js b/src/core/operations/StrUtils.js index 1c7ca9c..54f8228 100755 --- a/src/core/operations/StrUtils.js +++ b/src/core/operations/StrUtils.js @@ -1,5 +1,3 @@ -import {camelCase, kebabCase, snakeCase} from "lodash"; - import Utils from "../Utils.js"; import * as JsDiff from "diff"; @@ -594,45 +592,6 @@ const StrUtils = { return output; }, - - - /** - * Converts to snake_case. - * - * @param {string} input - * @param {Object[]} args - * @returns {string} - * - */ - runToSnakeCase(input, args) { - return snakeCase(input); - }, - - - /** - * Converts to camelCase. - * - * @param {string} input - * @param {Object[]} args - * @returns {string} - * - */ - runToCamelCase(input, args) { - return camelCase(input); - }, - - - /** - * Converts to kebab-case. - * - * @param {string} input - * @param {Object[]} args - * @returns {string} - * - */ - runToKebabCase(input, args) { - return kebabCase(input); - }, }; export default StrUtils; diff --git a/test/index.js b/test/index.js index 13d82b1..5f82a72 100644 --- a/test/index.js +++ b/test/index.js @@ -13,6 +13,7 @@ import "babel-polyfill"; import TestRegister from "./TestRegister.js"; import "./tests/operations/Base58.js"; import "./tests/operations/ByteRepr.js"; +import "./tests/operations/Code.js"; import "./tests/operations/Compress.js"; import "./tests/operations/FlowControl.js"; import "./tests/operations/MorseCode.js"; diff --git a/test/tests/operations/Code.js b/test/tests/operations/Code.js new file mode 100644 index 0000000..5f6a432 --- /dev/null +++ b/test/tests/operations/Code.js @@ -0,0 +1,132 @@ +/** + * Code tests. + * + * @author tlwr [toby@toby.codes] + * + * @copyright Crown Copyright 2017 + * @license Apache-2.0 + */ +import TestRegister from "../../TestRegister.js"; + +TestRegister.addTests([ + { + name: "To Camel case (dumb)", + input: "hello world", + expectedOutput: "helloWorld", + recipeConfig: [ + { + "op": "To Camel case", + "args": [false] + } + ], + }, + { + name: "To Snake case (dumb)", + input: "hello world", + expectedOutput: "hello_world", + recipeConfig: [ + { + "op": "To Snake case", + "args": [false] + } + ], + }, + { + name: "To Kebab case (dumb)", + input: "hello world", + expectedOutput: "hello-world", + recipeConfig: [ + { + "op": "To Kebab case", + "args": [false] + } + ], + }, + { + name: "To Camel case (smart)", + input: [ + "test='hello'", + "echo $test", + "a_camel_case_function", + "$a_camel_case_variable;", + "function function_name() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + expectedOutput: [ + "test='hello'", + "echo $test", + "aCamelCaseFunction", + "$aCamelCaseVariable;", + "function functionName() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + recipeConfig: [ + { + "op": "To Camel case", + "args": [true] + } + ], + }, + { + name: "To Snake case (smart)", + input: [ + "test='hello'", + "echo $test", + "aSnakeCaseFunction", + "$aSnakeCaseVariable;", + "function functionName() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + expectedOutput: [ + "test='hello'", + "echo $test", + "a_snake_case_function", + "$a_snake_case_variable;", + "function function_name() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + recipeConfig: [ + { + "op": "To Snake case", + "args": [true] + } + ], + }, + { + name: "To Kebab case (smart)", + input: [ + "test='hello'", + "echo $test", + "aKebabCaseFunction", + "$aKebabCaseVariable;", + "function functionName() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + expectedOutput: [ + "test='hello'", + "echo $test", + "a-kebab-case-function", + "$a-kebab-case-variable;", + "function function-name() {", + " console.log('things inside quotes do not get broken');", + " console.log(\"things inside quotes do not get broken\");", + "}", + ].join("\n"), + recipeConfig: [ + { + "op": "To Kebab case", + "args": [true] + } + ], + }, +]);