backgroundRepeat.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. "use strict";
  2. const parsers = require("../parsers");
  3. const property = "background-repeat";
  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. let parsedValue = "";
  22. switch (value.length) {
  23. case 1: {
  24. const [part1] = value;
  25. const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
  26. if (val1) {
  27. parsedValue = val1;
  28. }
  29. break;
  30. }
  31. case 2: {
  32. const [part1, part2] = value;
  33. const val1 = part1.type === AST_TYPES.IDENTIFIER && part1.name;
  34. const val2 = part2.type === AST_TYPES.IDENTIFIER && part2.name;
  35. if (val1 && val2) {
  36. if (val1 === "repeat" && val2 === "no-repeat") {
  37. parsedValue = "repeat-x";
  38. } else if (val1 === "no-repeat" && val2 === "repeat") {
  39. parsedValue = "repeat-y";
  40. } else if (val1 === val2) {
  41. parsedValue = val1;
  42. } else {
  43. parsedValue = `${val1} ${val2}`;
  44. }
  45. }
  46. break;
  47. }
  48. default:
  49. }
  50. if (parsedValue) {
  51. parsedValues.push(parsedValue);
  52. } else {
  53. return;
  54. }
  55. } else if (typeof value === "string") {
  56. parsedValues.push(value);
  57. }
  58. }
  59. if (parsedValues.length) {
  60. return parsedValues.join(", ");
  61. }
  62. };
  63. module.exports.definition = {
  64. set(v) {
  65. v = parsers.prepareValue(v);
  66. if (parsers.hasVarFunc(v)) {
  67. this._setProperty(shorthand, "");
  68. this._setProperty(property, v);
  69. } else {
  70. const val = module.exports.parse(v, {
  71. globalObject: this._global
  72. });
  73. if (typeof val === "string") {
  74. const priority =
  75. !this._priorities.get(shorthand) && this._priorities.has(property)
  76. ? this._priorities.get(property)
  77. : "";
  78. this._setProperty(property, val, priority);
  79. }
  80. }
  81. },
  82. get() {
  83. return this.getPropertyValue(property);
  84. },
  85. enumerable: true,
  86. configurable: true
  87. };
  88. module.exports.property = property;