@abasb75/dicom-parser 0.0.5-test → 0.0.20

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/Parser.js DELETED
@@ -1,223 +0,0 @@
1
- import Dataset from "./Dataset";
2
- import Tag from "./Tag";
3
- import Value from "./Value";
4
- import * as pako from "pako";
5
- class Parser {
6
- constructor(arrayBuffer) {
7
- Object.defineProperty(this, "arrayBuffer", {
8
- enumerable: true,
9
- configurable: true,
10
- writable: true,
11
- value: void 0
12
- });
13
- Object.defineProperty(this, "offset", {
14
- enumerable: true,
15
- configurable: true,
16
- writable: true,
17
- value: void 0
18
- });
19
- Object.defineProperty(this, "dataView", {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: void 0
24
- });
25
- Object.defineProperty(this, "tags", {
26
- enumerable: true,
27
- configurable: true,
28
- writable: true,
29
- value: {}
30
- });
31
- Object.defineProperty(this, "dataSet", {
32
- enumerable: true,
33
- configurable: true,
34
- writable: true,
35
- value: void 0
36
- });
37
- Object.defineProperty(this, "EXEPTED", {
38
- enumerable: true,
39
- configurable: true,
40
- writable: true,
41
- value: ["OB", "OW", "SQ", "UN"]
42
- });
43
- Object.defineProperty(this, "VRS", {
44
- enumerable: true,
45
- configurable: true,
46
- writable: true,
47
- value: ["AE", "AS", "AT", "CS", "DA", "DS", "DT", "FL", "FD", "IS", "LO", "LT", "OB", "OD", "OF", "OW", "PN", "SH", "SL", "SS", "ST", "TM", "UI", "UL", "UN", "US", "UT", "UC"]
48
- });
49
- Object.defineProperty(this, "IMPLICT_TRANSFER_SYNTAXES", {
50
- enumerable: true,
51
- configurable: true,
52
- writable: true,
53
- value: ["1.2.840.10008.1.2"]
54
- });
55
- Object.defineProperty(this, "BIG_ENDIAN_TRANSFER_SYNTAXES", {
56
- enumerable: true,
57
- configurable: true,
58
- writable: true,
59
- value: ["1.2.840.10008.1.2.2"]
60
- });
61
- Object.defineProperty(this, "DEFLATED_TRANSFER_SYNTAXES", {
62
- enumerable: true,
63
- configurable: true,
64
- writable: true,
65
- value: ["1.2.840.10008.1.2.1.99"]
66
- });
67
- Object.defineProperty(this, "littleEndian", {
68
- enumerable: true,
69
- configurable: true,
70
- writable: true,
71
- value: true
72
- });
73
- Object.defineProperty(this, "implicit", {
74
- enumerable: true,
75
- configurable: true,
76
- writable: true,
77
- value: false
78
- });
79
- Object.defineProperty(this, "transferSyntaxUID", {
80
- enumerable: true,
81
- configurable: true,
82
- writable: true,
83
- value: ""
84
- });
85
- // private UNDEFIENED_LEN:number = 0xffffffff;
86
- Object.defineProperty(this, "inflated", {
87
- enumerable: true,
88
- configurable: true,
89
- writable: true,
90
- value: false
91
- });
92
- Object.defineProperty(this, "concatArrayBuffers", {
93
- enumerable: true,
94
- configurable: true,
95
- writable: true,
96
- value: function (buffer1, buffer2) {
97
- var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
98
- tmp.set(new Uint8Array(buffer1), 0);
99
- tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
100
- return tmp.buffer;
101
- }
102
- });
103
- this.offset = 0;
104
- this.arrayBuffer = arrayBuffer;
105
- this.dataView = new DataView(arrayBuffer);
106
- if (this.arrayBuffer.byteLength < 132) {
107
- console.error("is not valid dicom file");
108
- return;
109
- }
110
- const prefix = Value.getString(new Uint8Array(arrayBuffer, 128, 4));
111
- if (prefix !== 'DICM') {
112
- console.error("is not valid dicom file");
113
- return;
114
- }
115
- this.offset = 132;
116
- this.parse();
117
- }
118
- parse() {
119
- this.getNextTag();
120
- this.dataSet = new Dataset(this.tags, this.dataView, this.littleEndian);
121
- console.log(this.dataSet);
122
- this.dataSet.transferSyntaxUID = this.transferSyntaxUID;
123
- return this.dataSet;
124
- }
125
- getDataset() {
126
- return this.dataSet;
127
- }
128
- getNextTag() {
129
- if (this.offset >= this.arrayBuffer.byteLength) {
130
- return;
131
- }
132
- const { group, element } = this.getNextGroupAndElement();
133
- if (!group && !element) {
134
- return;
135
- }
136
- if (group === 0xFFFE && (element === 0xE0DD || element === 0xE00D || element === 0xE000)) {
137
- this.offset += 4;
138
- return this.getNextTag();
139
- }
140
- if (!this.implicit && group !== 0x0002 && this.IMPLICT_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
141
- this.implicit = true;
142
- }
143
- if (this.littleEndian && group !== 0x0002 && this.BIG_ENDIAN_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
144
- this.littleEndian = false;
145
- }
146
- if (!this.inflated && group !== 0x0002 && this.DEFLATED_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
147
- this.offset -= 4;
148
- const meta = this.dataView.buffer.slice(0, this.offset);
149
- const body = this.dataView.buffer.slice(this.offset);
150
- const infaltedBody = pako.inflateRaw(body);
151
- this.arrayBuffer = this.concatArrayBuffers(meta, infaltedBody);
152
- this.dataView = new DataView(this.arrayBuffer);
153
- this.inflated = true;
154
- return this.getNextTag();
155
- }
156
- const vr = this.getNextVR(group, element);
157
- let len = 0;
158
- if (this.implicit) {
159
- len = this.dataView.getUint32(this.offset, this.littleEndian);
160
- this.offset += 4;
161
- }
162
- else if (this.EXEPTED.includes(vr)) {
163
- this.offset += 2; // skip 2 byte reserved
164
- len = this.dataView.getUint32(this.offset, this.littleEndian);
165
- this.offset += 4;
166
- }
167
- else if (this.VRS.includes(vr)) {
168
- len = this.dataView.getUint16(this.offset, this.littleEndian);
169
- this.offset += 2;
170
- }
171
- else if ((!vr || !vr.match(/^[A-Z]{2}$/)) && group === 0x0002 && element === 0x0000) {
172
- console.log("pyz");
173
- this.offset = 132;
174
- this.tags = {};
175
- this.implicit = true;
176
- return this.getNextTag();
177
- }
178
- else {
179
- console.log("ended", vr);
180
- return;
181
- }
182
- if (group === 0x0002 && element === 0x0010) {
183
- console.log("transfer syntax uid", this.transferSyntaxUID);
184
- this.transferSyntaxUID = (Value.getString(new Uint8Array(this.arrayBuffer, this.offset, len))).replace('\0', '');
185
- }
186
- const tag = new Tag(group, element, vr, len, this.offset);
187
- const key = tag.generateKey();
188
- this.tags[key] = tag;
189
- if (vr === "SQ") {
190
- this.getNextTag();
191
- }
192
- else {
193
- this.offset += len;
194
- this.getNextTag();
195
- }
196
- }
197
- getValue(len) {
198
- const value = this.arrayBuffer.slice(this.offset, len);
199
- this.offset += len;
200
- return value;
201
- }
202
- getNextGroupAndElement() {
203
- try {
204
- const group = this.dataView.getUint16(this.offset, this.littleEndian);
205
- this.offset += 2;
206
- const element = this.dataView.getUint16(this.offset, this.littleEndian);
207
- this.offset += 2;
208
- return { group, element };
209
- }
210
- catch (_a) {
211
- return { group: 0, element: 0 };
212
- }
213
- }
214
- getNextVR(groupInt, elementInt) {
215
- if (this.implicit) {
216
- return Tag.getTagVRFromDictionary(groupInt, elementInt) || "AA";
217
- }
218
- const vr = Value.getString(new Uint8Array(this.arrayBuffer, this.offset, 2));
219
- this.offset += 2;
220
- return vr;
221
- }
222
- }
223
- export default Parser;
package/Tag.d.ts DELETED
@@ -1,17 +0,0 @@
1
- declare class Tag {
2
- name: string;
3
- vr: string;
4
- group: number;
5
- element: number;
6
- value: unknown;
7
- valueLength: number;
8
- offset: number;
9
- constructor(group: number, element: number, vr: string, valueLength: number, offset: number, value?: ArrayBuffer, name?: string | null);
10
- generateKey(): string;
11
- static getTagNameFromDictionary(groupInt: number, elementInt: number): string;
12
- static getTagVRFromDictionary(group: number | string, element: number | string): string;
13
- static intTo4digitString(int: number): string;
14
- static int8digitString(int: number): string;
15
- getValue(): void;
16
- }
17
- export default Tag;
package/Tag.js DELETED
@@ -1,97 +0,0 @@
1
- import TagsDictionaryEnums from "./enums/TagsDictionary";
2
- class Tag {
3
- constructor(group, element, vr, valueLength, offset, value, name) {
4
- Object.defineProperty(this, "name", {
5
- enumerable: true,
6
- configurable: true,
7
- writable: true,
8
- value: void 0
9
- });
10
- Object.defineProperty(this, "vr", {
11
- enumerable: true,
12
- configurable: true,
13
- writable: true,
14
- value: void 0
15
- });
16
- Object.defineProperty(this, "group", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: void 0
21
- });
22
- Object.defineProperty(this, "element", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: void 0
27
- });
28
- Object.defineProperty(this, "value", {
29
- enumerable: true,
30
- configurable: true,
31
- writable: true,
32
- value: void 0
33
- });
34
- Object.defineProperty(this, "valueLength", {
35
- enumerable: true,
36
- configurable: true,
37
- writable: true,
38
- value: void 0
39
- });
40
- Object.defineProperty(this, "offset", {
41
- enumerable: true,
42
- configurable: true,
43
- writable: true,
44
- value: void 0
45
- });
46
- this.group = group;
47
- this.element = element;
48
- this.vr = vr;
49
- this.name = name || Tag.getTagNameFromDictionary(this.group, this.element) || '';
50
- this.value = value || undefined;
51
- this.valueLength = valueLength;
52
- this.offset = offset;
53
- if (this.name === '') {
54
- }
55
- }
56
- generateKey() {
57
- const group = Tag.intTo4digitString(this.group);
58
- const element = Tag.intTo4digitString(this.element);
59
- return `0x${group}${element}`;
60
- }
61
- static getTagNameFromDictionary(groupInt, elementInt) {
62
- const group = Tag.intTo4digitString(groupInt);
63
- const element = Tag.intTo4digitString(elementInt);
64
- const groupItems = TagsDictionaryEnums[group];
65
- if (!groupItems)
66
- return "";
67
- const elementItem = groupItems[element];
68
- if (!elementItem)
69
- return "";
70
- return elementItem[1];
71
- }
72
- static getTagVRFromDictionary(group, element) {
73
- let _group, _element;
74
- if (typeof group === "number") {
75
- _group = Tag.intTo4digitString(group);
76
- }
77
- if (typeof element === "number") {
78
- _element = Tag.intTo4digitString(element);
79
- }
80
- const groupItems = TagsDictionaryEnums[_group || group];
81
- if (!groupItems)
82
- return "";
83
- const elementItem = groupItems[_element || element];
84
- if (!elementItem)
85
- return "";
86
- return elementItem[0];
87
- }
88
- static intTo4digitString(int) {
89
- return ('0000' + int.toString(16).toUpperCase()).slice(-4);
90
- }
91
- static int8digitString(int) {
92
- return ('00000000' + int.toString(16).toUpperCase()).slice(-8);
93
- }
94
- getValue() {
95
- }
96
- }
97
- export default Tag;
package/Value.d.ts DELETED
@@ -1,11 +0,0 @@
1
- declare class Value {
2
- static byVr(dataView: DataView, offset: number, len: number, vr: string, littleEndian: boolean): string | number | (string | number)[] | undefined;
3
- static CS(dataView: DataView, offset: number, len: number): string | string[];
4
- static IS(dataView: DataView, offset: number, len: number): string | number;
5
- static DA(dataView: DataView, offset: number, len: number): string;
6
- static DS(dataView: DataView, offset: number, len: number): string | number | (string | number)[];
7
- static TM(dataView: DataView, offset: number, len: number): string;
8
- static getString(bytes: Uint8Array | Int8Array | ArrayBuffer): string;
9
- static US(dataView: DataView, offset: number, len: number, littleEndian?: boolean): number | undefined;
10
- }
11
- export default Value;
package/Value.js DELETED
@@ -1,94 +0,0 @@
1
- class Value {
2
- static byVr(dataView, offset, len, vr, littleEndian) {
3
- switch (vr) {
4
- case "CS":
5
- return Value.CS(dataView, offset, len);
6
- case "US":
7
- return Value.US(dataView, offset, len, littleEndian);
8
- case "IS":
9
- return Value.IS(dataView, offset, len);
10
- case "DS":
11
- return Value.DS(dataView, offset, len);
12
- case "DA":
13
- return Value.DA(dataView, offset, len);
14
- case "TM":
15
- return Value.TM(dataView, offset, len);
16
- case "UI":
17
- case "SH":
18
- case "LO":
19
- default:
20
- return Value.getString(new Uint8Array(dataView.buffer, offset, len));
21
- }
22
- }
23
- static CS(dataView, offset, len) {
24
- let value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
25
- const values = value.split("\\");
26
- if (values.length === 0) {
27
- return value;
28
- }
29
- else if (values.length === 1) {
30
- return values[0];
31
- }
32
- else {
33
- return values;
34
- }
35
- }
36
- static IS(dataView, offset, len) {
37
- const value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
38
- if (/^[0-9]+$/.exec(value)) {
39
- return parseInt(value);
40
- }
41
- return value;
42
- }
43
- static DA(dataView, offset, len) {
44
- const value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
45
- if (/^[0-9]{8}$/.exec(value)) {
46
- return `${value.slice(0, 4)}-${value.slice(4, 6)}-${value.slice(6, 8)}`;
47
- }
48
- return value;
49
- }
50
- static DS(dataView, offset, len) {
51
- let value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
52
- const values = value.split("\\").map(v => {
53
- if (/^[0-9]+$/.exec(v)) {
54
- return parseInt(v);
55
- }
56
- else if (/^[0-9]+\.[0-9]+$/.exec(v)) {
57
- return parseFloat(v);
58
- }
59
- return v;
60
- });
61
- if (values.length === 0) {
62
- return value;
63
- }
64
- else if (values.length === 1) {
65
- return values[0];
66
- }
67
- else {
68
- return values;
69
- }
70
- }
71
- static TM(dataView, offset, len) {
72
- let value = Value.getString(new Uint8Array(dataView.buffer, offset, len)).trim().split('.')[0];
73
- if (![2, 4, 6].includes(value.length)) {
74
- return value;
75
- }
76
- if (value.length === 4) {
77
- value += "00";
78
- }
79
- else if (value.length === 2) {
80
- value += "0000";
81
- }
82
- return `${value.slice(0, 2)}:${value.slice(2, 4)}:${value.slice(4, 6)}`;
83
- }
84
- static getString(bytes) {
85
- const decoder = new TextDecoder();
86
- return decoder.decode(bytes).trim();
87
- }
88
- static US(dataView, offset, len, littleEndian = true) {
89
- if (len === 2) {
90
- return dataView.getUint16(offset, littleEndian);
91
- }
92
- }
93
- }
94
- export default Value;
@@ -1,8 +0,0 @@
1
- interface TagsDictionaryEnumsType {
2
- [key: string]: {
3
- [key: string]: string[];
4
- };
5
- }
6
- declare const TagsDictionaryEnums: TagsDictionaryEnumsType;
7
- export default TagsDictionaryEnums;
8
- export type { TagsDictionaryEnumsType };