@@ -8,6 +8,7 @@ import 'dart:math' as math;
88import 'package:collection/collection.dart' ;
99
1010import '../callable.dart' ;
11+ import '../exception.dart' ;
1112import '../module/built_in.dart' ;
1213import '../util/character.dart' ;
1314import '../utils.dart' ;
@@ -32,6 +33,44 @@ final global = UnmodifiableListView([
3233final module = BuiltInModule ("string" , functions: < Callable > [
3334 _unquote, _quote, _toUpperCase, _toLowerCase, _length, _insert, _index, //
3435 _slice, _uniqueId,
36+
37+ _function ("split" , r"$string, $separator, $limit: null" , (arguments) {
38+ var string = arguments[0 ].assertString ("string" );
39+ var separator = arguments[1 ].assertString ("separator" );
40+ var limit = arguments[2 ].realNull? .assertNumber ("limit" ).assertInt ("limit" );
41+
42+ if (limit != null && limit < 1 ) {
43+ throw SassScriptException ("\$ limit: Must be 1 or greater, was $limit ." );
44+ }
45+
46+ if (string.text.isEmpty) {
47+ return const SassList .empty (
48+ separator: ListSeparator .comma, brackets: true );
49+ } else if (separator.text.isEmpty) {
50+ return SassList (
51+ string.text.runes.map ((rune) =>
52+ SassString (String .fromCharCode (rune), quotes: string.hasQuotes)),
53+ ListSeparator .comma,
54+ brackets: true );
55+ }
56+
57+ var i = 0 ;
58+ var lastEnd = 0 ;
59+ var chunks = < String > [];
60+ for (var match in separator.text.allMatches (string.text)) {
61+ chunks.add (string.text.substring (lastEnd, match.start));
62+ lastEnd = match.end;
63+
64+ i++ ;
65+ if (i == limit) break ;
66+ }
67+ chunks.add (string.text.substring (lastEnd));
68+
69+ return SassList (
70+ chunks.map ((chunk) => SassString (chunk, quotes: string.hasQuotes)),
71+ ListSeparator .comma,
72+ brackets: true );
73+ }),
3574]);
3675
3776final _unquote = _function ("unquote" , r"$string" , (arguments) {
0 commit comments