| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 'use strict';
- const keywords = new Map();
- const properties = new Map();
- const HYPHENMINUS = 45; // '-'.charCodeAt()
- const keyword = getKeywordDescriptor;
- const property = getPropertyDescriptor;
- const vendorPrefix = getVendorPrefix;
- 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
- const secondDashIndex = str.indexOf('-', offset + 2);
- if (secondDashIndex !== -1) {
- return str.substring(offset, secondDashIndex + 1);
- }
- }
- }
- return '';
- }
- function getKeywordDescriptor(keyword) {
- if (keywords.has(keyword)) {
- return keywords.get(keyword);
- }
- const name = keyword.toLowerCase();
- let descriptor = keywords.get(name);
- if (descriptor === undefined) {
- const custom = isCustomProperty(name, 0);
- const vendor = !custom ? getVendorPrefix(name, 0) : '';
- descriptor = Object.freeze({
- basename: name.substr(vendor.length),
- name,
- prefix: vendor,
- vendor,
- custom
- });
- }
- keywords.set(keyword, descriptor);
- return descriptor;
- }
- function getPropertyDescriptor(property) {
- if (properties.has(property)) {
- return properties.get(property);
- }
- let name = property;
- let hack = property[0];
- if (hack === '/') {
- hack = property[1] === '/' ? '//' : '/';
- } else if (hack !== '_' &&
- hack !== '*' &&
- hack !== '$' &&
- hack !== '#' &&
- hack !== '+' &&
- hack !== '&') {
- hack = '';
- }
- const custom = isCustomProperty(name, hack.length);
- // re-use result when possible (the same as for lower case)
- if (!custom) {
- name = name.toLowerCase();
- if (properties.has(name)) {
- const descriptor = properties.get(name);
- properties.set(property, descriptor);
- return descriptor;
- }
- }
- const vendor = !custom ? getVendorPrefix(name, hack.length) : '';
- const prefix = name.substr(0, hack.length + vendor.length);
- const descriptor = Object.freeze({
- basename: name.substr(prefix.length),
- name: name.substr(hack.length),
- hack,
- vendor,
- prefix,
- custom
- });
- properties.set(property, descriptor);
- return descriptor;
- }
- exports.isCustomProperty = isCustomProperty;
- exports.keyword = keyword;
- exports.property = property;
- exports.vendorPrefix = vendorPrefix;
|