removeUnknownsAndDefaults.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. 'use strict';
  2. exports.type = 'perItem';
  3. exports.active = true;
  4. exports.description = 'removes unknown elements content and attributes, removes attrs with default values';
  5. exports.params = {
  6. unknownContent: true,
  7. unknownAttrs: true,
  8. defaultAttrs: true,
  9. uselessOverrides: true,
  10. keepDataAttrs: true
  11. };
  12. var collections = require('./_collections'),
  13. elems = collections.elems,
  14. attrsGroups = collections.attrsGroups,
  15. elemsGroups = collections.elemsGroups,
  16. attrsGroupsDefaults = collections.attrsGroupsDefaults,
  17. attrsInheritable = collections.inheritableAttrs;
  18. // collect and extend all references
  19. for (var elem in elems) {
  20. elem = elems[elem];
  21. if (elem.attrsGroups) {
  22. elem.attrs = elem.attrs || [];
  23. elem.attrsGroups.forEach(function(attrsGroupName) {
  24. elem.attrs = elem.attrs.concat(attrsGroups[attrsGroupName]);
  25. var groupDefaults = attrsGroupsDefaults[attrsGroupName];
  26. if (groupDefaults) {
  27. elem.defaults = elem.defaults || {};
  28. for (var attrName in groupDefaults) {
  29. elem.defaults[attrName] = groupDefaults[attrName];
  30. }
  31. }
  32. });
  33. }
  34. if (elem.contentGroups) {
  35. elem.content = elem.content || [];
  36. elem.contentGroups.forEach(function(contentGroupName) {
  37. elem.content = elem.content.concat(elemsGroups[contentGroupName]);
  38. });
  39. }
  40. }
  41. /**
  42. * Remove unknown elements content and attributes,
  43. * remove attributes with default values.
  44. *
  45. * @param {Object} item current iteration item
  46. * @param {Object} params plugin params
  47. * @return {Boolean} if false, item will be filtered out
  48. *
  49. * @author Kir Belevich
  50. */
  51. exports.fn = function(item, params) {
  52. // elems w/o namespace prefix
  53. if (item.isElem() && !item.prefix) {
  54. var elem = item.elem;
  55. // remove unknown element's content
  56. if (
  57. params.unknownContent &&
  58. !item.isEmpty() &&
  59. elems[elem] && // make sure we know of this element before checking its children
  60. elem !== 'foreignObject' // Don't check foreignObject
  61. ) {
  62. item.content.forEach(function(content, i) {
  63. if (
  64. content.isElem() &&
  65. !content.prefix &&
  66. (
  67. (
  68. elems[elem].content && // Do we have a record of its permitted content?
  69. elems[elem].content.indexOf(content.elem) === -1
  70. ) ||
  71. (
  72. !elems[elem].content && // we dont know about its permitted content
  73. !elems[content.elem] // check that we know about the element at all
  74. )
  75. )
  76. ) {
  77. item.content.splice(i, 1);
  78. }
  79. });
  80. }
  81. // remove element's unknown attrs and attrs with default values
  82. if (elems[elem] && elems[elem].attrs) {
  83. item.eachAttr(function(attr) {
  84. if (
  85. attr.name !== 'xmlns' &&
  86. (attr.prefix === 'xml' || !attr.prefix) &&
  87. (!params.keepDataAttrs || attr.name.indexOf('data-') != 0)
  88. ) {
  89. if (
  90. // unknown attrs
  91. (
  92. params.unknownAttrs &&
  93. elems[elem].attrs.indexOf(attr.name) === -1
  94. ) ||
  95. // attrs with default values
  96. (
  97. params.defaultAttrs &&
  98. elems[elem].defaults &&
  99. elems[elem].defaults[attr.name] === attr.value && (
  100. attrsInheritable.indexOf(attr.name) < 0 ||
  101. !item.parentNode.computedAttr(attr.name)
  102. )
  103. ) ||
  104. // useless overrides
  105. (
  106. params.uselessOverrides &&
  107. attr.name !== 'transform' &&
  108. attrsInheritable.indexOf(attr.name) > -1 &&
  109. item.parentNode.computedAttr(attr.name, attr.value)
  110. )
  111. ) {
  112. item.removeAttr(attr.name);
  113. }
  114. }
  115. });
  116. }
  117. }
  118. };