@ifc-lite/encoding 1.14.3 → 1.14.4

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.
@@ -5,7 +5,16 @@
5
5
  * - \X4\XXXXXXXX\X0\ - Unicode 4-byte hex for chars outside BMP
6
6
  * - \X\XX\ - ISO-8859-1 hex encoding
7
7
  * - \S\X - Extended ASCII with escape
8
- * - \P..\ - Code page switches (stripped)
8
+ * - \P..\ - Code page switches (supported as directives and removed)
9
9
  */
10
10
  export declare function decodeIfcString(str: string): string;
11
+ /**
12
+ * Encode a Unicode string to IFC STEP string escapes.
13
+ *
14
+ * - Printable ASCII (32..126) is kept as-is.
15
+ * - 8-bit values are encoded as \X\HH.
16
+ * - BMP values are encoded as \X2\HHHH\X0\.
17
+ * - Non-BMP values are encoded as \X4\HHHHHHHH\X0\.
18
+ */
19
+ export declare function encodeIfcString(str: string): string;
11
20
  //# sourceMappingURL=ifc-string.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-string.d.ts","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4CnD"}
1
+ {"version":3,"file":"ifc-string.d.ts","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA6BnD"}
@@ -8,45 +8,104 @@
8
8
  * - \X4\XXXXXXXX\X0\ - Unicode 4-byte hex for chars outside BMP
9
9
  * - \X\XX\ - ISO-8859-1 hex encoding
10
10
  * - \S\X - Extended ASCII with escape
11
- * - \P..\ - Code page switches (stripped)
11
+ * - \P..\ - Code page switches (supported as directives and removed)
12
12
  */
13
13
  export function decodeIfcString(str) {
14
14
  if (!str || typeof str !== 'string')
15
15
  return str;
16
- let result = str;
17
- // Decode \X2\XXXX\X0\ patterns (Unicode 2-byte hex, can have multiple chars)
18
- result = result.replace(/\\X2\\([0-9A-Fa-f]+)\\X0\\/g, (_, hex) => {
19
- let decoded = '';
20
- for (let i = 0; i < hex.length; i += 4) {
21
- const charCode = parseInt(hex.substring(i, i + 4), 16);
22
- if (!isNaN(charCode)) {
23
- decoded += String.fromCharCode(charCode);
16
+ let result = '';
17
+ let i = 0;
18
+ while (i < str.length) {
19
+ if (str[i] !== '\\') {
20
+ result += str[i];
21
+ i += 1;
22
+ continue;
23
+ }
24
+ // Handle code page directives like \PA\, \PB\, ... by consuming them.
25
+ if (str[i + 1] === 'P' && str[i + 3] === '\\') {
26
+ i += 4;
27
+ continue;
28
+ }
29
+ // Handle \S\X where byte value is ord(X) + 128 in ISO-8859-1.
30
+ if (str[i + 1] === 'S' && str[i + 2] === '\\' && i + 3 < str.length) {
31
+ result += String.fromCharCode(str.charCodeAt(i + 3) + 128);
32
+ i += 4;
33
+ continue;
34
+ }
35
+ // Handle \X\HH (8-bit value from ISO 10646 row 0 / ISO-8859-1 overlap).
36
+ if (str[i + 1] === 'X' && str[i + 2] === '\\' && i + 5 <= str.length) {
37
+ const hex = str.slice(i + 3, i + 5);
38
+ if (/^[0-9A-Fa-f]{2}$/.test(hex)) {
39
+ result += String.fromCharCode(parseInt(hex, 16));
40
+ i += 5;
41
+ continue;
24
42
  }
25
43
  }
26
- return decoded;
27
- });
28
- // Decode \X4\XXXXXXXX\X0\ patterns (Unicode 4-byte hex for chars outside BMP)
29
- result = result.replace(/\\X4\\([0-9A-Fa-f]+)\\X0\\/g, (_, hex) => {
30
- let decoded = '';
31
- for (let i = 0; i < hex.length; i += 8) {
32
- const codePoint = parseInt(hex.substring(i, i + 8), 16);
33
- if (!isNaN(codePoint)) {
34
- decoded += String.fromCodePoint(codePoint);
44
+ // Handle \X2\....\X0\ (UTF-16 hex code units, 4 chars each).
45
+ if (str.startsWith('\\X2\\', i)) {
46
+ const end = str.indexOf('\\X0\\', i + 4);
47
+ if (end !== -1) {
48
+ const hex = str.slice(i + 4, end);
49
+ if (hex.length % 4 === 0 && /^[0-9A-Fa-f]+$/.test(hex)) {
50
+ for (let j = 0; j < hex.length; j += 4) {
51
+ result += String.fromCharCode(parseInt(hex.slice(j, j + 4), 16));
52
+ }
53
+ i = end + 4;
54
+ continue;
55
+ }
35
56
  }
36
57
  }
37
- return decoded;
38
- });
39
- // Decode \X\XX\ patterns (ISO-8859-1 single byte)
40
- result = result.replace(/\\X\\([0-9A-Fa-f]{2})/g, (_, hex) => {
41
- const charCode = parseInt(hex, 16);
42
- return !isNaN(charCode) ? String.fromCharCode(charCode) : '';
43
- });
44
- // Decode \S\X patterns (Latin extended, offset by 128)
45
- result = result.replace(/\\S\\(.)/g, (_, char) => {
46
- return String.fromCharCode(char.charCodeAt(0) + 128);
47
- });
48
- // Decode \P..\ code page switches (simplified - just remove them)
49
- result = result.replace(/\\P[A-Z]?\\/g, '');
58
+ // Handle \X4\........\X0\ (Unicode scalar values, 8 hex digits each).
59
+ if (str.startsWith('\\X4\\', i)) {
60
+ const end = str.indexOf('\\X0\\', i + 4);
61
+ if (end !== -1) {
62
+ const hex = str.slice(i + 4, end);
63
+ if (hex.length % 8 === 0 && /^[0-9A-Fa-f]+$/.test(hex)) {
64
+ for (let j = 0; j < hex.length; j += 8) {
65
+ result += String.fromCodePoint(parseInt(hex.slice(j, j + 8), 16));
66
+ }
67
+ i = end + 4;
68
+ continue;
69
+ }
70
+ }
71
+ }
72
+ // Unknown escape sequence: keep the backslash and move on.
73
+ result += str[i];
74
+ i += 1;
75
+ }
50
76
  return result;
51
77
  }
78
+ /**
79
+ * Encode a Unicode string to IFC STEP string escapes.
80
+ *
81
+ * - Printable ASCII (32..126) is kept as-is.
82
+ * - 8-bit values are encoded as \X\HH.
83
+ * - BMP values are encoded as \X2\HHHH\X0\.
84
+ * - Non-BMP values are encoded as \X4\HHHHHHHH\X0\.
85
+ */
86
+ export function encodeIfcString(str) {
87
+ if (!str || typeof str !== 'string')
88
+ return str;
89
+ let encoded = '';
90
+ for (const ch of str) {
91
+ const codePoint = ch.codePointAt(0);
92
+ if (codePoint === undefined) {
93
+ continue;
94
+ }
95
+ if (codePoint >= 32 && codePoint <= 126 && ch !== '\\') {
96
+ encoded += ch;
97
+ continue;
98
+ }
99
+ if (codePoint <= 0xFF) {
100
+ encoded += `\\X\\${codePoint.toString(16).toUpperCase().padStart(2, '0')}`;
101
+ continue;
102
+ }
103
+ if (codePoint <= 0xFFFF) {
104
+ encoded += `\\X2\\${codePoint.toString(16).toUpperCase().padStart(4, '0')}\\X0\\`;
105
+ continue;
106
+ }
107
+ encoded += `\\X4\\${codePoint.toString(16).toUpperCase().padStart(8, '0')}\\X0\\`;
108
+ }
109
+ return encoded;
110
+ }
52
111
  //# sourceMappingURL=ifc-string.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-string.js","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAEhD,IAAI,MAAM,GAAG,GAAG,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAChE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAChE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QAC/C,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"ifc-string.js","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { decodeIfcString } from './ifc-string.js';
1
+ export { decodeIfcString, encodeIfcString } from './ifc-string.js';
2
2
  export { parsePropertyValue } from './property-value.js';
3
3
  export type { ParsedPropertyValue } from './property-value.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- export { decodeIfcString } from './ifc-string.js';
4
+ export { decodeIfcString, encodeIfcString } from './ifc-string.js';
5
5
  export { parsePropertyValue } from './property-value.js';
6
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/encoding",
3
- "version": "1.14.3",
3
+ "version": "1.14.4",
4
4
  "description": "IFC string encoding/decoding and property value parsing for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",