@onerjs/serializers 8.41.6 → 8.41.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3MF/3mfSerializer.configuration.d.ts +9 -0
- package/3MF/3mfSerializer.configuration.js +11 -0
- package/3MF/3mfSerializer.configuration.js.map +1 -0
- package/3MF/3mfSerializer.d.ts +132 -0
- package/3MF/3mfSerializer.js +328 -0
- package/3MF/3mfSerializer.js.map +1 -0
- package/3MF/core/index.d.ts +2 -0
- package/3MF/core/index.js +4 -0
- package/3MF/core/index.js.map +1 -0
- package/3MF/core/model/3mf.builder.d.ts +231 -0
- package/3MF/core/model/3mf.builder.js +403 -0
- package/3MF/core/model/3mf.builder.js.map +1 -0
- package/3MF/core/model/3mf.d.ts +329 -0
- package/3MF/core/model/3mf.interfaces.d.ts +321 -0
- package/3MF/core/model/3mf.interfaces.js +39 -0
- package/3MF/core/model/3mf.interfaces.js.map +1 -0
- package/3MF/core/model/3mf.js +377 -0
- package/3MF/core/model/3mf.js.map +1 -0
- package/3MF/core/model/3mf.opc.d.ts +66 -0
- package/3MF/core/model/3mf.opc.interfaces.d.ts +126 -0
- package/3MF/core/model/3mf.opc.interfaces.js +75 -0
- package/3MF/core/model/3mf.opc.interfaces.js.map +1 -0
- package/3MF/core/model/3mf.opc.js +91 -0
- package/3MF/core/model/3mf.opc.js.map +1 -0
- package/3MF/core/model/3mf.serializer.d.ts +118 -0
- package/3MF/core/model/3mf.serializer.js +171 -0
- package/3MF/core/model/3mf.serializer.js.map +1 -0
- package/3MF/core/model/3mf.types.d.ts +46 -0
- package/3MF/core/model/3mf.types.js +2 -0
- package/3MF/core/model/3mf.types.js.map +1 -0
- package/3MF/core/model/index.d.ts +7 -0
- package/3MF/core/model/index.js +8 -0
- package/3MF/core/model/index.js.map +1 -0
- package/3MF/core/xml/index.d.ts +6 -0
- package/3MF/core/xml/index.js +7 -0
- package/3MF/core/xml/index.js.map +1 -0
- package/3MF/core/xml/xml.builder.bytes.d.ts +33 -0
- package/3MF/core/xml/xml.builder.bytes.js +60 -0
- package/3MF/core/xml/xml.builder.bytes.js.map +1 -0
- package/3MF/core/xml/xml.builder.d.ts +94 -0
- package/3MF/core/xml/xml.builder.js +286 -0
- package/3MF/core/xml/xml.builder.js.map +1 -0
- package/3MF/core/xml/xml.builder.string.d.ts +19 -0
- package/3MF/core/xml/xml.builder.string.js +35 -0
- package/3MF/core/xml/xml.builder.string.js.map +1 -0
- package/3MF/core/xml/xml.interfaces.d.ts +91 -0
- package/3MF/core/xml/xml.interfaces.js +110 -0
- package/3MF/core/xml/xml.interfaces.js.map +1 -0
- package/3MF/core/xml/xml.serializer.d.ts +39 -0
- package/3MF/core/xml/xml.serializer.format.d.ts +92 -0
- package/3MF/core/xml/xml.serializer.format.js +122 -0
- package/3MF/core/xml/xml.serializer.format.js.map +1 -0
- package/3MF/core/xml/xml.serializer.js +261 -0
- package/3MF/core/xml/xml.serializer.js.map +1 -0
- package/3MF/index.d.ts +3 -0
- package/3MF/index.js +5 -0
- package/3MF/index.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/legacy/legacy-3mfSerializer.d.ts +1 -0
- package/legacy/legacy-3mfSerializer.js +20 -0
- package/legacy/legacy-3mfSerializer.js.map +1 -0
- package/legacy/legacy.d.ts +1 -0
- package/legacy/legacy.js +1 -0
- package/legacy/legacy.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** */
|
|
2
|
+
export class Utf8XmlWriterToBytes {
|
|
3
|
+
constructor(_sink, _opts = {}) {
|
|
4
|
+
this._sink = _sink;
|
|
5
|
+
this._opts = _opts;
|
|
6
|
+
/** */
|
|
7
|
+
this.count = 0;
|
|
8
|
+
this._encoder = new TextEncoder();
|
|
9
|
+
this._pending = "";
|
|
10
|
+
this._pendingChars = 0;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @param data
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
write(...data) {
|
|
17
|
+
if (data.length === 0) {
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
const s = data.join("");
|
|
21
|
+
if (s.length === 0) {
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
this._pending += s;
|
|
25
|
+
this._pendingChars += s.length;
|
|
26
|
+
const limit = this._opts.flushChars ?? 64 * 1024;
|
|
27
|
+
if (this._pendingChars >= limit) {
|
|
28
|
+
this.flush();
|
|
29
|
+
}
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
flush() {
|
|
36
|
+
if (this._pendingChars === 0) {
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
const bytes = this._encoder.encode(this._pending);
|
|
40
|
+
this._sink.push(bytes);
|
|
41
|
+
this.count += bytes.length;
|
|
42
|
+
this._pending = "";
|
|
43
|
+
this._pendingChars = 0;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
*/
|
|
48
|
+
finish() {
|
|
49
|
+
this.flush();
|
|
50
|
+
this._sink.push(new Uint8Array(0), true);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
*/
|
|
54
|
+
clear() {
|
|
55
|
+
this._pending = "";
|
|
56
|
+
this._pendingChars = 0;
|
|
57
|
+
this.count = 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=xml.builder.bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.builder.bytes.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.bytes.ts"],"names":[],"mappings":"AAOA,MAAM;AACN,MAAM,OAAO,oBAAoB;IAO7B,YACqB,KAAe,EACf,QAAiC,EAAE;QADnC,UAAK,GAAL,KAAK,CAAU;QACf,UAAK,GAAL,KAAK,CAA8B;QARxD,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,aAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC7B,aAAQ,GAAG,EAAE,CAAC;QACd,kBAAa,GAAG,CAAC,CAAC;IAKvB,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;OACG;IACH,MAAM;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport type ByteSink = {\r\n push(chunk: Uint8Array, final?: boolean): void;\r\n};\r\n\r\n/** */\r\nexport class Utf8XmlWriterToBytes implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _encoder = new TextEncoder();\r\n private _pending = \"\";\r\n private _pendingChars = 0;\r\n\r\n constructor(\r\n private readonly _sink: ByteSink,\r\n private readonly _opts: { flushChars?: number } = {}\r\n ) {}\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n const s = data.join(\"\");\r\n if (s.length === 0) {\r\n return this;\r\n }\r\n\r\n this._pending += s;\r\n this._pendingChars += s.length;\r\n\r\n const limit = this._opts.flushChars ?? 64 * 1024;\r\n if (this._pendingChars >= limit) {\r\n this.flush();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n flush(): this {\r\n if (this._pendingChars === 0) {\r\n return this;\r\n }\r\n\r\n const bytes = this._encoder.encode(this._pending);\r\n this._sink.push(bytes);\r\n this.count += bytes.length;\r\n\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n */\r\n finish(): void {\r\n this.flush();\r\n this._sink.push(new Uint8Array(0), true);\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n this.count = 0;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { IXmlBuilder } from "./xml.interfaces.js";
|
|
2
|
+
/**
|
|
3
|
+
*/
|
|
4
|
+
export interface IXmlWriter {
|
|
5
|
+
/**
|
|
6
|
+
* @param data
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
write(...data: string[]): IXmlWriter;
|
|
10
|
+
/** */
|
|
11
|
+
count: number;
|
|
12
|
+
/** */
|
|
13
|
+
clear(): void;
|
|
14
|
+
}
|
|
15
|
+
/** */
|
|
16
|
+
export declare enum TokenType {
|
|
17
|
+
Declaration = 0,
|
|
18
|
+
Tag = 1,
|
|
19
|
+
Attribute = 2,
|
|
20
|
+
Text = 3
|
|
21
|
+
}
|
|
22
|
+
/** */
|
|
23
|
+
export declare class XmlBuilder implements IXmlBuilder {
|
|
24
|
+
/** */
|
|
25
|
+
static Context: {
|
|
26
|
+
new (name: string, depth: number): {
|
|
27
|
+
/** */
|
|
28
|
+
name: string;
|
|
29
|
+
/** */
|
|
30
|
+
closed: boolean;
|
|
31
|
+
/** */
|
|
32
|
+
lastToken: TokenType | null;
|
|
33
|
+
/** */
|
|
34
|
+
depth: number;
|
|
35
|
+
ns2prefix: Map<string, string>;
|
|
36
|
+
prefix2ns: Map<string, string>;
|
|
37
|
+
defaultNs: string | null;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/** */
|
|
41
|
+
private _w;
|
|
42
|
+
/** */
|
|
43
|
+
private _ctxStack;
|
|
44
|
+
/** */
|
|
45
|
+
private _d;
|
|
46
|
+
constructor(w: IXmlWriter);
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
* @param version
|
|
50
|
+
* @param encoding
|
|
51
|
+
* @param standalone
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @param ns
|
|
58
|
+
* @param n
|
|
59
|
+
* @param v
|
|
60
|
+
* @returns
|
|
61
|
+
*/
|
|
62
|
+
att(ns: string | null, n: string, v: string): IXmlBuilder;
|
|
63
|
+
/**
|
|
64
|
+
*
|
|
65
|
+
* @param ns
|
|
66
|
+
* @param n
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
ele(ns: string | null, n: string): IXmlBuilder;
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
* @param txt
|
|
73
|
+
* @returns
|
|
74
|
+
*/
|
|
75
|
+
text(txt: string): IXmlBuilder;
|
|
76
|
+
/**
|
|
77
|
+
*
|
|
78
|
+
* @returns
|
|
79
|
+
*/
|
|
80
|
+
end(): IXmlBuilder;
|
|
81
|
+
protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context>;
|
|
82
|
+
protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined;
|
|
83
|
+
protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined;
|
|
84
|
+
protected get _contextDepth(): number;
|
|
85
|
+
private _writeAttStr;
|
|
86
|
+
private _lookupPrefix;
|
|
87
|
+
private _escText;
|
|
88
|
+
private _escAttr;
|
|
89
|
+
private _isXmlnsDecl;
|
|
90
|
+
private _registerNamespace;
|
|
91
|
+
private _allocPrefix;
|
|
92
|
+
private _ensurePrefixDeclared;
|
|
93
|
+
private _closeOpenTagIfNeeded;
|
|
94
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/** */
|
|
2
|
+
class XmlSyntax {
|
|
3
|
+
}
|
|
4
|
+
/** */
|
|
5
|
+
XmlSyntax.OpenTag = "<";
|
|
6
|
+
/** */
|
|
7
|
+
XmlSyntax.CloseTag = ">";
|
|
8
|
+
/** */
|
|
9
|
+
XmlSyntax.Slash = "/";
|
|
10
|
+
/** */
|
|
11
|
+
XmlSyntax.Question = "?";
|
|
12
|
+
/** */
|
|
13
|
+
XmlSyntax.Quote = '"';
|
|
14
|
+
/** */
|
|
15
|
+
XmlSyntax.Equal = "=";
|
|
16
|
+
/** */
|
|
17
|
+
XmlSyntax.Space = " ";
|
|
18
|
+
/** */
|
|
19
|
+
XmlSyntax.Semicolon = ":";
|
|
20
|
+
/** */
|
|
21
|
+
XmlSyntax.Dec = "<?xml";
|
|
22
|
+
/** */
|
|
23
|
+
XmlSyntax.Xml = "xml";
|
|
24
|
+
/** */
|
|
25
|
+
XmlSyntax.Xmlns = "xmlns";
|
|
26
|
+
/** */
|
|
27
|
+
XmlSyntax.Xsi = "xsi";
|
|
28
|
+
/** */
|
|
29
|
+
XmlSyntax.VersionKeyword = "version";
|
|
30
|
+
/** */
|
|
31
|
+
XmlSyntax.EncodingKeyword = "encoding";
|
|
32
|
+
/** */
|
|
33
|
+
XmlSyntax.StandaloneKeyword = "standalone";
|
|
34
|
+
/** */
|
|
35
|
+
export var TokenType;
|
|
36
|
+
(function (TokenType) {
|
|
37
|
+
TokenType[TokenType["Declaration"] = 0] = "Declaration";
|
|
38
|
+
TokenType[TokenType["Tag"] = 1] = "Tag";
|
|
39
|
+
TokenType[TokenType["Attribute"] = 2] = "Attribute";
|
|
40
|
+
TokenType[TokenType["Text"] = 3] = "Text";
|
|
41
|
+
})(TokenType || (TokenType = {}));
|
|
42
|
+
/** */
|
|
43
|
+
export class XmlBuilder {
|
|
44
|
+
constructor(w) {
|
|
45
|
+
/** */
|
|
46
|
+
this._ctxStack = [];
|
|
47
|
+
/** */
|
|
48
|
+
this._d = 0;
|
|
49
|
+
this._w = w;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
*
|
|
53
|
+
* @param version
|
|
54
|
+
* @param encoding
|
|
55
|
+
* @param standalone
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
58
|
+
dec(version, encoding, standalone) {
|
|
59
|
+
this._w.write(XmlSyntax.Dec);
|
|
60
|
+
this._writeAttStr(XmlSyntax.VersionKeyword, version);
|
|
61
|
+
if (encoding) {
|
|
62
|
+
this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);
|
|
63
|
+
}
|
|
64
|
+
if (standalone !== undefined) {
|
|
65
|
+
this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? "yes" : "no");
|
|
66
|
+
}
|
|
67
|
+
this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
* @param ns
|
|
73
|
+
* @param n
|
|
74
|
+
* @param v
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
att(ns, n, v) {
|
|
78
|
+
const ctx = this._peekContext();
|
|
79
|
+
if (!ctx) {
|
|
80
|
+
throw new Error("att() without open element");
|
|
81
|
+
}
|
|
82
|
+
if (ctx.closed) {
|
|
83
|
+
throw new Error(`att() after start tag closed for <${ctx.name}>`);
|
|
84
|
+
}
|
|
85
|
+
// explicit namespace declaration: xmlns or xmlns:prefix
|
|
86
|
+
if (this._isXmlnsDecl(ns, n)) {
|
|
87
|
+
if (n === XmlSyntax.Xmlns) {
|
|
88
|
+
// default namespace
|
|
89
|
+
ctx.defaultNs = v;
|
|
90
|
+
// you can store default as empty prefix if you want
|
|
91
|
+
this._registerNamespace(ctx, "", v);
|
|
92
|
+
this._writeAttStr(XmlSyntax.Xmlns, v);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
if (!ns) {
|
|
96
|
+
const prefix = n.slice(6); // "xmlns:"
|
|
97
|
+
this._registerNamespace(ctx, prefix, v);
|
|
98
|
+
this._writeAttStr(n, v);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this._registerNamespace(ctx, n, v);
|
|
102
|
+
this._writeAttStr(`${ns}:${n}`, v);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
ctx.lastToken = TokenType.Attribute;
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
// normal attribute
|
|
109
|
+
let qn = n;
|
|
110
|
+
if (ns) {
|
|
111
|
+
// treat ns as a namespace URI, not a prefix
|
|
112
|
+
const p = this._ensurePrefixDeclared(ctx, ns);
|
|
113
|
+
qn = `${p}:${n}`;
|
|
114
|
+
}
|
|
115
|
+
ctx.lastToken = TokenType.Attribute;
|
|
116
|
+
this._writeAttStr(qn, v);
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
*
|
|
121
|
+
* @param ns
|
|
122
|
+
* @param n
|
|
123
|
+
* @returns
|
|
124
|
+
*/
|
|
125
|
+
ele(ns, n) {
|
|
126
|
+
let ctx = this._peekContext();
|
|
127
|
+
if (ctx) {
|
|
128
|
+
this._closeOpenTagIfNeeded(ctx);
|
|
129
|
+
}
|
|
130
|
+
let qns = n;
|
|
131
|
+
if (ns) {
|
|
132
|
+
const p = this._lookupPrefix(ns) ?? ns;
|
|
133
|
+
qns = `${p}:${n}`;
|
|
134
|
+
}
|
|
135
|
+
ctx = this._pushContext(qns, ++this._d);
|
|
136
|
+
this._w.write(XmlSyntax.OpenTag, qns);
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
* @param txt
|
|
142
|
+
* @returns
|
|
143
|
+
*/
|
|
144
|
+
text(txt) {
|
|
145
|
+
const ctx = this._peekContext();
|
|
146
|
+
if (!ctx) {
|
|
147
|
+
throw new Error("text() without open element");
|
|
148
|
+
}
|
|
149
|
+
this._closeOpenTagIfNeeded(ctx);
|
|
150
|
+
ctx.lastToken = TokenType.Text;
|
|
151
|
+
this._w.write(this._escText(txt));
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
*
|
|
156
|
+
* @returns
|
|
157
|
+
*/
|
|
158
|
+
end() {
|
|
159
|
+
const ctx = this._popContext();
|
|
160
|
+
if (ctx) {
|
|
161
|
+
this._d--;
|
|
162
|
+
if (!ctx.closed) {
|
|
163
|
+
this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
_pushContext(name, depth) {
|
|
172
|
+
const ctx = new XmlBuilder.Context(name, depth);
|
|
173
|
+
this._ctxStack.push(ctx);
|
|
174
|
+
return ctx;
|
|
175
|
+
}
|
|
176
|
+
_popContext() {
|
|
177
|
+
return this._ctxStack.pop();
|
|
178
|
+
}
|
|
179
|
+
_peekContext() {
|
|
180
|
+
return this._ctxStack[this._ctxStack.length - 1];
|
|
181
|
+
}
|
|
182
|
+
get _contextDepth() {
|
|
183
|
+
return this._ctxStack.length;
|
|
184
|
+
}
|
|
185
|
+
_writeAttStr(name, value) {
|
|
186
|
+
this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);
|
|
187
|
+
}
|
|
188
|
+
_lookupPrefix(ns) {
|
|
189
|
+
let i = this._ctxStack.length - 1;
|
|
190
|
+
if (i >= 0) {
|
|
191
|
+
do {
|
|
192
|
+
const ctx = this._ctxStack[i--];
|
|
193
|
+
const p = ctx.ns2prefix?.get(ns);
|
|
194
|
+
if (p) {
|
|
195
|
+
return p;
|
|
196
|
+
}
|
|
197
|
+
} while (i >= 0);
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
_escText(s) {
|
|
202
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
203
|
+
}
|
|
204
|
+
_escAttr(s) {
|
|
205
|
+
return this._escText(s).replace(/"/g, """).replace(/'/g, "'");
|
|
206
|
+
}
|
|
207
|
+
_isXmlnsDecl(ns, n) {
|
|
208
|
+
if (ns) {
|
|
209
|
+
return ns === XmlSyntax.Xmlns;
|
|
210
|
+
}
|
|
211
|
+
const l = n.length;
|
|
212
|
+
const s = XmlSyntax.Xmlns.length;
|
|
213
|
+
if (l >= s) {
|
|
214
|
+
return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);
|
|
215
|
+
}
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
_registerNamespace(ctx, prefix, uri) {
|
|
219
|
+
if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {
|
|
220
|
+
throw new Error(`reserved prefix '${prefix}'`);
|
|
221
|
+
}
|
|
222
|
+
const existingUri = ctx.prefix2ns.get(prefix);
|
|
223
|
+
if (existingUri && existingUri !== uri) {
|
|
224
|
+
throw new Error(`prefix '${prefix}' already bound to a different namespace`);
|
|
225
|
+
}
|
|
226
|
+
const existingPrefix = ctx.ns2prefix.get(uri);
|
|
227
|
+
if (!existingPrefix) {
|
|
228
|
+
ctx.ns2prefix.set(uri, prefix);
|
|
229
|
+
}
|
|
230
|
+
ctx.prefix2ns.set(prefix, uri);
|
|
231
|
+
}
|
|
232
|
+
_allocPrefix(ctx) {
|
|
233
|
+
let i = 1;
|
|
234
|
+
while (true) {
|
|
235
|
+
const p = `ns${i++}`;
|
|
236
|
+
if (!ctx.prefix2ns.has(p)) {
|
|
237
|
+
return p;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
_ensurePrefixDeclared(ctx, uri) {
|
|
242
|
+
const existing = this._lookupPrefix(uri);
|
|
243
|
+
if (existing) {
|
|
244
|
+
return existing;
|
|
245
|
+
}
|
|
246
|
+
if (ctx.closed) {
|
|
247
|
+
throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);
|
|
248
|
+
}
|
|
249
|
+
const prefix = this._allocPrefix(ctx);
|
|
250
|
+
// write xmlns:prefix="uri" and register it
|
|
251
|
+
this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);
|
|
252
|
+
this._registerNamespace(ctx, prefix, uri);
|
|
253
|
+
return prefix;
|
|
254
|
+
}
|
|
255
|
+
_closeOpenTagIfNeeded(ctx) {
|
|
256
|
+
if (!ctx.closed) {
|
|
257
|
+
this._w.write(XmlSyntax.CloseTag);
|
|
258
|
+
ctx.closed = true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/** */
|
|
263
|
+
XmlBuilder.Context = class {
|
|
264
|
+
/**
|
|
265
|
+
*
|
|
266
|
+
*@param name
|
|
267
|
+
*@param depth
|
|
268
|
+
*/
|
|
269
|
+
constructor(name, depth) {
|
|
270
|
+
/** */
|
|
271
|
+
this.name = "";
|
|
272
|
+
/** */
|
|
273
|
+
this.closed = false;
|
|
274
|
+
/** */
|
|
275
|
+
this.lastToken = null;
|
|
276
|
+
// uri -> prefix
|
|
277
|
+
this.ns2prefix = new Map();
|
|
278
|
+
// prefix -> uri (for conflict checks)
|
|
279
|
+
this.prefix2ns = new Map();
|
|
280
|
+
// optional: default namespace uri
|
|
281
|
+
this.defaultNs = null;
|
|
282
|
+
this.name = name;
|
|
283
|
+
this.depth = depth;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
//# sourceMappingURL=xml.builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IXmlBuilder } from \"./xml.interfaces\";\r\n\r\n/**\r\n */\r\nexport interface IXmlWriter {\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter;\r\n /** */\r\n count: number;\r\n /** */\r\n clear(): void;\r\n}\r\n\r\n/** */\r\nclass XmlSyntax {\r\n /** */\r\n public static OpenTag: string = \"<\";\r\n /** */\r\n public static CloseTag: string = \">\";\r\n /** */\r\n public static Slash: string = \"/\";\r\n /** */\r\n public static Question: string = \"?\";\r\n /** */\r\n public static Quote: string = '\"';\r\n /** */\r\n public static Equal: string = \"=\";\r\n /** */\r\n public static Space: string = \" \";\r\n /** */\r\n public static Semicolon: string = \":\";\r\n\r\n /** */\r\n public static Dec = \"<?xml\";\r\n /** */\r\n public static Xml = \"xml\";\r\n /** */\r\n public static Xmlns = \"xmlns\";\r\n /** */\r\n public static Xsi = \"xsi\";\r\n\r\n /** */\r\n public static VersionKeyword = \"version\";\r\n /** */\r\n public static EncodingKeyword = \"encoding\";\r\n /** */\r\n public static StandaloneKeyword = \"standalone\";\r\n}\r\n\r\n/** */\r\nexport enum TokenType {\r\n Declaration,\r\n Tag,\r\n Attribute,\r\n Text,\r\n}\r\n\r\n/** */\r\nexport class XmlBuilder implements IXmlBuilder {\r\n /** */\r\n static Context = class {\r\n /** */\r\n name: string = \"\";\r\n /** */\r\n closed: boolean = false;\r\n /** */\r\n lastToken: TokenType | null = null;\r\n /** */\r\n depth: number;\r\n\r\n // uri -> prefix\r\n ns2prefix: Map<string, string> = new Map();\r\n\r\n // prefix -> uri (for conflict checks)\r\n prefix2ns: Map<string, string> = new Map();\r\n\r\n // optional: default namespace uri\r\n defaultNs: string | null = null;\r\n\r\n /**\r\n *\r\n *@param name\r\n *@param depth\r\n */\r\n constructor(name: string, depth: number) {\r\n this.name = name;\r\n this.depth = depth;\r\n }\r\n };\r\n\r\n /** */\r\n private _w: IXmlWriter;\r\n /** */\r\n private _ctxStack: Array<InstanceType<typeof XmlBuilder.Context>> = [];\r\n /** */\r\n private _d: number = 0;\r\n\r\n public constructor(w: IXmlWriter) {\r\n this._w = w;\r\n }\r\n\r\n /**\r\n *\r\n * @param version\r\n * @param encoding\r\n * @param standalone\r\n * @returns\r\n */\r\n public dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder {\r\n this._w.write(XmlSyntax.Dec);\r\n this._writeAttStr(XmlSyntax.VersionKeyword, version);\r\n if (encoding) {\r\n this._writeAttStr(XmlSyntax.EncodingKeyword, encoding);\r\n }\r\n if (standalone !== undefined) {\r\n this._writeAttStr(XmlSyntax.StandaloneKeyword, standalone ? \"yes\" : \"no\");\r\n }\r\n this._w.write(XmlSyntax.Question, XmlSyntax.CloseTag);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @param v\r\n * @returns\r\n */\r\n public att(ns: string | null, n: string, v: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"att() without open element\");\r\n }\r\n if (ctx.closed) {\r\n throw new Error(`att() after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n // explicit namespace declaration: xmlns or xmlns:prefix\r\n if (this._isXmlnsDecl(ns, n)) {\r\n if (n === XmlSyntax.Xmlns) {\r\n // default namespace\r\n ctx.defaultNs = v;\r\n // you can store default as empty prefix if you want\r\n this._registerNamespace(ctx, \"\", v);\r\n this._writeAttStr(XmlSyntax.Xmlns, v);\r\n } else {\r\n if (!ns) {\r\n const prefix = n.slice(6); // \"xmlns:\"\r\n this._registerNamespace(ctx, prefix, v);\r\n this._writeAttStr(n, v);\r\n } else {\r\n this._registerNamespace(ctx, n, v);\r\n this._writeAttStr(`${ns}:${n}`, v);\r\n }\r\n }\r\n ctx.lastToken = TokenType.Attribute;\r\n return this;\r\n }\r\n\r\n // normal attribute\r\n let qn = n;\r\n\r\n if (ns) {\r\n // treat ns as a namespace URI, not a prefix\r\n const p = this._ensurePrefixDeclared(ctx, ns);\r\n qn = `${p}:${n}`;\r\n }\r\n\r\n ctx.lastToken = TokenType.Attribute;\r\n this._writeAttStr(qn, v);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param ns\r\n * @param n\r\n * @returns\r\n */\r\n public ele(ns: string | null, n: string): IXmlBuilder {\r\n let ctx = this._peekContext();\r\n if (ctx) {\r\n this._closeOpenTagIfNeeded(ctx);\r\n }\r\n let qns = n;\r\n if (ns) {\r\n const p = this._lookupPrefix(ns) ?? ns;\r\n qns = `${p}:${n}`;\r\n }\r\n ctx = this._pushContext(qns, ++this._d);\r\n this._w.write(XmlSyntax.OpenTag, qns);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param txt\r\n * @returns\r\n */\r\n public text(txt: string): IXmlBuilder {\r\n const ctx = this._peekContext();\r\n if (!ctx) {\r\n throw new Error(\"text() without open element\");\r\n }\r\n this._closeOpenTagIfNeeded(ctx);\r\n ctx.lastToken = TokenType.Text;\r\n this._w.write(this._escText(txt));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public end(): IXmlBuilder {\r\n const ctx = this._popContext();\r\n if (ctx) {\r\n this._d--;\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.Slash, XmlSyntax.CloseTag);\r\n } else {\r\n this._w.write(XmlSyntax.OpenTag, XmlSyntax.Slash, ctx.name, XmlSyntax.CloseTag);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n protected _pushContext(name: string, depth: number): InstanceType<typeof XmlBuilder.Context> {\r\n const ctx = new XmlBuilder.Context(name, depth);\r\n this._ctxStack.push(ctx);\r\n return ctx;\r\n }\r\n\r\n protected _popContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack.pop();\r\n }\r\n\r\n protected _peekContext(): InstanceType<typeof XmlBuilder.Context> | undefined {\r\n return this._ctxStack[this._ctxStack.length - 1];\r\n }\r\n\r\n protected get _contextDepth(): number {\r\n return this._ctxStack.length;\r\n }\r\n\r\n private _writeAttStr(name: string, value: string) {\r\n this._w.write(XmlSyntax.Space, name, XmlSyntax.Equal, XmlSyntax.Quote, this._escAttr(value), XmlSyntax.Quote);\r\n }\r\n\r\n private _lookupPrefix(ns: string): string | undefined {\r\n let i = this._ctxStack.length - 1;\r\n if (i >= 0) {\r\n do {\r\n const ctx = this._ctxStack[i--];\r\n const p = ctx.ns2prefix?.get(ns);\r\n if (p) {\r\n return p;\r\n }\r\n } while (i >= 0);\r\n }\r\n return undefined;\r\n }\r\n\r\n private _escText(s: string): string {\r\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\r\n }\r\n\r\n private _escAttr(s: string): string {\r\n return this._escText(s).replace(/\"/g, \""\").replace(/'/g, \"'\");\r\n }\r\n\r\n private _isXmlnsDecl(ns: string | null, n: string): boolean {\r\n if (ns) {\r\n return ns === XmlSyntax.Xmlns;\r\n }\r\n const l = n.length;\r\n const s = XmlSyntax.Xmlns.length;\r\n if (l >= s) {\r\n return n.startsWith(XmlSyntax.Xmlns) && (n.length == s || n[s] == XmlSyntax.Semicolon);\r\n }\r\n return false;\r\n }\r\n\r\n private _registerNamespace(ctx: InstanceType<typeof XmlBuilder.Context>, prefix: string, uri: string) {\r\n if (prefix === XmlSyntax.Xml || prefix === XmlSyntax.Xmlns) {\r\n throw new Error(`reserved prefix '${prefix}'`);\r\n }\r\n\r\n const existingUri = ctx.prefix2ns.get(prefix);\r\n if (existingUri && existingUri !== uri) {\r\n throw new Error(`prefix '${prefix}' already bound to a different namespace`);\r\n }\r\n\r\n const existingPrefix = ctx.ns2prefix.get(uri);\r\n if (!existingPrefix) {\r\n ctx.ns2prefix.set(uri, prefix);\r\n }\r\n\r\n ctx.prefix2ns.set(prefix, uri);\r\n }\r\n\r\n private _allocPrefix(ctx: InstanceType<typeof XmlBuilder.Context>): string {\r\n let i = 1;\r\n while (true) {\r\n const p = `ns${i++}`;\r\n if (!ctx.prefix2ns.has(p)) {\r\n return p;\r\n }\r\n }\r\n }\r\n\r\n private _ensurePrefixDeclared(ctx: InstanceType<typeof XmlBuilder.Context>, uri: string): string {\r\n const existing = this._lookupPrefix(uri);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n if (ctx.closed) {\r\n throw new Error(`can not declare namespace after start tag closed for <${ctx.name}>`);\r\n }\r\n\r\n const prefix = this._allocPrefix(ctx);\r\n\r\n // write xmlns:prefix=\"uri\" and register it\r\n this._writeAttStr(`${XmlSyntax.Xmlns}:${prefix}`, uri);\r\n this._registerNamespace(ctx, prefix, uri);\r\n\r\n return prefix;\r\n }\r\n\r\n private _closeOpenTagIfNeeded(ctx: InstanceType<typeof XmlBuilder.Context>) {\r\n if (!ctx.closed) {\r\n this._w.write(XmlSyntax.CloseTag);\r\n ctx.closed = true;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IXmlWriter } from "./xml.builder.js";
|
|
2
|
+
/** */
|
|
3
|
+
export declare class StringXmlWriter implements IXmlWriter {
|
|
4
|
+
/** */
|
|
5
|
+
count: number;
|
|
6
|
+
private _chunks;
|
|
7
|
+
/**
|
|
8
|
+
* @param data
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
write(...data: string[]): IXmlWriter;
|
|
12
|
+
/**
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
toString(): string;
|
|
16
|
+
/**
|
|
17
|
+
*/
|
|
18
|
+
clear(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** */
|
|
2
|
+
export class StringXmlWriter {
|
|
3
|
+
constructor() {
|
|
4
|
+
/** */
|
|
5
|
+
this.count = 0;
|
|
6
|
+
this._chunks = [];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @param data
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
write(...data) {
|
|
13
|
+
if (data.length === 0) {
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
// join once per call, keeps DOM out, very fast
|
|
17
|
+
const s = data.join("");
|
|
18
|
+
this._chunks.push(s);
|
|
19
|
+
this.count += s.length;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
25
|
+
toString() {
|
|
26
|
+
return this._chunks.join("");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
*/
|
|
30
|
+
clear() {
|
|
31
|
+
this._chunks = [];
|
|
32
|
+
this.count = 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=xml.builder.string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.builder.string.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.string.ts"],"names":[],"mappings":"AAEA,MAAM;AACN,MAAM,OAAO,eAAe;IAA5B;QACI,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,YAAO,GAAa,EAAE,CAAC;IA+BnC,CAAC;IA7BG;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,+CAA+C;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport class StringXmlWriter implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _chunks: string[] = [];\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n // join once per call, keeps DOM out, very fast\r\n const s = data.join(\"\");\r\n this._chunks.push(s);\r\n this.count += s.length;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n toString(): string {\r\n return this._chunks.join(\"\");\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._chunks = [];\r\n this.count = 0;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { IXmlSerializerFormatOptions } from "./xml.serializer.format.js";
|
|
2
|
+
/** */
|
|
3
|
+
export interface IQualifiedName {
|
|
4
|
+
/** */
|
|
5
|
+
ns?: string;
|
|
6
|
+
/** */
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
/** */
|
|
10
|
+
export interface IXmlBuilder {
|
|
11
|
+
dec(version: string, encoding?: string, standalone?: boolean): IXmlBuilder;
|
|
12
|
+
att(ns: string | null, n: string, v: string): IXmlBuilder;
|
|
13
|
+
ele(ns: string | null, n: string): IXmlBuilder;
|
|
14
|
+
text(txt: string): IXmlBuilder;
|
|
15
|
+
end(): IXmlBuilder;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @param x
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export declare function IsQualifiedName(x: unknown): x is {
|
|
22
|
+
name: string;
|
|
23
|
+
};
|
|
24
|
+
export type XmlName = string | IQualifiedName;
|
|
25
|
+
type FieldKind = "attr" | "elem" | "none";
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
export interface IFormatter<T = any> {
|
|
30
|
+
toString(value: T): string;
|
|
31
|
+
}
|
|
32
|
+
export type FormatterCtor<T> = new (args: IXmlSerializerFormatOptions) => IFormatter<T>;
|
|
33
|
+
type FieldMeta = {
|
|
34
|
+
kind: FieldKind;
|
|
35
|
+
prop: string;
|
|
36
|
+
name?: XmlName;
|
|
37
|
+
ignore?: boolean;
|
|
38
|
+
formatter?: FormatterCtor<any>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* @param name
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
export declare function XmlName(name: XmlName): (ctor: Function) => void;
|
|
45
|
+
/**
|
|
46
|
+
* tell the serializer to ignore the property
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
export declare function XmlIgnore(): (target: any, prop: string) => void;
|
|
50
|
+
/**
|
|
51
|
+
* tell the serializer to serialize the property as attribute
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
export declare function XmlAttr(opts?: {
|
|
55
|
+
name: XmlName;
|
|
56
|
+
formatter?: FormatterCtor<any>;
|
|
57
|
+
}): (target: any, prop: string) => void;
|
|
58
|
+
/**
|
|
59
|
+
* tell the serializer to serialize the property as element - this is the default behavior but shoud be
|
|
60
|
+
* specified when wanted to update the default name of the classe or if the class is not decorated (without \@XmlName)
|
|
61
|
+
* @returns
|
|
62
|
+
*/
|
|
63
|
+
export declare function XmlElem(opts?: {
|
|
64
|
+
name: XmlName;
|
|
65
|
+
}): (target: any, prop: string) => void;
|
|
66
|
+
/**
|
|
67
|
+
*
|
|
68
|
+
* @param obj
|
|
69
|
+
* @returns
|
|
70
|
+
*/
|
|
71
|
+
export declare function GetXmlFieldMeta(obj: any): FieldMeta[];
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
* @param obj
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
export declare function GetXmlName(obj: any): XmlName | undefined;
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
* @param qn
|
|
81
|
+
* @returns
|
|
82
|
+
*/
|
|
83
|
+
export declare function XmlNameToParts(qn: XmlName): IQualifiedName;
|
|
84
|
+
/**
|
|
85
|
+
*
|
|
86
|
+
* @param name
|
|
87
|
+
* @param prefix
|
|
88
|
+
* @returns
|
|
89
|
+
*/
|
|
90
|
+
export declare function ToQualifiedString(name: string, prefix?: string): string;
|
|
91
|
+
export {};
|