"use strict"; const HTMLElementImpl = require("./HTMLElement-impl").implementation; const { asciiLowercase, parseNonNegativeInteger } = require("../helpers/strings"); const { closest } = require("../helpers/traversal"); function reflectedAttributeClampedToRange(attrValue, min, max, defaultValue = 0) { if (attrValue === null) { return defaultValue; } const parsed = parseNonNegativeInteger(attrValue); if (parsed === null) { return defaultValue; } if (parsed < min) { return min; } if (parsed > max) { return max; } return parsed; } class HTMLTableCellElementImpl extends HTMLElementImpl { get colSpan() { return reflectedAttributeClampedToRange(this.getAttributeNS(null, "colspan"), 1, 1000, 1); } set colSpan(V) { this.setAttributeNS(null, "colspan", String(V)); } get rowSpan() { return reflectedAttributeClampedToRange(this.getAttributeNS(null, "rowspan"), 0, 65534, 1); } set rowSpan(V) { this.setAttributeNS(null, "rowspan", String(V)); } get cellIndex() { const tr = closest(this, "tr"); if (tr === null) { return -1; } return tr.cells.indexOf(this); } get scope() { let value = this.getAttributeNS(null, "scope"); if (value === null) { return ""; } // Enumerated attribute is matched ASCII-case-insensitively. value = asciiLowercase(value); if (value === "row" || value === "col" || value === "rowgroup" || value === "colgroup") { return value; } return ""; } set scope(V) { this.setAttributeNS(null, "scope", V); } } module.exports = { implementation: HTMLTableCellElementImpl };