nnnjjj123
2020-11-17 1b2c1edb61190eeb19f465ff031eaa3b2a1b8dbc
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);
        }
    });
});