@@ -4,21 +4,35 @@ import Tree from "react-d3-tree";
44import { elementToSVG } from "dom-to-svg" ;
55
66// Function to draw an arc between the children
7- const drawSemicircle = ( rectWidth , rectHeight , isAlternative ) => {
7+ const drawSemicircle = ( rectWidth , rectHeight , isAlternative , isCardinalityGroup , card_min , card_max ) => {
88 const radius = rectWidth / 4 ;
99 const startX = radius ;
1010 const startY = rectHeight / 2 ;
1111 const endX = - radius ;
1212 const endY = rectHeight / 2 ;
1313
1414 return (
15+ < g >
1516 < path
1617 d = { `M ${ startX } ,${ startY } A ${ radius } ,${ radius } 0 0,1 ${ endX } ,${ endY } ` }
1718 fill = { isAlternative ? "none" : "gray" }
1819 stroke = "black"
1920 strokeWidth = "1"
2021 className = "group"
2122 />
23+ { isCardinalityGroup && (
24+ < text
25+ x = "0"
26+ y = { endY + 15 }
27+ fill = "white"
28+ fontSize = "12"
29+ textAnchor = "middle"
30+ dominantBaseline = "middle"
31+ >
32+ [{ card_min } ..{ card_max } ]
33+ </ text >
34+ ) }
35+ </ g >
2236 ) ;
2337} ;
2438
@@ -40,9 +54,19 @@ const RenderRectSvgNode = ({ nodeDatum, toggleNode }) => {
4054 const isOptional = nodeDatum . attributes ?. isOptional ;
4155 const isAlternativeGroup = nodeDatum . attributes ?. isAlternativeGroup ;
4256 const isOrGroup = nodeDatum . attributes ?. isOrGroup ;
57+ const isCardinalityGroup = nodeDatum . attributes ?. isCardinalityGroup ;
58+ const cardinalityGroupMin = nodeDatum . attributes ?. cardinalityGroup ?. min ;
59+ const cardinalityGroupMax = nodeDatum . attributes ?. cardinalityGroup ?. max == - 1 ? "*" : nodeDatum . attributes ?. cardinalityGroup ?. max ;
4360 const isAbstract = nodeDatum . attributes ?. isAbstract ;
44-
45- const nodeName = nodeDatum . name ;
61+ const isMultifeature = nodeDatum . attributes ?. isMultifeature ;
62+ const featureCardinalityMin = nodeDatum . attributes ?. featureCardinality . min ;
63+ const featureCardinalityMax = nodeDatum . attributes ?. featureCardinality . max == - 1 ? "*" : nodeDatum . attributes ?. featureCardinality . max ;
64+ const featureCardinality = isMultifeature ? " [" + featureCardinalityMin + ".." + featureCardinalityMax + "]" : "" ;
65+ const isNumerical = nodeDatum . attributes ?. isNumerical ;
66+ const isString = nodeDatum . attributes ?. isString ;
67+ const featureType = isNumerical || isString ? " : " + nodeDatum . attributes ?. featureType : "" ;
68+
69+ const nodeName = nodeDatum . name + featureCardinality + featureType ;
4670 const defaultFontSize = 20 ;
4771
4872 const [ fontSize , setFontSize ] = useState ( defaultFontSize ) ;
@@ -81,7 +105,7 @@ const RenderRectSvgNode = ({ nodeDatum, toggleNode }) => {
81105 x = "0"
82106 y = "5"
83107 textAnchor = "middle"
84- style = { { fontSize : `${ fontSize } px` , fontWeight : "lighter" } }
108+ style = { { fontSize : `${ fontSize } px` , fontWeight : "lighter" , fontStyle : isAbstract ? "italic" : "normal" } }
85109 >
86110 { nodeName }
87111 </ text >
@@ -103,8 +127,8 @@ const RenderRectSvgNode = ({ nodeDatum, toggleNode }) => {
103127 ) }
104128
105129 { /* Render arc between children if it's an alternative group */ }
106- { ( isAlternativeGroup || isOrGroup ) && (
107- < g > { drawSemicircle ( rectWidth , rectHeight , isAlternativeGroup ) } </ g >
130+ { ( isAlternativeGroup || isOrGroup || isCardinalityGroup ) && (
131+ < g > { drawSemicircle ( rectWidth , rectHeight , isAlternativeGroup , isCardinalityGroup , cardinalityGroupMin , cardinalityGroupMax ) } </ g >
108132 ) }
109133 </ g >
110134 ) ;
0 commit comments