feat: auto-merge table rows and cells

pull/725/head
Septs 2023-01-16 08:52:17 +08:00
parent 4d04025b99
commit 5ba7f0a282
1 changed files with 38 additions and 0 deletions

View File

@ -73,3 +73,41 @@ document.addEventListener(
); );
// #endregion // #endregion
document.querySelectorAll('table').forEach((table) => {
tableMerge(table.rows)
})
function tableMerge(rows) {
const refs = new Map()
// Merge cells in a *column* first.
for (let cellIndex = 0; cellIndex < rows[0].cells.length; cellIndex++) {
for (let rowIndex = 1; rowIndex < rows.length; rowIndex++) {
const cell = rows[rowIndex].cells[cellIndex]
const prevCell = rows[rowIndex - 1].cells[cellIndex]
if (cell.innerHTML !== prevCell.innerHTML) continue
const mergedTo = refs.get(prevCell) || prevCell
refs.set(cell, mergedTo)
mergedTo.rowSpan += cell.rowSpan
cell.hidden = true
}
}
// Merge cells in a *row* then.
for (const row of rows) {
for (let cellIndex = 1; cellIndex < row.cells.length; cellIndex++) {
const cell = row.cells[cellIndex]
const prevCell = row.cells[cellIndex - 1]
if (refs.has(cell) || refs.has(prevCell)) continue
if (cell.innerHTML !== prevCell.innerHTML) continue
const mergedTo = refs.get(prevCell) || prevCell
if (cell.rowSpan !== mergedTo.rowSpan) continue
mergedTo.colSpan += cell.colSpan
refs.set(cell, mergedTo)
cell.hidden = true
}
}
for (const cell of refs.keys()) {
cell.remove()
}
refs.clear()
}