SassyJSON 1.1.1 → 1.1.2
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 +7 -0
- data/CHANGELOG.md +18 -18
- data/README.md +112 -112
- data/lib/JsonImporter.rb +228 -228
- data/lib/SassyJSON.rb +12 -14
- data/stylesheets/SassyJSON.scss +5 -5
- data/stylesheets/decode/api/_json.scss +26 -26
- data/stylesheets/decode/decode.scss +28 -28
- data/stylesheets/decode/helpers/all/_throw.scss +11 -11
- data/stylesheets/decode/helpers/all/_value.scss +49 -49
- data/stylesheets/decode/helpers/color/_color.scss +50 -50
- data/stylesheets/decode/helpers/color/_get-color-value.scss +22 -22
- data/stylesheets/decode/helpers/color/_hex-to-dec.scss +19 -19
- data/stylesheets/decode/helpers/color/_hex.scss +39 -39
- data/stylesheets/decode/helpers/color/_hsl.scss +46 -46
- data/stylesheets/decode/helpers/color/_rgb.scss +46 -46
- data/stylesheets/decode/helpers/map/_consume.scss +33 -33
- data/stylesheets/decode/helpers/number/_find-digits.scss +39 -39
- data/stylesheets/decode/helpers/number/_find-exponent.scss +51 -51
- data/stylesheets/decode/helpers/number/_find-integer.scss +37 -37
- data/stylesheets/decode/helpers/number/_pow.scss +22 -22
- data/stylesheets/decode/helpers/string/_find-ending-quote.scss +57 -57
- data/stylesheets/decode/helpers/string/_length.scss +42 -42
- data/stylesheets/decode/helpers/string/_strip-token.scss +16 -16
- data/stylesheets/decode/types/_bool.scss +40 -40
- data/stylesheets/decode/types/_list.scss +54 -54
- data/stylesheets/decode/types/_map.scss +78 -78
- data/stylesheets/decode/types/_null.scss +19 -19
- data/stylesheets/decode/types/_number.scss +63 -63
- data/stylesheets/decode/types/_string.scss +41 -41
- data/stylesheets/encode/api/_json.scss +17 -17
- data/stylesheets/encode/encode.scss +17 -17
- data/stylesheets/encode/helpers/_quote.scss +9 -9
- data/stylesheets/encode/mixins/_json.scss +36 -36
- data/stylesheets/encode/types/_bool.scss +9 -9
- data/stylesheets/encode/types/_color.scss +9 -9
- data/stylesheets/encode/types/_list.scss +13 -13
- data/stylesheets/encode/types/_map.scss +13 -13
- data/stylesheets/encode/types/_null.scss +9 -9
- data/stylesheets/encode/types/_number.scss +9 -9
- data/stylesheets/encode/types/_string.scss +9 -9
- metadata +8 -10
@@ -1,37 +1,37 @@
|
|
1
|
-
// Parses a JSON encoded number to find the integer part
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $source: JSON complete source
|
4
|
-
// @param [number] $pointer: current pointer
|
5
|
-
// --------------------------------------------------------------------------------
|
6
|
-
// @throw "Unexpected token $token."
|
7
|
-
// --------------------------------------------------------------------------------
|
8
|
-
// @return [list|false] (new pointer, parsed number)
|
9
|
-
|
10
|
-
@function _find-integer($source, $pointer) {
|
11
|
-
$source: to-lower-case($source);
|
12
|
-
$length: str-length($source);
|
13
|
-
$numbers: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
|
14
|
-
$result: 0;
|
15
|
-
|
16
|
-
@while $pointer <= $length {
|
17
|
-
$token: str-slice($source, $pointer, $pointer);
|
18
|
-
$index: index($numbers, $token);
|
19
|
-
|
20
|
-
@if $token == '-' {
|
21
|
-
// do nothing
|
22
|
-
}
|
23
|
-
@else if $index {
|
24
|
-
$result: $result * 10 + ($index - 1);
|
25
|
-
}
|
26
|
-
@else {
|
27
|
-
@if index('e' '.' ' ' ',' ']' '}', $token) {
|
28
|
-
@return $pointer, $result;
|
29
|
-
}
|
30
|
-
@return _throw("Unexpected token `" + $token + "`.", $pointer);
|
31
|
-
}
|
32
|
-
|
33
|
-
$pointer: $pointer + 1;
|
34
|
-
}
|
35
|
-
|
36
|
-
@return $pointer, $result;
|
37
|
-
}
|
1
|
+
// Parses a JSON encoded number to find the integer part
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $source: JSON complete source
|
4
|
+
// @param [number] $pointer: current pointer
|
5
|
+
// --------------------------------------------------------------------------------
|
6
|
+
// @throw "Unexpected token $token."
|
7
|
+
// --------------------------------------------------------------------------------
|
8
|
+
// @return [list|false] (new pointer, parsed number)
|
9
|
+
|
10
|
+
@function _find-integer($source, $pointer) {
|
11
|
+
$source: to-lower-case($source);
|
12
|
+
$length: str-length($source);
|
13
|
+
$numbers: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
|
14
|
+
$result: 0;
|
15
|
+
|
16
|
+
@while $pointer <= $length {
|
17
|
+
$token: str-slice($source, $pointer, $pointer);
|
18
|
+
$index: index($numbers, $token);
|
19
|
+
|
20
|
+
@if $token == '-' {
|
21
|
+
// do nothing
|
22
|
+
}
|
23
|
+
@else if $index {
|
24
|
+
$result: $result * 10 + ($index - 1);
|
25
|
+
}
|
26
|
+
@else {
|
27
|
+
@if index('e' '.' ' ' ',' ']' '}', $token) {
|
28
|
+
@return $pointer, $result;
|
29
|
+
}
|
30
|
+
@return _throw("Unexpected token `" + $token + "`.", $pointer);
|
31
|
+
}
|
32
|
+
|
33
|
+
$pointer: $pointer + 1;
|
34
|
+
}
|
35
|
+
|
36
|
+
@return $pointer, $result;
|
37
|
+
}
|
@@ -1,22 +1,22 @@
|
|
1
|
-
// Power function
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [number] $x: number
|
4
|
-
// @param [number] $n: power
|
5
|
-
// --------------------------------------------------------------------------------
|
6
|
-
// @return [number] $x ^ $n
|
7
|
-
|
8
|
-
@function _pow($x, $n) {
|
9
|
-
$ret: 1;
|
10
|
-
|
11
|
-
@if $n >= 0 {
|
12
|
-
@for $i from 1 through $n {
|
13
|
-
$ret: $ret * $x;
|
14
|
-
}
|
15
|
-
} @else {
|
16
|
-
@for $i from $n to 0 {
|
17
|
-
$ret: $ret / $x;
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
@return $ret;
|
22
|
-
}
|
1
|
+
// Power function
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [number] $x: number
|
4
|
+
// @param [number] $n: power
|
5
|
+
// --------------------------------------------------------------------------------
|
6
|
+
// @return [number] $x ^ $n
|
7
|
+
|
8
|
+
@function _pow($x, $n) {
|
9
|
+
$ret: 1;
|
10
|
+
|
11
|
+
@if $n >= 0 {
|
12
|
+
@for $i from 1 through $n {
|
13
|
+
$ret: $ret * $x;
|
14
|
+
}
|
15
|
+
} @else {
|
16
|
+
@for $i from $n to 0 {
|
17
|
+
$ret: $ret / $x;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
@return $ret;
|
22
|
+
}
|
@@ -1,57 +1,57 @@
|
|
1
|
-
// Will find the first non escaped quote in a JSON String
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $string: to search in
|
4
|
-
// --------------------------------------------------------------------------------
|
5
|
-
// @return [number] position of the first non escaped quote
|
6
|
-
|
7
|
-
@function _find-ending-quote($string){
|
8
|
-
$backslash: str-slice('\\', 1, 1); // Dirty hack to have a single backslash
|
9
|
-
$escaped-chars: '"\/bfnrtu'; // Characters that can be escaped in JSON
|
10
|
-
$hexadecimal-chars: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' 'a' 'b' 'c' 'd' 'e' 'f';
|
11
|
-
|
12
|
-
$pos: 1;
|
13
|
-
$length: str-length($string);
|
14
|
-
$backslash-found: false;
|
15
|
-
|
16
|
-
@while $pos <= $length {
|
17
|
-
$char: to-lower-case(str-slice($string, $pos, $pos));
|
18
|
-
|
19
|
-
// Previous char was a backslash
|
20
|
-
@if $backslash-found {
|
21
|
-
|
22
|
-
// Special case, the 'u' character
|
23
|
-
@if $char == 'u' {
|
24
|
-
// Next 4 characters must be hexadecimal
|
25
|
-
@if not index($hexadecimal-chars, str-slice($string, $pos + 1, $pos + 1)) or
|
26
|
-
not index($hexadecimal-chars, str-slice($string, $pos + 2, $pos + 2)) or
|
27
|
-
not index($hexadecimal-chars, str-slice($string, $pos + 3, $pos + 3)) or
|
28
|
-
not index($hexadecimal-chars, str-slice($string, $pos + 4, $pos + 4)) {
|
29
|
-
@return 0;
|
30
|
-
}
|
31
|
-
|
32
|
-
$pos: $pos + 4;
|
33
|
-
}
|
34
|
-
|
35
|
-
// Invalid character escaped
|
36
|
-
@else if not str-index($escaped-chars, $char) {
|
37
|
-
@return 0;
|
38
|
-
}
|
39
|
-
|
40
|
-
$backslash-found: false;
|
41
|
-
}
|
42
|
-
|
43
|
-
@else if $char == $backslash {
|
44
|
-
$backslash-found: true;
|
45
|
-
}
|
46
|
-
|
47
|
-
// Unescaped quote found
|
48
|
-
@else if $char == '"' {
|
49
|
-
@return $pos;
|
50
|
-
}
|
51
|
-
|
52
|
-
$pos: $pos + 1;
|
53
|
-
}
|
54
|
-
|
55
|
-
// No end of string found
|
56
|
-
@return 0;
|
57
|
-
}
|
1
|
+
// Will find the first non escaped quote in a JSON String
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: to search in
|
4
|
+
// --------------------------------------------------------------------------------
|
5
|
+
// @return [number] position of the first non escaped quote
|
6
|
+
|
7
|
+
@function _find-ending-quote($string){
|
8
|
+
$backslash: str-slice('\\', 1, 1); // Dirty hack to have a single backslash
|
9
|
+
$escaped-chars: '"\/bfnrtu'; // Characters that can be escaped in JSON
|
10
|
+
$hexadecimal-chars: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' 'a' 'b' 'c' 'd' 'e' 'f';
|
11
|
+
|
12
|
+
$pos: 1;
|
13
|
+
$length: str-length($string);
|
14
|
+
$backslash-found: false;
|
15
|
+
|
16
|
+
@while $pos <= $length {
|
17
|
+
$char: to-lower-case(str-slice($string, $pos, $pos));
|
18
|
+
|
19
|
+
// Previous char was a backslash
|
20
|
+
@if $backslash-found {
|
21
|
+
|
22
|
+
// Special case, the 'u' character
|
23
|
+
@if $char == 'u' {
|
24
|
+
// Next 4 characters must be hexadecimal
|
25
|
+
@if not index($hexadecimal-chars, str-slice($string, $pos + 1, $pos + 1)) or
|
26
|
+
not index($hexadecimal-chars, str-slice($string, $pos + 2, $pos + 2)) or
|
27
|
+
not index($hexadecimal-chars, str-slice($string, $pos + 3, $pos + 3)) or
|
28
|
+
not index($hexadecimal-chars, str-slice($string, $pos + 4, $pos + 4)) {
|
29
|
+
@return 0;
|
30
|
+
}
|
31
|
+
|
32
|
+
$pos: $pos + 4;
|
33
|
+
}
|
34
|
+
|
35
|
+
// Invalid character escaped
|
36
|
+
@else if not str-index($escaped-chars, $char) {
|
37
|
+
@return 0;
|
38
|
+
}
|
39
|
+
|
40
|
+
$backslash-found: false;
|
41
|
+
}
|
42
|
+
|
43
|
+
@else if $char == $backslash {
|
44
|
+
$backslash-found: true;
|
45
|
+
}
|
46
|
+
|
47
|
+
// Unescaped quote found
|
48
|
+
@else if $char == '"' {
|
49
|
+
@return $pos;
|
50
|
+
}
|
51
|
+
|
52
|
+
$pos: $pos + 1;
|
53
|
+
}
|
54
|
+
|
55
|
+
// No end of string found
|
56
|
+
@return 0;
|
57
|
+
}
|
@@ -1,43 +1,43 @@
|
|
1
|
-
// Parses a JSON encoded string to see if it's a CSS length
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $string: JSON string
|
4
|
-
// --------------------------------------------------------------------------------
|
5
|
-
// @return [number|string] string or number, depending on the match
|
6
|
-
|
7
|
-
@function _length($string) {
|
8
|
-
@if type-of($string) == number {
|
9
|
-
@return $string;
|
10
|
-
}
|
11
|
-
|
12
|
-
$strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax';
|
13
|
-
$units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax;
|
14
|
-
$number: "";
|
15
|
-
$unit: "";
|
16
|
-
|
17
|
-
@for $i from 1 through str-length($string) {
|
18
|
-
$c: str-slice($string, $i, $i);
|
19
|
-
@if $c == ' ' {
|
20
|
-
@if $number != "" {
|
21
|
-
@return $string;
|
22
|
-
}
|
23
|
-
}
|
24
|
-
@else if index('0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '-' '.', $c) {
|
25
|
-
$number: $number + $c;
|
26
|
-
}
|
27
|
-
@else {
|
28
|
-
@if $number == "" {
|
29
|
-
@return $string;
|
30
|
-
}
|
31
|
-
$unit: $unit + $c;
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
$number: nth(_json-decode--number($number, 2), 2);
|
36
|
-
$index: index($strings, to-lower-case($unit));
|
37
|
-
|
38
|
-
@if $index and $index > 0 {
|
39
|
-
@return $number * nth($units, $index);
|
40
|
-
}
|
41
|
-
|
42
|
-
@return $string;
|
1
|
+
// Parses a JSON encoded string to see if it's a CSS length
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: JSON string
|
4
|
+
// --------------------------------------------------------------------------------
|
5
|
+
// @return [number|string] string or number, depending on the match
|
6
|
+
|
7
|
+
@function _length($string) {
|
8
|
+
@if type-of($string) == number {
|
9
|
+
@return $string;
|
10
|
+
}
|
11
|
+
|
12
|
+
$strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax';
|
13
|
+
$units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax;
|
14
|
+
$number: "";
|
15
|
+
$unit: "";
|
16
|
+
|
17
|
+
@for $i from 1 through str-length($string) {
|
18
|
+
$c: str-slice($string, $i, $i);
|
19
|
+
@if $c == ' ' {
|
20
|
+
@if $number != "" {
|
21
|
+
@return $string;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
@else if index('0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '-' '.', $c) {
|
25
|
+
$number: $number + $c;
|
26
|
+
}
|
27
|
+
@else {
|
28
|
+
@if $number == "" {
|
29
|
+
@return $string;
|
30
|
+
}
|
31
|
+
$unit: $unit + $c;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
$number: nth(_json-decode--number($number, 2), 2);
|
36
|
+
$index: index($strings, to-lower-case($unit));
|
37
|
+
|
38
|
+
@if $index and $index > 0 {
|
39
|
+
@return $number * nth($units, $index);
|
40
|
+
}
|
41
|
+
|
42
|
+
@return $string;
|
43
43
|
}
|
@@ -1,16 +1,16 @@
|
|
1
|
-
// Strip special carriage return characters
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $string: string to parse
|
4
|
-
// @param [string] $char: char to strip
|
5
|
-
// --------------------------------------------------------------------------------
|
6
|
-
// @return [string] new string
|
7
|
-
|
8
|
-
@function _strip-token($string, $token, $replace) {
|
9
|
-
|
10
|
-
@while str-index($string, $token) and str-index($string, $token) > 0 {
|
11
|
-
$index: str-index($string, $token);
|
12
|
-
$string: str-slice($string, 1, $index - 1) + $replace + str-slice($string, $index + str-length($token));
|
13
|
-
}
|
14
|
-
|
15
|
-
@return $string;
|
16
|
-
}
|
1
|
+
// Strip special carriage return characters
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string to parse
|
4
|
+
// @param [string] $char: char to strip
|
5
|
+
// --------------------------------------------------------------------------------
|
6
|
+
// @return [string] new string
|
7
|
+
|
8
|
+
@function _strip-token($string, $token, $replace) {
|
9
|
+
|
10
|
+
@while str-index($string, $token) and str-index($string, $token) > 0 {
|
11
|
+
$index: str-index($string, $token);
|
12
|
+
$string: str-slice($string, 1, $index - 1) + $replace + str-slice($string, $index + str-length($token));
|
13
|
+
}
|
14
|
+
|
15
|
+
@return $string;
|
16
|
+
}
|
@@ -1,40 +1,40 @@
|
|
1
|
-
// Parses a JSON encoded `true`
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $source: JSON complete source
|
4
|
-
// @param [number] $pointer: current pointer
|
5
|
-
// --------------------------------------------------------------------------------
|
6
|
-
// @throw "Unexpected token `t`."
|
7
|
-
// --------------------------------------------------------------------------------
|
8
|
-
// @return [list|false] (new pointer, true)
|
9
|
-
|
10
|
-
@function _json-decode--true($source, $pointer) {
|
11
|
-
$length: str-length($source);
|
12
|
-
@if $length - $pointer < 2
|
13
|
-
or str-slice($source, $pointer, $pointer) != 'r'
|
14
|
-
or str-slice($source, $pointer + 1, $pointer + 1) != 'u'
|
15
|
-
or str-slice($source, $pointer + 2, $pointer + 2) != 'e' {
|
16
|
-
@return _throw("Unexpected token: `t`.", $pointer);
|
17
|
-
}
|
18
|
-
@return ($pointer + 3, true);
|
19
|
-
}
|
20
|
-
|
21
|
-
// Parses a JSON encoded `false`
|
22
|
-
// --------------------------------------------------------------------------------
|
23
|
-
// @param $source: JSON complete source
|
24
|
-
// @param $pointer: current pointer
|
25
|
-
// --------------------------------------------------------------------------------
|
26
|
-
// @throw "Unexpected token `f`."
|
27
|
-
// --------------------------------------------------------------------------------
|
28
|
-
// @return [list|false] (new pointer, false)
|
29
|
-
|
30
|
-
@function _json-decode--false($source, $pointer) {
|
31
|
-
$length: str-length($source);
|
32
|
-
@if $length - $pointer < 3
|
33
|
-
or str-slice($source, $pointer, $pointer) != 'a'
|
34
|
-
or str-slice($source, $pointer + 1, $pointer + 1) != 'l'
|
35
|
-
or str-slice($source, $pointer + 2, $pointer + 2) != 's'
|
36
|
-
or str-slice($source, $pointer + 3, $pointer + 3) != 'e' {
|
37
|
-
@return _throw("Unexpected token: `f`.", $pointer);
|
38
|
-
}
|
39
|
-
@return ($pointer + 4, false);
|
40
|
-
}
|
1
|
+
// Parses a JSON encoded `true`
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $source: JSON complete source
|
4
|
+
// @param [number] $pointer: current pointer
|
5
|
+
// --------------------------------------------------------------------------------
|
6
|
+
// @throw "Unexpected token `t`."
|
7
|
+
// --------------------------------------------------------------------------------
|
8
|
+
// @return [list|false] (new pointer, true)
|
9
|
+
|
10
|
+
@function _json-decode--true($source, $pointer) {
|
11
|
+
$length: str-length($source);
|
12
|
+
@if $length - $pointer < 2
|
13
|
+
or str-slice($source, $pointer, $pointer) != 'r'
|
14
|
+
or str-slice($source, $pointer + 1, $pointer + 1) != 'u'
|
15
|
+
or str-slice($source, $pointer + 2, $pointer + 2) != 'e' {
|
16
|
+
@return _throw("Unexpected token: `t`.", $pointer);
|
17
|
+
}
|
18
|
+
@return ($pointer + 3, true);
|
19
|
+
}
|
20
|
+
|
21
|
+
// Parses a JSON encoded `false`
|
22
|
+
// --------------------------------------------------------------------------------
|
23
|
+
// @param $source: JSON complete source
|
24
|
+
// @param $pointer: current pointer
|
25
|
+
// --------------------------------------------------------------------------------
|
26
|
+
// @throw "Unexpected token `f`."
|
27
|
+
// --------------------------------------------------------------------------------
|
28
|
+
// @return [list|false] (new pointer, false)
|
29
|
+
|
30
|
+
@function _json-decode--false($source, $pointer) {
|
31
|
+
$length: str-length($source);
|
32
|
+
@if $length - $pointer < 3
|
33
|
+
or str-slice($source, $pointer, $pointer) != 'a'
|
34
|
+
or str-slice($source, $pointer + 1, $pointer + 1) != 'l'
|
35
|
+
or str-slice($source, $pointer + 2, $pointer + 2) != 's'
|
36
|
+
or str-slice($source, $pointer + 3, $pointer + 3) != 'e' {
|
37
|
+
@return _throw("Unexpected token: `f`.", $pointer);
|
38
|
+
}
|
39
|
+
@return ($pointer + 4, false);
|
40
|
+
}
|
@@ -1,54 +1,54 @@
|
|
1
|
-
// Parses a JSON encoded array
|
2
|
-
// --------------------------------------------------------------------------------
|
3
|
-
// @param [string] $source: JSON complete source
|
4
|
-
// @param [number] $pointer: current pointer
|
5
|
-
// --------------------------------------------------------------------------------
|
6
|
-
// @throw "Unexpected comma in array literal."
|
7
|
-
// @throw "Missing comma in array literal."
|
8
|
-
// @throw "Unterminated array literal."
|
9
|
-
// --------------------------------------------------------------------------------
|
10
|
-
// @return [list|false] (new pointer, parsed list)
|
11
|
-
|
12
|
-
@function _json-decode--list($source, $pointer) {
|
13
|
-
$length: str-length($source);
|
14
|
-
$list: ();
|
15
|
-
$needs-comma: false;
|
16
|
-
|
17
|
-
@if $pointer <= $length and str-slice($source, $pointer, $pointer) == "]" {
|
18
|
-
@return ($pointer + 1, $list);
|
19
|
-
}
|
20
|
-
|
21
|
-
@while $pointer <= $length {
|
22
|
-
$token: str-slice($source, $pointer, $pointer);
|
23
|
-
|
24
|
-
@if $token == "]" {
|
25
|
-
@if not $needs-comma and length($list) != 0 {
|
26
|
-
@return _throw("Unexpected comma in array literal.", $pointer);
|
27
|
-
}
|
28
|
-
|
29
|
-
// Do it the Sass way and destruct a single item array to an element.
|
30
|
-
@return ($pointer + 1, if(length($list) == 1, nth($list, 1), $list));
|
31
|
-
}
|
32
|
-
@else if $token == " " {
|
33
|
-
$pointer: $pointer + 1;
|
34
|
-
}
|
35
|
-
@else if $token == "," {
|
36
|
-
@if not $needs-comma {
|
37
|
-
@return _throw("Unexpected comma in array literal.", $pointer);
|
38
|
-
}
|
39
|
-
$needs-comma: false;
|
40
|
-
$pointer: $pointer + 1;
|
41
|
-
}
|
42
|
-
@else {
|
43
|
-
@if $needs-comma {
|
44
|
-
@return _throw("Missing comma in array literal.", $pointer);
|
45
|
-
}
|
46
|
-
$read: _json-decode--value($source, $pointer);
|
47
|
-
$pointer: nth($read, 1);
|
48
|
-
$list: append($list, nth($read, 2));
|
49
|
-
$needs-comma: true;
|
50
|
-
}
|
51
|
-
}
|
52
|
-
|
53
|
-
@return _throw("Unterminated array literal.", $pointer);
|
54
|
-
}
|
1
|
+
// Parses a JSON encoded array
|
2
|
+
// --------------------------------------------------------------------------------
|
3
|
+
// @param [string] $source: JSON complete source
|
4
|
+
// @param [number] $pointer: current pointer
|
5
|
+
// --------------------------------------------------------------------------------
|
6
|
+
// @throw "Unexpected comma in array literal."
|
7
|
+
// @throw "Missing comma in array literal."
|
8
|
+
// @throw "Unterminated array literal."
|
9
|
+
// --------------------------------------------------------------------------------
|
10
|
+
// @return [list|false] (new pointer, parsed list)
|
11
|
+
|
12
|
+
@function _json-decode--list($source, $pointer) {
|
13
|
+
$length: str-length($source);
|
14
|
+
$list: ();
|
15
|
+
$needs-comma: false;
|
16
|
+
|
17
|
+
@if $pointer <= $length and str-slice($source, $pointer, $pointer) == "]" {
|
18
|
+
@return ($pointer + 1, $list);
|
19
|
+
}
|
20
|
+
|
21
|
+
@while $pointer <= $length {
|
22
|
+
$token: str-slice($source, $pointer, $pointer);
|
23
|
+
|
24
|
+
@if $token == "]" {
|
25
|
+
@if not $needs-comma and length($list) != 0 {
|
26
|
+
@return _throw("Unexpected comma in array literal.", $pointer);
|
27
|
+
}
|
28
|
+
|
29
|
+
// Do it the Sass way and destruct a single item array to an element.
|
30
|
+
@return ($pointer + 1, if(length($list) == 1, nth($list, 1), $list));
|
31
|
+
}
|
32
|
+
@else if $token == " " {
|
33
|
+
$pointer: $pointer + 1;
|
34
|
+
}
|
35
|
+
@else if $token == "," {
|
36
|
+
@if not $needs-comma {
|
37
|
+
@return _throw("Unexpected comma in array literal.", $pointer);
|
38
|
+
}
|
39
|
+
$needs-comma: false;
|
40
|
+
$pointer: $pointer + 1;
|
41
|
+
}
|
42
|
+
@else {
|
43
|
+
@if $needs-comma {
|
44
|
+
@return _throw("Missing comma in array literal.", $pointer);
|
45
|
+
}
|
46
|
+
$read: _json-decode--value($source, $pointer);
|
47
|
+
$pointer: nth($read, 1);
|
48
|
+
$list: append($list, nth($read, 2));
|
49
|
+
$needs-comma: true;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
@return _throw("Unterminated array literal.", $pointer);
|
54
|
+
}
|