backgroundSize.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. "use strict";
  2. const parsers = require("../parsers");
  3. const property = "background-size";
  4. const shorthand = "background";
  5. module.exports.parse = (v, opt = {}) => {
  6. const { globalObject } = opt;
  7. if (v === "") {
  8. return v;
  9. }
  10. const { AST_TYPES } = parsers;
  11. const values = parsers.splitValue(v, {
  12. delimiter: ","
  13. });
  14. const parsedValues = [];
  15. for (const val of values) {
  16. const value = parsers.parsePropertyValue(property, val, {
  17. globalObject,
  18. inArray: true
  19. });
  20. if (Array.isArray(value) && value.length) {
  21. if (value.length === 1) {
  22. const [{ isNumber, name, type, value: itemValue }] = value;
  23. switch (type) {
  24. case AST_TYPES.CALC: {
  25. if (isNumber) {
  26. return;
  27. }
  28. parsedValues.push(`${name}(${itemValue})`);
  29. break;
  30. }
  31. case AST_TYPES.GLOBAL_KEYWORD:
  32. case AST_TYPES.IDENTIFIER: {
  33. parsedValues.push(name);
  34. break;
  35. }
  36. default: {
  37. const parsedValue = parsers.resolveNumericValue(value, {
  38. type: "length"
  39. });
  40. if (!parsedValue) {
  41. return;
  42. }
  43. parsedValues.push(parsedValue);
  44. }
  45. }
  46. } else {
  47. const [val1, val2] = value;
  48. const parts = [];
  49. if (val1.type === AST_TYPES.CALC && !val1.isNumber) {
  50. parts.push(`${val1.name}(${val1.value})`);
  51. } else if (val1.type === AST_TYPES.IDENTIFIER) {
  52. parts.push(val1.name);
  53. } else if (val1.type === AST_TYPES.DIMENSION) {
  54. parts.push(`${val1.value}${val1.unit}`);
  55. } else if (val1.type === AST_TYPES.PERCENTAGE) {
  56. parts.push(`${val1.value}%`);
  57. } else {
  58. return;
  59. }
  60. switch (val2.type) {
  61. case AST_TYPES.CALC: {
  62. if (val2.isNumber) {
  63. return;
  64. }
  65. parts.push(`${val2.name}(${val2.value})`);
  66. break;
  67. }
  68. case AST_TYPES.DIMENSION: {
  69. parts.push(`${val2.value}${val2.unit}`);
  70. break;
  71. }
  72. case AST_TYPES.IDENTIFIER: {
  73. if (val2.name !== "auto") {
  74. parts.push(val2.name);
  75. }
  76. break;
  77. }
  78. case AST_TYPES.PERCENTAGE: {
  79. parts.push(`${val2.value}%`);
  80. break;
  81. }
  82. default: {
  83. return;
  84. }
  85. }
  86. parsedValues.push(parts.join(" "));
  87. }
  88. } else if (typeof value === "string") {
  89. parsedValues.push(value);
  90. }
  91. }
  92. if (parsedValues.length) {
  93. return parsedValues.join(", ");
  94. }
  95. };
  96. module.exports.definition = {
  97. set(v) {
  98. v = parsers.prepareValue(v);
  99. if (parsers.hasVarFunc(v)) {
  100. this._setProperty(shorthand, "");
  101. this._setProperty(property, v);
  102. } else {
  103. const val = module.exports.parse(v, {
  104. globalObject: this._global
  105. });
  106. if (typeof val === "string") {
  107. const priority =
  108. !this._priorities.get(shorthand) && this._priorities.has(property)
  109. ? this._priorities.get(property)
  110. : "";
  111. this._setProperty(property, val, priority);
  112. }
  113. }
  114. },
  115. get() {
  116. return this.getPropertyValue(property);
  117. },
  118. enumerable: true,
  119. configurable: true
  120. };
  121. module.exports.property = property;