motion
Version:
motion - moving development forward
95 lines (78 loc) • 2.34 kB
JavaScript
var stringify = require('postcss-value-parser').stringify;
var uniqs = require('uniqs');
var keywords = [
'sans-serif',
'serif',
'fantasy',
'cursive',
'monospace'
];
function intersection(haystack, array) {
return array.some(function (v) {
return ~haystack.indexOf(v);
});
};
module.exports = function (nodes, opts) {
var family = [];
var last = null;
var i, max;
nodes.forEach(function (node, index, nodes) {
var value = node.value;
if (node.type === 'string') {
family.push(node);
} else if (node.type === 'word') {
if (!last) {
last = { type: 'word', value: '' };
family.push(last);
}
last.value += node.value;
} else if (node.type === 'space') {
if (last && index !== nodes.length - 1) {
last.value += ' ';
}
} else {
last = null;
}
});
family = family.map(function (node) {
if (node.type === 'string') {
if (!opts.removeQuotes || intersection(node.value, keywords)) {
return stringify(node);
}
var escaped = node.value.split(/\s/).map(function (word, index, words) {
var next = words[index + 1];
if (next && /^[^a-z]/i.test(next)) {
return word + '\\';
}
if (!/^[^a-z\d\xa0-\uffff_-]/i.test(word)) {
return word.replace(/([^a-z\d\xa0-\uffff_-])/gi, '\\$1');
}
if (/^[^a-z]/i.test(word) && index < 1) {
return '\\' + word;
}
return word;
}).join(' ');
if (escaped.length < node.value.length + 2) {
return escaped;
}
}
return stringify(node);
});
if (opts.removeAfterKeyword) {
for (i = 0, max = family.length; i < max; i += 1) {
if (~keywords.indexOf(family[i])) {
family = family.slice(0, i + 1);
break;
}
}
}
if (opts.removeDuplicates) {
family = uniqs(family);
}
return [
{
type: 'word',
value: family.join()
}
];
};