mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 04:44:08 +01:00 
			
		
		
		
	Merge branch 'develop' into 6080-fix
This commit is contained in:
		@@ -857,49 +857,6 @@ flowchart LR
 | 
			
		||||
    D --> E
 | 
			
		||||
      A["A"]
 | 
			
		||||
 | 
			
		||||
`,
 | 
			
		||||
          { flowchart: { titleTopMargin: 0 } }
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
      it('6080: should handle diamond shape intersections', () => {
 | 
			
		||||
        imgSnapshotTest(
 | 
			
		||||
          `---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
 subgraph s1["Untitled subgraph"]
 | 
			
		||||
        n1["Evaluate"]
 | 
			
		||||
        n2["Option 1"]
 | 
			
		||||
        n3["Option 2"]
 | 
			
		||||
        n4["fa:fa-car Option 3"]
 | 
			
		||||
  end
 | 
			
		||||
 subgraph s2["Untitled subgraph"]
 | 
			
		||||
        n5["Evaluate"]
 | 
			
		||||
        n6["Option 1"]
 | 
			
		||||
        n7["Option 2"]
 | 
			
		||||
        n8["fa:fa-car Option 3"]
 | 
			
		||||
  end
 | 
			
		||||
    A["Start"] -- Some text --> B("Continue")
 | 
			
		||||
    B --> C{"Evaluate"}
 | 
			
		||||
    C -- One --> D["Option 1"]
 | 
			
		||||
    C -- Two --> E["Option 2"]
 | 
			
		||||
    C -- Three --> F["fa:fa-car Option 3"]
 | 
			
		||||
    n1 -- One --> n2
 | 
			
		||||
    n1 -- Two --> n3
 | 
			
		||||
    n1 -- Three --> n4
 | 
			
		||||
    n5 -- One --> n6
 | 
			
		||||
    n5 -- Two --> n7
 | 
			
		||||
    n5 -- Three --> n8
 | 
			
		||||
    n1@{ shape: diam}
 | 
			
		||||
    n2@{ shape: rect}
 | 
			
		||||
    n3@{ shape: rect}
 | 
			
		||||
    n4@{ shape: rect}
 | 
			
		||||
    n5@{ shape: diam}
 | 
			
		||||
    n6@{ shape: rect}
 | 
			
		||||
    n7@{ shape: rect}
 | 
			
		||||
    n8@{ shape: rect}
 | 
			
		||||
 | 
			
		||||
`,
 | 
			
		||||
          { flowchart: { titleTopMargin: 0 } }
 | 
			
		||||
        );
 | 
			
		||||
 
 | 
			
		||||
@@ -88,134 +88,40 @@
 | 
			
		||||
  </head>
 | 
			
		||||
 | 
			
		||||
  <body>
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
    <pre id="diagram4" class="mermaid">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
    look: handDrawn
 | 
			
		||||
    theme: default
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
 subgraph s1["Untitled subgraph"]
 | 
			
		||||
        n1["Evaluate"]
 | 
			
		||||
        n2["Option 1"]
 | 
			
		||||
        n3["Option 2"]
 | 
			
		||||
        n4["fa:fa-car Option 3"]
 | 
			
		||||
  end
 | 
			
		||||
    n1 -- One --> n2
 | 
			
		||||
    n1 -- Two --> n3
 | 
			
		||||
    n1 -- Three --> n4
 | 
			
		||||
    n5
 | 
			
		||||
    n1@{ shape: diam}
 | 
			
		||||
    n2@{ shape: rect}
 | 
			
		||||
    n3@{ shape: rect}
 | 
			
		||||
    n4@{ shape: rect}
 | 
			
		||||
    A["Start"] -- Some text --> B("Continue")
 | 
			
		||||
    B --> C{"Evaluate"}
 | 
			
		||||
    C -- One --> D["Option 1"]
 | 
			
		||||
    C -- Two --> E["Option 2"]
 | 
			
		||||
    C -- Three --> F["fa:fa-car Option 3"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    n00@{ shape: triangle, label: 'This is a label for triangle shape' }
 | 
			
		||||
    n11@{ shape: sloped-rectangle, label: 'This is a label for sloped-rectangle shape' }
 | 
			
		||||
    n22@{ shape: horizontal-cylinder, label: 'This is a label for horizontal-cylinder shape' }
 | 
			
		||||
    n33@{ shape: flipped-triangle, label: 'This is a label for flipped-triangle shape' }
 | 
			
		||||
    n44@{ shape: hourglass, label: 'This is a label for hourglass shape' }
 | 
			
		||||
    n00 --> n11
 | 
			
		||||
    n00 --> n22
 | 
			
		||||
    n00 --> n33
 | 
			
		||||
    n00 --> n44
 | 
			
		||||
    n11 --> n22
 | 
			
		||||
    n11 --> n33
 | 
			
		||||
    n11 --> n44
 | 
			
		||||
    n22 --> n33
 | 
			
		||||
    n22 --> n44
 | 
			
		||||
    n33 --> n44
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre id="diagram4" class="mermaid">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
    look: handDrawn
 | 
			
		||||
    theme: default
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
 subgraph s1["Untitled subgraph"]
 | 
			
		||||
        n1["Evaluate"]
 | 
			
		||||
        n2["Option 1"]
 | 
			
		||||
        n3["Option 2"]
 | 
			
		||||
        n4["fa:fa-car Option 3"]
 | 
			
		||||
  end
 | 
			
		||||
 subgraph s2["Untitled subgraph"]
 | 
			
		||||
        n5["Evaluate"]
 | 
			
		||||
        n6["Option 1"]
 | 
			
		||||
        n7["Option 2"]
 | 
			
		||||
        n8["fa:fa-car Option 3"]
 | 
			
		||||
  end
 | 
			
		||||
    A["Start"] -- Some text --> B("Continue")
 | 
			
		||||
    B --> C{"Evaluate"}
 | 
			
		||||
    C -- One --> D["Option 1"]
 | 
			
		||||
    C -- Two --> E["Option 2"]
 | 
			
		||||
    C -- Three --> F["fa:fa-car Option 3"]
 | 
			
		||||
    n1 -- One --> n2
 | 
			
		||||
    n1 -- Two --> n3
 | 
			
		||||
    n1 -- Three --> n4
 | 
			
		||||
    n5 -- One --> n6
 | 
			
		||||
    n5 -- Two --> n7
 | 
			
		||||
    n5 -- Three --> n8
 | 
			
		||||
    n1@{ shape: diam}
 | 
			
		||||
    n2@{ shape: rect}
 | 
			
		||||
    n3@{ shape: rect}
 | 
			
		||||
    n4@{ shape: rect}
 | 
			
		||||
    n5@{ shape: diam}
 | 
			
		||||
    n6@{ shape: rect}
 | 
			
		||||
    n7@{ shape: rect}
 | 
			
		||||
    n8@{ shape: rect}
 | 
			
		||||
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
 subgraph s1["Untitled subgraph"]
 | 
			
		||||
        n1["Evaluate"]
 | 
			
		||||
        n2["Option 1"]
 | 
			
		||||
  end
 | 
			
		||||
    n1 -- One --> n2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
    A{A} --> B & C
 | 
			
		||||
</pre
 | 
			
		||||
    >
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  layout: elk
 | 
			
		||||
---
 | 
			
		||||
flowchart LR
 | 
			
		||||
    n2@{ shape: rect}
 | 
			
		||||
    n3@{ shape: rect}
 | 
			
		||||
    n4@{ shape: rect}
 | 
			
		||||
    A["Start"] -- Some text --> B("Continue")
 | 
			
		||||
    B --> C{"Evaluate"}
 | 
			
		||||
    C -- One --> D["Option 1"]
 | 
			
		||||
    C -- Two --> E["Option 2"]
 | 
			
		||||
    C -- Three --> F["fa:fa-car Option 3"]
 | 
			
		||||
    %% C@{ shape: hexagon}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  kanban:
 | 
			
		||||
    ticketBaseUrl: 'https://github.com/your-repo/issues/#TICKET#'
 | 
			
		||||
---
 | 
			
		||||
kanban
 | 
			
		||||
  Backlog
 | 
			
		||||
    task1[📝 Define project requirements]@{ ticket: a101 }
 | 
			
		||||
  To Do
 | 
			
		||||
    task2[🔍 Research technologies]@{ ticket: a102 }
 | 
			
		||||
  Review
 | 
			
		||||
    task4[🔍 Code review for login feature]@{ ticket: a104 }
 | 
			
		||||
  Done
 | 
			
		||||
    task5[✅ Deploy initial version]@{ ticket: a105 }
 | 
			
		||||
  In Progress
 | 
			
		||||
    task3[💻 Develop login feature]@{ ticket: 103 }
 | 
			
		||||
 | 
			
		||||
    n22@{ shape: h-cyl }
 | 
			
		||||
    n00 --> n11
 | 
			
		||||
    n00 --> n22
 | 
			
		||||
    n11 --> n22
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre id="diagram4" class="mermaid2">
 | 
			
		||||
flowchart LR
 | 
			
		||||
 
 | 
			
		||||
@@ -484,8 +484,6 @@ export const render = async (
 | 
			
		||||
    const r3 = a1 * q1.x + b1 * q1.y + c1;
 | 
			
		||||
    const r4 = a1 * q2.x + b1 * q2.y + c1;
 | 
			
		||||
 | 
			
		||||
    const epsilon = 1e-6;
 | 
			
		||||
 | 
			
		||||
    // Check signs of r3 and r4. If both point 3 and point 4 lie on
 | 
			
		||||
    // same side of line 1, the line segments do not intersect.
 | 
			
		||||
    if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {
 | 
			
		||||
@@ -504,7 +502,7 @@ export const render = async (
 | 
			
		||||
    // Check signs of r1 and r2. If both point 1 and point 2 lie
 | 
			
		||||
    // on same side of second line segment, the line segments do
 | 
			
		||||
    // not intersect.
 | 
			
		||||
    if (Math.abs(r1) < epsilon && Math.abs(r2) < epsilon && sameSign(r1, r2)) {
 | 
			
		||||
    if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {
 | 
			
		||||
      return /*DON'T_INTERSECT*/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -549,11 +547,11 @@ export const render = async (
 | 
			
		||||
      { x: x1 - w / 2, y: y1 },
 | 
			
		||||
    ];
 | 
			
		||||
    log.debug(
 | 
			
		||||
      `APA16 diamondIntersection calc abc89:
 | 
			
		||||
      `UIO diamondIntersection calc abc89:
 | 
			
		||||
  outsidePoint: ${JSON.stringify(outsidePoint)}
 | 
			
		||||
  insidePoint : ${JSON.stringify(insidePoint)}
 | 
			
		||||
  node-bounds       : x:${bounds.x} y:${bounds.y} w:${bounds.width} h:${bounds.height}`,
 | 
			
		||||
      JSON.stringify(polyPoints)
 | 
			
		||||
  node        : x:${bounds.x} y:${bounds.y} w:${bounds.width} h:${bounds.height}`,
 | 
			
		||||
      polyPoints
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const intersections = [];
 | 
			
		||||
@@ -566,8 +564,8 @@ export const render = async (
 | 
			
		||||
      minY = Math.min(minY, entry.y);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const left = x1 - w / 2 - minX;
 | 
			
		||||
    const top = y1 - h / 2 - minY;
 | 
			
		||||
    // const left = x1 - w / 2;
 | 
			
		||||
    // const top = y1 + h / 2;
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < polyPoints.length; i++) {
 | 
			
		||||
      const p1 = polyPoints[i];
 | 
			
		||||
@@ -575,8 +573,8 @@ export const render = async (
 | 
			
		||||
      const intersect = intersectLine(
 | 
			
		||||
        bounds,
 | 
			
		||||
        outsidePoint,
 | 
			
		||||
        { x: left + p1.x, y: top + p1.y },
 | 
			
		||||
        { x: left + p2.x, y: top + p2.y }
 | 
			
		||||
        { x: p1.x, y: p1.y },
 | 
			
		||||
        { x: p2.x, y: p2.y }
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      if (intersect) {
 | 
			
		||||
@@ -755,6 +753,7 @@ export const render = async (
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
    log.debug('returning points', points);
 | 
			
		||||
    return points;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@@ -969,17 +968,17 @@ export const render = async (
 | 
			
		||||
            startNode.innerHTML
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
        if (startNode.shape === 'diamond' || startNode.shape === 'diam') {
 | 
			
		||||
        if (startNode.shape === 'diamond') {
 | 
			
		||||
          edge.points.unshift({
 | 
			
		||||
            x: startNode.x + startNode.width / 2 + offset.x,
 | 
			
		||||
            y: startNode.y + startNode.height / 2 + offset.y,
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
        if (endNode.shape === 'diamond' || endNode.shape === 'diam') {
 | 
			
		||||
        if (endNode.shape === 'diamond') {
 | 
			
		||||
          const x = endNode.x + endNode.width / 2 + offset.x;
 | 
			
		||||
          // Add a point at the center of the diamond
 | 
			
		||||
          if (
 | 
			
		||||
            Math.abs(edge.points[edge.points.length - 1].y - endNode.y - offset.y) > 0.01 ||
 | 
			
		||||
            Math.abs(edge.points[edge.points.length - 1].y - endNode.y - offset.y) > 0.001 ||
 | 
			
		||||
            Math.abs(edge.points[edge.points.length - 1].x - x) > 0.001
 | 
			
		||||
          ) {
 | 
			
		||||
            edge.points.push({
 | 
			
		||||
@@ -998,7 +997,7 @@ export const render = async (
 | 
			
		||||
            height: startNode.height,
 | 
			
		||||
            padding: startNode.padding,
 | 
			
		||||
          },
 | 
			
		||||
          startNode.shape === 'diamond' || startNode.shape === 'diam'
 | 
			
		||||
          startNode.shape === 'diamond'
 | 
			
		||||
        ).reverse();
 | 
			
		||||
 | 
			
		||||
        edge.points = cutPathAtIntersect(
 | 
			
		||||
@@ -1010,7 +1009,7 @@ export const render = async (
 | 
			
		||||
            height: endNode.height,
 | 
			
		||||
            padding: endNode.padding,
 | 
			
		||||
          },
 | 
			
		||||
          endNode.shape === 'diamond' || endNode.shape === 'diam'
 | 
			
		||||
          endNode.shape === 'diamond'
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const paths = insertEdge(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user