nextTick(() => {
document.querySelectorAll('table').forEach((table, idx) => {
const div = document.createElement('div')
div.className = 'divTableContainer'
table.parentNode.insertBefore(div, table.nextSibling)
convertTableWithMergedCells(table, div)
})
function convertTableWithMergedCells(tableElement, targetContainer) {
targetContainer.innerHTML = ''
const rows = Array.from(tableElement.rows)
const colCount = getTheadColCount(tableElement)
targetContainer.style.display = 'grid'
targetContainer.style.gridTemplateColumns = `repeat(${colCount}, 1fr)`
const cellMatrix = []
rows.forEach((tr, rowIndex) => {
let colPointer = 0
if (!cellMatrix[rowIndex]) cellMatrix[rowIndex] = []
Array.from(tr.cells).forEach(td => {
while (cellMatrix[rowIndex][colPointer]) colPointer++
const rowspan = parseInt(td.getAttribute('rowspan') || 1, 10)
const colspan = Math.min(parseInt(td.getAttribute('colspan') || 1, 10), colCount - colPointer)
const cellDiv = document.createElement('div')
cellDiv.className = 'div-cell'
cellDiv.innerHTML = td.innerHTML
cellDiv.style.gridColumn = `${colPointer + 1} / span ${colspan}`
cellDiv.style.gridRow = `${rowIndex + 1} / span ${rowspan}`
targetContainer.appendChild(cellDiv)
for (let r = 0; r < rowspan; r++) {
for (let c = 0; c < colspan; c++) {
if (!cellMatrix[rowIndex + r]) cellMatrix[rowIndex + r] = []
cellMatrix[rowIndex + r][colPointer + c] = true
}
}
colPointer += colspan
})
})
}
function getTheadColCount(tableElement) {
const thead = tableElement.querySelector('thead')
if (!thead) return 0
const firstRow = thead.rows[0]
if (!firstRow) return 0
let colCount = 0
Array.from(firstRow.cells).forEach(td => {
colCount += parseInt(td.getAttribute('colspan') || 1, 10)
})
return colCount
}
})