@logicflow/extension 1.1.12 → 1.2.0-alpha.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 (66) hide show
  1. package/cjs/NodeResize/Control/Control.js +8 -8
  2. package/cjs/NodeResize/Control/Util.js +11 -11
  3. package/cjs/bpmn-adapter/index.js +124 -76
  4. package/cjs/bpmn-adapter/json2xml.js +5 -2
  5. package/cjs/bpmn-adapter/xml2json.js +38 -284
  6. package/cjs/components/context-menu/index.js +2 -2
  7. package/cjs/components/menu/index.js +23 -23
  8. package/cjs/components/mini-map/index.js +2 -2
  9. package/cjs/components/selection-select/index.js +5 -5
  10. package/cjs/insert-node-in-polyline/edge.js +4 -4
  11. package/cjs/insert-node-in-polyline/index.js +1 -1
  12. package/cjs/materials/group/GroupNode.js +2 -2
  13. package/cjs/materials/group/index.js +3 -3
  14. package/cjs/tools/auto-layout/index.js +9 -9
  15. package/cjs/turbo-adapter/index.js +2 -2
  16. package/es/NodeResize/Control/Control.d.ts +1 -1
  17. package/es/NodeResize/Control/Control.js +9 -9
  18. package/es/NodeResize/Control/Util.d.ts +3 -3
  19. package/es/NodeResize/Control/Util.js +7 -7
  20. package/es/bpmn-adapter/index.d.ts +41 -33
  21. package/es/bpmn-adapter/index.js +124 -76
  22. package/es/bpmn-adapter/json2xml.js +5 -2
  23. package/es/bpmn-adapter/xml2json.js +38 -284
  24. package/es/components/context-menu/index.js +2 -2
  25. package/es/components/menu/index.js +23 -23
  26. package/es/components/mini-map/index.js +2 -2
  27. package/es/components/selection-select/index.d.ts +1 -1
  28. package/es/components/selection-select/index.js +5 -5
  29. package/es/insert-node-in-polyline/edge.d.ts +3 -3
  30. package/es/insert-node-in-polyline/edge.js +3 -3
  31. package/es/insert-node-in-polyline/index.js +2 -2
  32. package/es/materials/group/GroupNode.d.ts +1 -1
  33. package/es/materials/group/GroupNode.js +2 -2
  34. package/es/materials/group/index.d.ts +1 -1
  35. package/es/materials/group/index.js +3 -3
  36. package/es/tools/auto-layout/index.d.ts +2 -2
  37. package/es/tools/auto-layout/index.js +9 -9
  38. package/es/turbo-adapter/index.js +2 -2
  39. package/lib/AutoLayout.js +1 -1
  40. package/lib/BpmnAdapter.js +1 -1
  41. package/lib/BpmnElement.js +1 -1
  42. package/lib/ContextMenu.js +1 -1
  43. package/lib/Control.js +1 -1
  44. package/lib/CurvedEdge.js +1 -1
  45. package/lib/DndPanel.js +1 -1
  46. package/lib/FlowPath.js +1 -1
  47. package/lib/Group.js +1 -1
  48. package/lib/InsertNodeInPolyline.js +1 -1
  49. package/lib/Menu.js +1 -1
  50. package/lib/MiniMap.js +1 -1
  51. package/lib/NodeResize.js +1 -1
  52. package/lib/RectLabelNode.js +1 -1
  53. package/lib/SelectionSelect.js +1 -1
  54. package/lib/Snapshot.js +1 -1
  55. package/lib/TurboAdapter.js +1 -1
  56. package/lib/lfJson2Xml.js +1 -1
  57. package/lib/lfXml2Json.js +1 -1
  58. package/package.json +2 -2
  59. package/types/NodeResize/Control/Control.d.ts +1 -1
  60. package/types/NodeResize/Control/Util.d.ts +3 -3
  61. package/types/bpmn-adapter/index.d.ts +41 -33
  62. package/types/components/selection-select/index.d.ts +1 -1
  63. package/types/insert-node-in-polyline/edge.d.ts +3 -3
  64. package/types/materials/group/GroupNode.d.ts +1 -1
  65. package/types/materials/group/index.d.ts +1 -1
  66. package/types/tools/auto-layout/index.d.ts +2 -2
@@ -125,12 +125,12 @@ var Control = /** @class */ (function (_super) {
125
125
  var afterPoint;
126
126
  edges.sourceEdges.forEach(function (item) {
127
127
  params.point = item.startPoint;
128
- afterPoint = Util_1.getRectReizeEdgePoint(params);
128
+ afterPoint = Util_1.getRectResizeEdgePoint(params);
129
129
  item.updateStartPoint(afterPoint);
130
130
  });
131
131
  edges.targetEdges.forEach(function (item) {
132
132
  params.point = item.endPoint;
133
- afterPoint = Util_1.getRectReizeEdgePoint(params);
133
+ afterPoint = Util_1.getRectResizeEdgePoint(params);
134
134
  item.updateEndPoint(afterPoint);
135
135
  });
136
136
  _this.eventEmit({ beforeNode: beforeNode, afterNode: afterNode });
@@ -189,12 +189,12 @@ var Control = /** @class */ (function (_super) {
189
189
  var afterPoint;
190
190
  edges.sourceEdges.forEach(function (item) {
191
191
  params.point = item.startPoint;
192
- afterPoint = Util_1.getEllipseReizeEdgePoint(params);
192
+ afterPoint = Util_1.getEllipseResizeEdgePoint(params);
193
193
  item.updateStartPoint(afterPoint);
194
194
  });
195
195
  edges.targetEdges.forEach(function (item) {
196
196
  params.point = item.endPoint;
197
- afterPoint = Util_1.getEllipseReizeEdgePoint(params);
197
+ afterPoint = Util_1.getEllipseResizeEdgePoint(params);
198
198
  item.updateEndPoint(afterPoint);
199
199
  });
200
200
  _this.eventEmit({ beforeNode: __assign(__assign({}, beforeNode), { rx: rx, ry: ry }), afterNode: afterNode });
@@ -253,12 +253,12 @@ var Control = /** @class */ (function (_super) {
253
253
  var edges = _this.getNodeEdges(id);
254
254
  edges.sourceEdges.forEach(function (item) {
255
255
  params.point = item.startPoint;
256
- afterPoint = Util_1.getDiamondReizeEdgePoint(params);
256
+ afterPoint = Util_1.getDiamondResizeEdgePoint(params);
257
257
  item.updateStartPoint(afterPoint);
258
258
  });
259
259
  edges.targetEdges.forEach(function (item) {
260
260
  params.point = item.endPoint;
261
- afterPoint = Util_1.getDiamondReizeEdgePoint(params);
261
+ afterPoint = Util_1.getDiamondResizeEdgePoint(params);
262
262
  item.updateEndPoint(afterPoint);
263
263
  });
264
264
  _this.eventEmit({ beforeNode: beforeNode, afterNode: afterNode });
@@ -270,7 +270,7 @@ var Control = /** @class */ (function (_super) {
270
270
  var newNodeSize = __assign({ id: id, modelType: modelType, type: type }, afterNode);
271
271
  _this.graphModel.eventCenter.emit('node:resize', { oldNodeSize: oldNodeSize, newNodeSize: newNodeSize });
272
272
  };
273
- _this.onDraging = function (_a) {
273
+ _this.onDragging = function (_a) {
274
274
  var deltaX = _a.deltaX, deltaY = _a.deltaY;
275
275
  var modelType = _this.nodeModel.modelType;
276
276
  // html和矩形的计算方式是一样的,共用一个方法
@@ -300,7 +300,7 @@ var Control = /** @class */ (function (_super) {
300
300
  }
301
301
  _this.state = {};
302
302
  _this.dragHandler = new StepDrag({
303
- onDraging: _this.onDraging,
303
+ onDragging: _this.onDragging,
304
304
  step: step,
305
305
  });
306
306
  return _this;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDiamondReizeEdgePoint = exports.getEllipseReizeEdgePoint = exports.getRectReizeEdgePoint = exports.ModelType = void 0;
3
+ exports.getDiamondResizeEdgePoint = exports.getEllipseResizeEdgePoint = exports.getRectResizeEdgePoint = exports.ModelType = void 0;
4
4
  var ModelType;
5
5
  (function (ModelType) {
6
6
  ModelType["NODE"] = "node";
@@ -28,7 +28,7 @@ function getNodeBox(node) {
28
28
  };
29
29
  }
30
30
  // 计算矩形radius设置后,四个圆角的圆心
31
- function getRidusCenter(node) {
31
+ function getRadiusCenter(node) {
32
32
  var nodeBox = getNodeBox(node);
33
33
  var radius = node.radius;
34
34
  var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY;
@@ -52,7 +52,7 @@ function getRidusCenter(node) {
52
52
  ];
53
53
  }
54
54
  // 获取矩形resize之后,与矩形连接边的新端点
55
- function getRectReizeEdgePoint(_a) {
55
+ function getRectResizeEdgePoint(_a) {
56
56
  var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
57
57
  var x = point.x, y = point.y;
58
58
  var afterPoint = {
@@ -107,8 +107,8 @@ function getRectReizeEdgePoint(_a) {
107
107
  }
108
108
  else {
109
109
  // 在圆角部分
110
- var beeforCoc = getRidusCenter(beforeNode);
111
- var afterCoc = getRidusCenter(afterNode);
110
+ var beforeCoc = getRadiusCenter(beforeNode);
111
+ var afterCoc = getRadiusCenter(afterNode);
112
112
  var nodeBox = getNodeBox(beforeNode);
113
113
  var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY;
114
114
  var index = -1;
@@ -130,16 +130,16 @@ function getRectReizeEdgePoint(_a) {
130
130
  }
131
131
  if (index > -1) {
132
132
  // 根据夹角角度计算位置
133
- var angle = Math.atan2((y - beeforCoc[index].y), (x - beeforCoc[index].x));
133
+ var angle = Math.atan2((y - beforeCoc[index].y), (x - beforeCoc[index].x));
134
134
  afterPoint.x = afterCoc[index].x + radius * Math.cos(angle);
135
135
  afterPoint.y = afterCoc[index].y + radius * Math.sin(angle);
136
136
  }
137
137
  }
138
138
  return afterPoint;
139
139
  }
140
- exports.getRectReizeEdgePoint = getRectReizeEdgePoint;
140
+ exports.getRectResizeEdgePoint = getRectResizeEdgePoint;
141
141
  // 获取椭圆resize之后,与椭圆连接边的新端点
142
- function getEllipseReizeEdgePoint(_a) {
142
+ function getEllipseResizeEdgePoint(_a) {
143
143
  var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
144
144
  var rx = afterNode.rx, ry = afterNode.ry;
145
145
  var afterPoint = point;
@@ -176,9 +176,9 @@ function getEllipseReizeEdgePoint(_a) {
176
176
  afterPoint = { x: x + afterNode.x, y: y + afterNode.y };
177
177
  return afterPoint;
178
178
  }
179
- exports.getEllipseReizeEdgePoint = getEllipseReizeEdgePoint;
179
+ exports.getEllipseResizeEdgePoint = getEllipseResizeEdgePoint;
180
180
  // 获取菱形resize之后,与菱形连接边的新端点
181
- function getDiamondReizeEdgePoint(_a) {
181
+ function getDiamondResizeEdgePoint(_a) {
182
182
  var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode;
183
183
  var afterPoint = point;
184
184
  var x;
@@ -213,4 +213,4 @@ function getDiamondReizeEdgePoint(_a) {
213
213
  };
214
214
  return afterPoint;
215
215
  }
216
- exports.getDiamondReizeEdgePoint = getDiamondReizeEdgePoint;
216
+ exports.getDiamondResizeEdgePoint = getDiamondResizeEdgePoint;
@@ -1,4 +1,28 @@
1
1
  "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ extendStatics(d, b);
11
+ function __() { this.constructor = d; }
12
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
13
+ };
14
+ })();
15
+ var __assign = (this && this.__assign) || function () {
16
+ __assign = Object.assign || function(t) {
17
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
18
+ s = arguments[i];
19
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
20
+ t[p] = s[p];
21
+ }
22
+ return t;
23
+ };
24
+ return __assign.apply(this, arguments);
25
+ };
2
26
  var __read = (this && this.__read) || function (o, n) {
3
27
  var m = typeof Symbol === "function" && o[Symbol.iterator];
4
28
  if (!m) return o;
@@ -32,8 +56,8 @@ var BpmnElements;
32
56
  })(BpmnElements || (BpmnElements = {}));
33
57
  var defaultAttrs = ['-name', '-id', 'bpmn:incoming', 'bpmn:outgoing', '-sourceRef', '-targetRef'];
34
58
  /**
35
- * 将普通json转换为xmljson
36
- * xmljsonproperity会以“-”开头
59
+ * 将普通json转换为xmlJson
60
+ * xmlJsonproperty会以“-”开头
37
61
  * 如果没有“-”表示为子节点
38
62
  */
39
63
  function toXmlJson(json) {
@@ -117,8 +141,6 @@ function convertLf2ProcessData(bpmnProcessData, data) {
117
141
  var sequenceFlow = data.edges.map(function (edge) {
118
142
  var _a, _b;
119
143
  var targetNode = nodeMap.get(edge.targetNodeId);
120
- // @see https://github.com/didi/LogicFlow/issues/325
121
- // 需要保证incomming在outgoing之前
122
144
  if (!targetNode['bpmn:incoming']) {
123
145
  targetNode['bpmn:incoming'] = edge.id;
124
146
  }
@@ -131,19 +153,17 @@ function convertLf2ProcessData(bpmnProcessData, data) {
131
153
  edge.id,
132
154
  ];
133
155
  }
134
- var sourceNode = nodeMap.get(edge.sourceNodeId);
135
- if (!sourceNode['bpmn:outgoing']) {
136
- sourceNode['bpmn:outgoing'] = edge.id;
137
- }
138
- else if (Array.isArray(sourceNode['bpmn:outgoing'])) {
139
- sourceNode['bpmn:outgoing'].push(edge.id);
140
- }
141
- else { // 字符串转数组
142
- sourceNode['bpmn:outgoing'] = [
143
- sourceNode['bpmn:outgoing'],
144
- edge.id,
145
- ];
146
- }
156
+ // const sourceNode = nodeMap.get(edge.sourceNodeId);
157
+ // if (!sourceNode['bpmn:outgoing']) {
158
+ // sourceNode['bpmn:outgoing'] = edge.id;
159
+ // } else if (Array.isArray(sourceNode['bpmn:outgoing'])) {
160
+ // sourceNode['bpmn:outgoing'].push(edge.id);
161
+ // } else { // 字符串转数组
162
+ // sourceNode['bpmn:outgoing'] = [
163
+ // sourceNode['bpmn:outgoing'],
164
+ // edge.id,
165
+ // ];
166
+ // }
147
167
  var edgeConfig = {
148
168
  '-id': edge.id,
149
169
  '-sourceRef': edge.sourceNodeId,
@@ -158,6 +178,23 @@ function convertLf2ProcessData(bpmnProcessData, data) {
158
178
  }
159
179
  return edgeConfig;
160
180
  });
181
+ // @see https://github.com/didi/LogicFlow/issues/325
182
+ // 需要保证incomming在outgoing之前
183
+ data.edges.forEach(function (edge) {
184
+ var sourceNode = nodeMap.get(edge.sourceNodeId);
185
+ if (!sourceNode['bpmn:outgoing']) {
186
+ sourceNode['bpmn:outgoing'] = edge.id;
187
+ }
188
+ else if (Array.isArray(sourceNode['bpmn:outgoing'])) {
189
+ sourceNode['bpmn:outgoing'].push(edge.id);
190
+ }
191
+ else { // 字符串转数组
192
+ sourceNode['bpmn:outgoing'] = [
193
+ sourceNode['bpmn:outgoing'],
194
+ edge.id,
195
+ ];
196
+ }
197
+ });
161
198
  bpmnProcessData[BpmnElements.FLOW] = sequenceFlow;
162
199
  }
163
200
  /**
@@ -402,53 +439,59 @@ function getEdgeConfig(edgeValue, processValue) {
402
439
  }
403
440
  return edge;
404
441
  }
405
- var BpmnAdapter = {
406
- pluginName: 'bpmn-adapter',
407
- install: function (lf) {
408
- lf.adapterIn = this.adapterIn;
409
- lf.adapterOut = this.adapterOut;
410
- },
411
- shapeConfigMap: new Map(),
412
- setCustomShape: function (key, val) {
413
- this.shapeConfigMap.set(key, val);
414
- },
415
- adapterOut: function (data) {
416
- var bpmnProcessData = {
417
- '-id': "Process_" + bpmnIds_1.getBpmnId(),
418
- '-isExecutable': 'false',
442
+ var BpmnAdapter = /** @class */ (function () {
443
+ function BpmnAdapter(_a) {
444
+ var _this = this;
445
+ var lf = _a.lf;
446
+ this.adapterOut = function (data) {
447
+ var bpmnProcessData = __assign({}, _this.processAttributes);
448
+ convertLf2ProcessData(bpmnProcessData, data);
449
+ var bpmnDiagramData = {
450
+ '-id': 'BPMNPlane_1',
451
+ '-bpmnElement': bpmnProcessData['-id'],
452
+ };
453
+ convertLf2DiagramData(bpmnDiagramData, data);
454
+ var definitions = _this.definitionAttributes;
455
+ definitions['bpmn:process'] = bpmnProcessData;
456
+ definitions['bpmndi:BPMNDiagram'] = {
457
+ '-id': 'BPMNDiagram_1',
458
+ 'bpmndi:BPMNPlane': bpmnDiagramData,
459
+ };
460
+ var bpmnData = {
461
+ 'bpmn:definitions': definitions,
462
+ };
463
+ return bpmnData;
464
+ };
465
+ this.adapterIn = function (bpmnData) {
466
+ if (bpmnData) {
467
+ return convertBpmn2LfData(bpmnData);
468
+ }
419
469
  };
420
- convertLf2ProcessData(bpmnProcessData, data);
421
- var bpmnDiagramData = {
422
- '-id': 'BPMNPlane_1',
423
- '-bpmnElement': bpmnProcessData['-id'],
470
+ lf.adapterIn = function (data) { return _this.adapterIn(data); };
471
+ lf.adapterOut = function (data) { return _this.adapterOut(data); };
472
+ this.processAttributes = {
473
+ '-isExecutable': 'true',
474
+ '-id': "Process_" + bpmnIds_1.getBpmnId(),
424
475
  };
425
- convertLf2DiagramData(bpmnDiagramData, data);
426
- var bpmnData = {
427
- 'bpmn:definitions': {
428
- '-id': "Definitions_" + bpmnIds_1.getBpmnId(),
429
- '-xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
430
- '-xmlns:bpmn': 'http://www.omg.org/spec/BPMN/20100524/MODEL',
431
- '-xmlns:bpmndi': 'http://www.omg.org/spec/BPMN/20100524/DI',
432
- '-xmlns:dc': 'http://www.omg.org/spec/DD/20100524/DC',
433
- '-xmlns:di': 'http://www.omg.org/spec/DD/20100524/DI',
434
- '-targetNamespace': 'http://bpmn.io/schema/bpmn',
435
- '-exporter': 'bpmn-js (https://demo.bpmn.io)',
436
- '-exporterVersion': '7.3.0',
437
- 'bpmn:process': bpmnProcessData,
438
- 'bpmndi:BPMNDiagram': {
439
- '-id': 'BPMNDiagram_1',
440
- 'bpmndi:BPMNPlane': bpmnDiagramData,
441
- },
442
- },
476
+ this.definitionAttributes = {
477
+ '-id': "Definitions_" + bpmnIds_1.getBpmnId(),
478
+ '-xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
479
+ '-xmlns:bpmn': 'http://www.omg.org/spec/BPMN/20100524/MODEL',
480
+ '-xmlns:bpmndi': 'http://www.omg.org/spec/BPMN/20100524/DI',
481
+ '-xmlns:dc': 'http://www.omg.org/spec/DD/20100524/DC',
482
+ '-xmlns:di': 'http://www.omg.org/spec/DD/20100524/DI',
483
+ '-targetNamespace': 'http://logic-flow.org',
484
+ '-exporter': 'logicflow',
485
+ '-exporterVersion': '1.2.0',
443
486
  };
444
- return bpmnData;
445
- },
446
- adapterIn: function (bpmnData) {
447
- if (bpmnData) {
448
- return convertBpmn2LfData(bpmnData);
449
- }
450
- },
451
- };
487
+ }
488
+ BpmnAdapter.prototype.setCustomShape = function (key, val) {
489
+ BpmnAdapter.shapeConfigMap.set(key, val);
490
+ };
491
+ BpmnAdapter.pluginName = 'bpmn-adapter';
492
+ BpmnAdapter.shapeConfigMap = new Map();
493
+ return BpmnAdapter;
494
+ }());
452
495
  exports.BpmnAdapter = BpmnAdapter;
453
496
  BpmnAdapter.shapeConfigMap.set(BpmnElements.START, {
454
497
  width: constant_1.StartEventConfig.width,
@@ -470,20 +513,25 @@ BpmnAdapter.shapeConfigMap.set(BpmnElements.USER, {
470
513
  width: constant_1.UserTaskConfig.width,
471
514
  height: constant_1.UserTaskConfig.height,
472
515
  });
473
- var BpmnXmlAdapter = {
474
- pluginName: 'bpmnXmlAdapter',
475
- install: function (lf) {
476
- lf.adapterIn = this.adapterXmlIn;
477
- lf.adapterOut = this.adapterXmlOut;
478
- },
479
- adapterXmlIn: function (bpmnData) {
480
- var json = xml2json_1.lfXml2Json(bpmnData);
481
- return BpmnAdapter.adapterIn(json);
482
- },
483
- adapterXmlOut: function (data) {
484
- var outData = BpmnAdapter.adapterOut(data);
485
- return json2xml_1.lfJson2Xml(outData);
486
- },
487
- };
516
+ var BpmnXmlAdapter = /** @class */ (function (_super) {
517
+ __extends(BpmnXmlAdapter, _super);
518
+ function BpmnXmlAdapter(data) {
519
+ var _this = _super.call(this, data) || this;
520
+ _this.adapterXmlIn = function (bpmnData) {
521
+ var json = xml2json_1.lfXml2Json(bpmnData);
522
+ return _this.adapterIn(json);
523
+ };
524
+ _this.adapterXmlOut = function (data) {
525
+ var outData = _this.adapterOut(data);
526
+ return json2xml_1.lfJson2Xml(outData);
527
+ };
528
+ var lf = data.lf;
529
+ lf.adapterIn = _this.adapterXmlIn;
530
+ lf.adapterOut = _this.adapterXmlOut;
531
+ return _this;
532
+ }
533
+ BpmnXmlAdapter.pluginName = 'bpmnXmlAdapter';
534
+ return BpmnXmlAdapter;
535
+ }(BpmnAdapter));
488
536
  exports.BpmnXmlAdapter = BpmnXmlAdapter;
489
537
  exports.default = BpmnAdapter;
@@ -25,10 +25,13 @@ function toXml(v, name, ind, deep) {
25
25
  var hasChild = false;
26
26
  xml += addIndSpace(ind, deep) + "<" + name;
27
27
  for (var m in v) {
28
- if (m.charAt(0) == "-")
28
+ if (m.charAt(0) == "-") {
29
+ console.log(m, v[m]);
29
30
  xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
30
- else
31
+ }
32
+ else {
31
33
  hasChild = true;
34
+ }
32
35
  }
33
36
  xml += hasChild ? ">" : " />";
34
37
  if (hasChild) {