Skip to content

Instantly share code, notes, and snippets.

@TheoryOfNekomata
Last active June 11, 2016 14:08
Show Gist options
  • Select an option

  • Save TheoryOfNekomata/41cb1c5bfef7f54400aa to your computer and use it in GitHub Desktop.

Select an option

Save TheoryOfNekomata/41cb1c5bfef7f54400aa to your computer and use it in GitHub Desktop.
Converts a POJO to a value accepted by node-sass
#!/usr/bin node
(function () {
var SassTypes = require('node-sass').types;
module.exports = function convertToSassValue(obj) {
var parseValue, parseString, parseNumber, parseRgbColor, parseList, parseMap;
parseValue = function parseValue(obj) {
if (!obj) {
return new SassTypes.Null();
}
switch (typeof obj) {
case 'number':
return new SassTypes.Number(obj);
case 'string':
return parseString(obj);
case 'boolean':
return new SassTypes.Boolean(obj);
default:
break;
}
if (obj instanceof Array) {
return parseList(obj);
}
return parseMap(obj);
};
parseRgbColor = function parseColor(str) {
var patterns = [
/^rgb\s*\(\s*[0-9]{1,3}\s*,\s*[0-9]{1,3}\s*,\s*[0-9]{1,3}\s*\)$/i,
/^rgba\s*\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)$/i,
/^#[0-9a-fA-F]{6}$/
],
values,
sassColor = null;
patterns.forEach(function (pattern, i) {
if (!pattern.test(str.trim())) {
return null;
}
switch (i) {
case 0:
case 1:
values = str.slice(str.indexOf('(') + 1, str.lastIndexOf(')')).split(',').map(function(value) {
return parseInt(value.trim());
});
return sassColor = new SassTypes.Color(values[0], values[1], values[2], values[3] || 1.0);
case 2:
return sassColor = new SassTypes.Color(parseInt(str.slice(str.indexOf('#') + 1)) | 0xFF000000);
default:
break;
}
});
return sassColor;
};
parseNumber = function parseNumber(str) {
var numValue, strNum, unit;
try {
numValue = parseFloat(str);
strNum = '' + numValue;
unit = str.slice(strNum.length);
return new SassTypes.Number(numValue, unit);
} catch (e) {}
return null;
};
parseString = function parseString(str) {
var value;
value = parseRgbColor(str) || parseNumber(str);
if (!value) {
return new SassTypes.String(str);
}
return value;
};
parseMap = function parseMap(obj) {
var keys, sassMap;
keys = Object.keys(obj);
sassMap = new SassTypes.Map(keys.length);
keys.forEach(function (key, i) {
sassMap.setKey(i, new SassTypes.String(key));
sassMap.setValue(i, parseValue(obj[key]));
});
return sassMap;
};
parseList = function parseList(list) {
var sassList;
sassList = new SassTypes.List(list.length, true);
list.forEach(function(item, i) {
sassList.setValue(i, parseValue(item));
});
return sassList;
};
return parseValue(obj);
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment