Index: lib/src/util.dart |
diff --git a/lib/src/util.dart b/lib/src/util.dart |
index 3ecc47c5846d14842aca546698e828441a676497..a99d2dd1f9fcbedc02722b5349216a2dbc1f260c 100644 |
--- a/lib/src/util.dart |
+++ b/lib/src/util.dart |
@@ -7,6 +7,20 @@ library matcher.util; |
import 'core_matchers.dart'; |
import 'interfaces.dart'; |
+/// A [Map] between whitespace characters and their escape sequences. |
+const _escapeMap = const { |
+ '\n': r'\n', |
+ '\r': r'\r', |
+ '\f': r'\f', |
+ '\b': r'\b', |
+ '\t': r'\t', |
+ '\v': r'\v', |
+}; |
+ |
+/// A [RegExp] that matches whitespace characters that should be escaped. |
+final _escapeRegExp = |
+ new RegExp("[${_escapeMap.keys.map(_getHexLiteral).join()}]"); |
+ |
/// Useful utility for nesting match states. |
void addStateInfo(Map matchState, Map values) { |
var innerState = new Map.from(matchState); |
@@ -29,3 +43,20 @@ Matcher wrapMatcher(x) { |
return equals(x); |
} |
} |
+ |
+/// Returns [str] with all whitespace characters represented as their escape |
+/// sequences. |
+/// |
+/// Backslash characters are escaped as `\\` |
+String escape(String str) { |
+ str = str.replaceAll('\\', r'\\'); |
+ return str.replaceAllMapped(_escapeRegExp, (match) { |
+ return _escapeMap[match[0]]; |
+ }); |
+} |
+ |
+/// Given single-character string, return the hex-escaped equivalent. |
+String _getHexLiteral(String input) { |
+ int rune = input.runes.single; |
+ return r'\x' + rune.toRadixString(16).padLeft(2, '0'); |
+} |