Last active
June 11, 2016 14:08
-
-
Save TheoryOfNekomata/41cb1c5bfef7f54400aa to your computer and use it in GitHub Desktop.
Converts a POJO to a value accepted by node-sass
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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