| // 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; |
| |
| if (name.indexOf('--') === 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; |