You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.9 KiB
104 lines
2.9 KiB
var hasOwnProperty = Object.prototype.hasOwnProperty; |
|
var keywords = Object.create(null); |
|
var properties = Object.create(null); |
|
var HYPHENMINUS = 45; // '-'.charCodeAt() |
|
|
|
function isCustomProperty(str, offset) { |
|
offset = offset || 0; |
|
|
|
return str.length - offset >= 2 && |
|
str.charCodeAt(offset) === HYPHENMINUS && |
|
str.charCodeAt(offset + 1) === HYPHENMINUS; |
|
} |
|
|
|
function getVendorPrefix(str, offset) { |
|
offset = offset || 0; |
|
|
|
// verdor prefix should be at least 3 chars length |
|
if (str.length - offset >= 3) { |
|
// vendor prefix starts with hyper minus following non-hyper minus |
|
if (str.charCodeAt(offset) === HYPHENMINUS && |
|
str.charCodeAt(offset + 1) !== HYPHENMINUS) { |
|
// vendor prefix should contain a hyper minus at the ending |
|
var secondDashIndex = str.indexOf('-', offset + 2); |
|
|
|
if (secondDashIndex !== -1) { |
|
return str.substring(offset, secondDashIndex + 1); |
|
} |
|
} |
|
} |
|
|
|
return ''; |
|
} |
|
|
|
function getKeywordDescriptor(keyword) { |
|
if (hasOwnProperty.call(keywords, keyword)) { |
|
return keywords[keyword]; |
|
} |
|
|
|
var name = keyword.toLowerCase(); |
|
|
|
if (hasOwnProperty.call(keywords, name)) { |
|
return keywords[keyword] = keywords[name]; |
|
} |
|
|
|
var custom = isCustomProperty(name, 0); |
|
var vendor = !custom ? getVendorPrefix(name, 0) : ''; |
|
|
|
return keywords[keyword] = Object.freeze({ |
|
basename: name.substr(vendor.length), |
|
name: name, |
|
vendor: vendor, |
|
prefix: vendor, |
|
custom: custom |
|
}); |
|
} |
|
|
|
function getPropertyDescriptor(property) { |
|
if (hasOwnProperty.call(properties, property)) { |
|
return properties[property]; |
|
} |
|
|
|
var name = property; |
|
var hack = property[0]; |
|
|
|
if (hack === '/') { |
|
hack = property[1] === '/' ? '//' : '/'; |
|
} else if (hack !== '_' && |
|
hack !== '*' && |
|
hack !== '$' && |
|
hack !== '#' && |
|
hack !== '+' && |
|
hack !== '&') { |
|
hack = ''; |
|
} |
|
|
|
var custom = isCustomProperty(name, hack.length); |
|
|
|
// re-use result when possible (the same as for lower case) |
|
if (!custom) { |
|
name = name.toLowerCase(); |
|
if (hasOwnProperty.call(properties, name)) { |
|
return properties[property] = properties[name]; |
|
} |
|
} |
|
|
|
var vendor = !custom ? getVendorPrefix(name, hack.length) : ''; |
|
var prefix = name.substr(0, hack.length + vendor.length); |
|
|
|
return properties[property] = Object.freeze({ |
|
basename: name.substr(prefix.length), |
|
name: name.substr(hack.length), |
|
hack: hack, |
|
vendor: vendor, |
|
prefix: prefix, |
|
custom: custom |
|
}); |
|
} |
|
|
|
module.exports = { |
|
keyword: getKeywordDescriptor, |
|
property: getPropertyDescriptor, |
|
isCustomProperty: isCustomProperty, |
|
vendorPrefix: getVendorPrefix |
|
};
|
|
|