border.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. "use strict";
  2. const parsers = require("../parsers");
  3. const borderWidth = require("./borderWidth");
  4. const borderStyle = require("./borderStyle");
  5. const borderColor = require("./borderColor");
  6. const borderTop = require("./borderTop");
  7. const borderRight = require("./borderRight");
  8. const borderBottom = require("./borderBottom");
  9. const borderLeft = require("./borderLeft");
  10. const property = "border";
  11. const subProps = {
  12. width: borderWidth.property,
  13. style: borderStyle.property,
  14. color: borderColor.property
  15. };
  16. module.exports.initialValues = new Map([
  17. [borderWidth.property, "medium"],
  18. [borderStyle.property, "none"],
  19. [borderColor.property, "currentcolor"]
  20. ]);
  21. module.exports.shorthandFor = new Map([
  22. [borderWidth.property, borderWidth],
  23. [borderStyle.property, borderStyle],
  24. [borderColor.property, borderColor]
  25. ]);
  26. module.exports.positionShorthandFor = new Map([
  27. [borderTop.property, borderTop],
  28. [borderRight.property, borderRight],
  29. [borderBottom.property, borderBottom],
  30. [borderLeft.property, borderLeft]
  31. ]);
  32. module.exports.parse = (v, opt = {}) => {
  33. const { globalObject } = opt;
  34. if (v === "" || parsers.hasVarFunc(v)) {
  35. return v;
  36. }
  37. const values = parsers.splitValue(v);
  38. const parsedValues = new Map();
  39. for (const val of values) {
  40. const value = parsers.parsePropertyValue(property, val, {
  41. globalObject,
  42. inArray: true
  43. });
  44. if (Array.isArray(value) && value.length === 1) {
  45. const parsedValue = parsers.resolveBorderShorthandValue(value, subProps, parsedValues);
  46. if (typeof parsedValue === "string") {
  47. return parsedValue;
  48. } else if (Array.isArray(parsedValue)) {
  49. const [key, resolvedVal] = parsedValue;
  50. parsedValues.set(key, resolvedVal);
  51. } else {
  52. return;
  53. }
  54. } else {
  55. return;
  56. }
  57. }
  58. if (parsedValues.size) {
  59. const keys = module.exports.shorthandFor.keys();
  60. const obj = {
  61. [borderWidth.property]: "medium"
  62. };
  63. for (const key of keys) {
  64. if (parsedValues.has(key)) {
  65. const parsedValue = parsedValues.get(key);
  66. if (parsedValue !== module.exports.initialValues.get(key)) {
  67. obj[key] = parsedValues.get(key);
  68. if (obj[borderWidth.property] && obj[borderWidth.property] === "medium") {
  69. delete obj[borderWidth.property];
  70. }
  71. }
  72. }
  73. }
  74. return obj;
  75. }
  76. };
  77. module.exports.definition = {
  78. set(v) {
  79. v = parsers.prepareValue(v);
  80. if (parsers.hasVarFunc(v)) {
  81. this._borderSetter(property, v, "");
  82. } else {
  83. const val = module.exports.parse(v, {
  84. globalObject: this._global
  85. });
  86. if (val || typeof val === "string") {
  87. const priority = this._priorities.get(property) ?? "";
  88. this._borderSetter(property, val, priority);
  89. }
  90. }
  91. },
  92. get() {
  93. return this.getPropertyValue(property);
  94. },
  95. enumerable: true,
  96. configurable: true
  97. };
  98. module.exports.property = property;