Index: sdk/lib/core/encode_decode.dart |
diff --git a/sdk/lib/core/encode_decode.dart b/sdk/lib/core/encode_decode.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d236acf9c79598eb686d2fbfd4ba4406d546e7d9 |
--- /dev/null |
+++ b/sdk/lib/core/encode_decode.dart |
@@ -0,0 +1,123 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+part of dart.core; |
+ |
+// Frequently used character codes. |
+class _CharCode { |
+ //static const int HT = 9; |
+ //static const int LF = 10; |
+ //static const int CR = 13; |
+ //static const int SP = 32; |
+ //static const int AMPERSAND = 38; |
+ //static const int COMMA = 44; |
+ //static const int DASH = 45; |
+ //static const int SLASH = 47; |
+ //static const int ZERO = 48; |
+ //static const int ONE = 49; |
+ //static const int COLON = 58; |
+ //static const int SEMI_COLON = 59; |
+ //static const int EQUAL = 61; |
+ static const int PERCENT = 0x25; |
+ static const int ZERO = 0x30; |
+ static const int NINE = 0x39; |
+ static const int UPPER_CASE_A = 0x41; |
+ static const int UPPER_CASE_F = 0x46; |
+ static const int LOWER_CASE_A = 0x61; |
+ static const int LOWER_CASE_F = 0x66; |
+} |
+ |
+/** |
+ * This is the internal implementation of JavaScript's encodeURI function. |
+ * It encodes all characters in the string [text] except for those |
+ * that appear in [canonicalTable], and returns the escaped string. |
+ */ |
+String _uriEncode(List<int> canonicalTable, |
+ String text, |
+ {bool spaceToPlus: false}) { |
+ final String hex = '0123456789ABCDEF'; |
+ var byteToHex = (int v) => '%${hex[v >> 4]}${hex[v & 0x0f]}'; |
floitsch
2013/05/24 20:37:27
This shouldn't be a 'var' but a normal nested func
Søren Gjesse
2013/05/27 10:47:21
Done.
Lasse Reichstein Nielsen
2013/05/28 07:26:23
Seems inefficient to create a string, and then wri
|
+ StringBuffer result = new StringBuffer(); |
+ for (int i = 0; i < text.length; i++) { |
+ int ch = text.codeUnitAt(i); |
+ if (ch < 128 && ((canonicalTable[ch >> 4] & (1 << (ch & 0x0f))) != 0)) { |
+ result.write(text[i]); |
+ } else if (spaceToPlus && text[i] == " ") { |
+ result.write("+"); |
+ } else { |
+ if (ch >= 0xD800 && ch < 0xDC00) { |
+ // Low surrogate. We expect a next char high surrogate. |
+ ++i; |
+ int nextCh = text.length == i ? 0 : text.codeUnitAt(i); |
+ if (nextCh >= 0xDC00 && nextCh < 0xE000) { |
+ // convert the pair to a U+10000 codepoint |
+ ch = 0x10000 + ((ch - 0xD800) << 10) + (nextCh - 0xDC00); |
+ } else { |
+ throw new ArgumentError('Malformed URI'); |
+ } |
+ } |
+ for (int codepoint in codepointsToUtf8([ch])) { |
+ result.write(byteToHex(codepoint)); |
+ } |
+ } |
+ } |
+ return result.toString(); |
+} |
+ |
+/** |
+ * Convert a byte (2 character hex sequence) in string [s] starting |
+ * at position [pos] to its ordinal value |
+ */ |
+int _hexCharPairToByte(String s, int pos) { |
+ int byte = 0; |
+ for (int i = 0; i < 2; i++) { |
+ var charCode = s.codeUnitAt(pos + i); |
+ if (0x30 <= charCode && charCode <= 0x39) { |
+ byte = byte * 16 + charCode - 0x30; |
+ } else { |
+ // Check ranges A-F (0x41-0x46) and a-f (0x61-0x66). |
+ charCode |= 0x20; |
+ if (0x61 <= charCode && charCode <= 0x66) { |
+ byte = byte * 16 + charCode - 0x57; |
+ } else { |
+ throw new ArgumentError("Invalid URL encoding"); |
+ } |
+ } |
+ } |
+ return byte; |
+} |
+ |
+/** |
+ * A JavaScript-like decodeURI function. It unescapes the string [text] and |
+ * returns the unescaped string. |
+ */ |
+String _uriDecode(String text, {bool plusToSpace: false}) { |
+ StringBuffer result = new StringBuffer(); |
+ List<int> codepoints = new List<int>(); |
+ for (int i = 0; i < text.length;) { |
+ String ch = text[i]; |
+ if (ch != '%') { |
+ if (plusToSpace && ch == '+') { |
+ result.write(" "); |
+ } else { |
+ result.write(ch); |
+ } |
+ i++; |
+ } else { |
+ codepoints.clear(); |
+ while (ch == '%') { |
+ if (++i > text.length - 2) { |
+ throw new ArgumentError('Truncated URI'); |
+ } |
+ codepoints.add(_hexCharPairToByte(text, i)); |
+ i += 2; |
+ if (i == text.length) |
+ break; |
+ ch = text[i]; |
+ } |
+ result.write(decodeUtf8(codepoints)); |
+ } |
+ } |
+ return result.toString(); |
+} |