to-grid.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { memoize } from '../../core/utils';
  2. /**
  3. * Converts a table to an Array of arrays, normalized for row and column spans
  4. * @method toGrid
  5. * @memberof axe.commons.table
  6. * @instance
  7. * @param {HTMLTableElement} node The table to convert
  8. * @return {Array<HTMLTableCellElement>} Array of HTMLTableCellElements
  9. */
  10. function toGrid(node) {
  11. var table = [];
  12. var rows = node.rows;
  13. for (var i = 0, rowLength = rows.length; i < rowLength; i++) {
  14. var cells = rows[i].cells;
  15. table[i] = table[i] || [];
  16. var columnIndex = 0;
  17. for (var j = 0, cellLength = cells.length; j < cellLength; j++) {
  18. for (var colSpan = 0; colSpan < cells[j].colSpan; colSpan++) {
  19. // if [the rowSpan] value is set to 0, it extends until the
  20. // end of the table section
  21. // @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-rowspan
  22. // ie11 returns 1 as the rowspan value even if it's set to 0
  23. const rowspanAttr = cells[j].getAttribute('rowspan');
  24. const rowspanValue =
  25. parseInt(rowspanAttr) === 0 || cells[j].rowspan === 0
  26. ? rows.length
  27. : cells[j].rowSpan;
  28. for (var rowSpan = 0; rowSpan < rowspanValue; rowSpan++) {
  29. table[i + rowSpan] = table[i + rowSpan] || [];
  30. while (table[i + rowSpan][columnIndex]) {
  31. columnIndex++;
  32. }
  33. table[i + rowSpan][columnIndex] = cells[j];
  34. }
  35. columnIndex++;
  36. }
  37. }
  38. }
  39. return table;
  40. }
  41. export default memoize(toGrid);