@@ -119,16 +119,32 @@ var HTML_ = (function() {
119119 } ;
120120} ) ( ) ;
121121
122- function parse_dom_table ( table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
122+ function sheet_add_dom ( ws /*:Worksheet*/ , table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
123123 var opts = _opts || { } ;
124124 if ( DENSE != null ) opts . dense = DENSE ;
125- var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
125+ var or_R = 0 , or_C = 0 ;
126+ if ( opts . origin != null ) {
127+ if ( typeof opts . origin == 'number' ) or_R = opts . origin ;
128+ else {
129+ var _origin /*:CellAddress*/ = typeof opts . origin == "string" ? decode_cell ( opts . origin ) : opts . origin ;
130+ or_R = _origin . r ; or_C = _origin . c ;
131+ }
132+ }
126133 var rows /*:HTMLCollection<HTMLTableRowElement>*/ = table . getElementsByTagName ( 'tr' ) ;
127- var sheetRows = opts . sheetRows || 10000000 ;
128- var range /*:Range*/ = { s :{ r :0 , c :0 } , e :{ r :0 , c :0 } } ;
134+ var sheetRows = Math . min ( opts . sheetRows || 10000000 , rows . length ) ;
135+ var range /*:Range*/ = { s :{ r :0 , c :0 } , e :{ r :or_R , c :or_C } } ;
136+ if ( ws [ "!ref" ] ) {
137+ var _range /*:Range*/ = decode_range ( ws [ "!ref" ] ) ;
138+ range . s . r = Math . min ( range . s . r , _range . s . r ) ;
139+ range . s . c = Math . min ( range . s . c , _range . s . c ) ;
140+ range . e . r = Math . max ( range . e . r , _range . e . r ) ;
141+ range . e . c = Math . max ( range . e . c , _range . e . c ) ;
142+ if ( or_R == - 1 ) range . e . r = or_R = _range . e . r + 1 ;
143+ }
129144 var merges /*:Array<Range>*/ = [ ] , midx = 0 ;
130- var rowinfo /*:Array<RowInfo>*/ = [ ] ;
145+ var rowinfo /*:Array<RowInfo>*/ = ws [ "!rows" ] || ( ws [ "!rows" ] = [ ] ) ;
131146 var _R = 0 , R = 0 , _C = 0 , C = 0 , RS = 0 , CS = 0 ;
147+ if ( ! ws [ "!cols" ] ) ws [ '!cols' ] = [ ] ;
132148 for ( ; _R < rows . length && R < sheetRows ; ++ _R ) {
133149 var row /*:HTMLTableRowElement*/ = rows [ _R ] ;
134150 if ( is_dom_element_hidden ( row ) ) {
@@ -143,11 +159,11 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
143159 var z /*:?string*/ = elt . getAttribute ( 'z' ) ;
144160 for ( midx = 0 ; midx < merges . length ; ++ midx ) {
145161 var m /*:Range*/ = merges [ midx ] ;
146- if ( m . s . c == C && m . s . r <= R && R <= m . e . r ) { C = m . e . c + 1 ; midx = - 1 ; }
162+ if ( m . s . c == C + or_C && m . s . r < R + or_R && R + or_R <= m . e . r ) { C = m . e . c + 1 - or_C ; midx = - 1 ; }
147163 }
148164 /* TODO: figure out how to extract nonstandard mso- style */
149165 CS = + elt . getAttribute ( "colspan" ) || 1 ;
150- if ( ( RS = + elt . getAttribute ( "rowspan" ) ) > 0 || CS > 1 ) merges . push ( { s :{ r :R , c :C } , e :{ r :R + ( RS || 1 ) - 1 , c :C + CS - 1 } } ) ;
166+ if ( ( ( RS = ( + elt . getAttribute ( "rowspan" ) || 1 ) ) ) > 1 || CS > 1 ) merges . push ( { s :{ r :R + or_R , c :C + or_C } , e :{ r :R + or_R + ( RS || 1 ) - 1 , c :C + or_C + ( CS || 1 ) - 1 } } ) ;
151167 var o /*:Cell*/ = { t :'s' , v :v } ;
152168 var _t /*:string*/ = elt . getAttribute ( "t" ) || "" ;
153169 if ( v != null ) {
@@ -163,21 +179,26 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
163179 }
164180 }
165181 if ( o . z === undefined && z != null ) o . z = z ;
166- if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = o ; }
167- else ws [ encode_cell ( { c :C , r :R } ) ] = o ;
168- if ( range . e . c < C ) range . e . c = C ;
182+ if ( opts . dense ) { if ( ! ws [ R + or_R ] ) ws [ R + or_R ] = [ ] ; ws [ R + or_R ] [ C + or_C ] = o ; }
183+ else ws [ encode_cell ( { c :C + or_C , r :R + or_R } ) ] = o ;
184+ if ( range . e . c < C + or_C ) range . e . c = C + or_C ;
169185 C += CS ;
170186 }
171187 ++ R ;
172188 }
173- if ( merges . length ) ws [ '!merges' ] = merges ;
174- if ( rowinfo . length ) ws [ '!rows' ] = rowinfo ;
175- range . e . r = R - 1 ;
189+ if ( merges . length ) ws [ '!merges' ] = ( ws [ "!merges" ] || [ ] ) . concat ( merges ) ;
190+ range . e . r = Math . max ( range . e . r , R - 1 + or_R ) ;
176191 ws [ '!ref' ] = encode_range ( range ) ;
177- if ( R >= sheetRows ) ws [ '!fullref' ] = encode_range ( ( range . e . r = rows . length - _R + R - 1 , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
192+ if ( R >= sheetRows ) ws [ '!fullref' ] = encode_range ( ( range . e . r = rows . length - _R + R - 1 + or_R , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
178193 return ws ;
179194}
180195
196+ function parse_dom_table ( table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
197+ var opts = _opts || { } ;
198+ var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
199+ return sheet_add_dom ( ws , table , _opts ) ;
200+ }
201+
181202function table_to_book ( table /*:HTMLElement*/ , opts /*:?any*/ ) /*:Workbook*/ {
182203 return sheet_to_workbook ( parse_dom_table ( table , opts ) , opts ) ;
183204}
0 commit comments