'use strict'; const valueParser = require('postcss-value-parser'); const keywords = require('./keywords'); const minifyFamily = require('./minify-family'); const minifyWeight = require('./minify-weight'); /** * Adds missing spaces before strings. * * @param toBeSpliced {Set} * @param {import('postcss-value-parser').Node[]} nodes * @return {void} */ function normalizeNodes(nodes, toBeSpliced) { for (const index of toBeSpliced) { nodes.splice( index, 0, /** @type {import('postcss-value-parser').SpaceNode} */ ({ type: 'space', value: ' ', }) ); } } /** * @param {string} unminified * @param {import('../index').Options} opts * @return {string} */ module.exports = function (unminified, opts) { const tree = valueParser(unminified); const nodes = tree.nodes; let familyStart = NaN; let hasSize = false; const toBeSpliced = new Set(); for (const [i, node] of nodes.entries()) { if (node.type === 'string' && i > 0 && nodes[i - 1].type !== 'space') { toBeSpliced.add(i); } if (node.type === 'word') { if (hasSize) { continue; } const value = node.value.toLowerCase(); if ( value === 'normal' || value === 'inherit' || value === 'initial' || value === 'unset' ) { familyStart = i; } else if (keywords.style.has(value) || valueParser.unit(value)) { familyStart = i; } else if (keywords.variant.has(value)) { familyStart = i; } else if (keywords.weight.has(value)) { node.value = minifyWeight(value); familyStart = i; } else if (keywords.stretch.has(value)) { familyStart = i; } else if (keywords.size.has(value) || valueParser.unit(value)) { familyStart = i; hasSize = true; } } else if ( node.type === 'function' && nodes[i + 1] && nodes[i + 1].type === 'space' ) { familyStart = i; } else if (node.type === 'div' && node.value === '/') { familyStart = i + 1; break; } } normalizeNodes(nodes, toBeSpliced); familyStart += 2; const family = minifyFamily(nodes.slice(familyStart), opts); tree.nodes = nodes.slice(0, familyStart).concat(family); return tree.toString(); };