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-03-03 08:35:39 +00:00
|
|
|
default: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in metadata');
|
|
|
|
}
|
|
|
|
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("");
|
|
|
|
}
|