| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | /// <reference path="src/types.ts"/>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 12.3.10 Metadata Part */ | 
					
						
							|  |  |  | function parse_xlmeta_xml(data: string, name: string, opts?: ParseXLMetaOptions): XLMeta { | 
					
						
							| 
									
										
										
										
											2022-03-14 06:51:33 +00:00
										 |  |  | 	var out: XLMeta = { Types: [], Cell: [], Value: [] }; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 	if(!data) return out; | 
					
						
							|  |  |  | 	var pass = false; | 
					
						
							| 
									
										
										
										
											2022-03-16 03:18:09 +00:00
										 |  |  | 	var metatype: 0 | 1 | 2 = 2; | 
					
						
							| 
									
										
										
										
											2022-03-21 01:39:16 +00:00
										 |  |  | 	var lastmeta: XLMDT; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 03:18:09 +00:00
										 |  |  | 	data.replace(tagregex, (x: string/*, idx: number*/) => { | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 		var y: any = parsexmltag(x); | 
					
						
							|  |  |  | 		switch(strip_ns(y[0])) { | 
					
						
							|  |  |  | 			case '<?xml': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.8 */ | 
					
						
							|  |  |  | 			case '<metadata': case '</metadata>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.11 */ | 
					
						
							|  |  |  | 			case '<metadataTypes': case '</metadataTypes>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.10 */ | 
					
						
							|  |  |  | 			case '<metadataType': | 
					
						
							|  |  |  | 				out.Types.push({ name: y.name }); | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2022-03-14 06:51:33 +00:00
										 |  |  | 			case '</metadataType>': break; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.4 */ | 
					
						
							| 
									
										
										
										
											2022-03-21 01:39:16 +00:00
										 |  |  | 			case '<futureMetadata': | 
					
						
							|  |  |  | 				for(var j = 0; j < out.Types.length; ++j) if(out.Types[j].name == y.name) lastmeta = out.Types[j]; | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 			case '</futureMetadata>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.1 */ | 
					
						
							|  |  |  | 			case '<bk>': break; | 
					
						
							|  |  |  | 			case '</bk>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.15 */ | 
					
						
							| 
									
										
										
										
											2022-03-14 06:51:33 +00:00
										 |  |  | 			case '<rc': | 
					
						
							| 
									
										
										
										
											2022-03-16 03:18:09 +00:00
										 |  |  | 				if(metatype == 1) out.Cell.push({ type: out.Types[y.t - 1].name, index: +y.v }); | 
					
						
							|  |  |  | 				else if(metatype == 0) out.Value.push({ type: out.Types[y.t - 1].name, index: +y.v }); | 
					
						
							| 
									
										
										
										
											2022-03-14 06:51:33 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 			case '</rc>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.3 */ | 
					
						
							| 
									
										
										
										
											2022-03-16 03:18:09 +00:00
										 |  |  | 			case '<cellMetadata': metatype = 1; break; | 
					
						
							|  |  |  | 			case '</cellMetadata>': metatype = 2; break; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.9.17 */ | 
					
						
							| 
									
										
										
										
											2022-03-16 03:18:09 +00:00
										 |  |  | 			case '<valueMetadata': metatype = 0; break; | 
					
						
							|  |  |  | 			case '</valueMetadata>': metatype = 2; break; | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.2.10 extLst CT_ExtensionList ? */ | 
					
						
							|  |  |  | 			case '<extLst': case '<extLst>': case '</extLst>': case '<extLst/>': break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* 18.2.7  ext CT_Extension + */ | 
					
						
							|  |  |  | 			case '<ext': pass=true; break; //TODO: check with versions of excel
 | 
					
						
							|  |  |  | 			case '</ext>': pass=false; break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-21 01:39:16 +00:00
										 |  |  | 			case '<rvb': | 
					
						
							|  |  |  | 				if(!lastmeta) break; | 
					
						
							|  |  |  | 				if(!lastmeta.offsets) lastmeta.offsets = []; | 
					
						
							|  |  |  | 				lastmeta.offsets.push(+y.i); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-21 22:16:57 +00:00
										 |  |  | 			default: if(!pass && opts?.WTF) throw new Error('unrecognized ' + y[0] + ' in metadata'); | 
					
						
							| 
									
										
										
										
											2022-03-03 08:35:39 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return x; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	return out; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* TODO: coordinate with cell writing, pass flags */ | 
					
						
							|  |  |  | function write_xlmeta_xml(): string { | 
					
						
							|  |  |  | 	var o = [XML_HEADER]; | 
					
						
							|  |  |  | 	o.push(`\
 | 
					
						
							|  |  |  | <metadata xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:xlrd="http://schemas.microsoft.com/office/spreadsheetml/2017/richdata" xmlns:xda="http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray"> | 
					
						
							|  |  |  |   <metadataTypes count="1"> | 
					
						
							|  |  |  |     <metadataType name="XLDAPR" minSupportedVersion="120000" copy="1" pasteAll="1" pasteValues="1" merge="1" splitFirst="1" rowColShift="1" clearFormats="1" clearComments="1" assign="1" coerce="1" cellMeta="1"/> | 
					
						
							|  |  |  |   </metadataTypes> | 
					
						
							|  |  |  |   <futureMetadata name="XLDAPR" count="1"> | 
					
						
							|  |  |  |     <bk> | 
					
						
							|  |  |  |       <extLst> | 
					
						
							|  |  |  |         <ext uri="{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}"> | 
					
						
							|  |  |  |           <xda:dynamicArrayProperties fDynamic="1" fCollapsed="0"/> | 
					
						
							|  |  |  |         </ext> | 
					
						
							|  |  |  |       </extLst> | 
					
						
							|  |  |  |     </bk> | 
					
						
							|  |  |  |   </futureMetadata> | 
					
						
							|  |  |  |   <cellMetadata count="1"> | 
					
						
							|  |  |  |     <bk> | 
					
						
							|  |  |  |       <rc t="1" v="0"/> | 
					
						
							|  |  |  |     </bk> | 
					
						
							|  |  |  |   </cellMetadata> | 
					
						
							|  |  |  | </metadata>`);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return o.join(""); | 
					
						
							|  |  |  | } |