TableWalker
The table iterator class. It allows to iterate over table cells. For each cell the iterator yields
TableSlot
with proper table cell attributes.
Properties
-
_cellIndex : number
internalmodule:table/tablewalker~TableWalker#_cellIndex
The cell index in a parent row. For spanned cells when
_includeAllSlots
is set totrue
, this represents the index of the next table cell. -
_column : number
internalmodule:table/tablewalker~TableWalker#_column
The current column index.
-
_row : number
internalmodule:table/tablewalker~TableWalker#_row
The current row index.
-
_rowIndex : number
internalmodule:table/tablewalker~TableWalker#_rowIndex
The index of the current row element in the table.
-
_table : ModelElement
internalreadonlymodule:table/tablewalker~TableWalker#_table
The walker's table element.
-
_endColumn : number | undefined
privatereadonlymodule:table/tablewalker~TableWalker#_endColumn
If set, the table walker will only output cells up to a given column.
-
_endRow : null | number | undefined
privatereadonlymodule:table/tablewalker~TableWalker#_endRow
A row index at which this iterator will end.
-
_includeAllSlots : boolean
privatereadonlymodule:table/tablewalker~TableWalker#_includeAllSlots
Enables output of spanned cells that are normally not yielded.
-
_jumpedToStartRow : boolean
privatemodule:table/tablewalker~TableWalker#_jumpedToStartRow
Indicates whether the iterator jumped to (or close to) the start row, ignoring rows that don't need to be traversed.
-
_nextCellAtColumn : number
privatemodule:table/tablewalker~TableWalker#_nextCellAtColumn
Index of the next column where a cell is anchored.
-
_skipRows : Set<number>
privatereadonlymodule:table/tablewalker~TableWalker#_skipRows
Row indexes to skip from the iteration.
-
_spannedCells : Map<number, Map<number, CellData>>
privatereadonlymodule:table/tablewalker~TableWalker#_spannedCells
Holds a map of spanned cells in a table.
-
_startColumn : number
privatereadonlymodule:table/tablewalker~TableWalker#_startColumn
If set, the table walker will only output cells from a given column and following ones or cells that overlap them.
-
_startRow : null | number
privatereadonlymodule:table/tablewalker~TableWalker#_startRow
A row index from which this iterator will start.
Methods
-
constructor( table, options )
module:table/tablewalker~TableWalker#constructor
Creates an instance of the table walker.
The table walker iterates internally by traversing the table from row index = 0 and column index = 0. It walks row by row and column by column in order to output values defined in the constructor. By default it will output only the locations that are occupied by a cell. To include also spanned rows and columns, pass the
includeAllSlots
option to the constructor.The most important values of the iterator are column and row indexes of a cell.
See
TableSlot
what values are returned by the table walker.To iterate over a given row:
const tableWalker = new TableWalker( table, { startRow: 1, endRow: 2 } ); for ( const tableSlot of tableWalker ) { console.log( 'A cell at row', tableSlot.row, 'and column', tableSlot.column ); }
For instance the code above for the following table:
+----+----+----+----+----+----+ | 00 | 02 | 03 | 04 | 05 | | +----+----+----+----+ | | 12 | 14 | 15 | | +----+----+----+ + | | 22 | | |----+----+----+----+----+ + | 30 | 31 | 32 | 33 | 34 | | +----+----+----+----+----+----+
will log in the console:
'A cell at row 1 and column 2' 'A cell at row 1 and column 4' 'A cell at row 1 and column 5' 'A cell at row 2 and column 2'
To also iterate over spanned cells:
const tableWalker = new TableWalker( table, { row: 1, includeAllSlots: true } ); for ( const tableSlot of tableWalker ) { console.log( 'Slot at', tableSlot.row, 'x', tableSlot.column, ':', tableSlot.isAnchor ? 'is anchored' : 'is spanned' ); }
will log in the console for the table from the previous example:
'Cell at 1 x 0 : is spanned' 'Cell at 1 x 1 : is spanned' 'Cell at 1 x 2 : is anchored' 'Cell at 1 x 3 : is spanned' 'Cell at 1 x 4 : is anchored' 'Cell at 1 x 5 : is anchored'
Note: Option
row
is a shortcut that sets bothstartRow
andendRow
to the same row. (Use eitherrow
orstartRow
andendRow
but never together). Similarly thecolumn
option sets bothstartColumn
andendColumn
to the same column (Use eithercolumn
orstartColumn
andendColumn
but never together).Parameters
table : ModelElement
A table over which the walker iterates.
options : TableWalkerOptions
An object with configuration.
Defaults to
{}
-
Symbol.iterator() → IterableIterator<TableSlot>
module:table/tablewalker~TableWalker#Symbol.iterator
-
module:table/tablewalker~TableWalker#next
Gets the next table walker's value.
Returns
IteratorResult<TableSlot, undefined>
The next table walker's value.
-
skipRow( row ) → void
module:table/tablewalker~TableWalker#skipRow
Marks a row to skip in the next iteration. It will also skip cells from the current row if there are any cells from the current row to output.
Parameters
row : number
The row index to skip.
Returns
void
-
_advanceToNextRow() → IteratorResult<TableSlot, undefined>
privatemodule:table/tablewalker~TableWalker#_advanceToNextRow
-
_canJumpToStartRow() → boolean
privatemodule:table/tablewalker~TableWalker#_canJumpToStartRow
-
_formatOutValue( cell, anchorRow, anchorColumn ) → IteratorYieldResult<TableSlot>
privatemodule:table/tablewalker~TableWalker#_formatOutValue
A common method for formatting the iterator's output value.
Parameters
cell : ModelElement
The table cell to output.
anchorRow : number
The row index of a cell anchor slot.
Defaults to
...
anchorColumn : number
The column index of a cell anchor slot.
Defaults to
...
Returns
IteratorYieldResult<TableSlot>
-
_getRowLength( rowIndex ) → number
privatemodule:table/tablewalker~TableWalker#_getRowLength
Returns a number of columns in a row taking
colspan
into consideration.Parameters
rowIndex : number
Returns
number
-
_getSpanned() → null | CellData
privatemodule:table/tablewalker~TableWalker#_getSpanned
Returns the cell element that is spanned over the current cell location.
Returns
null | CellData
-
_isOverEndColumn() → boolean
privatemodule:table/tablewalker~TableWalker#_isOverEndColumn
-
_isOverEndRow() → boolean
privatemodule:table/tablewalker~TableWalker#_isOverEndRow
-
_jumpToNonSpannedRowClosestToStartRow() → void
privatemodule:table/tablewalker~TableWalker#_jumpToNonSpannedRowClosestToStartRow
Sets the current row to
this._startRow
or the first row before it that has the number of cells equal to the number of columns in the table.Example: +----+----+----+ | 00 | 01 | 02 | |----+----+----+ | 10 | 12 | | +----+ | | 22 | | +----+ | | 32 | <--- Start row +----+----+----+ | 40 | 41 | 42 | +----+----+----+
If the 4th row is a
this._startRow
, this method will: 1.) Count the number of columns this table has based on the first row (3 columns in this case). 2.) Check if the 4th row contains 3 cells. It doesn't, so go to the row before it. 3.) Check if the 3rd row contains 3 cells. It doesn't, so go to the row before it. 4.) Check if the 2nd row contains 3 cells. It does, so set the current row to that row.Setting the current row this way is necessary to let the
next()
method loop over the cells spanning multiple rows or columns and update thethis._spannedCells
property.Returns
void
-
_markSpannedCell( row, column, data ) → void
privatemodule:table/tablewalker~TableWalker#_markSpannedCell
Marks the cell location as spanned by another cell.
Parameters
row : number
The row index of the cell location.
column : number
The column index of the cell location.
data : CellData
A spanned cell details (cell element, anchor row and column).
Returns
void
-
_recordSpans( cell, rowspan, colspan ) → void
privatemodule:table/tablewalker~TableWalker#_recordSpans
Updates spanned cells map relative to the current cell location and its span dimensions.
Parameters
cell : ModelElement
A cell that is spanned.
rowspan : number
Cell height.
colspan : number
Cell width.
Returns
void
-
_shouldSkipSlot() → boolean
privatemodule:table/tablewalker~TableWalker#_shouldSkipSlot