names.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. var hasOwnProperty = Object.prototype.hasOwnProperty;
  2. var knownKeywords = Object.create(null);
  3. var knownProperties = Object.create(null);
  4. function getVendorPrefix(string) {
  5. if (string[0] === '-') {
  6. // skip 2 chars to avoid wrong match with variables names
  7. var secondDashIndex = string.indexOf('-', 2);
  8. if (secondDashIndex !== -1) {
  9. return string.substr(0, secondDashIndex + 1);
  10. }
  11. }
  12. return '';
  13. }
  14. function getKeywordInfo(keyword) {
  15. if (hasOwnProperty.call(knownKeywords, keyword)) {
  16. return knownKeywords[keyword];
  17. }
  18. var lowerCaseKeyword = keyword.toLowerCase();
  19. var vendor = getVendorPrefix(lowerCaseKeyword);
  20. var name = lowerCaseKeyword;
  21. if (vendor) {
  22. name = name.substr(vendor.length);
  23. }
  24. return knownKeywords[keyword] = Object.freeze({
  25. vendor: vendor,
  26. prefix: vendor,
  27. name: name
  28. });
  29. }
  30. function getPropertyInfo(property) {
  31. if (hasOwnProperty.call(knownProperties, property)) {
  32. return knownProperties[property];
  33. }
  34. var lowerCaseProperty = property.toLowerCase();
  35. var hack = lowerCaseProperty[0];
  36. if (hack === '*' || hack === '_' || hack === '$') {
  37. lowerCaseProperty = lowerCaseProperty.substr(1);
  38. } else if (hack === '/' && property[1] === '/') {
  39. hack = '//';
  40. lowerCaseProperty = lowerCaseProperty.substr(2);
  41. } else {
  42. hack = '';
  43. }
  44. var vendor = getVendorPrefix(lowerCaseProperty);
  45. var name = lowerCaseProperty;
  46. if (vendor) {
  47. name = name.substr(vendor.length);
  48. }
  49. return knownProperties[property] = Object.freeze({
  50. hack: hack,
  51. vendor: vendor,
  52. prefix: hack + vendor,
  53. name: name
  54. });
  55. }
  56. module.exports = {
  57. keyword: getKeywordInfo,
  58. property: getPropertyInfo
  59. };