Browse Source

Make camel,etc smart and add tests

toby 8 years ago
parent
commit
116c0680a2

+ 3 - 3
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",
         ]
     },
     {

+ 18 - 3
src/core/config/OperationConfig.js

@@ -3257,10 +3257,15 @@ const OperationConfig = {
             "<br><br>",
             "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 = {
             "<br><br>",
             "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 = {
             "<br><br>",
             "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,
+            },
         ]
     },
 };

+ 80 - 0
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;

+ 0 - 41
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;

+ 1 - 0
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";

+ 132 - 0
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]
+            }
+        ],
+    },
+]);