102 lines
2.6 KiB
JavaScript
102 lines
2.6 KiB
JavaScript
|
var stringify = require('postcss-value-parser').stringify;
|
||
|
var uniqs = require('./uniqs')('monospace');
|
||
|
|
||
|
// Note that monospace is missing intentionally from this list; we should not
|
||
|
// remove instances of duplicated monospace keywords, it causes the font to be
|
||
|
// rendered smaller in Chrome.
|
||
|
|
||
|
var keywords = [
|
||
|
'sans-serif',
|
||
|
'serif',
|
||
|
'fantasy',
|
||
|
'cursive'
|
||
|
];
|
||
|
|
||
|
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' || node.type === 'function') {
|
||
|
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) ||
|
||
|
/[0-9]/.test(node.value.slice(0, 1))
|
||
|
) {
|
||
|
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()
|
||
|
}
|
||
|
];
|
||
|
};
|