x_ite 8.3.2 → 8.4.0

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.
Files changed (117) hide show
  1. package/.github/workflows/pages-deploy.yml +1 -1
  2. package/.vscode/settings.json +2 -1
  3. package/dist/LICENSE.md +4 -4
  4. package/dist/assets/components/Annotation.js +13 -13
  5. package/dist/assets/components/Annotation.min.js +1 -1
  6. package/dist/assets/components/CADGeometry.js +13 -13
  7. package/dist/assets/components/CADGeometry.min.js +1 -1
  8. package/dist/assets/components/CubeMapTexturing.js +25 -25
  9. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  10. package/dist/assets/components/DIS.js +13 -13
  11. package/dist/assets/components/DIS.min.js +1 -1
  12. package/dist/assets/components/EventUtilities.js +9 -9
  13. package/dist/assets/components/EventUtilities.min.js +1 -1
  14. package/dist/assets/components/Geometry2D.js +19 -19
  15. package/dist/assets/components/Geometry2D.min.js +1 -1
  16. package/dist/assets/components/Geospatial.js +33 -33
  17. package/dist/assets/components/Geospatial.min.js +1 -1
  18. package/dist/assets/components/HAnim.js +64 -75
  19. package/dist/assets/components/HAnim.min.js +1 -1
  20. package/dist/assets/components/KeyDeviceSensor.js +8 -8
  21. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  22. package/dist/assets/components/Layout.js +27 -27
  23. package/dist/assets/components/Layout.min.js +1 -1
  24. package/dist/assets/components/NURBS.js +24 -24
  25. package/dist/assets/components/NURBS.min.js +1 -1
  26. package/dist/assets/components/ParticleSystems.js +23 -23
  27. package/dist/assets/components/ParticleSystems.min.js +1 -1
  28. package/dist/assets/components/Picking.js +19 -19
  29. package/dist/assets/components/Picking.min.js +1 -1
  30. package/dist/assets/components/RigidBodyPhysics.js +17 -17
  31. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  32. package/dist/assets/components/Scripting.js +28 -28
  33. package/dist/assets/components/Scripting.min.js +1 -1
  34. package/dist/assets/components/Text.js +24 -24
  35. package/dist/assets/components/Text.min.js +1 -1
  36. package/dist/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +39 -39
  37. package/dist/assets/components/TextureProjector.min.js +1 -0
  38. package/dist/assets/components/Texturing3D.js +27 -27
  39. package/dist/assets/components/Texturing3D.min.js +1 -1
  40. package/dist/assets/components/VolumeRendering.js +19 -19
  41. package/dist/assets/components/VolumeRendering.min.js +1 -1
  42. package/dist/assets/components/X_ITE.js +9 -9
  43. package/dist/assets/components/X_ITE.min.js +1 -1
  44. package/dist/x_ite.css +1 -1
  45. package/dist/x_ite.js +3986 -1366
  46. package/dist/x_ite.min.js +1 -1
  47. package/dist/x_ite.zip +0 -0
  48. package/docs/Gemfile +1 -4
  49. package/docs/_config.yml +3 -3
  50. package/docs/_posts/getting-started.md +147 -441
  51. package/docs/_posts/reference/field-services-and-objects.md +24 -4
  52. package/docs/_posts/reference/prototype-services.md +24 -4
  53. package/docs/_posts/reference/scene-services.md +18 -2
  54. package/docs/_posts/what's-new.md +32 -4
  55. package/docs/_tabs/playground.html +36 -40
  56. package/docs/assets/css/style.scss +18 -0
  57. package/package.json +1 -1
  58. package/src/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +5 -5
  59. package/src/examples.js +1 -1
  60. package/src/tests.js +5 -5
  61. package/src/x_ite/Base/X3DInfoArray.js +45 -19
  62. package/src/x_ite/Base/X3DObject.js +29 -20
  63. package/src/x_ite/Base/X3DObjectArrayField.js +71 -26
  64. package/src/x_ite/Base/X3DTypedArrayField.js +108 -32
  65. package/src/x_ite/Browser/DOMIntegration.js +4 -3
  66. package/src/x_ite/Browser/VERSION.js +1 -1
  67. package/src/x_ite/Browser/X3DBrowser.js +43 -28
  68. package/src/x_ite/Components/Core/X3DNode.js +682 -210
  69. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +484 -100
  70. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +18 -43
  71. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +27 -26
  72. package/src/x_ite/Components/HAnim/HAnimJoint.js +19 -31
  73. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +6 -3
  74. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +14 -1
  75. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +0 -1
  76. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjector.js +1 -1
  77. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjectorParallel.js +1 -1
  78. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/X3DTextureProjectorNode.js +0 -0
  79. package/src/x_ite/Components/Time/TimeSensor.js +5 -0
  80. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +1 -0
  81. package/src/x_ite/Configuration/ComponentInfo.js +51 -22
  82. package/src/x_ite/Configuration/ProfileInfo.js +10 -6
  83. package/src/x_ite/Configuration/SupportedComponents.js +22 -20
  84. package/src/x_ite/Configuration/SupportedProfiles.js +1 -1
  85. package/src/x_ite/Configuration/UnitInfo.js +69 -26
  86. package/src/x_ite/Execution/X3DExecutionContext.js +78 -55
  87. package/src/x_ite/Execution/X3DExportedNode.js +75 -28
  88. package/src/x_ite/Execution/X3DImportedNode.js +227 -67
  89. package/src/x_ite/Execution/X3DScene.js +437 -117
  90. package/src/x_ite/Fields/ArrayFields.js +105 -55
  91. package/src/x_ite/Fields/SFBool.js +14 -6
  92. package/src/x_ite/Fields/SFColor.js +35 -12
  93. package/src/x_ite/Fields/SFColorRGBA.js +2 -0
  94. package/src/x_ite/Fields/SFDouble.js +17 -10
  95. package/src/x_ite/Fields/SFFloat.js +17 -10
  96. package/src/x_ite/Fields/SFImage.js +93 -8
  97. package/src/x_ite/Fields/SFInt32.js +14 -6
  98. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +38 -13
  99. package/src/x_ite/Fields/SFNode.js +59 -21
  100. package/src/x_ite/Fields/SFRotation.js +38 -13
  101. package/src/x_ite/Fields/SFString.js +14 -7
  102. package/src/x_ite/Fields/SFTime.js +14 -6
  103. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +39 -13
  104. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  105. package/src/x_ite/InputOutput/Generator.js +178 -17
  106. package/src/x_ite/Parser/JSONParser.js +1 -1
  107. package/src/x_ite/Parser/VRMLParser.js +24 -27
  108. package/src/x_ite/Parser/X3DParser.js +0 -4
  109. package/src/x_ite/Parser/XMLParser.js +2 -2
  110. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +182 -64
  111. package/src/x_ite/Prototype/X3DProtoDeclaration.js +314 -93
  112. package/src/x_ite/Rendering/X3DRenderObject.js +6 -1
  113. package/src/x_ite/Routing/X3DRoute.js +104 -40
  114. package/src/x_ite.html +1 -1
  115. package/x_ite.min.html +1 -1
  116. package/dist/assets/components/ProjectiveTextureMapping.min.js +0 -1
  117. package/docs/Gemfile.lock +0 -116
@@ -48,7 +48,6 @@
48
48
  import Fields from "../../Fields.js";
49
49
  import X3DBaseNode from "../../Base/X3DBaseNode.js";
50
50
  import X3DConstants from "../../Base/X3DConstants.js";
51
- import Generator from "../../InputOutput/Generator.js";
52
51
 
53
52
  function X3DNode (executionContext)
54
53
  {
@@ -218,14 +217,12 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
218
217
  return true;
219
218
  },
220
219
  traverse: function () { },
221
- toStream: function (stream)
220
+ toStream: function (generator)
222
221
  {
223
- stream .string += this .getTypeName () + " { }";
222
+ generator .string += this .getTypeName () + " { }";
224
223
  },
225
- toVRMLStream: function (stream)
224
+ toVRMLStream: function (generator)
226
225
  {
227
- const generator = Generator .Get (stream);
228
-
229
226
  generator .EnterScope ();
230
227
 
231
228
  const name = generator .Name (this);
@@ -234,9 +231,9 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
234
231
  {
235
232
  if (generator .ExistsNode (this))
236
233
  {
237
- stream .string += "USE";
238
- stream .string += " ";
239
- stream .string += name;
234
+ generator .string += "USE";
235
+ generator .string += generator .Space ();
236
+ generator .string += name;
240
237
 
241
238
  generator .LeaveScope ();
242
239
  return;
@@ -247,96 +244,108 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
247
244
  {
248
245
  generator .AddNode (this);
249
246
 
250
- stream .string += "DEF";
251
- stream .string += " ";
252
- stream .string += name;
253
- stream .string += " ";
247
+ generator .string += "DEF";
248
+ generator .string += generator .Space ();
249
+ generator .string += name;
250
+ generator .string += generator .Space ();
254
251
  }
255
252
 
256
- stream .string += this .getTypeName ();
257
- stream .string += " ";
258
- stream .string += "{";
253
+ generator .string += this .getTypeName ();
254
+ generator .string += generator .TidySpace ();
255
+ generator .string += "{";
259
256
 
260
257
  const
261
258
  fields = this .getChangedFields (),
262
259
  userDefinedFields = this .getUserDefinedFields ();
263
260
 
264
- let
265
- fieldTypeLength = 0,
266
- accessTypeLength = 0;
267
-
268
261
  if (this .canUserDefinedFields ())
269
262
  {
270
- for (const field of userDefinedFields)
271
- {
272
- fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
273
- accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
274
- }
275
-
276
263
  if (userDefinedFields .length)
277
264
  {
278
- stream .string += "\n";
265
+ let
266
+ fieldTypeLength = 0,
267
+ accessTypeLength = 0;
268
+
269
+ for (const field of userDefinedFields)
270
+ {
271
+ fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
272
+ accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
273
+ }
274
+
275
+ const last = userDefinedFields .at (-1);
276
+
277
+ generator .string += generator .TidyBreak ();
279
278
  generator .IncIndent ();
280
279
 
281
280
  for (const field of userDefinedFields)
282
281
  {
283
- this .toVRMLStreamUserDefinedField (stream, field, fieldTypeLength, accessTypeLength);
282
+ this .toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength);
284
283
 
285
- stream .string += "\n";
284
+ if (field === last)
285
+ generator .string += generator .TidyBreak ();
286
+ else
287
+ generator .string += generator .Break ();
286
288
  }
287
289
 
288
290
  generator .DecIndent ();
289
291
 
290
292
  if (fields .length !== 0)
291
- stream .string += "\n";
293
+ generator .string += generator .TidyBreak ();
292
294
  }
293
295
  }
294
296
 
295
297
  if (fields .length === 0)
296
298
  {
297
299
  if (userDefinedFields .length)
298
- stream .string += generator .Indent ();
300
+ generator .string += generator .Indent ();
299
301
  else
300
- stream .string += " ";
302
+ generator .string += generator .TidySpace ();
301
303
  }
302
304
  else
303
305
  {
306
+ const last = fields .at (-1);
307
+
304
308
  if (userDefinedFields .length === 0)
305
- stream .string += "\n";
309
+ generator .string += generator .TidyBreak ();
306
310
 
307
311
  generator .IncIndent ();
308
312
 
309
- fields .forEach (function (field)
313
+ for (const field of fields)
310
314
  {
311
- this .toVRMLStreamField (stream, field, fieldTypeLength, accessTypeLength);
315
+ this .toVRMLStreamField (generator, field);
312
316
 
313
- stream .string += "\n";
314
- },
315
- this);
317
+ if (field === last)
318
+ generator .string += generator .TidyBreak ();
319
+ else
320
+ generator .string += generator .Break ();
321
+ }
316
322
 
317
323
  generator .DecIndent ();
318
- stream .string += generator .Indent ();
324
+ generator .string += generator .Indent ();
319
325
  }
320
326
 
321
- stream .string += "}";
327
+ generator .string += "}";
322
328
 
323
329
  generator .LeaveScope ();
324
330
  },
325
- toVRMLStreamField: function (stream, field, fieldTypeLength, accessTypeLength)
331
+ toVRMLStreamUserDefinedField: function (generator, field, fieldTypeLength, accessTypeLength)
326
332
  {
327
- const
328
- generator = Generator .Get (stream),
329
- sharedNode = generator .IsSharedNode (this);
333
+ const sharedNode = generator .IsSharedNode (this);
330
334
 
331
335
  if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
332
336
  {
337
+ generator .string += generator .Indent ();
338
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
339
+ generator .string += generator .Space ();
340
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
341
+ generator .string += generator .Space ();
342
+ generator .string += field .getName ();
343
+
333
344
  if (field .isInitializable ())
334
345
  {
335
- stream .string += generator .Indent ();
336
- stream .string += field .getName ();
337
- stream .string += " ";
346
+ generator .string += generator .Space ();
338
347
 
339
- field .toVRMLStream (stream);
348
+ field .toVRMLStream (generator);
340
349
  }
341
350
  }
342
351
  else
@@ -345,58 +354,61 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
345
354
  index = 0,
346
355
  initializableReference = false;
347
356
 
348
- field .getReferences () .forEach (function (reference)
357
+ for (const reference of field .getReferences ())
349
358
  {
350
359
  initializableReference = initializableReference || reference .isInitializable ();
351
360
 
352
- // Output build in reference field
361
+ // Output user defined reference field
353
362
 
354
- stream .string += generator .Indent ();
355
- stream .string += field .getName ();
356
- stream .string += " ";
357
- stream .string += "IS";
358
- stream .string += " ";
359
- stream .string += reference .getName ();
363
+ generator .string += generator .Indent ();
364
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
365
+ generator .string += generator .Space ();
366
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
367
+ generator .string += generator .Space ();
368
+ generator .string += field .getName ();
369
+ generator .string += generator .Space ();
370
+ generator .string += "IS";
371
+ generator .string += generator .Space ();
372
+ generator .string += reference .getName ();
360
373
 
361
374
  ++ index;
362
375
 
363
376
  if (index !== field .getReferences () .size)
364
- stream .string += "\n";
365
- });
377
+ generator .string += generator .Break ();
378
+ }
366
379
 
367
- if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !this .isDefaultValue (field))
380
+ if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !field .isDefaultValue ())
368
381
  {
369
- // Output build in field
382
+ generator .string += generator .Break ();
383
+ generator .string += generator .Indent ();
384
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
385
+ generator .string += generator .Space ();
386
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
387
+ generator .string += generator .Space ();
388
+ generator .string += field .getName ();
370
389
 
371
- stream .string += "\n";
372
- stream .string += generator .Indent ();
373
- stream .string += field .getName ();
374
- stream .string += " ";
390
+ if (field .isInitializable ())
391
+ {
392
+ generator .string += generator .Space ();
375
393
 
376
- field .toVRMLStream (stream);
394
+ field .toVRMLStream (generator);
395
+ }
377
396
  }
378
397
  }
379
398
  },
380
- toVRMLStreamUserDefinedField: function (stream, field, fieldTypeLength, accessTypeLength)
399
+ toVRMLStreamField: function (generator, field)
381
400
  {
382
- const
383
- generator = Generator .Get (stream),
384
- sharedNode = generator .IsSharedNode (this);
401
+ const sharedNode = generator .IsSharedNode (this);
385
402
 
386
403
  if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
387
404
  {
388
- stream .string += generator .Indent ();
389
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
390
- stream .string += " ";
391
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
392
- stream .string += " ";
393
- stream .string += field .getName ();
394
-
395
405
  if (field .isInitializable ())
396
406
  {
397
- stream .string += " ";
407
+ generator .string += generator .Indent ();
408
+ generator .string += field .getName ();
409
+ generator .string += generator .Space ();
398
410
 
399
- field .toVRMLStream (stream);
411
+ field .toVRMLStream (generator);
400
412
  }
401
413
  }
402
414
  else
@@ -405,53 +417,41 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
405
417
  index = 0,
406
418
  initializableReference = false;
407
419
 
408
- field .getReferences () .forEach (function (reference)
420
+ for (const reference of field .getReferences ())
409
421
  {
410
422
  initializableReference = initializableReference || reference .isInitializable ();
411
423
 
412
- // Output user defined reference field
424
+ // Output build in reference field
413
425
 
414
- stream .string += generator .Indent ();
415
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
416
- stream .string += " ";
417
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
418
- stream .string += " ";
419
- stream .string += field .getName ();
420
- stream .string += " ";
421
- stream .string += "IS";
422
- stream .string += " ";
423
- stream .string += reference .getName ();
426
+ generator .string += generator .Indent ();
427
+ generator .string += field .getName ();
428
+ generator .string += generator .Space ();
429
+ generator .string += "IS";
430
+ generator .string += generator .Space ();
431
+ generator .string += reference .getName ();
424
432
 
425
433
  ++ index;
426
434
 
427
435
  if (index !== field .getReferences () .size)
428
- stream .string += "\n";
429
- });
436
+ generator .string += generator .Break ();
437
+ }
430
438
 
431
- if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !field .isDefaultValue ())
439
+ if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !this .isDefaultValue (field))
432
440
  {
433
- stream .string += "\n";
434
- stream .string += generator .Indent ();
435
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
436
- stream .string += " ";
437
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
438
- stream .string += " ";
439
- stream .string += field .getName ();
441
+ // Output build in field
440
442
 
441
- if (field .isInitializable ())
442
- {
443
- stream .string += " ";
443
+ generator .string += generator .Break ();
444
+ generator .string += generator .Indent ();
445
+ generator .string += field .getName ();
446
+ generator .string += generator .Space ();
444
447
 
445
- field .toVRMLStream (stream);
446
- }
448
+ field .toVRMLStream (generator);
447
449
  }
448
450
  }
449
451
  },
450
- toXMLStream: function (stream)
452
+ toXMLStream: function (generator)
451
453
  {
452
- const
453
- generator = Generator .Get (stream),
454
- sharedNode = generator .IsSharedNode (this);
454
+ const sharedNode = generator .IsSharedNode (this);
455
455
 
456
456
  generator .EnterScope ();
457
457
 
@@ -461,13 +461,13 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
461
461
  {
462
462
  if (generator .ExistsNode (this))
463
463
  {
464
- stream .string += generator .Indent ();
465
- stream .string += "<";
466
- stream .string += this .getTypeName ();
467
- stream .string += " ";
468
- stream .string += "USE='";
469
- stream .string += generator .XMLEncode (name);
470
- stream .string += "'";
464
+ generator .string += generator .Indent ();
465
+ generator .string += "<";
466
+ generator .string += this .getTypeName ();
467
+ generator .string += generator .Space ();
468
+ generator .string += "USE='";
469
+ generator .string += generator .XMLEncode (name);
470
+ generator .string += "'";
471
471
 
472
472
  const containerField = generator .ContainerField ();
473
473
 
@@ -475,32 +475,32 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
475
475
  {
476
476
  if (containerField .getName () !== this .getContainerField ())
477
477
  {
478
- stream .string += " ";
479
- stream .string += "containerField='";
480
- stream .string += generator .XMLEncode (containerField .getName ());
481
- stream .string += "'";
478
+ generator .string += generator .Space ();
479
+ generator .string += "containerField='";
480
+ generator .string += generator .XMLEncode (containerField .getName ());
481
+ generator .string += "'";
482
482
  }
483
483
  }
484
484
 
485
- stream .string += "/>";
485
+ generator .string += "/>";
486
486
 
487
487
  generator .LeaveScope ();
488
488
  return;
489
489
  }
490
490
  }
491
491
 
492
- stream .string += generator .Indent ();
493
- stream .string += "<";
494
- stream .string += this .getTypeName ();
492
+ generator .string += generator .Indent ();
493
+ generator .string += "<";
494
+ generator .string += this .getTypeName ();
495
495
 
496
496
  if (name .length)
497
497
  {
498
498
  generator .AddNode (this);
499
499
 
500
- stream .string += " ";
501
- stream .string += "DEF='";
502
- stream .string += generator .XMLEncode (name);
503
- stream .string += "'";
500
+ generator .string += generator .Space ();
501
+ generator .string += "DEF='";
502
+ generator .string += generator .XMLEncode (name);
503
+ generator .string += "'";
504
504
  }
505
505
 
506
506
  const containerField = generator .ContainerField ();
@@ -509,10 +509,10 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
509
509
  {
510
510
  if (containerField .getName () !== this .getContainerField ())
511
511
  {
512
- stream .string += " ";
513
- stream .string += "containerField='";
514
- stream .string += generator .XMLEncode (containerField .getName ());
515
- stream .string += "'";
512
+ generator .string += generator .Space ();
513
+ generator .string += "containerField='";
514
+ generator .string += generator .XMLEncode (containerField .getName ());
515
+ generator .string += "'";
516
516
  }
517
517
  }
518
518
 
@@ -543,14 +543,7 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
543
543
  {
544
544
  if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
545
545
  {
546
- let initializableReference = false;
547
-
548
- field .getReferences () .forEach (function (fieldReference)
549
- {
550
- initializableReference = initializableReference || fieldReference .isInitializable ();
551
- });
552
-
553
- if (!initializableReference)
546
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
554
547
  mustOutputValue = !this .isDefaultValue (field);
555
548
  }
556
549
  }
@@ -578,14 +571,14 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
578
571
  if (field === cdata)
579
572
  break;
580
573
 
581
- stream .string += "\n";
582
- stream .string += generator .Indent ();
583
- stream .string += field .getName ();
584
- stream .string += "='";
574
+ generator .string += generator .AttribBreak ();
575
+ generator .string += generator .ListIndent ();
576
+ generator .string += field .getName ();
577
+ generator .string += "='";
585
578
 
586
- field .toXMLStream (stream);
579
+ field .toXMLStream (generator);
587
580
 
588
- stream .string += "'";
581
+ generator .string += "'";
589
582
  break;
590
583
  }
591
584
  }
@@ -602,11 +595,12 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
602
595
 
603
596
  if ((!this .canUserDefinedFields () || !userDefinedFields .length) && (!references .length || sharedNode) && !childNodes .length && !cdata)
604
597
  {
605
- stream .string += "/>";
598
+ generator .string += "/>";
606
599
  }
607
600
  else
608
601
  {
609
- stream .string += ">\n";
602
+ generator .string += ">";
603
+ generator .string += generator .TidyBreak ();
610
604
 
611
605
  generator .IncIndent ();
612
606
 
@@ -614,37 +608,33 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
614
608
  {
615
609
  for (const field of userDefinedFields)
616
610
  {
617
- stream .string += generator .Indent ();
618
- stream .string += "<field";
619
- stream .string += " ";
620
- stream .string += "accessType='";
621
- stream .string += generator .AccessType (field .getAccessType ());
622
- stream .string += "'";
623
- stream .string += " ";
624
- stream .string += "type='";
625
- stream .string += field .getTypeName ();
626
- stream .string += "'";
627
- stream .string += " ";
628
- stream .string += "name='";
629
- stream .string += generator .XMLEncode (field .getName ());
630
- stream .string += "'";
611
+ generator .string += generator .Indent ();
612
+ generator .string += "<field";
613
+ generator .string += generator .Space ();
614
+ generator .string += "accessType='";
615
+ generator .string += generator .AccessType (field .getAccessType ());
616
+ generator .string += "'";
617
+ generator .string += generator .Space ();
618
+ generator .string += "type='";
619
+ generator .string += field .getTypeName ();
620
+ generator .string += "'";
621
+ generator .string += generator .Space ();
622
+ generator .string += "name='";
623
+ generator .string += generator .XMLEncode (field .getName ());
624
+ generator .string += "'";
631
625
 
632
626
  // If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
633
627
  // for this field.
634
628
 
635
629
  let mustOutputValue = false;
636
630
 
637
- if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
631
+ if (generator .ExecutionContext ())
638
632
  {
639
- let initializableReference = false;
640
-
641
- field .getReferences () .forEach (function (fieldReference)
633
+ if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
642
634
  {
643
- initializableReference = initializableReference || fieldReference .isInitializable ();
644
- });
645
-
646
- if (!initializableReference)
647
- mustOutputValue = true;
635
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
636
+ mustOutputValue = !this .isDefaultValue (field);
637
+ }
648
638
  }
649
639
 
650
640
  if ((field .getReferences () .size === 0 || !generator .ExecutionContext ()) || sharedNode || mustOutputValue)
@@ -654,7 +644,8 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
654
644
 
655
645
  if (!field .isInitializable () || field .isDefaultValue ())
656
646
  {
657
- stream .string += "/>\n";
647
+ generator .string += "/>";
648
+ generator .string += generator .TidyBreak ();
658
649
  }
659
650
  else
660
651
  {
@@ -667,31 +658,34 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
667
658
  {
668
659
  generator .PushContainerField (field);
669
660
 
670
- stream .string += ">\n";
661
+ generator .string += ">";
662
+ generator .string += generator .TidyBreak ();
671
663
 
672
664
  generator .IncIndent ();
673
665
 
674
- field .toXMLStream (stream);
666
+ field .toXMLStream (generator);
675
667
 
676
- stream .string += "\n";
668
+ generator .string += generator .TidyBreak ();
677
669
 
678
670
  generator .DecIndent ();
679
671
 
680
- stream .string += generator .Indent ();
681
- stream .string += "</field>\n";
672
+ generator .string += generator .Indent ();
673
+ generator .string += "</field>";
674
+ generator .string += generator .TidyBreak ();
682
675
 
683
676
  generator .PopContainerField ();
684
677
  break;
685
678
  }
686
679
  default:
687
680
  {
688
- stream .string += " ";
689
- stream .string += "value='";
681
+ generator .string += generator .Space ();
682
+ generator .string += "value='";
690
683
 
691
- field .toXMLStream (stream);
684
+ field .toXMLStream (generator);
692
685
 
693
- stream .string += "'";
694
- stream .string += "/>\n";
686
+ generator .string += "'";
687
+ generator .string += "/>";
688
+ generator .string += generator .TidyBreak ();
695
689
  break;
696
690
  }
697
691
  }
@@ -702,16 +696,17 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
702
696
  if (generator .ExecutionContext ())
703
697
  references .push (field);
704
698
 
705
- stream .string += "/>\n";
699
+ generator .string += "/>";
700
+ generator .string += generator .TidyBreak ();
706
701
  }
707
702
  }
708
703
  }
709
704
 
710
705
  if (references .length && !sharedNode)
711
706
  {
712
- stream .string += generator .Indent ();
713
- stream .string += "<IS>";
714
- stream .string += "\n";
707
+ generator .string += generator .Indent ();
708
+ generator .string += "<IS>";
709
+ generator .string += generator .TidyBreak ();
715
710
 
716
711
  generator .IncIndent ();
717
712
 
@@ -719,35 +714,37 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
719
714
  {
720
715
  const protoFields = field .getReferences ();
721
716
 
722
- protoFields .forEach (function (protoField)
717
+ for (const protoField of protoFields)
723
718
  {
724
- stream .string += generator .Indent ();
725
- stream .string += "<connect";
726
- stream .string += " ";
727
- stream .string += "nodeField='";
728
- stream .string += generator .XMLEncode (field .getName ());
729
- stream .string += "'";
730
- stream .string += " ";
731
- stream .string += "protoField='";
732
- stream .string += generator .XMLEncode (protoField .getName ());
733
- stream .string += "'";
734
- stream .string += "/>\n";
735
- });
719
+ generator .string += generator .Indent ();
720
+ generator .string += "<connect";
721
+ generator .string += generator .Space ();
722
+ generator .string += "nodeField='";
723
+ generator .string += generator .XMLEncode (field .getName ());
724
+ generator .string += "'";
725
+ generator .string += generator .Space ();
726
+ generator .string += "protoField='";
727
+ generator .string += generator .XMLEncode (protoField .getName ());
728
+ generator .string += "'";
729
+ generator .string += "/>";
730
+ generator .string += generator .TidyBreak ();
731
+ }
736
732
  }
737
733
 
738
734
  generator .DecIndent ();
739
735
 
740
- stream .string += generator .Indent ();
741
- stream .string += "</IS>\n";
736
+ generator .string += generator .Indent ();
737
+ generator .string += "</IS>";
738
+ generator .string += generator .TidyBreak ();
742
739
  }
743
740
 
744
741
  for (const field of childNodes)
745
742
  {
746
743
  generator .PushContainerField (field);
747
744
 
748
- field .toXMLStream (stream);
745
+ field .toXMLStream (generator);
749
746
 
750
- stream .string += "\n";
747
+ generator .string += generator .TidyBreak ();
751
748
 
752
749
  generator .PopContainerField ();
753
750
  }
@@ -756,22 +753,497 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
756
753
  {
757
754
  for (const value of cdata)
758
755
  {
759
- stream .string += "<![CDATA[";
760
- stream .string += generator .escapeCDATA (value);
761
- stream .string += "]]>\n";
756
+ generator .string += "<![CDATA[";
757
+ generator .string += generator .escapeCDATA (value);
758
+ generator .string += "]]>";
759
+ generator .string += generator .TidyBreak ();
762
760
  }
763
761
  }
764
762
 
765
763
  generator .DecIndent ();
766
764
 
767
- stream .string += generator .Indent ();
768
- stream .string += "</";
769
- stream .string += this .getTypeName ();
770
- stream .string += ">";
765
+ generator .string += generator .Indent ();
766
+ generator .string += "</";
767
+ generator .string += this .getTypeName ();
768
+ generator .string += ">";
771
769
  }
772
770
 
773
771
  generator .LeaveScope ();
774
772
  },
773
+ toJSONStream: function (generator)
774
+ {
775
+ try
776
+ {
777
+ const sharedNode = generator .IsSharedNode (this);
778
+
779
+ generator .EnterScope ();
780
+
781
+ const name = generator .Name (this);
782
+
783
+ // USE name
784
+
785
+ if (name .length)
786
+ {
787
+ if (generator .ExistsNode (this))
788
+ {
789
+ generator .string += '{';
790
+ generator .string += generator .TidySpace ();
791
+ generator .string += '"';
792
+ generator .string += this .getTypeName ();
793
+ generator .string += '"';
794
+ generator .string += ':';
795
+ generator .string += generator .TidyBreak ();
796
+ generator .string += generator .IncIndent ();
797
+ generator .string += generator .Indent ();
798
+ generator .string += '{';
799
+ generator .string += generator .TidyBreak ();
800
+ generator .string += generator .IncIndent ();
801
+ generator .string += generator .Indent ();
802
+ generator .string += '"';
803
+ generator .string += "@USE";
804
+ generator .string += '"';
805
+ generator .string += ':';
806
+ generator .string += generator .TidySpace ();
807
+ generator .string += generator .JSONEncode (name);
808
+ generator .string += generator .TidyBreak ();
809
+ generator .string += generator .DecIndent ();
810
+ generator .string += generator .Indent ();
811
+ generator .string += '}';
812
+ generator .string += generator .TidyBreak ();
813
+ generator .string += generator .DecIndent ();
814
+ generator .string += generator .Indent ();
815
+ generator .string += '}';
816
+
817
+ generator .LeaveScope ();
818
+ return;
819
+ }
820
+ }
821
+
822
+ // Type name
823
+
824
+ generator .string += '{';
825
+ generator .string += generator .TidySpace ();
826
+ generator .string += '"';
827
+ generator .string += this .getTypeName ();
828
+ generator .string += '"';
829
+ generator .string += ':';
830
+ generator .string += generator .TidyBreak ();
831
+ generator .string += generator .IncIndent ();
832
+ generator .string += generator .Indent ();
833
+ generator .string += '{';
834
+ generator .string += generator .TidyBreak ();
835
+ generator .string += generator .IncIndent ();
836
+
837
+
838
+ // DEF name
839
+
840
+ if (name .length)
841
+ {
842
+ generator .AddNode (this);
843
+
844
+ generator .string += generator .Indent ();
845
+ generator .string += '"';
846
+ generator .string += "@DEF";
847
+ generator .string += '"';
848
+ generator .string += ':';
849
+ generator .string += generator .TidySpace ();
850
+ generator .string += generator .JSONEncode (name);
851
+ generator .string += ',';
852
+ generator .string += generator .TidyBreak ();
853
+ }
854
+
855
+
856
+ // Fields
857
+
858
+ const
859
+ fields = this .getChangedFields (),
860
+ userDefinedFields = this .getUserDefinedFields ();
861
+
862
+ const references = [ ];
863
+
864
+ let sourceText = this .getSourceText ();
865
+
866
+ // Source text
867
+
868
+ if (sourceText)
869
+ {
870
+ if (sourceText .length !== 1)
871
+ sourceText = null;
872
+
873
+ if (sourceText && ! sourceText [0] .match (/^\s*(?:ecmascript|javascript|vrmlscript)\:/s))
874
+ sourceText = null;
875
+ }
876
+
877
+
878
+ // Predefined fields
879
+
880
+ if (fields .length)
881
+ {
882
+ const outputFields = [ ];
883
+
884
+ for (const field of fields)
885
+ {
886
+ // If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
887
+ // for this field.
888
+
889
+ let mustOutputValue = false;
890
+
891
+ if (generator .ExecutionContext ())
892
+ {
893
+ if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
894
+ {
895
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
896
+ mustOutputValue = !this .isDefaultValue (field);
897
+ }
898
+ }
899
+
900
+ // If we have no execution context we are not in a proto and must not generate IS references the same is true
901
+ // if the node is a shared node as the node does not belong to the execution context.
902
+
903
+ if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode || mustOutputValue)
904
+ {
905
+ if (mustOutputValue)
906
+ references .push (field);
907
+
908
+ if (field !== sourceText)
909
+ outputFields .push (field);
910
+ }
911
+ else
912
+ {
913
+ references .push (field);
914
+ }
915
+ }
916
+
917
+ for (const field of outputFields)
918
+ {
919
+ if (field .isInitializable ())
920
+ {
921
+ switch (field .getType ())
922
+ {
923
+ case X3DConstants .SFNode:
924
+ case X3DConstants .MFNode:
925
+ {
926
+ generator .string += generator .Indent ();
927
+ generator .string += '"';
928
+ generator .string += '-';
929
+ generator .string += field .getName ();
930
+ generator .string += '"';
931
+ generator .string += ':';
932
+ generator .string += generator .TidySpace ();
933
+
934
+ field .toJSONStream (generator);
935
+ break;
936
+ }
937
+ default:
938
+ {
939
+ generator .string += generator .Indent ();
940
+ generator .string += '"';
941
+ generator .string += '@';
942
+ generator .string += field .getName ();
943
+ generator .string += '"';
944
+ generator .string += ':';
945
+ generator .string += generator .TidySpace ();
946
+
947
+ field .toJSONStream (generator);
948
+ break;
949
+ }
950
+ }
951
+
952
+ generator .string += ',';
953
+ generator .string += generator .TidyBreak ();
954
+ }
955
+ }
956
+ }
957
+
958
+ // User defined fields
959
+
960
+ if (! this .canUserDefinedFields () || ! userDefinedFields .length)
961
+ ;
962
+ else
963
+ {
964
+ generator .string += generator .Indent ();
965
+ generator .string += '"';
966
+ generator .string += "field";
967
+ generator .string += '"';
968
+ generator .string += ':';
969
+ generator .string += generator .TidySpace ();
970
+ generator .string += '[';
971
+ generator .string += generator .TidyBreak ();
972
+ generator .string += generator .IncIndent ();
973
+
974
+ for (const field of userDefinedFields)
975
+ {
976
+ generator .string += generator .Indent ();
977
+ generator .string += '{';
978
+ generator .string += generator .TidyBreak ();
979
+ generator .string += generator .IncIndent ();
980
+
981
+ generator .string += generator .Indent ();
982
+ generator .string += '"';
983
+ generator .string += "@accessType";
984
+ generator .string += '"';
985
+ generator .string += ':';
986
+ generator .string += generator .TidySpace ();
987
+ generator .string += '"';
988
+ generator .string += generator .AccessType (field .getAccessType ());
989
+ generator .string += '"';
990
+ generator .string += ',';
991
+ generator .string += generator .TidyBreak ();
992
+
993
+ generator .string += generator .Indent ();
994
+ generator .string += '"';
995
+ generator .string += "@type";
996
+ generator .string += '"';
997
+ generator .string += ':';
998
+ generator .string += generator .TidySpace ();
999
+ generator .string += '"';
1000
+ generator .string += field .getTypeName ();
1001
+ generator .string += '"';
1002
+ generator .string += ',';
1003
+ generator .string += generator .TidyBreak ();
1004
+
1005
+ generator .string += generator .Indent ();
1006
+ generator .string += '"';
1007
+ generator .string += "@name";
1008
+ generator .string += '"';
1009
+ generator .string += ':';
1010
+ generator .string += generator .TidySpace ();
1011
+ generator .string += generator .JSONEncode (field .getName ());
1012
+
1013
+ // If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
1014
+ // for this field.
1015
+
1016
+ let mustOutputValue = false;
1017
+
1018
+ if (generator .ExecutionContext ())
1019
+ {
1020
+ if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
1021
+ {
1022
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
1023
+ mustOutputValue = !this .isDefaultValue (field);
1024
+ }
1025
+ }
1026
+
1027
+ if ((field .getReferences () .size === 0 || !generator .ExecutionContext ()) || sharedNode || mustOutputValue)
1028
+ {
1029
+ if (mustOutputValue && generator .ExecutionContext ())
1030
+ references .push (field);
1031
+
1032
+ if (!field .isInitializable () || field .isDefaultValue ())
1033
+ ;
1034
+ else
1035
+ {
1036
+ // Output value
1037
+
1038
+ generator .string += ',';
1039
+ generator .string += generator .TidyBreak ();
1040
+
1041
+ switch (field .getType ())
1042
+ {
1043
+ case X3DConstants .SFNode:
1044
+ {
1045
+ generator .string += generator .Indent ();
1046
+ generator .string += '"';
1047
+ generator .string += "-children";
1048
+ generator .string += '"';
1049
+ generator .string += ':';
1050
+ generator .string += generator .TidySpace ();
1051
+ generator .string += '[';
1052
+ generator .string += generator .TidyBreak ();
1053
+ generator .string += generator .IncIndent ();
1054
+ generator .string += generator .Indent ();
1055
+
1056
+ field .toJSONStream (generator);
1057
+
1058
+ generator .string += generator .TidyBreak ();
1059
+ generator .string += generator .DecIndent ();
1060
+ generator .string += generator .Indent ();
1061
+ generator .string += ']';
1062
+ break;
1063
+ }
1064
+ case X3DConstants .MFNode:
1065
+ {
1066
+ generator .string += generator .Indent ();
1067
+ generator .string += '"';
1068
+ generator .string += "-children";
1069
+ generator .string += '"';
1070
+ generator .string += ':';
1071
+ generator .string += generator .TidySpace ();
1072
+
1073
+ field .toJSONStream (generator);
1074
+ break;
1075
+ }
1076
+ default:
1077
+ {
1078
+ generator .string += generator .Indent ();
1079
+ generator .string += '"';
1080
+ generator .string += "@value";
1081
+ generator .string += '"';
1082
+ generator .string += ':';
1083
+ generator .string += generator .TidySpace ();
1084
+
1085
+ field .toJSONStream (generator);
1086
+ break;
1087
+ }
1088
+ }
1089
+ }
1090
+ }
1091
+ else
1092
+ {
1093
+ if (generator .ExecutionContext ())
1094
+ references .push (field);
1095
+ }
1096
+
1097
+ generator .string += generator .TidyBreak ();
1098
+ generator .string += generator .DecIndent ();
1099
+ generator .string += generator .Indent ();
1100
+ generator .string += '}';
1101
+
1102
+ if (field !== userDefinedFields .at (-1))
1103
+ generator .string += ',';
1104
+
1105
+ generator .string += generator .TidyBreak ();
1106
+ }
1107
+
1108
+ generator .string += generator .DecIndent ();
1109
+ generator .string += generator .Indent ();
1110
+ generator .string += ']';
1111
+ generator .string += ',';
1112
+ generator .string += generator .TidyBreak ();
1113
+ }
1114
+
1115
+ // Source text
1116
+
1117
+ if (sourceText)
1118
+ {
1119
+ generator .string += generator .Indent ();
1120
+ generator .string += '"';
1121
+ generator .string += "#sourceText";
1122
+ generator .string += '"';
1123
+ generator .string += ':';
1124
+ generator .string += generator .TidySpace ();
1125
+ generator .string += '[';
1126
+ generator .string += generator .TidyBreak ();
1127
+ generator .string += generator .IncIndent ();
1128
+
1129
+ const sourceTextLines = sourceText [0] .split ("\n");
1130
+
1131
+ for (let i = 0, length = sourceTextLines .length; i < length; ++ i)
1132
+ {
1133
+ generator .string += generator .ListIndent ();
1134
+ generator .string += generator .JSONEncode (sourceTextLines [i]);
1135
+
1136
+ if (i !== length - 1)
1137
+ generator .string += ',';
1138
+
1139
+ generator .string += generator .TidyBreak ();
1140
+ }
1141
+
1142
+ generator .string += generator .DecIndent ();
1143
+ generator .string += generator .Indent ();
1144
+ generator .string += ']';
1145
+ generator .string += ',';
1146
+ generator .string += generator .TidyBreak ();
1147
+ }
1148
+
1149
+
1150
+ // IS references
1151
+
1152
+ if (references .length && !sharedNode)
1153
+ {
1154
+ generator .string += generator .Indent ();
1155
+ generator .string += '"';
1156
+ generator .string += "IS";
1157
+ generator .string += '"';
1158
+ generator .string += ':';
1159
+ generator .string += generator .TidySpace ();
1160
+ generator .string += '{';
1161
+ generator .string += generator .TidyBreak ();
1162
+ generator .string += generator .IncIndent ();
1163
+ generator .string += generator .Indent ();
1164
+ generator .string += '"';
1165
+ generator .string += "connect";
1166
+ generator .string += '"';
1167
+ generator .string += ':';
1168
+ generator .string += generator .TidySpace ();
1169
+ generator .string += '[';
1170
+ generator .string += generator .TidyBreak ();
1171
+ generator .string += generator .IncIndent ();
1172
+
1173
+ for (const field of references)
1174
+ {
1175
+ const protoFields = [... field .getReferences ()];
1176
+
1177
+ for (const protoField of protoFields)
1178
+ {
1179
+ generator .string += generator .Indent ();
1180
+ generator .string += '{';
1181
+ generator .string += generator .TidyBreak ();
1182
+ generator .string += generator .IncIndent ();
1183
+
1184
+ generator .string += generator .Indent ();
1185
+ generator .string += '"';
1186
+ generator .string += "@nodeField";
1187
+ generator .string += '"';
1188
+ generator .string += ':';
1189
+ generator .string += generator .TidySpace ();
1190
+ generator .string += generator .JSONEncode (field .getName ());
1191
+ generator .string += ',';
1192
+ generator .string += generator .TidyBreak ();
1193
+
1194
+ generator .string += generator .Indent ();
1195
+ generator .string += '"';
1196
+ generator .string += "@protoField";
1197
+ generator .string += '"';
1198
+ generator .string += ':';
1199
+ generator .string += generator .TidySpace ();
1200
+ generator .string += generator .JSONEncode (protoField .getName ());
1201
+ generator .string += generator .TidyBreak ();
1202
+
1203
+ generator .string += generator .DecIndent ();
1204
+ generator .string += generator .Indent ();
1205
+ generator .string += '}';
1206
+
1207
+ if (field === references .at (-1) && protoField === protoFields .at (-1))
1208
+ ;
1209
+ else
1210
+ {
1211
+ generator .string += ',';
1212
+ }
1213
+
1214
+ generator .string += generator .TidyBreak ();
1215
+ }
1216
+ }
1217
+
1218
+ generator .string += generator .DecIndent ();
1219
+ generator .string += generator .Indent ();
1220
+ generator .string += ']';
1221
+ generator .string += generator .TidyBreak ();
1222
+ generator .string += generator .DecIndent ();
1223
+ generator .string += generator .Indent ();
1224
+ generator .string += '}';
1225
+ generator .string += generator .TidyBreak ();
1226
+ }
1227
+
1228
+ generator .string = generator .string .replace (/,(\s*)$/s, "$1");
1229
+
1230
+ // End
1231
+
1232
+ generator .string += generator .DecIndent ();
1233
+ generator .string += generator .Indent ();
1234
+ generator .string += '}';
1235
+ generator .string += generator .TidyBreak ();
1236
+ generator .string += generator .DecIndent ();
1237
+ generator .string += generator .Indent ();
1238
+ generator .string += '}';
1239
+
1240
+ generator .LeaveScope ();
1241
+ }
1242
+ catch (error)
1243
+ {
1244
+ console .log (error)
1245
+ }
1246
+ },
775
1247
  dispose: function ()
776
1248
  {
777
1249
  const executionContext = this .getExecutionContext ();