diff --git a/README.markdown b/README.markdown
index 3fd577e..62871fb 100644
--- a/README.markdown
+++ b/README.markdown
@@ -1,6 +1,12 @@
# Compass SASS Stylesheets
This is a repository to pull SASS style sheets on bower, and enjoy the compass mixins by using libsass for faster compilation. I made no modifications to the original stylesheets from the [original repository](https://github.com/chriseppstein/compass.git)
+# Compass Ruby Functions
+
+This project includes reasonably similar implementations of some of the Ruby functions that Compass provides as Sass extensions. These are used in some Compass mixins, such as `@include background()`.
+
+To make those functions available to your compass mixins, you'll want to import the included `_functions.scss` before `_compass.scss`.
+
## License
Copyright (c) 2008-2009 Christopher M. Eppstein
All Rights Reserved.
diff --git a/lib/_functions.scss b/lib/_functions.scss
new file mode 100644
index 0000000..e57e52f
--- /dev/null
+++ b/lib/_functions.scss
@@ -0,0 +1 @@
+@import "functions/lists";
diff --git a/lib/functions/lists.scss b/lib/functions/lists.scss
new file mode 100644
index 0000000..a118e6a
--- /dev/null
+++ b/lib/functions/lists.scss
@@ -0,0 +1,53 @@
+/*
+ * A partial implementation of the Ruby list functions from Compass:
+ * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb
+ */
+
+
+// compact is part of libsass
+
+@function -compass-nth($list, $place) {
+ // Yep, Sass-lists are 1-indexed.
+ @if $place == "first" {
+ $place: 1;
+ }
+ @if $place == "last" {
+ $place: length($list);
+ }
+ @return nth($list, $place);
+}
+
+// compass_list and compass_space_list can't be implemented in sass script
+
+@function -compass-list-size($list) {
+ @return length($list);
+}
+
+@function -compass-slice($list, $start, $end: false) {
+ @if $end == false {
+ $end: length($list);
+ }
+ $full: nth($list, $start);
+ @for $i from $start + 1 through $end {
+ $full: $full, nth($list, $i);
+ }
+ @return $full;
+}
+
+@function reject($list, $reject1, $reject2:null, $reject3:null, $reject4:null, $reject5:null, $reject6:null, $reject7:null, $reject8:null, $reject9:null) {
+ $rejects: $reject1, $reject2, $reject3, $reject4, $reject5, $reject6, $reject7, $reject8, $reject9;
+
+ $full: false;
+ @each $item in $list {
+ @if index($rejects, $item) {}
+ @else {
+ @if $full {
+ $full: $full, $item;
+ }
+ @else {
+ $full: $item;
+ }
+ }
+ }
+ @return $full;
+}
diff --git a/test/functionsSpec.js b/test/functionsSpec.js
new file mode 100644
index 0000000..1b09b31
--- /dev/null
+++ b/test/functionsSpec.js
@@ -0,0 +1,69 @@
+var sass = require('node-sass');
+var chalk = require('chalk');
+
+var libDir = __dirname.replace(/test$/, 'lib');
+
+var render = function(data, callback) {
+ sass.render({
+ data: '@import "'+libDir+'/functions";' + data,
+ outputStyle: 'compressed',
+ success: function(output){
+ callback(output);
+ },
+ error: function(err){
+ console.log(chalk.red("Sass error:"), err);
+ callback('', err);
+ }
+ });
+}
+
+var property = function(prop) {
+ return 'a{b:'+prop+';}';
+}
+
+describe("Functions", function () {
+
+ // This is verifying a function that's part of libsass that Compass also provided.
+ it("should compact a list with false values", function (done) {
+ render(property('compact(one,false,three)'), function(output, err) {
+ expect(output).toBe(property('one,three'));
+ done();
+ });
+ });
+
+ it("should calculate a list length", function(done) {
+ render('$list: one, two;' + property('-compass-list-size($list)'), function(output, err) {
+ expect(output).toBe(property('2'));
+ done();
+ });
+ });
+
+ it("should calculate a list length with a space delimiter", function(done) {
+ render('$list: one two;' + property('-compass-list-size($list)'), function(output, err) {
+ expect(output).toBe(property('2'));
+ done();
+ });
+ });
+
+ it("should slice a list", function(done) {
+ render('$list: one, two, three, four;' + property('-compass-slice($list, 2, 3)'), function(output, err) {
+ expect(output).toBe(property('two,three'));
+ done();
+ });
+ });
+
+ it("should slice a list to the end", function(done) {
+ render('$list: one, two, three, four;' + property('-compass-slice($list, 2)'), function(output, err) {
+ expect(output).toBe(property('two,three,four'));
+ done();
+ });
+ });
+
+ it("should reject values from a list", function(done) {
+ render('$list: one, two, three, four;' + property('reject($list, two, four)'), function(output, err) {
+ expect(output).toBe(property('one,three'));
+ done();
+ });
+ });
+
+});