diff --git a/src/js/config/Categories.js b/src/js/config/Categories.js index db43721c..d7ad1407 100755 --- a/src/js/config/Categories.js +++ b/src/js/config/Categories.js @@ -167,6 +167,8 @@ var Categories = [ "Parse UNIX file permissions", "Swap endianness", "Parse colour code", + "Escape String", + "Unescape String", ] }, { diff --git a/src/js/config/OperationConfig.js b/src/js/config/OperationConfig.js index b5ea0427..cbed494f 100755 --- a/src/js/config/OperationConfig.js +++ b/src/js/config/OperationConfig.js @@ -2952,5 +2952,19 @@ var OperationConfig = { value: Cipher.SUBS_CIPHERTEXT } ] - } + }, + "Escape String": { + description: "Escapes a string so that it can be embedded in another. For example, Don't stop me now becomes Don\\'t stop me now.", + run: String_.run_escape, + input_type: "string", + output_type: "string", + args: [] + }, + "Unescape String": { + description: "Unescapes a string that was embedded inside another so that it can be used in it's own right. For example, Don\\'t stop me now becomes Don't stop me now.", + run: String_.run_unescape, + input_type: "string", + output_type: "string", + args: [] + }, }; diff --git a/src/js/operations/String.js b/src/js/operations/String.js new file mode 100755 index 00000000..a85b385b --- /dev/null +++ b/src/js/operations/String.js @@ -0,0 +1,67 @@ +/** + * String operations. + * Namespace is appended with an underscore to prevent overwriting the global String object. + * + * @author Vel0x + * @namespace + */ +var String_ = { + + /** + * @constant + * @default + */ + REPLACEMENTS: [ + {"escaped": "\\\\", "unescaped":"\\"}, // Must be first + {"escaped": "\\'", "unescaped":"'"}, + {"escaped": "\\\"", "unescaped":"\""}, + {"escaped": "\\n", "unescaped":"\n"}, + {"escaped": "\\r", "unescaped":"\r"}, + ], + + /** + * Escapes a string for embedding in another string. + * + * Example: "Don't do that" -> "Don\'t do that" + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run_escape: function(input, args) { + return String_._replace_by_keys(input, "unescaped", "escaped") + }, + + /** + * Unescapes a string that was part of another string + * + * Example: "Don\'t do that" -> "Don't do that" + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run_unescape: function(input, args) { + return String_._replace_by_keys(input, "escaped", "unescaped") + }, + + /** + * Replaces all matching tokens in REPLACEMENTS with the correction. The + * ordering is determined by the pattern_key and the replacement_key. + * + * @param {string} input + * @param {string} pattern_key + * @param {string} replacement_key + * @returns {string} + */ + _replace_by_keys: function(input, pattern_key, replacement_key) { + var output = input; + var replacementsLength = String_.REPLACEMENTS.length; + for (var i = 0; i < replacementsLength; i++) { + var replacement = String_.REPLACEMENTS[i]; + output = output.split(replacement[pattern_key]).join(replacement[replacement_key]); + } + return output + }, + +};