@drawcall/charta 0.1.15 → 0.1.17

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.
@@ -0,0 +1,8 @@
1
+ import type { Call } from './parser.js';
2
+ /**
3
+ * Generates a charta text from a parsed AST.
4
+ * This is the inverse of parse() - it takes the Call[][][] structure
5
+ * and produces the original charta text format.
6
+ */
7
+ export declare function generate(ast: Call[][][]): string;
8
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,aAAa,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAsBhD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Generates a charta text from a parsed AST.
3
+ * This is the inverse of parse() - it takes the Call[][][] structure
4
+ * and produces the original charta text format.
5
+ */
6
+ export function generate(ast) {
7
+ if (ast.length === 0)
8
+ return '';
9
+ const rows = [];
10
+ for (const row of ast) {
11
+ const cells = [];
12
+ for (const cell of row) {
13
+ const calls = [];
14
+ for (const call of cell) {
15
+ calls.push(generateCall(call));
16
+ }
17
+ cells.push(calls.join(' '));
18
+ }
19
+ rows.push(cells.join(' | '));
20
+ }
21
+ return rows.join('\n');
22
+ }
23
+ /**
24
+ * Generates a single call string from a Call object.
25
+ * Format: name(param1, param2, key=value, ...)
26
+ */
27
+ function generateCall(call) {
28
+ const args = [];
29
+ // Add positional parameters
30
+ for (const param of call.locationParams) {
31
+ args.push(formatValue(param));
32
+ }
33
+ // Add key-value parameters
34
+ for (const [key, value] of call.keyParams) {
35
+ args.push(`${key}=${formatValue(value)}`);
36
+ }
37
+ return `${call.name}(${args.join(', ')})`;
38
+ }
39
+ /**
40
+ * Formats a value, quoting it if necessary.
41
+ * A value needs to be quoted if it contains special characters
42
+ * that would interfere with parsing: space, tab, comma, parentheses, equals, pipe, newline, or quotes.
43
+ */
44
+ function formatValue(value) {
45
+ // Check if value contains characters that require quoting
46
+ if (/[ \t,()=|\n"]/.test(value)) {
47
+ // Escape any quotes within the value and wrap in quotes
48
+ return `"${value.replace(/"/g, '\\"')}"`;
49
+ }
50
+ return value;
51
+ }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./parser.js";
2
+ export * from "./generator.js";
2
3
  export * from "./interpreter.js";
3
4
  export * from "./tiles/index.js";
4
5
  export * from "./walls/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./parser.js";
2
+ export * from "./generator.js";
2
3
  export * from "./interpreter.js";
3
4
  export * from "./tiles/index.js";
4
5
  export * from "./walls/index.js";
@@ -35,7 +35,7 @@ export type PlaceGroupOptions = {
35
35
  skipBuild?: boolean;
36
36
  };
37
37
  export declare class PlaceGroup extends Group {
38
- private batchBuilders;
38
+ readonly batchBuilders: Map<string, PrefabBatchBuilder>;
39
39
  constructor(interpreter: Interpreter, _materialFallback?: Material, opts?: PlaceGroupOptions);
40
40
  dispose(): void;
41
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/place/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAQ,MAAM,OAAO,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAEvD,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE;IACvC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,UAAU,CAAA;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,WAAW,CAAA;IACxB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IAC5D,IAAI,EAAE,MAAM,CAAA;CACb,KAAK,IAAI,CAAA;AAKV,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAOvD;AAED,qBAAa,kBAAkB;aAIX,UAAU,EAAE,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,SAAgB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAK;gBAG3B,UAAU,EAAE,OAAO,EAClB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;IAG5E,GAAG,CAAC,MAAM,EAAE,OAAO;IAKZ,KAAK,IAAI,QAAQ;CAGzB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,OAAO,CAAC,aAAa,CAAgC;gBAEzC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAE,iBAAsB;IAuPhG,OAAO;CAOR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/place/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAQ,MAAM,OAAO,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAEvD,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE;IACvC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,UAAU,CAAA;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,WAAW,CAAA;IACxB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IAC5D,IAAI,EAAE,MAAM,CAAA;CACb,KAAK,IAAI,CAAA;AAKV,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAOvD;AAED,qBAAa,kBAAkB;aAIX,UAAU,EAAE,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,SAAgB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAK;gBAG3B,UAAU,EAAE,OAAO,EAClB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;IAG5E,GAAG,CAAC,MAAM,EAAE,OAAO;IAKZ,KAAK,IAAI,QAAQ;CAGzB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,aAAa,kCAAwC;gBAEzD,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAE,iBAAsB;IAuPhG,OAAO;CAOR"}
@@ -31,7 +31,7 @@ export class PrefabBatchBuilder {
31
31
  }
32
32
  }
33
33
  export class PlaceGroup extends Group {
34
- batchBuilders = new Set();
34
+ batchBuilders = new Map();
35
35
  constructor(interpreter, _materialFallback, opts = {}) {
36
36
  super();
37
37
  const { mock = false, skipBuild = false } = opts;
@@ -112,7 +112,7 @@ export class PlaceGroup extends Group {
112
112
  // In mock mode, we only validate asset existence - skip expensive placement computation
113
113
  if (mock)
114
114
  continue;
115
- this.batchBuilders.add(batchBuilder);
115
+ this.batchBuilders.set(parsed.model, batchBuilder);
116
116
  const usualSize = new Vector3();
117
117
  usualSize.copy(batchBuilder.prefabSize);
118
118
  const layerIndex = interpreter.countCalls([row, col], (c) => c.name === 'ground' || c.name === 'ceiling', 0, callIdx) - 1;
@@ -189,7 +189,7 @@ export class PlaceGroup extends Group {
189
189
  // In mock mode, skip expensive transform computation and placement
190
190
  if (mock)
191
191
  continue;
192
- this.batchBuilders.add(batchBuilder);
192
+ this.batchBuilders.set(parsed.model, batchBuilder);
193
193
  const layerIndex = interpreter.countCalls([row, col], (c) => c.name === 'ground' || c.name === 'ceiling', 0, callIdx) - 1;
194
194
  const yaw = parsed.yaw ?? 0;
195
195
  const alignMode = (parsed.align ?? 'up').toLowerCase();
@@ -207,7 +207,7 @@ export class PlaceGroup extends Group {
207
207
  }
208
208
  // Build step: skip if mock or skipBuild is enabled
209
209
  if (!mock && !skipBuild) {
210
- for (const batchBuilder of this.batchBuilders) {
210
+ for (const batchBuilder of this.batchBuilders.values()) {
211
211
  this.add(batchBuilder.build());
212
212
  }
213
213
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawcall/charta",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "author": "Bela Bohlender",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://drawcall.ai",