Index: sdk/lib/_internal/lib/js_string.dart |
diff --git a/sdk/lib/_internal/lib/js_string.dart b/sdk/lib/_internal/lib/js_string.dart |
index 66938214274b10605a277b25ee9dbe9c9aa5c890..4b4fbcfae5c4547c797651c69ef9242cf501a05e 100644 |
--- a/sdk/lib/_internal/lib/js_string.dart |
+++ b/sdk/lib/_internal/lib/js_string.dart |
@@ -180,35 +180,87 @@ class JSString extends Interceptor implements String, JSIndexable { |
String trim() { |
const int CARRIAGE_RETURN = 0x0D; |
const int SPACE = 0x20; |
+ const int NEL = 0x85; |
+ const int BOM = 0xFEFF; |
+ // Start by doing JS trim. Then check if it leaves a |
floitsch
2014/02/19 10:20:36
Unfinished sentence.
Søren Gjesse
2014/02/19 10:44:10
Leaves a...?
Lasse Reichstein Nielsen
2014/02/19 11:43:16
Done.
|
+ Strint result = JS("String", "#.trim()", this); |
Søren Gjesse
2014/02/19 10:44:10
What type is Strint?
Lasse Reichstein Nielsen
2014/02/19 11:43:16
Done.
|
+ |
+ if (result.length == 0) return result; |
+ int firstCode = result.codeUnitAt(0); |
int startIndex = 0; |
- while (startIndex < this.length) { |
- int codeUnit = this.codeUnitAt(startIndex); |
- if (codeUnit == SPACE || |
- codeUnit == CARRIAGE_RETURN || |
- _isWhitespace(codeUnit)) { |
- startIndex++; |
- } else { |
- break; |
+ if (firstCode == NEL || firstCode == BOM) { |
+ startIndex++; |
+ while (startIndex < result.length) { |
+ int codeUnit = result.codeUnitAt(startIndex); |
+ if (codeUnit == SPACE || |
+ codeUnit == CARRIAGE_RETURN || |
+ _isWhitespace(codeUnit)) { |
+ startIndex++; |
+ } else { |
+ break; |
+ } |
} |
+ if (startIndex == result.length) return ""; |
} |
- if (startIndex == this.length) return ""; |
- int endIndex = this.length; |
+ int endIndex = result.length; |
// We know that there is at least one character that is non-whitespace. |
// Therefore we don't need to verify that endIndex > startIndex. |
- while (true) { |
- int codeUnit = this.codeUnitAt(endIndex - 1); |
- if (codeUnit == SPACE || |
- codeUnit == CARRIAGE_RETURN || |
- _isWhitespace(codeUnit)) { |
- endIndex--; |
- } else { |
- break; |
+ int lastCode = result.codeUnitAt(endIndex - 1); |
+ if (lastCode == NEL || lastCode == BOM) { |
+ endIndex--; |
+ while (true) { |
+ int codeUnit = result.codeUnitAt(endIndex - 1); |
+ if (codeUnit == SPACE || |
+ codeUnit == CARRIAGE_RETURN || |
+ _isWhitespace(codeUnit)) { |
+ endIndex--; |
+ } else { |
+ break; |
+ } |
} |
} |
- if (startIndex == 0 && endIndex == this.length) return this; |
- return JS('String', r'#.substring(#, #)', this, startIndex, endIndex); |
+ if (startIndex == 0 && endIndex == result.length) return result; |
+ return JS('String', r'#.substring(#, #)', result, startIndex, endIndex); |
+ } |
+ |
+ String repeat(int times, [String separator = ""]) { |
+ if (times < 0) throw new RangeError.value(times); |
+ if (times == 0) return ""; |
+ if (separator.isEmpty) { |
+ return JS('String', "new Array(# + 1).join(#)", times, this); |
+ } else { |
+ var list = new JSArray.growable(times); |
+ for (int i = 0; i < times; i++) list[i] = this; |
+ return JS('String', "#.join(#)", list, separator); |
+ } |
+ } |
+ |
+ String padLeft(int newSize, String padding, { int size }) { |
+ if (size == null) { |
+ size = this.length; |
+ } else if (size < 0) { |
+ throw new RangeError.value(size); |
+ } |
+ int delta = newSize - size; |
+ if (delta <= 0) return this; |
+ var list = new JSArray.growable(delta + 1); |
+ list[delta] = this; |
+ return JS("String", "#.join(#)", list, padding); |
+ } |
+ |
+ String padRight(int newSize, String padding, { int size }) { |
+ if (size == null) { |
+ size = this.length; |
+ } else if (size < 0) { |
+ throw new RangeError.value(size); |
+ } |
+ int delta = newSize - size; |
+ if (delta <= 0) return this; |
+ var list = new JSArray.growable(delta + 1); |
+ list[0] = this; |
+ return JS("String", "#.join(#)", list, padding); |
} |
List<int> get codeUnits => new _CodeUnits(this); |