SassyStrings 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|