SassyStrings 0.0.1
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.
- data/CHANGELOG.md +3 -0
- data/README.md +45 -0
- data/lib/SassyStrings.rb +14 -0
- data/stylesheets/_SassyStrings.scss +23 -0
- data/stylesheets/functions/_char-at.scss +25 -0
- data/stylesheets/functions/_levenshtein.scss +99 -0
- data/stylesheets/functions/_str-count.scss +31 -0
- data/stylesheets/functions/_str-ends-with.scss +20 -0
- data/stylesheets/functions/_str-explode.scss +45 -0
- data/stylesheets/functions/_str-implode.scss +15 -0
- data/stylesheets/functions/_str-last-index.scss +30 -0
- data/stylesheets/functions/_str-lcfirst.scss +14 -0
- data/stylesheets/functions/_str-pad.scss +45 -0
- data/stylesheets/functions/_str-printf.scss +28 -0
- data/stylesheets/functions/_str-repeat.scss +26 -0
- data/stylesheets/functions/_str-replace.scss +47 -0
- data/stylesheets/functions/_str-reverse.scss +20 -0
- data/stylesheets/functions/_str-rot.scss +43 -0
- data/stylesheets/functions/_str-shuffle.scss +26 -0
- data/stylesheets/functions/_str-starts-with.scss +20 -0
- data/stylesheets/functions/_str-trim.scss +30 -0
- data/stylesheets/functions/_str-ucfirst.scss +14 -0
- data/stylesheets/functions/_str-word-count.scss +26 -0
- data/stylesheets/functions/_stringify.scss +21 -0
- metadata +101 -0
data/CHANGELOG.md
ADDED
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# SassyStrings
|
2
|
+
|
3
|
+
Here is a [Compass Extension](http://compass-style.org/) providing you all functions you need to manipulate your [Sass](http://sass-lang.com/) strings.
|
4
|
+
|
5
|
+
## What's in there?
|
6
|
+
|
7
|
+
* `char-at($string, $index)`: returns the character from `$string` at index `$index`
|
8
|
+
* `levenshtein($a, $b)`: returns the Levenshtein distance betwee `$a` and `$b`
|
9
|
+
* `str-count($string, $needle)`: counts number of occurrences of `$needle` in `$string`
|
10
|
+
* `str-ends-width($string, $needle)`: returns wether `$string` ends with `$needle`
|
11
|
+
* `str-explode($string, $separator)`: explodes `$string` on `$separator` occurrences
|
12
|
+
* `str-implode($list)`: implodes `$list` into a string
|
13
|
+
* `str-last-index($string, $needle)`: returns last index of `$needle` in `$string`
|
14
|
+
* `str-lcfirst($string)`: turns first letter of `$string` into lower case
|
15
|
+
* `str-pad($string, $length, $pad: " ", $direction: left)`: pads `$string` with `$pad` to match `$length` starting from `$direction`
|
16
|
+
* `str-printf($string, $elements...)`: replaces occurrences of `%s` in `$string` by elements from `$elements`
|
17
|
+
* `str-repeat($string, $times)`: repeats `$string` `$times` times
|
18
|
+
* `str-replace($string, $old, $new: "", $case-sensitive: true)`: replaces `$old` by `$new` in `$string` respecting `$case-sensitive`
|
19
|
+
* `str-reverse($string)`: reverses string
|
20
|
+
* `str-rot($string, $rot: 13)`: rotates letters in `$string` of `$rot` position in alphabet
|
21
|
+
* `str-shuffle($string)`: shuffles letters in string
|
22
|
+
* `str-split($string)`: splits `$string` into a list of characters
|
23
|
+
* `str-starts-width($string, $needle)`: returns wether `$string` starts with `$needle`
|
24
|
+
* `str-trim($string)`: removes white spaces before and after `$string`
|
25
|
+
* `str-ucfirst($string)`: turns first letter of `$string` into upper case
|
26
|
+
* `str-word-count($string)`: counts number of words in `$string`
|
27
|
+
* `stringify($literal)`: casts to stringify
|
28
|
+
|
29
|
+
As well as default Sass core functions:
|
30
|
+
|
31
|
+
* `str-index`
|
32
|
+
* `str-slice`
|
33
|
+
* `str-length`
|
34
|
+
* `str-insert`
|
35
|
+
* `to-lower-case`
|
36
|
+
* `to-upper-case`
|
37
|
+
|
38
|
+
If you feel like an explorer, you can have a look at the code [here](https://github.com/HugoGiraudel/SassyStrings/tree/master/stylesheets).
|
39
|
+
|
40
|
+
## Requirements
|
41
|
+
|
42
|
+
* Sass ~> 3.3.0
|
43
|
+
* Compass ~> 1.0
|
44
|
+
|
45
|
+
Some functions depend on other functions. If you include functions individually, make sure to check for these dependencies in their respective docs.
|
data/lib/SassyStrings.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'compass'
|
2
|
+
|
3
|
+
extension_path = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
4
|
+
Compass::Frameworks.register("SassyStrings", :path => "#{File.dirname(__FILE__)}/..")
|
5
|
+
|
6
|
+
module SassyStrings
|
7
|
+
VERSION = "0.0.1"
|
8
|
+
DATE = "2014-02-16"
|
9
|
+
end
|
10
|
+
|
11
|
+
# Sassy String Functions
|
12
|
+
module Sass::Script::Functions
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
// -------------------------------------------------------------------------------
|
2
|
+
// SassyStrings - A couple of advanced Sass string functions
|
3
|
+
// -------------------------------------------------------------------------------
|
4
|
+
// Repository: https://github.com/HugoGiraudel/SassyStrings/
|
5
|
+
// -------------------------------------------------------------------------------
|
6
|
+
|
7
|
+
@import "functions/char-at";
|
8
|
+
@import "functions/levenshtein";
|
9
|
+
@import "functions/str-count";
|
10
|
+
@import "functions/str-ends-with";
|
11
|
+
@import "functions/str-explode";
|
12
|
+
@import "functions/str-implode";
|
13
|
+
@import "functions/str-lcfirst";
|
14
|
+
@import "functions/str-pad";
|
15
|
+
@import "functions/str-repeat";
|
16
|
+
@import "functions/str-replace";
|
17
|
+
@import "functions/str-rot";
|
18
|
+
@import "functions/str-shuffle";
|
19
|
+
@import "functions/str-starts-with";
|
20
|
+
@import "functions/str-trim";
|
21
|
+
@import "functions/str-ucfirst";
|
22
|
+
@import "functions/str-word-count";
|
23
|
+
@import "functions/stringify";
|
@@ -0,0 +1,25 @@
|
|
1
|
+
// Return character from $string at $index
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $index: index to inspect
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [string]
|
7
|
+
|
8
|
+
@function char-at($string, $index) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`char-at` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($index) != "number" {
|
15
|
+
@warn "`char-at` function expecting a number for $index; #{type-of($index)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
@if $index < 1 or $index > str-length($string) {
|
20
|
+
@warn "Out of bounds $index for `char-at`.";
|
21
|
+
@return false;
|
22
|
+
}
|
23
|
+
|
24
|
+
@return str-slice($string, $index, $index);
|
25
|
+
}
|
@@ -0,0 +1,99 @@
|
|
1
|
+
// Calculating Levenshtein distance between two strings
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param $a: first string
|
4
|
+
// @param $b: second string
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [number]
|
7
|
+
|
8
|
+
@function levenshtein($a, $b) {
|
9
|
+
@if type-of($a) != "string" {
|
10
|
+
@warn "`str-count` function expecting a string for $a; #{type-of($a)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($b) != "string" {
|
15
|
+
@warn "`str-count` function expecting a string for $b; #{type-of($b)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
$a: to-lower-case($a);
|
20
|
+
$b: to-lower-case($b);
|
21
|
+
|
22
|
+
$n: str-length($a);
|
23
|
+
$m: str-length($b);
|
24
|
+
|
25
|
+
$matrix: _matrix($n + 1, $m + 1);
|
26
|
+
$cost: _matrix($n, $m);
|
27
|
+
|
28
|
+
@if $a == $b { @return 0; }
|
29
|
+
@if $n == 0 { @return $m; }
|
30
|
+
@if $m == 0 { @return $n; }
|
31
|
+
|
32
|
+
@for $i from 0 through $n {
|
33
|
+
@for $j from 0 through $m {
|
34
|
+
$v: if($i == 0, $j, if($j == 0, $i, 0));
|
35
|
+
@if $v != 0 {
|
36
|
+
$matrix: _set-matrix($matrix, $i + 1, $j + 1, $v);
|
37
|
+
}
|
38
|
+
@if $i != 0 and $j != 0 {
|
39
|
+
$v: if(str-slice($a, $i, $i) == str-slice($b, $j, $j), 0, 1);
|
40
|
+
@if $v != 0 {
|
41
|
+
$cost: _set-matrix($cost, $i, $j, $v);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
@for $i from 2 through length($matrix) {
|
48
|
+
@for $j from 2 through length(nth($matrix, $i)) {
|
49
|
+
$matrix: _set-matrix($matrix, $i, $j, min(_e($matrix, $i - 1, $j) + 1, _e($matrix, $i, $j - 1) + 1, _e($matrix, $i - 1, $j - 1) + _e($cost, $i - 1, $j - 1)));
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
@return _e($matrix, length($matrix), length(nth($matrix, 1)));
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
// Helper to target an element in a matrix
|
58
|
+
// ----------------------------------------------------------------------------------------------------
|
59
|
+
// @param $m: matrix
|
60
|
+
// @param $x: x coord
|
61
|
+
// @param $y: y coord
|
62
|
+
// ----------------------------------------------------------------------------------------------------
|
63
|
+
// @return [literal]
|
64
|
+
|
65
|
+
@function _e($m, $x, $y) {
|
66
|
+
@return nth(nth($m, $x), $y);
|
67
|
+
}
|
68
|
+
|
69
|
+
// Helper instanciation a matrix of $x by $y
|
70
|
+
// ----------------------------------------------------------------------------------------------------
|
71
|
+
// @param $x: number of cols
|
72
|
+
// @param $y: number of lines
|
73
|
+
// ----------------------------------------------------------------------------------------------------
|
74
|
+
// @return [list]
|
75
|
+
|
76
|
+
@function _matrix($x, $y) {
|
77
|
+
$matrix: ();
|
78
|
+
@for $i from 1 through $x {
|
79
|
+
$tmp: ();
|
80
|
+
@for $y from 1 through $y {
|
81
|
+
$tmp: append($tmp, 0)
|
82
|
+
}
|
83
|
+
$matrix: append($matrix, $tmp);
|
84
|
+
}
|
85
|
+
@return $matrix;
|
86
|
+
}
|
87
|
+
|
88
|
+
// Helper assigning $value at $matrix[$x, $y]
|
89
|
+
// ----------------------------------------------------------------------------------------------------
|
90
|
+
// @param $matrix: matrix to update
|
91
|
+
// @param $x: x coord
|
92
|
+
// @param $y: y coord
|
93
|
+
// @param $value: value to assign at $matrix[$x, $y]
|
94
|
+
// ----------------------------------------------------------------------------------------------------
|
95
|
+
// @return [list]
|
96
|
+
|
97
|
+
@function _set-matrix($matrix, $x, $y, $value) {
|
98
|
+
@return set-nth($matrix, $x, set-nth(nth($matrix, $x), $y, $value));
|
99
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Count the number of occurrences of $needle in $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $needle: substring to count in $string
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [number] | false
|
7
|
+
|
8
|
+
@function str-count($string, $needle) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-count` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($needle) != "string" {
|
15
|
+
@warn "`str-count` function expecting a string for $needle; #{type-of($needle)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
$index: str-index($string, $needle);
|
20
|
+
$result: if($index, 1, 0);
|
21
|
+
|
22
|
+
@if $index {
|
23
|
+
@for $i from $index + str-length($needle) through str-length($string) {
|
24
|
+
@if str-slice($string, $i, $i + str-length($needle) - 1) == $needle {
|
25
|
+
$result: $result + 1;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
@return $result;
|
31
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// Check whether $string ends with $needle
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $needle: substring to check
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [bool]
|
7
|
+
|
8
|
+
@function str-ends-with($string, $needle) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-starts-with` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($needle) != "string" {
|
15
|
+
@warn "`str-starts-with` function expecting a string for $needle; #{type-of($needle)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
@return str-slice($string, -1 * str-length($needle)) == $needle;
|
20
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
// Split $string into several parts using $delimiter
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $delimiter: string to use as a delimiter to split $string
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [list] | false
|
7
|
+
|
8
|
+
@function str-explode($string, $delimiter: '') {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`explode` function expecting a string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($delimiter) != "string" {
|
15
|
+
@warn "`explode` function expecting a string; #{type-of($delimiter)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
$result: ();
|
20
|
+
$length: str-length($string);
|
21
|
+
|
22
|
+
@if str-length($delimiter) == 0 {
|
23
|
+
@for $i from 1 through $length {
|
24
|
+
$result: append($result, str-slice($string, $i, $i));
|
25
|
+
}
|
26
|
+
@return $result;
|
27
|
+
}
|
28
|
+
|
29
|
+
$running: true;
|
30
|
+
$remaining: $string;
|
31
|
+
|
32
|
+
@while $running {
|
33
|
+
$index: str-index($remaining, $delimiter);
|
34
|
+
@if $index {
|
35
|
+
$slice: str-slice($remaining, 1, $index - 1);
|
36
|
+
$result: append($result, $slice);
|
37
|
+
$remaining: str-slice($remaining, $index + str-length($delimiter));
|
38
|
+
}
|
39
|
+
@else {
|
40
|
+
$running: false;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
@return append($result, $remaining);
|
45
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// Implode $list into a string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [list] $list: list to convert to string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string]
|
6
|
+
|
7
|
+
@function str-implode($list) {
|
8
|
+
$result: "";
|
9
|
+
|
10
|
+
@each $item in $list {
|
11
|
+
$result: $result + if(length($item) > 1, str-implode($item), $item);
|
12
|
+
}
|
13
|
+
|
14
|
+
@return $result;
|
15
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// Return last index of $needle in $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [number] | null | false
|
6
|
+
|
7
|
+
@function str-last-index($string, $needle) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-last-index` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
@if type-of($needle) != "string" {
|
14
|
+
@warn "`str-last-index` function expecting a string for $needle; #{type-of($needle)} given.";
|
15
|
+
@return false;
|
16
|
+
}
|
17
|
+
|
18
|
+
$index: str-index($string, $needle);
|
19
|
+
$result: $index;
|
20
|
+
|
21
|
+
@if $index {
|
22
|
+
@for $i from $index + str-length($needle) through str-length($string) {
|
23
|
+
@if str-slice($string, $i, $i + str-length($needle) - 1) == $needle {
|
24
|
+
$result: $i;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
@return $result;
|
30
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// Lower case first character of $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string]
|
6
|
+
|
7
|
+
@function str-lcfirst($string) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-lcfirst` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
@return to-lower-case(str-slice($string, 1, 1)) + str-slice($string, 2);
|
14
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
// Pad $string from $direction with $pad to reach $length characters
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [number] $length: number of characters to go for in returned string
|
5
|
+
// @param [string] $pad: string to use to pad $string
|
6
|
+
// @param [string] $direction: direction left or right for padding
|
7
|
+
// ----------------------------------------------------------------------------------------------------
|
8
|
+
// @return [string] | false
|
9
|
+
|
10
|
+
@function str-pad($string, $length, $pad: " ", $direction: left) {
|
11
|
+
@if type-of($string) != "string" {
|
12
|
+
@warn "`str-pad` function expecting a string for $string; #{type-of($string)} given.";
|
13
|
+
@return false;
|
14
|
+
}
|
15
|
+
|
16
|
+
@if type-of($pad) != "string" {
|
17
|
+
@warn "`str-pad` function expecting a string for $pad; #{type-of($pad)} given.";
|
18
|
+
@return false;
|
19
|
+
}
|
20
|
+
|
21
|
+
@if type-of($length) != "number" {
|
22
|
+
@warn "`str-pad` function expecting a number for $length; #{type-of($length)} given.";
|
23
|
+
@return false;
|
24
|
+
}
|
25
|
+
|
26
|
+
$direction: if(index(left right, $direction), $direction, left);
|
27
|
+
$new-string: $string;
|
28
|
+
$index: 1;
|
29
|
+
|
30
|
+
@if $length > str-length($string) {
|
31
|
+
@while str-length($new-string) < $length {
|
32
|
+
$remains: $length - str-length($new-string);
|
33
|
+
$pad: if($remains < str-length($pad), str-slice($pad, 1, $remains), $pad);
|
34
|
+
@if $direction == left {
|
35
|
+
$new-string: str-insert($new-string, $pad, $index);
|
36
|
+
$index: $index + str-length($pad);
|
37
|
+
}
|
38
|
+
@else {
|
39
|
+
$new-string: $new-string + $pad;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
@return $new-string;
|
45
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
// Replace occurrences of %s in $string by $elements
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [arglist] $elements: strings to use for replacements in %s
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [string] | false
|
7
|
+
|
8
|
+
@function str-printf($string, $elements...) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-printf` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
$breaker: '%s';
|
15
|
+
$result: $string;
|
16
|
+
|
17
|
+
@for $i from 1 through length($elements) {
|
18
|
+
$index: str-index($result, $breaker);
|
19
|
+
@if $index {
|
20
|
+
$result: str-slice($result, 1, $index - 1) + stringify(nth($elements, $i)) + str-slice($result, $index + str-length($breaker));
|
21
|
+
}
|
22
|
+
@else {
|
23
|
+
@return $result;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
@return $result;
|
28
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Repeat $string $times times
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [number] $times: number of times to repeat $string
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [string] | false
|
7
|
+
|
8
|
+
@function str-repeat($string, $times) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-repeat` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($times) != "number" {
|
15
|
+
@warn "`str-repeat` function expecting a number for $times; #{type-of($times)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
$result: "";
|
20
|
+
|
21
|
+
@for $i from 1 through $times {
|
22
|
+
$result: $result + $string;
|
23
|
+
}
|
24
|
+
|
25
|
+
@return $result;
|
26
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// Replace $old occurrences by $new in $string respecting $case-sensitive
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $old: old substring to replace by $new
|
5
|
+
// @param [string] $new: new substring to replace $old
|
6
|
+
// @param [bool] $case-sensitive: case-sensitivity
|
7
|
+
// ----------------------------------------------------------------------------------------------------
|
8
|
+
// @return [string] | false
|
9
|
+
|
10
|
+
@function str-replace($string, $old, $new: '', $case-sensitive: true) {
|
11
|
+
@if type-of($string) != "string" {
|
12
|
+
@warn "`str-replace` function expecting a string for $string; #{type-of($string)} given.";
|
13
|
+
@return false;
|
14
|
+
}
|
15
|
+
|
16
|
+
@if type-of($old) != "string" {
|
17
|
+
@warn "`str-replace` function expecting a string for $old; #{type-of($old)} given.";
|
18
|
+
@return false;
|
19
|
+
}
|
20
|
+
|
21
|
+
@if type-of($new) != "string" {
|
22
|
+
@warn "`str-replace` function expecting a string for $new; #{type-of($new)} given.";
|
23
|
+
@return false;
|
24
|
+
}
|
25
|
+
|
26
|
+
@if str-index($new, $old) {
|
27
|
+
@warn "The string to be replaced is contained in the new string. Infinite recursion avoided.";
|
28
|
+
@return $string;
|
29
|
+
}
|
30
|
+
|
31
|
+
$index: if(not $case-sensitive, str-index(to-lower-case($string), to-lower-case($old)), str-index($string, $old));
|
32
|
+
|
33
|
+
@if $index and $new != $old {
|
34
|
+
$result: if($index != 1, quote(str-slice($string, 1, $index - 1)), '');
|
35
|
+
|
36
|
+
@for $i from $index through str-length($string) {
|
37
|
+
@if $i < $index or $i >= $index + str-length($old) {
|
38
|
+
$result: $result + str-slice($string, $i, $i);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
@return quote(str-replace(str-insert($result, $new, $index), $old, $new, $case-sensitive));
|
43
|
+
}
|
44
|
+
|
45
|
+
@return $string;
|
46
|
+
}
|
47
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// Reverse $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string] | false
|
6
|
+
|
7
|
+
@function str-reverse($string) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-reverse` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
$result: "";
|
14
|
+
|
15
|
+
@for $i from str-length($string) * -1 through -1 {
|
16
|
+
$result: $result + str-slice($string, abs($i), abs($i));
|
17
|
+
}
|
18
|
+
|
19
|
+
@return $result;
|
20
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
// Rotate all characters from the alphabet in $string by $rot positions
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [number] $rot: number of positions to switch in alphabet
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [string] | false
|
7
|
+
|
8
|
+
@function str-rot($string, $rot: 13) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-rot` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($rot) != "number" {
|
15
|
+
@warn "`str-rot` function expecting a number for $rot; #{type-of($rot)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
$alphabet: a b c d e f g h i j k l m n o p q r s t u v w x y z;
|
20
|
+
$result: "";
|
21
|
+
$rot: if(type-of($rot) == "number", floor($rot), 13);
|
22
|
+
|
23
|
+
@for $i from 1 through str-length($string) {
|
24
|
+
$char: str-slice($string, $i, $i);
|
25
|
+
$index: index($alphabet, to-lower-case($char));
|
26
|
+
$is-caps: $index and (index($alphabet, to-lower-case($char)) != index($alphabet, $char));
|
27
|
+
$new-char: if($index,
|
28
|
+
if($index + $rot > length($alphabet),
|
29
|
+
nth($alphabet, $index + $rot - length($alphabet)),
|
30
|
+
nth($alphabet, $index + $rot)
|
31
|
+
),
|
32
|
+
$char
|
33
|
+
);
|
34
|
+
|
35
|
+
@if $is-caps {
|
36
|
+
$new-char: to-upper-case($new-char);
|
37
|
+
}
|
38
|
+
|
39
|
+
$result: $result + $new-char;
|
40
|
+
}
|
41
|
+
|
42
|
+
@return $result;
|
43
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Shuffle characters from $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string]
|
6
|
+
|
7
|
+
@function str-shuffle($string) {
|
8
|
+
@return str-implode(_shuffle(str-explode($string)));
|
9
|
+
}
|
10
|
+
|
11
|
+
// Shuffle a list
|
12
|
+
// ----------------------------------------------------------------------------------------------------
|
13
|
+
// @param [list] $list: shuffle a list
|
14
|
+
// ----------------------------------------------------------------------------------------------------
|
15
|
+
// @return [list]
|
16
|
+
|
17
|
+
@function _shuffle($list) {
|
18
|
+
@for $i from -1 * length($list) through -1 {
|
19
|
+
$i: abs($i);
|
20
|
+
$j: random(length($list) - 1) + 1;
|
21
|
+
$tmp: nth($list, $i);
|
22
|
+
$list: set-nth($list, $i, nth($list, $j));
|
23
|
+
$list: set-nth($list, $j, $tmp);
|
24
|
+
}
|
25
|
+
@return $list;
|
26
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// Check whether $string stars with $needle
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// @param [string] $needle: substring to check
|
5
|
+
// ----------------------------------------------------------------------------------------------------
|
6
|
+
// @return [bool] | false
|
7
|
+
|
8
|
+
@function str-starts-with($string, $needle) {
|
9
|
+
@if type-of($string) != "string" {
|
10
|
+
@warn "`str-starts-with` function expecting a string for $string; #{type-of($string)} given.";
|
11
|
+
@return false;
|
12
|
+
}
|
13
|
+
|
14
|
+
@if type-of($needle) != "string" {
|
15
|
+
@warn "`str-starts-with` function expecting a string for $needle; #{type-of($needle)} given.";
|
16
|
+
@return false;
|
17
|
+
}
|
18
|
+
|
19
|
+
@return str-slice($string, 1, str-length($needle)) == $needle;
|
20
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// Remove all trailing and leading whitespaces from $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string] | false
|
6
|
+
|
7
|
+
@function str-trim($string) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-trim` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
$start: 1;
|
14
|
+
$end: str-length($string);
|
15
|
+
|
16
|
+
@for $i from 1 through str-length($string) {
|
17
|
+
$first: str-slice($string, $i, $i);
|
18
|
+
$last: str-slice($string, -$i, -$i);
|
19
|
+
|
20
|
+
@if $first == " " and $i + 1 == $start + 1 {
|
21
|
+
$start: $i + 1;
|
22
|
+
}
|
23
|
+
|
24
|
+
@if $last == " " and str-length($string) - $i == $end - 1 {
|
25
|
+
$end: str-length($string) - $i;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
@return str-slice($string, $start, $end);
|
30
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// Capitalize first letter from $strign
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string] | false
|
6
|
+
|
7
|
+
@function str-ucfirst($string) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-ucfirst` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
@return to-upper-case(str-slice($string, 1, 1)) + str-slice($string, 2);
|
14
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Count number of words in $string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [string] $string: string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string] | false
|
6
|
+
|
7
|
+
@function str-word-count($string) {
|
8
|
+
@if type-of($string) != "string" {
|
9
|
+
@warn "`str-word-count` function expecting a string for $string; #{type-of($string)} given.";
|
10
|
+
@return false;
|
11
|
+
}
|
12
|
+
|
13
|
+
$string: str-trim($string);
|
14
|
+
$words: ();
|
15
|
+
$i: str-length($string);
|
16
|
+
|
17
|
+
@while $i > 0 {
|
18
|
+
@if str-slice($string, $i, $i) == " " {
|
19
|
+
$words: append($words, str-slice($string, $i + 1));
|
20
|
+
$string: str-slice($string, 1, $i - 1);
|
21
|
+
}
|
22
|
+
$i: $i - 1;
|
23
|
+
}
|
24
|
+
|
25
|
+
@return length(append($words, $string));
|
26
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// Cast anything to string
|
2
|
+
// ----------------------------------------------------------------------------------------------------
|
3
|
+
// @param [literal] $literal: literal to cast to string
|
4
|
+
// ----------------------------------------------------------------------------------------------------
|
5
|
+
// @return [string]
|
6
|
+
|
7
|
+
@function stringify($literal) {
|
8
|
+
$result: "";
|
9
|
+
|
10
|
+
@if length($literal) == 1 {
|
11
|
+
$result: $literal + unquote("");
|
12
|
+
}
|
13
|
+
|
14
|
+
@else {
|
15
|
+
@each $item in $literal {
|
16
|
+
$result: $result + stringify($item);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
@return quote($result);
|
21
|
+
}
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: SassyStrings
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Hugo Giraudel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-02-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: sass
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: compass
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.0
|
46
|
+
description: A collection of Sass functions to manipulate strings.
|
47
|
+
email:
|
48
|
+
- hugo.giraudel@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- README.md
|
54
|
+
- CHANGELOG.md
|
55
|
+
- lib/SassyStrings.rb
|
56
|
+
- stylesheets/functions/_char-at.scss
|
57
|
+
- stylesheets/functions/_levenshtein.scss
|
58
|
+
- stylesheets/functions/_str-count.scss
|
59
|
+
- stylesheets/functions/_str-ends-with.scss
|
60
|
+
- stylesheets/functions/_str-explode.scss
|
61
|
+
- stylesheets/functions/_str-implode.scss
|
62
|
+
- stylesheets/functions/_str-last-index.scss
|
63
|
+
- stylesheets/functions/_str-lcfirst.scss
|
64
|
+
- stylesheets/functions/_str-pad.scss
|
65
|
+
- stylesheets/functions/_str-printf.scss
|
66
|
+
- stylesheets/functions/_str-repeat.scss
|
67
|
+
- stylesheets/functions/_str-replace.scss
|
68
|
+
- stylesheets/functions/_str-reverse.scss
|
69
|
+
- stylesheets/functions/_str-rot.scss
|
70
|
+
- stylesheets/functions/_str-shuffle.scss
|
71
|
+
- stylesheets/functions/_str-starts-with.scss
|
72
|
+
- stylesheets/functions/_str-trim.scss
|
73
|
+
- stylesheets/functions/_str-ucfirst.scss
|
74
|
+
- stylesheets/functions/_str-word-count.scss
|
75
|
+
- stylesheets/functions/_stringify.scss
|
76
|
+
- stylesheets/_SassyStrings.scss
|
77
|
+
homepage: https://github.com/HugoGiraudel/SassyStrings
|
78
|
+
licenses: []
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.2'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project: SassyStrings
|
97
|
+
rubygems_version: 1.8.24
|
98
|
+
signing_key:
|
99
|
+
specification_version: 3
|
100
|
+
summary: Advanced String handling for Sass
|
101
|
+
test_files: []
|