forked from sheetjs/sheetjs
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 9.3 Relationships */
 | 
						|
var RELS = ({
 | 
						|
	WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
 | 
						|
	SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
 | 
						|
	HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
 | 
						|
	VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
 | 
						|
	XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
 | 
						|
	XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",
 | 
						|
	XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",
 | 
						|
	CXML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",
 | 
						|
	CXMLP: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",
 | 
						|
	CMNT: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
 | 
						|
	CORE_PROPS: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties",
 | 
						|
	EXT_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
 | 
						|
	CUST_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
 | 
						|
	SST: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",
 | 
						|
	STY: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
 | 
						|
	THEME: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
 | 
						|
	CHART: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",
 | 
						|
	CHARTEX: "http://schemas.microsoft.com/office/2014/relationships/chartEx",
 | 
						|
	CS: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",
 | 
						|
	WS: [
 | 
						|
		"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
 | 
						|
		"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
 | 
						|
	],
 | 
						|
	DS: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet",
 | 
						|
	MS: "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet",
 | 
						|
	IMG: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
 | 
						|
	DRAW: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing",
 | 
						|
	XLMETA: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata",
 | 
						|
	TCMNT: "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment",
 | 
						|
	PEOPLE: "http://schemas.microsoft.com/office/2017/10/relationships/person",
 | 
						|
	VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
 | 
						|
}/*:any*/);
 | 
						|
 | 
						|
 | 
						|
/* 9.3.3 Representing Relationships */
 | 
						|
function get_rels_path(file/*:string*/)/*:string*/ {
 | 
						|
	var n = file.lastIndexOf("/");
 | 
						|
	return file.slice(0,n+1) + '_rels/' + file.slice(n+1) + ".rels";
 | 
						|
}
 | 
						|
 | 
						|
function parse_rels(data/*:?string*/, currentFilePath/*:string*/) {
 | 
						|
	var rels = {"!id":{}};
 | 
						|
	if (!data) return rels;
 | 
						|
	if (currentFilePath.charAt(0) !== '/') {
 | 
						|
		currentFilePath = '/'+currentFilePath;
 | 
						|
	}
 | 
						|
	var hash = {};
 | 
						|
 | 
						|
	(data.match(tagregex)||[]).forEach(function(x) {
 | 
						|
		var y = parsexmltag(x);
 | 
						|
		/* 9.3.2.2 OPC_Relationships */
 | 
						|
		if (y[0] === '<Relationship') {
 | 
						|
			var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; if(y.TargetMode) rel.TargetMode = y.TargetMode;
 | 
						|
			var canonictarget = y.TargetMode === 'External' ? y.Target : resolve_path(y.Target, currentFilePath);
 | 
						|
			rels[canonictarget] = rel;
 | 
						|
			hash[y.Id] = rel;
 | 
						|
		}
 | 
						|
	});
 | 
						|
	rels["!id"] = hash;
 | 
						|
	return rels;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* TODO */
 | 
						|
function write_rels(rels)/*:string*/ {
 | 
						|
	var o = [XML_HEADER, writextag('Relationships', null, {
 | 
						|
		//'xmlns:ns0': XMLNS.RELS,
 | 
						|
		'xmlns': XMLNS.RELS
 | 
						|
	})];
 | 
						|
	keys(rels['!id']).forEach(function(rid) {
 | 
						|
		o[o.length] = (writextag('Relationship', null, rels['!id'][rid]));
 | 
						|
	});
 | 
						|
	if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace("/>",">"); }
 | 
						|
	return o.join("");
 | 
						|
}
 | 
						|
 | 
						|
function add_rels(rels, rId/*:number*/, f, type, relobj, targetmode/*:?string*/)/*:number*/ {
 | 
						|
	if(!relobj) relobj = {};
 | 
						|
	if(!rels['!id']) rels['!id'] = {};
 | 
						|
	if(!rels['!idx']) rels['!idx'] = 1;
 | 
						|
	if(rId < 0) for(rId = rels['!idx']; rels['!id']['rId' + rId]; ++rId){/* empty */}
 | 
						|
	rels['!idx'] = rId + 1;
 | 
						|
	relobj.Id = 'rId' + rId;
 | 
						|
	relobj.Type = type;
 | 
						|
	relobj.Target = f;
 | 
						|
	if(targetmode) relobj.TargetMode = targetmode;
 | 
						|
	else if([RELS.HLINK, RELS.XPATH, RELS.XMISS].indexOf(relobj.Type) > -1) relobj.TargetMode = "External";
 | 
						|
	if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId);
 | 
						|
	rels['!id'][relobj.Id] = relobj;
 | 
						|
	rels[('/' + relobj.Target).replace("//","/")] = relobj;
 | 
						|
	return rId;
 | 
						|
}
 |