diff --git a/src/js/config/Categories.js b/src/js/config/Categories.js
index db43721cb5..d7ad140741 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 b5ea042788..cbed494f05 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 0000000000..a85b385b94
--- /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
+ },
+
+};