opal 0.8.0.beta1 → 0.8.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitmodules +0 -24
- data/.jshintrc +51 -0
- data/.travis.yml +6 -1
- data/CHANGELOG.md +2 -0
- data/Gemfile +3 -7
- data/README.md +2 -3
- data/Rakefile +1 -0
- data/lib/mspec/opal/rake_task.rb +1 -1
- data/lib/opal/builder.rb +21 -3
- data/lib/opal/builder_processors.rb +2 -2
- data/lib/opal/cli.rb +8 -5
- data/lib/opal/erb.rb +1 -1
- data/lib/opal/nodes/call.rb +1 -1
- data/lib/opal/nodes/call_special.rb +1 -1
- data/lib/opal/nodes/helpers.rb +6 -4
- data/lib/opal/nodes/iter.rb +2 -2
- data/lib/opal/nodes/singleton_class.rb +2 -1
- data/lib/opal/parser/lexer.rb +3 -2
- data/lib/opal/path_reader.rb +8 -1
- data/lib/opal/paths.rb +23 -16
- data/lib/opal/regexp_anchors.rb +5 -0
- data/lib/opal/sprockets/erb.rb +1 -1
- data/lib/opal/sprockets/processor.rb +21 -35
- data/lib/opal/sprockets/source_map_server.rb +5 -5
- data/lib/opal/version.rb +3 -1
- data/lib/tilt/opal.rb +11 -5
- data/opal.gemspec +2 -2
- data/opal/corelib/array.rb +196 -4
- data/opal/corelib/enumerable.rb +1 -1
- data/opal/corelib/enumerator.rb +2 -2
- data/opal/corelib/hash.rb +6 -6
- data/opal/corelib/kernel.rb +5 -3
- data/opal/corelib/module.rb +18 -12
- data/opal/corelib/regexp.rb +110 -4
- data/opal/corelib/runtime.js +12 -4
- data/opal/corelib/string.rb +51 -95
- data/opal/corelib/string/inheritance.rb +22 -0
- data/opal/corelib/variables.rb +1 -1
- data/spec/filters/bugs/array.rb +3 -39
- data/spec/filters/bugs/basic_object.rb +20 -0
- data/spec/filters/bugs/date.rb +5 -0
- data/spec/filters/bugs/enumerable.rb +9 -0
- data/spec/filters/bugs/enumerator.rb +0 -7
- data/spec/filters/bugs/hash.rb +2 -0
- data/spec/filters/bugs/kernel.rb +5 -0
- data/spec/filters/bugs/language.rb +14 -0
- data/spec/filters/bugs/method.rb +5 -0
- data/spec/filters/bugs/module.rb +23 -0
- data/spec/filters/bugs/regular_expressions.rb +41 -0
- data/spec/filters/bugs/singleton.rb +3 -0
- data/spec/filters/bugs/string.rb +2 -9
- data/spec/filters/bugs/stringscanner.rb +3 -0
- data/spec/filters/bugs/time.rb +19 -0
- data/spec/filters/unsupported/module.rb +6 -0
- data/spec/filters/unsupported/mutable_strings.rb +8 -0
- data/spec/filters/unsupported/regular_expressions.rb +90 -0
- data/spec/lib/builder_spec.rb +12 -6
- data/spec/lib/cli_spec.rb +2 -2
- data/spec/lib/path_reader_spec.rb +12 -0
- data/spec/lib/sprockets/server_spec.rb +7 -8
- data/spec/lib/tilt/opal_spec.rb +18 -0
- data/spec/opal/core/language/regexp_spec.rb +1 -1
- data/spec/opal/core/runtime/bridged_classes_spec.rb +48 -1
- data/spec/rubyspecs +88 -78
- data/stdlib/encoding.rb +3 -0
- data/stdlib/native.rb +1 -1
- data/stdlib/pp.rb +27 -6
- data/stdlib/set.rb +10 -0
- data/tasks/linting.rake +18 -0
- data/tasks/testing.rake +11 -4
- data/{stdlib → vendored-minitest}/minitest.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/assertions.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/autorun.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/benchmark.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/expectations.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/hell.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/mock.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/parallel.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/pride.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/pride_plugin.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/spec.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/test.rb +0 -0
- data/{stdlib → vendored-minitest}/minitest/unit.rb +0 -0
- data/vendored-minitest/test/unit.rb +23 -0
- metadata +31 -29
- data/stdlib/test/unit.rb +0 -10
- data/tasks/documentation.rake +0 -38
data/opal/corelib/enumerable.rb
CHANGED
data/opal/corelib/enumerator.rb
CHANGED
@@ -59,7 +59,7 @@ class Enumerator
|
|
59
59
|
return enum_for :with_index, offset unless block
|
60
60
|
|
61
61
|
%x{
|
62
|
-
var result, index =
|
62
|
+
var result, index = offset;
|
63
63
|
|
64
64
|
self.$each.$$p = function() {
|
65
65
|
var param = #{Opal.destructure(`arguments`)},
|
@@ -79,7 +79,7 @@ class Enumerator
|
|
79
79
|
return result;
|
80
80
|
}
|
81
81
|
|
82
|
-
return
|
82
|
+
return self.object;
|
83
83
|
}
|
84
84
|
end
|
85
85
|
|
data/opal/corelib/hash.rb
CHANGED
@@ -363,7 +363,7 @@ class Hash
|
|
363
363
|
%x{
|
364
364
|
var _map = self.map,
|
365
365
|
smap = self.smap,
|
366
|
-
keys = self.keys;
|
366
|
+
keys = self.keys, key, map, khash;
|
367
367
|
|
368
368
|
for (var i = 0, length = keys.length; i < length; i++) {
|
369
369
|
key = keys[i];
|
@@ -613,7 +613,7 @@ class Hash
|
|
613
613
|
|
614
614
|
var key, value,
|
615
615
|
inspect = [],
|
616
|
-
keys = self.keys
|
616
|
+
keys = self.keys,
|
617
617
|
id = self.$object_id(),
|
618
618
|
counter = 0;
|
619
619
|
|
@@ -820,7 +820,7 @@ class Hash
|
|
820
820
|
var keys = self.keys,
|
821
821
|
_map = self.map,
|
822
822
|
smap = self.smap,
|
823
|
-
key, khash, value;
|
823
|
+
key, khash, value, map;
|
824
824
|
|
825
825
|
for (var i = 0, length = keys.length; i < length; i++) {
|
826
826
|
key = keys[i]
|
@@ -967,7 +967,7 @@ class Hash
|
|
967
967
|
smap = self.smap,
|
968
968
|
keys = self.keys,
|
969
969
|
result = nil,
|
970
|
-
key, khash, value, object;
|
970
|
+
key, khash, value, object, map;
|
971
971
|
|
972
972
|
for (var i = 0, length = keys.length; i < length; i++) {
|
973
973
|
key = keys[i];
|
@@ -1039,7 +1039,7 @@ class Hash
|
|
1039
1039
|
_map = self.map,
|
1040
1040
|
smap = self.smap,
|
1041
1041
|
result = [],
|
1042
|
-
map, key;
|
1042
|
+
map, key, khash;
|
1043
1043
|
|
1044
1044
|
for (var i = 0, length = keys.length; i < length; i++) {
|
1045
1045
|
key = keys[i];
|
@@ -1096,7 +1096,7 @@ class Hash
|
|
1096
1096
|
smap = self.smap,
|
1097
1097
|
keys = self.keys,
|
1098
1098
|
result = [],
|
1099
|
-
map, khash;
|
1099
|
+
map, khash, key;
|
1100
1100
|
|
1101
1101
|
for (var i = 0, length = keys.length; i < length; i++) {
|
1102
1102
|
key = keys[i];
|
data/opal/corelib/kernel.rb
CHANGED
@@ -116,7 +116,9 @@ module Kernel
|
|
116
116
|
initialize_copy(other)
|
117
117
|
end
|
118
118
|
|
119
|
-
def define_singleton_method(name, &
|
119
|
+
def define_singleton_method(name, body = nil, &block)
|
120
|
+
body ||= block
|
121
|
+
|
120
122
|
unless body
|
121
123
|
raise ArgumentError, "tried to create Proc object without a block"
|
122
124
|
end
|
@@ -180,8 +182,8 @@ module Kernel
|
|
180
182
|
|
181
183
|
def format(format_string, *args)
|
182
184
|
if args.length == 1 && args[0].respond_to?(:to_ary)
|
183
|
-
|
184
|
-
args =
|
185
|
+
ary = Opal.coerce_to?(args[0], Array, :to_ary)
|
186
|
+
args = ary.to_a unless ary.nil?
|
185
187
|
end
|
186
188
|
|
187
189
|
%x{
|
data/opal/corelib/module.rb
CHANGED
@@ -198,7 +198,7 @@ class Module
|
|
198
198
|
raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w*$/
|
199
199
|
|
200
200
|
%x{
|
201
|
-
scopes = [self.$$scope];
|
201
|
+
var scopes = [self.$$scope];
|
202
202
|
|
203
203
|
if (inherit || self === Opal.Object) {
|
204
204
|
var parent = self.$$super;
|
@@ -278,18 +278,24 @@ class Module
|
|
278
278
|
value
|
279
279
|
end
|
280
280
|
|
281
|
-
def define_method(name, method =
|
282
|
-
|
283
|
-
raise ArgumentError,
|
281
|
+
def define_method(name, method = undefined, &block)
|
282
|
+
if `method === undefined && !#{block_given?}`
|
283
|
+
raise ArgumentError, "tried to create a Proc object without a block"
|
284
284
|
end
|
285
285
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
286
|
+
block ||= case method
|
287
|
+
when Proc
|
288
|
+
method
|
289
|
+
when Method
|
290
|
+
method.to_proc
|
291
|
+
when UnboundMethod
|
292
|
+
lambda do |*args|
|
293
|
+
bound = method.bind(self)
|
294
|
+
bound.call *args
|
295
|
+
end
|
296
|
+
else
|
297
|
+
raise TypeError, "wrong argument type #{block.class} (expected Proc/Method)"
|
298
|
+
end
|
293
299
|
|
294
300
|
%x{
|
295
301
|
var id = '$' + name;
|
@@ -536,7 +542,7 @@ class Module
|
|
536
542
|
end
|
537
543
|
|
538
544
|
def to_s
|
539
|
-
name || "#<#{`self.$$is_mod ? 'Module' : 'Class'`}:0x#{__id__.to_s(16)}>"
|
545
|
+
`self.$$name` || "#<#{`self.$$is_mod ? 'Module' : 'Class'`}:0x#{__id__.to_s(16)}>"
|
540
546
|
end
|
541
547
|
|
542
548
|
def undef_method(symbol)
|
data/opal/corelib/regexp.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
class RegexpError < StandardError; end
|
1
2
|
class Regexp
|
2
|
-
|
3
|
+
IGNORECASE = 1
|
4
|
+
MULTILINE = 4
|
5
|
+
|
6
|
+
`def.$$is_regexp = true`
|
3
7
|
|
4
8
|
class << self
|
5
9
|
def escape(string)
|
@@ -23,11 +27,77 @@ class Regexp
|
|
23
27
|
alias quote escape
|
24
28
|
|
25
29
|
def union(*parts)
|
26
|
-
|
30
|
+
%x{
|
31
|
+
var is_first_part_array, quoted_validated, part, options, each_part_options;
|
32
|
+
if (parts.length == 0) {
|
33
|
+
return /(?!)/;
|
34
|
+
}
|
35
|
+
// cover the 2 arrays passed as arguments case
|
36
|
+
is_first_part_array = parts[0].$$is_array;
|
37
|
+
if (parts.length > 1 && is_first_part_array) {
|
38
|
+
#{raise TypeError, 'no implicit conversion of Array into String'}
|
39
|
+
}
|
40
|
+
// deal with splat issues (related to https://github.com/opal/opal/issues/858)
|
41
|
+
if (is_first_part_array) {
|
42
|
+
parts = parts[0];
|
43
|
+
}
|
44
|
+
options = undefined;
|
45
|
+
quoted_validated = [];
|
46
|
+
for (var i=0; i < parts.length; i++) {
|
47
|
+
part = parts[i];
|
48
|
+
if (part.$$is_string) {
|
49
|
+
quoted_validated.push(#{escape(`part`)});
|
50
|
+
}
|
51
|
+
else if (part.$$is_regexp) {
|
52
|
+
each_part_options = #{`part`.options};
|
53
|
+
if (options != undefined && options != each_part_options) {
|
54
|
+
#{raise TypeError, 'All expressions must use the same options'}
|
55
|
+
}
|
56
|
+
options = each_part_options;
|
57
|
+
quoted_validated.push('('+part.source+')');
|
58
|
+
}
|
59
|
+
else {
|
60
|
+
quoted_validated.push(#{escape(`part`.to_str)});
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
# Take advantage of logic that can parse options from JS Regex
|
65
|
+
new(`quoted_validated`.join('|'), `options`)
|
27
66
|
end
|
28
67
|
|
29
|
-
def new(regexp, options = undefined)
|
30
|
-
|
68
|
+
def new(regexp, options = undefined)
|
69
|
+
%x{
|
70
|
+
// Play nice with IE8
|
71
|
+
if (regexp.$$is_string && regexp.substr(regexp.length-1, 1) == "\\") {
|
72
|
+
#{raise RegexpError, "too short escape sequence: /#{regexp}/"}
|
73
|
+
}
|
74
|
+
|
75
|
+
if (options == undefined || #{!options}) {
|
76
|
+
options = undefined;
|
77
|
+
}
|
78
|
+
|
79
|
+
if (options != undefined) {
|
80
|
+
if (regexp.$$is_regexp) {
|
81
|
+
// options are already in regex
|
82
|
+
options = undefined;
|
83
|
+
}
|
84
|
+
else if (options.$$is_number) {
|
85
|
+
var result = '';
|
86
|
+
if (#{IGNORECASE} & options) {
|
87
|
+
result += 'i';
|
88
|
+
}
|
89
|
+
if (#{MULTILINE} & options) {
|
90
|
+
result += 'm';
|
91
|
+
}
|
92
|
+
options = result;
|
93
|
+
}
|
94
|
+
else {
|
95
|
+
options = 'i';
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
return new RegExp(regexp, options);
|
100
|
+
}
|
31
101
|
end
|
32
102
|
end
|
33
103
|
|
@@ -70,6 +140,7 @@ class Regexp
|
|
70
140
|
}
|
71
141
|
}
|
72
142
|
|
143
|
+
// global RegExp maintains state, so not using self/this
|
73
144
|
var md, re = new RegExp(self.source, 'gm' + (self.ignoreCase ? 'i' : ''));
|
74
145
|
|
75
146
|
while (true) {
|
@@ -93,6 +164,41 @@ class Regexp
|
|
93
164
|
def source
|
94
165
|
`self.source`
|
95
166
|
end
|
167
|
+
|
168
|
+
def options
|
169
|
+
# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags is still experimental
|
170
|
+
# we need the flags and source does not give us that
|
171
|
+
%x{
|
172
|
+
var as_string, text_flags, result, text_flag;
|
173
|
+
as_string = self.toString();
|
174
|
+
if (as_string == "/(?:)/") {
|
175
|
+
#{raise TypeError, 'uninitialized Regexp'}
|
176
|
+
}
|
177
|
+
text_flags = as_string.replace(self.source, '').match(/\w+/);
|
178
|
+
result = 0;
|
179
|
+
// may have no flags
|
180
|
+
if (text_flags == null) {
|
181
|
+
return result;
|
182
|
+
}
|
183
|
+
// first match contains all of our flags
|
184
|
+
text_flags = text_flags[0];
|
185
|
+
for (var i=0; i < text_flags.length; i++) {
|
186
|
+
text_flag = text_flags[i];
|
187
|
+
switch(text_flag) {
|
188
|
+
case 'i':
|
189
|
+
result |= #{IGNORECASE};
|
190
|
+
break;
|
191
|
+
case 'm':
|
192
|
+
result |= #{MULTILINE};
|
193
|
+
break;
|
194
|
+
default:
|
195
|
+
#{raise "RegExp flag #{`text_flag`} does not have a match in Ruby"}
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
return result;
|
200
|
+
}
|
201
|
+
end
|
96
202
|
|
97
203
|
alias to_s source
|
98
204
|
end
|
data/opal/corelib/runtime.js
CHANGED
@@ -155,7 +155,7 @@
|
|
155
155
|
}
|
156
156
|
else if (typeof(superklass) === 'function') {
|
157
157
|
// passed native constructor as superklass, so bridge it as ruby class
|
158
|
-
return bridge_class(id, superklass);
|
158
|
+
return bridge_class(id, superklass, base);
|
159
159
|
}
|
160
160
|
else {
|
161
161
|
// if class doesnt exist, create a new one with given superclass
|
@@ -560,14 +560,22 @@
|
|
560
560
|
*
|
561
561
|
* @param [String] name the name of the ruby class to create
|
562
562
|
* @param [Function] constructor native javascript constructor to use
|
563
|
+
* @param [Object] base where the bridge class is being created. If none is supplied, the top level scope (Opal) will be used
|
563
564
|
* @return [Class] returns new ruby class
|
564
565
|
*/
|
565
|
-
function bridge_class(name, constructor) {
|
566
|
+
function bridge_class(name, constructor, base) {
|
566
567
|
var klass = boot_class_object(ObjectClass, constructor);
|
567
568
|
|
568
569
|
klass.$$name = name;
|
569
570
|
|
570
|
-
|
571
|
+
if (base === undefined) {
|
572
|
+
base = Opal;
|
573
|
+
}
|
574
|
+
else {
|
575
|
+
base = base.$$scope;
|
576
|
+
}
|
577
|
+
|
578
|
+
create_scope(base, klass, name);
|
571
579
|
bridged_classes.push(klass);
|
572
580
|
|
573
581
|
var object_methods = BasicObjectClass.$$methods.concat(ObjectClass.$$methods);
|
@@ -1155,7 +1163,7 @@
|
|
1155
1163
|
keys = [],
|
1156
1164
|
_map = {},
|
1157
1165
|
smap = {},
|
1158
|
-
key, obj, length, khash;
|
1166
|
+
key, obj, length, khash, map;
|
1159
1167
|
|
1160
1168
|
hash.map = _map;
|
1161
1169
|
hash.smap = smap;
|
data/opal/corelib/string.rb
CHANGED
@@ -952,127 +952,83 @@ class String
|
|
952
952
|
alias slice []
|
953
953
|
alias slice! <<
|
954
954
|
|
955
|
-
def split(pattern =
|
955
|
+
def split(pattern = undefined, limit = undefined)
|
956
956
|
%x{
|
957
|
-
if (pattern === nil || pattern === undefined) {
|
958
|
-
pattern = #{$;};
|
959
|
-
}
|
960
|
-
|
961
|
-
var result = [];
|
962
|
-
if (limit !== undefined) {
|
963
|
-
limit = #{Opal.coerce_to!(limit, Integer, :to_int)};
|
964
|
-
}
|
965
|
-
|
966
957
|
if (self.length === 0) {
|
967
958
|
return [];
|
968
959
|
}
|
969
960
|
|
970
|
-
if (limit ===
|
971
|
-
|
961
|
+
if (limit === undefined) {
|
962
|
+
limit = 0;
|
963
|
+
} else {
|
964
|
+
limit = #{Opal.coerce_to!(limit, Integer, :to_int)};
|
965
|
+
if (limit === 1) {
|
966
|
+
return [self];
|
967
|
+
}
|
972
968
|
}
|
973
969
|
|
974
|
-
if (pattern
|
975
|
-
|
970
|
+
if (pattern === undefined || pattern === nil) {
|
971
|
+
pattern = #{$; || ' '};
|
972
|
+
}
|
976
973
|
|
977
|
-
|
978
|
-
|
979
|
-
|
974
|
+
var result = [],
|
975
|
+
string = self.toString(),
|
976
|
+
index = 0,
|
977
|
+
match,
|
978
|
+
i;
|
980
979
|
|
981
|
-
|
982
|
-
|
983
|
-
|
980
|
+
if (pattern.$$is_regexp) {
|
981
|
+
pattern = new RegExp(pattern.source, 'gm' + (pattern.ignoreCase ? 'i' : ''));
|
982
|
+
} else {
|
983
|
+
pattern = #{Opal.coerce_to(pattern, String, :to_str).to_s};
|
984
|
+
if (pattern === ' ') {
|
985
|
+
pattern = /\s+/gm;
|
986
|
+
string = string.replace(/^\s+/, '');
|
987
|
+
} else {
|
988
|
+
pattern = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gm');
|
984
989
|
}
|
985
|
-
|
986
|
-
/* RegExp.exec only has sane behavior with global flag */
|
987
|
-
if (! pattern.global) {
|
988
|
-
pattern = eval(pattern_str + 'g');
|
989
|
-
}
|
990
|
-
|
991
|
-
var match_data;
|
992
|
-
var prev_index = 0;
|
993
|
-
pattern.lastIndex = 0;
|
994
|
-
|
995
|
-
while ((match_data = pattern.exec(self)) !== null) {
|
996
|
-
var segment = self.slice(prev_index, match_data.index);
|
997
|
-
result.push(segment);
|
998
|
-
|
999
|
-
prev_index = pattern.lastIndex;
|
1000
|
-
|
1001
|
-
if (match_data[0].length === 0) {
|
1002
|
-
if (blank_pattern) {
|
1003
|
-
/* explicitly split on JS's empty RE form.*/
|
1004
|
-
pattern = /(?:)/;
|
1005
|
-
}
|
1006
|
-
|
1007
|
-
result = self.split(pattern);
|
1008
|
-
/* with "unlimited", ruby leaves a trail on blanks. */
|
1009
|
-
if (limit !== undefined && limit < 0 && blank_pattern) {
|
1010
|
-
result.push('');
|
1011
|
-
}
|
1012
|
-
|
1013
|
-
prev_index = undefined;
|
1014
|
-
break;
|
1015
|
-
}
|
990
|
+
}
|
1016
991
|
|
1017
|
-
|
1018
|
-
break;
|
1019
|
-
}
|
1020
|
-
}
|
992
|
+
result = string.split(pattern);
|
1021
993
|
|
1022
|
-
|
1023
|
-
|
1024
|
-
}
|
1025
|
-
}
|
994
|
+
while ((i = result.indexOf(undefined)) !== -1) {
|
995
|
+
result.splice(i, 1);
|
1026
996
|
}
|
1027
|
-
else {
|
1028
|
-
var splitted = 0, start = 0, lim = 0;
|
1029
997
|
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
pattern = #{Opal.try_convert(pattern, String, :to_str).to_s};
|
998
|
+
if (limit === 0) {
|
999
|
+
while (result[result.length - 1] === '') {
|
1000
|
+
result.length -= 1;
|
1034
1001
|
}
|
1002
|
+
return result;
|
1003
|
+
}
|
1035
1004
|
|
1036
|
-
|
1037
|
-
: self;
|
1038
|
-
var cursor = -1;
|
1039
|
-
while ((cursor = string.indexOf(pattern, start)) > -1 && cursor < string.length) {
|
1040
|
-
if (splitted + 1 === limit) {
|
1041
|
-
break;
|
1042
|
-
}
|
1043
|
-
|
1044
|
-
if (pattern == ' ' && cursor == start) {
|
1045
|
-
start = cursor + 1;
|
1046
|
-
continue;
|
1047
|
-
}
|
1048
|
-
|
1049
|
-
result.push(string.substr(start, pattern.length ? cursor - start : 1));
|
1050
|
-
splitted++;
|
1051
|
-
|
1052
|
-
start = cursor + (pattern.length ? pattern.length : 1);
|
1053
|
-
}
|
1005
|
+
match = pattern.exec(string);
|
1054
1006
|
|
1055
|
-
|
1056
|
-
|
1007
|
+
if (limit < 0) {
|
1008
|
+
if (match !== null && match[0] === '' && pattern.source.indexOf('(?=') === -1) {
|
1009
|
+
for (i = 0; i < match.length; i++) {
|
1057
1010
|
result.push('');
|
1058
1011
|
}
|
1059
|
-
else {
|
1060
|
-
result.push(string.substr(start, string.length));
|
1061
|
-
}
|
1062
1012
|
}
|
1013
|
+
return result;
|
1063
1014
|
}
|
1064
1015
|
|
1065
|
-
if (
|
1066
|
-
|
1067
|
-
|
1068
|
-
}
|
1016
|
+
if (match !== null && match[0] === '') {
|
1017
|
+
result.splice(limit - 1, result.length - 1, result.slice(limit - 1).join(''));
|
1018
|
+
return result;
|
1069
1019
|
}
|
1070
1020
|
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1021
|
+
i = 0;
|
1022
|
+
while (match !== null) {
|
1023
|
+
i++;
|
1024
|
+
index = pattern.lastIndex;
|
1025
|
+
if (i + 1 === limit) {
|
1026
|
+
break;
|
1027
|
+
}
|
1028
|
+
match = pattern.exec(string);
|
1074
1029
|
}
|
1075
1030
|
|
1031
|
+
result.splice(limit - 1, result.length - 1, string.slice(index));
|
1076
1032
|
return result;
|
1077
1033
|
}
|
1078
1034
|
end
|