attr.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { ns } from './elem';
  2. import { kebabCase } from '../string/format';
  3. export const CASE_SENSITIVE_ATTR = [
  4. 'viewBox',
  5. 'attributeName',
  6. 'attributeType',
  7. 'repeatCount',
  8. 'textLength',
  9. 'lengthAdjust',
  10. 'gradientUnits',
  11. ];
  12. export function getAttribute(elem, name) {
  13. return elem.getAttribute(name);
  14. }
  15. export function removeAttribute(elem, name) {
  16. const qualified = qualifyAttr(name);
  17. if (qualified.ns) {
  18. if (elem.hasAttributeNS(qualified.ns, qualified.local)) {
  19. elem.removeAttributeNS(qualified.ns, qualified.local);
  20. }
  21. }
  22. else if (elem.hasAttribute(name)) {
  23. elem.removeAttribute(name);
  24. }
  25. }
  26. export function setAttribute(elem, name, value) {
  27. if (value == null) {
  28. return removeAttribute(elem, name);
  29. }
  30. const qualified = qualifyAttr(name);
  31. if (qualified.ns && typeof value === 'string') {
  32. elem.setAttributeNS(qualified.ns, name, value);
  33. }
  34. else if (name === 'id') {
  35. elem.id = `${value}`;
  36. }
  37. else {
  38. elem.setAttribute(name, `${value}`);
  39. }
  40. }
  41. export function setAttributes(elem, attrs) {
  42. Object.keys(attrs).forEach((name) => {
  43. setAttribute(elem, name, attrs[name]);
  44. });
  45. }
  46. export function attr(elem, name, value) {
  47. if (name == null) {
  48. const attrs = elem.attributes;
  49. const ret = {};
  50. for (let i = 0; i < attrs.length; i += 1) {
  51. ret[attrs[i].name] = attrs[i].value;
  52. }
  53. return ret;
  54. }
  55. if (typeof name === 'string' && value === undefined) {
  56. return elem.getAttribute(name);
  57. }
  58. if (typeof name === 'object') {
  59. setAttributes(elem, name);
  60. }
  61. else {
  62. setAttribute(elem, name, value);
  63. }
  64. }
  65. export function qualifyAttr(name) {
  66. if (name.indexOf(':') !== -1) {
  67. const combinedKey = name.split(':');
  68. return {
  69. ns: ns[combinedKey[0]],
  70. local: combinedKey[1],
  71. };
  72. }
  73. return {
  74. ns: null,
  75. local: name,
  76. };
  77. }
  78. export function kebablizeAttrs(attrs) {
  79. const result = {};
  80. Object.keys(attrs).forEach((key) => {
  81. const name = CASE_SENSITIVE_ATTR.includes(key) ? key : kebabCase(key);
  82. result[name] = attrs[key];
  83. });
  84. return result;
  85. }
  86. export function styleToObject(styleString) {
  87. const ret = {};
  88. const styles = styleString.split(';');
  89. styles.forEach((item) => {
  90. const section = item.trim();
  91. if (section) {
  92. const pair = section.split('=');
  93. if (pair.length) {
  94. ret[pair[0].trim()] = pair[1] ? pair[1].trim() : '';
  95. }
  96. }
  97. });
  98. return ret;
  99. }
  100. export function mergeAttrs(target, source) {
  101. Object.keys(source).forEach((attr) => {
  102. if (attr === 'class') {
  103. target[attr] = target[attr]
  104. ? `${target[attr]} ${source[attr]}`
  105. : source[attr];
  106. }
  107. else if (attr === 'style') {
  108. const to = typeof target[attr] === 'object';
  109. const so = typeof source[attr] === 'object';
  110. let tt;
  111. let ss;
  112. if (to && so) {
  113. tt = target[attr];
  114. ss = source[attr];
  115. }
  116. else if (to) {
  117. tt = target[attr];
  118. ss = styleToObject(source[attr]);
  119. }
  120. else if (so) {
  121. tt = styleToObject(target[attr]);
  122. ss = source[attr];
  123. }
  124. else {
  125. tt = styleToObject(target[attr]);
  126. ss = styleToObject(source[attr]);
  127. }
  128. target[attr] = mergeAttrs(tt, ss);
  129. }
  130. else {
  131. target[attr] = source[attr];
  132. }
  133. });
  134. return target;
  135. }
  136. //# sourceMappingURL=attr.js.map