From c728aeca9ef83bb786ed0c886a2b3dc4faf3dc45 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Thu, 1 Feb 2018 19:05:06 +0100
Subject: [PATCH] Better association display in compact mode

---
 parser.js | 63 ++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 44 insertions(+), 19 deletions(-)

diff --git a/parser.js b/parser.js
index ea0841a..8fc65ed 100644
--- a/parser.js
+++ b/parser.js
@@ -26,7 +26,9 @@ class ErDiags
 			"*": "0,n",
 			"+": "1,n",
 			"?": "0,1",
-			"1": "1,1"
+			"1": "1,1",
+			"?R": "(0,1)",
+			"1R": "(1,1)",
 		};
 	}
 
@@ -136,7 +138,10 @@ class ErDiags
 		return inheritance;
 	}
 
-	// Association (parsed here): { entities: ArrayOf entity names + cardinality, [attributes: ArrayOf {name, [isKey], [type], [qualifiers]}] }
+	// Association (parsed here): {
+	//   entities: ArrayOf entity names + cardinality,
+	//   [attributes: ArrayOf {name, [isKey], [type], [qualifiers]}]
+	// }
 	parseAssociation(lines, start, end)
 	{
 		let assoce = { };
@@ -192,7 +197,7 @@ class ErDiags
 		mcdDot += 'rankdir="LR";\n';
 		// Nodes:
 		if (mcdStyle == "compact")
-			mcdDot += "node [shape=plaintext];\n";
+			mcdDot += 'node [shape=plaintext];\n';
 		_.shuffle(Object.keys(this.entities)).forEach( name => {
 			if (mcdStyle == "bubble")
 			{
@@ -252,15 +257,47 @@ class ErDiags
 			});
 		});
 		// Relationships:
+		if (mcdStyle == "compact")
+			mcdDot += 'node [shape=rectangle, style=rounded];\n';
 		let assoceCounter = 0;
 		_.shuffle(this.associations).forEach( a => {
 			let name = !!a.name && a.name.length > 0
 				? a.name
 				: '_assoce' + assoceCounter++;
-			mcdDot += '"' + name + '" [shape="diamond", style="filled", color="lightgrey", label="' + name + '"';
-			if (a.weak)
-				mcdDot += ', peripheries=2';
-			mcdDot += '];\n';
+			if (mcdStyle == "bubble")
+			{
+				mcdDot += '"' + name + '" [shape="diamond", style="filled", color="lightgrey", label="' + name + '"';
+				if (a.weak)
+					mcdDot += ', peripheries=2';
+				mcdDot += '];\n';
+				if (!!a.attributes)
+				{
+					a.attributes.forEach( attr => {
+						let label = (attr.isKey ? '#' : '') + attr.name;
+						mcdDot += '"' + name + '_' + attr.name + '" [shape=ellipse, label="' + label + '"];\n';
+						let attrName = name + '_' + attr.name;
+						if (Math.random() < 0.5)
+							mcdDot += '"' + attrName + '" -- "' + name + '";\n';
+						else
+							mcdDot += '"' + name + '" -- "' + attrName + '";\n';
+					});
+				}
+			}
+			else
+			{
+				let label = name;
+				if (!!a.attributes)
+				{
+					a.attributes.forEach( attr => {
+						let attrLabel = (attr.isKey ? '#' : '') + attr.name;
+						label += '\\n<' + attrLabel + '>';
+					});
+				}
+				mcdDot += '"' + name + '" [color="lightgrey", label="' + label + '"';
+				if (a.weak)
+					mcdDot += ', peripheries=2';
+				mcdDot += '];\n';
+			}
 			_.shuffle(a.entities).forEach( e => {
 				if (Math.random() < 0.5)
 					mcdDot += '"' + e.name + '":name -- "' + name + '"';
@@ -268,18 +305,6 @@ class ErDiags
 					mcdDot += '"' + name + '" -- "' + e.name + '":name';
 				mcdDot += '[label="' + ErDiags.CARDINAL[e.card] + '"];\n';
 			});
-			if (!!a.attributes)
-			{
-				a.attributes.forEach( attr => {
-					let label = (attr.isKey ? '#' : '') + attr.name;
-					mcdDot += '"' + name + '_' + attr.name + '" [shape=ellipse, label="' + label + '"];\n';
-					let attrName = name + '_' + attr.name;
-					if (Math.random() < 0.5)
-						mcdDot += '"' + attrName + '" -- "' + name + '";\n';
-					else
-						mcdDot += '"' + name + '" -- "' + attrName + '";\n';
-				});
-			}
 		});
 		mcdDot += '}';
 		console.log(mcdDot);
-- 
2.44.0