You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.1 KiB
JavaScript
119 lines
3.1 KiB
JavaScript
6 years ago
|
var BACKSLASH_HACK = '\\';
|
||
|
var IMPORTANT_WORD = 'important';
|
||
|
var IMPORTANT_TOKEN = '!'+IMPORTANT_WORD;
|
||
|
var IMPORTANT_WORD_MATCH = new RegExp(IMPORTANT_WORD+'$', 'i');
|
||
|
var IMPORTANT_TOKEN_MATCH = new RegExp(IMPORTANT_TOKEN+'$', 'i');
|
||
|
var STAR_HACK = '*';
|
||
|
var UNDERSCORE_HACK = '_';
|
||
|
var BANG_HACK = '!';
|
||
|
|
||
|
function wrapAll(properties) {
|
||
|
var wrapped = [];
|
||
|
|
||
|
for (var i = properties.length - 1; i >= 0; i--) {
|
||
|
if (typeof properties[i][0] == 'string')
|
||
|
continue;
|
||
|
|
||
|
var single = wrapSingle(properties[i]);
|
||
|
single.all = properties;
|
||
|
single.position = i;
|
||
|
wrapped.unshift(single);
|
||
|
}
|
||
|
|
||
|
return wrapped;
|
||
|
}
|
||
|
|
||
|
function isMultiplex(property) {
|
||
|
for (var i = 1, l = property.length; i < l; i++) {
|
||
|
if (property[i][0] == ',' || property[i][0] == '/')
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function hackType(property) {
|
||
|
var type = false;
|
||
|
var name = property[0][0];
|
||
|
var lastValue = property[property.length - 1];
|
||
|
|
||
|
if (name[0] == UNDERSCORE_HACK) {
|
||
|
type = 'underscore';
|
||
|
} else if (name[0] == STAR_HACK) {
|
||
|
type = 'star';
|
||
|
} else if (lastValue[0][0] == BANG_HACK && !lastValue[0].match(IMPORTANT_WORD_MATCH)) {
|
||
|
type = 'bang';
|
||
|
} else if (lastValue[0].indexOf(BANG_HACK) > 0 && !lastValue[0].match(IMPORTANT_WORD_MATCH)) {
|
||
|
type = 'bang';
|
||
|
} else if (lastValue[0].indexOf(BACKSLASH_HACK) > 0 && lastValue[0].indexOf(BACKSLASH_HACK) == lastValue[0].length - BACKSLASH_HACK.length - 1) {
|
||
|
type = 'backslash';
|
||
|
} else if (lastValue[0].indexOf(BACKSLASH_HACK) === 0 && lastValue[0].length == 2) {
|
||
|
type = 'backslash';
|
||
|
}
|
||
|
|
||
|
return type;
|
||
|
}
|
||
|
|
||
|
function isImportant(property) {
|
||
|
if (property.length > 1) {
|
||
|
var p = property[property.length - 1][0];
|
||
|
if (typeof(p) === 'string') {
|
||
|
return IMPORTANT_TOKEN_MATCH.test(p);
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function stripImportant(property) {
|
||
|
if (property.length > 0)
|
||
|
property[property.length - 1][0] = property[property.length - 1][0].replace(IMPORTANT_TOKEN_MATCH, '');
|
||
|
}
|
||
|
|
||
|
function stripPrefixHack(property) {
|
||
|
property[0][0] = property[0][0].substring(1);
|
||
|
}
|
||
|
|
||
|
function stripSuffixHack(property, hackType) {
|
||
|
var lastValue = property[property.length - 1];
|
||
|
lastValue[0] = lastValue[0]
|
||
|
.substring(0, lastValue[0].indexOf(hackType == 'backslash' ? BACKSLASH_HACK : BANG_HACK))
|
||
|
.trim();
|
||
|
|
||
|
if (lastValue[0].length === 0)
|
||
|
property.pop();
|
||
|
}
|
||
|
|
||
|
function wrapSingle(property) {
|
||
|
var _isImportant = isImportant(property);
|
||
|
if (_isImportant)
|
||
|
stripImportant(property);
|
||
|
|
||
|
var _hackType = hackType(property);
|
||
|
if (_hackType == 'star' || _hackType == 'underscore')
|
||
|
stripPrefixHack(property);
|
||
|
else if (_hackType == 'backslash' || _hackType == 'bang')
|
||
|
stripSuffixHack(property, _hackType);
|
||
|
|
||
|
var isVariable = property[0][0].indexOf('--') === 0;
|
||
|
|
||
|
return {
|
||
|
block: isVariable && property[1] && Array.isArray(property[1][0][0]),
|
||
|
components: [],
|
||
|
dirty: false,
|
||
|
hack: _hackType,
|
||
|
important: _isImportant,
|
||
|
name: property[0][0],
|
||
|
multiplex: property.length > 2 ? isMultiplex(property) : false,
|
||
|
position: 0,
|
||
|
shorthand: false,
|
||
|
unused: property.length < 2,
|
||
|
value: property.slice(1),
|
||
|
variable: isVariable
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
all: wrapAll,
|
||
|
single: wrapSingle
|
||
|
};
|