All files / owid-grapher/site Tablepress.tsx

18.18% Statements 12/66
100% Branches 0/0
0% Functions 0/3
18.18% Lines 12/66

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 761x 1x 1x 1x 1x 1x 1x 1x               1x 1x 1x                                               1x                                                                    
import * as React from "react"
 
interface Cell {
    data: string
    colspan: number
    rowspan: number
}
 
function cell(data?: string) {
    return {
        data: data || "",
        colspan: 1,
        rowspan: 1,
    }
}
 
const ROWSPAN_TOKEN = "#rowspan#"
 
function parseTable(table: string[][]): Cell[][] {
    const resultTable: Cell[][] = []
    table.forEach((row, r) => {
        const resultRow: Cell[] = []
        row.forEach((data, c) => {
            if (data === ROWSPAN_TOKEN) {
                let i = r - 1
                while (i >= 0 && table[i][c] === ROWSPAN_TOKEN) {
                    i--
                }
                if (i >= 0) {
                    resultTable[i][c].rowspan++
                } else {
                    resultRow.push(cell())
                }
            } else {
                resultRow.push(cell(data))
            }
        })
        resultTable.push(resultRow)
    })
    return resultTable
}
 
export default function Tablepress(props: { data: string[][] }) {
    const { data } = props
    const table = parseTable(data)
    const [headerRow, ...body] = table
    return (
        <table className="tablepress">
            <thead>
                <tr>
                    {headerRow.map((cell, i) => (
                        <th
                            key={i}
                            dangerouslySetInnerHTML={{ __html: cell.data }}
                        />
                    ))}
                </tr>
            </thead>
            <tbody className="row-hover">
                {body.map((row, i) => (
                    <tr key={i}>
                        {row.map((cell, j) => (
                            <td
                                key={j}
                                colSpan={cell.colspan}
                                rowSpan={cell.rowspan}
                                dangerouslySetInnerHTML={{ __html: cell.data }}
                            />
                        ))}
                    </tr>
                ))}
            </tbody>
        </table>
    )
}