-
Notifications
You must be signed in to change notification settings - Fork 295
/
GridWithColumnSetsFromHtml.js
128 lines (117 loc) · 3.66 KB
/
GridWithColumnSetsFromHtml.js
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
define([
'./GridFromHtml',
'./ColumnSet',
'dojo/_base/declare'
], function (GridFromHtml, ColumnSet, declare) {
// summary:
// This module augments GridFromHtml with additional support for interpreting
// ColumnSets from colgroups in table markup.
function getColumnSetsFromDom(domNode) {
// summary:
// Generates ColumnSets from DOM.
var columnsets = [], // to be pushed upon / returned
cgspans = [], // stores info on columnset sizes (colgroup span)
rowspans = [], // will store info on any "unexhausted" rowspans
colgroups = domNode.getElementsByTagName('colgroup'),
cglen = colgroups.length,
trs = domNode.getElementsByTagName('tr'),
trslen = trs.length,
getNum = GridFromHtml.utils.getNumFromAttr,
getCol = GridFromHtml.utils.getColumnFromCell,
// used in loops:
currcol, // keeps track of what column we're at
currcg, // and which colgroup
groupColumns,
tr,
ths,
thslen,
i,
j,
tmp;
function incCurrcol(amount) {
// Check whether we've passed into the next colgroup within current row.
// (Used within th loop)
currcol += amount;
tmp = cgspans[currcg];
if (currcol >= tmp) {
// First, push info for the set we just finished:
// (i is still the active row index from the for loop)
columnsets[currcg][i] = groupColumns;
// Now, time to move on to the next columnset for this row.
currcol -= tmp;
currcg++;
groupColumns = [];
}
}
// no need for ColumnSet unless there's >1 colgroup
if (cglen < 2) {
return false;
}
// read span from each colgroup (defaults to 1)
for (i = 0; i < cglen; i++) {
// store number of cells this column spans
tmp = getNum(colgroups[i], 'span') || 1;
cgspans[i] = tmp;
// add nested array to return value to be populated for this set
columnsets[i] = [];
// initialize inner rowspan-tracking array for each
rowspans[i] = [];
for (j = 0; j < tmp; j++) {
rowspans[i][j] = 0;
}
}
for (i = 0; i < trslen; i++) {
currcol = currcg = 0;
groupColumns = [];
tr = trs[i];
ths = tr.getElementsByTagName('th');
thslen = ths.length;
for (j = 0; j < thslen; j++) {
// account for space occupied by previous rowSpans
while (rowspans[currcg][currcol]) {
// decrement rowspan "leftover" for next iteration
rowspans[currcg][currcol]--;
// skip past this cell for now, and try again w/ updated currcg/col
incCurrcol(1);
}
// store cell info
tmp = getCol(ths[j]);
groupColumns.push(tmp);
// if this cell has rowspan, keep that in mind for future iterations
rowspans[currcg][currcol] = tmp.rowSpan ? tmp.rowSpan - 1 : 0;
// increment currcol/currcg appropriately, accounting for cell colSpan
incCurrcol(tmp.colSpan || 1);
}
// At the end of processing each row, there is a chance that the last
// column set didn't get pushed yet (specifically if there are trailing
// rowspans - since rowspan "debt" gets iterated at the beginning of each
// iteration, not the end). In that case, push the last one now.
if (groupColumns.length) {
columnsets[currcg][i] = groupColumns;
}
}
if (tr) {
domNode.removeChild(tr.parentNode);
}
return columnsets;
}
return declare([GridFromHtml, ColumnSet], {
configStructure: function () {
// summary:
// Configure subRows based on HTML originally in srcNodeRef
var tmp;
if (!this._checkedTrs) {
tmp = getColumnSetsFromDom(this.srcNodeRef);
if (tmp) {
this.columnSets = tmp;
this._checkedTrs = true;
}
else {
// no reason to worry about ColumnSets, let GridFromHtml do the job
return this.inherited(arguments);
}
}
return this.inherited(arguments);
}
});
});