| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | /* 15.2.12.2 Custom File Properties Part */ | 
					
						
							|  |  |  | XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"; | 
					
						
							|  |  |  | RELS.CUST_PROPS  = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | var custregex = /<[^>]+>[^<]*/g; | 
					
						
							| 
									
										
										
										
											2017-02-10 19:23:01 +00:00
										 |  |  | function parse_cust_props(data/*:string*/, opts) { | 
					
						
							|  |  |  | 	var p = {}, name = ""; | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | 	var m = data.match(custregex); | 
					
						
							|  |  |  | 	if(m) for(var i = 0; i != m.length; ++i) { | 
					
						
							|  |  |  | 		var x = m[i], y = parsexmltag(x); | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 		switch(y[0]) { | 
					
						
							|  |  |  | 			case '<?xml': break; | 
					
						
							| 
									
										
										
										
											2017-02-19 20:36:32 +00:00
										 |  |  | 			case '<Properties': break; | 
					
						
							| 
									
										
										
										
											2019-11-27 09:47:16 +00:00
										 |  |  | 			case '<property': name = unescapexml(y.name); break; | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 			case '</property>': name = null; break; | 
					
						
							|  |  |  | 			default: if (x.indexOf('<vt:') === 0) { | 
					
						
							|  |  |  | 				var toks = x.split('>'); | 
					
						
							| 
									
										
										
										
											2018-01-11 08:01:25 +00:00
										 |  |  | 				var type = toks[0].slice(4), text = toks[1]; | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 				/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */ | 
					
						
							|  |  |  | 				switch(type) { | 
					
						
							| 
									
										
										
										
											2017-03-28 22:03:03 +00:00
										 |  |  | 					case 'lpstr': case 'bstr': case 'lpwstr': | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 						p[name] = unescapexml(text); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					case 'bool': | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | 						p[name] = parsexmlbool(text); | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 						break; | 
					
						
							|  |  |  | 					case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint': | 
					
						
							|  |  |  | 						p[name] = parseInt(text, 10); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					case 'r4': case 'r8': case 'decimal': | 
					
						
							|  |  |  | 						p[name] = parseFloat(text); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					case 'filetime': case 'date': | 
					
						
							| 
									
										
										
										
											2017-03-23 01:18:40 +00:00
										 |  |  | 						p[name] = parseDate(text); | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 						break; | 
					
						
							|  |  |  | 					case 'cy': case 'error': | 
					
						
							|  |  |  | 						p[name] = unescapexml(text); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					default: | 
					
						
							| 
									
										
										
										
											2017-07-26 08:35:28 +00:00
										 |  |  | 						if(type.slice(-1) == '/') break; | 
					
						
							| 
									
										
										
										
											2017-02-03 20:50:45 +00:00
										 |  |  | 						if(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks); | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-01-11 08:01:25 +00:00
										 |  |  | 			} else if(x.slice(0,2) === "</") {/* empty */ | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 			} else if(opts.WTF) throw new Error(x); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 	return p; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var CUST_PROPS_XML_ROOT = writextag('Properties', null, { | 
					
						
							|  |  |  | 	'xmlns': XMLNS.CUST_PROPS, | 
					
						
							|  |  |  | 	'xmlns:vt': XMLNS.vt | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-23 09:07:51 +00:00
										 |  |  | function write_cust_props(cp/*::, opts*/)/*:string*/ { | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | 	var o = [XML_HEADER, CUST_PROPS_XML_ROOT]; | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 	if(!cp) return o.join(""); | 
					
						
							|  |  |  | 	var pid = 1; | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | 	keys(cp).forEach(function custprop(k) { ++pid; | 
					
						
							|  |  |  | 		o[o.length] = (writextag('property', write_vt(cp[k]), { | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 			'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}', | 
					
						
							|  |  |  | 			'pid': pid, | 
					
						
							| 
									
										
										
										
											2019-11-27 09:47:16 +00:00
										 |  |  | 			'name': escapexml(k) | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 		})); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-06-29 18:29:45 +00:00
										 |  |  | 	if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace("/>",">"); } | 
					
						
							| 
									
										
										
										
											2014-05-16 00:33:34 +00:00
										 |  |  | 	return o.join(""); | 
					
						
							|  |  |  | } |