123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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()
- }
- ];
- };
|