// This extractor is used in level 2 optimizations // IMPORTANT: Mind Token class and this code is not related! // Properties will be tokenized in one step, see #429 var Token = require('../../tokenizer/token'); var serializeRules = require('../../writer/one-time').rules; var serializeValue = require('../../writer/one-time').value; function extractProperties(token) { var properties = []; var inSpecificSelector; var property; var name; var value; var i, l; if (token[0] == Token.RULE) { inSpecificSelector = !/[.+>~]/.test(serializeRules(token[1])); for (i = 0, l = token[2].length; i < l; i++) { property = token[2][i]; if (property[0] != Token.PROPERTY) { continue; } name = property[1][1]; if (name.length === 0) { continue; } value = serializeValue(property, i); properties.push([ name, value, findNameRoot(name), token[2][i], name + ':' + value, token[1], inSpecificSelector ]); } } else if (token[0] == Token.NESTED_BLOCK) { for (i = 0, l = token[2].length; i < l; i++) { properties = properties.concat(extractProperties(token[2][i])); } } return properties; } function findNameRoot(name) { if (name == 'list-style') { return name; } if (name.indexOf('-radius') > 0) { return 'border-radius'; } if (name == 'border-collapse' || name == 'border-spacing' || name == 'border-image') { return name; } if (name.indexOf('border-') === 0 && /^border-\w+-\w+$/.test(name)) { return name.match(/border-\w+/)[0]; } if (name.indexOf('border-') === 0 && /^border-\w+$/.test(name)) { return 'border'; } if (name.indexOf('text-') === 0) { return name; } if (name == '-chrome-') { return name; } return name.replace(/^-\w+-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase(); } module.exports = extractProperties;