Fix accents issues. Now allowing any non-space characters in names
[erdiag.git] / parser.js
index 8a09321..8a4c524 100644 (file)
--- a/parser.js
+++ b/parser.js
@@ -7,6 +7,7 @@ class ErDiags
                this.inheritances = [];
                this.associations = [];
                this.txt2json(description);
+               this.tables = [];
                // Cache SVG graphs returned by server (in addition to server cache = good perfs)
                this.mcdGraph = "";
                this.mldGraph = "";
@@ -15,7 +16,7 @@ class ErDiags
 
        static get TYPES()
        {
-               // SQLite types without null (TODO: be more general)
+               // SQLite storage classes without null
                return ["integer","real","text","blob"];
        }
 
@@ -66,7 +67,7 @@ class ErDiags
                {
                        case '[':
                                // Entity = { name: { attributes, [weak] } }
-                               let name = lines[start].match(/\w+/)[0];
+                               let name = lines[start].match(/[^\[\]\s]+/)[0];
                                let entity = { attributes: this.parseAttributes(lines, start+1, end) };
                                if (lines[start].charAt(1) == '[')
                                        entity.weak = true;
@@ -78,7 +79,7 @@ class ErDiags
                        case '{': //association
                                // Association = { [name], [attributes], [weak], entities: ArrayOf entity indices }
                                let relationship = { };
-                               let nameRes = lines[start].match(/\w+/);
+                               let nameRes = lines[start].match(/[^{}\s]+/);
                                if (nameRes !== null)
                                        relationship.name = nameRes[0];
                                if (lines[start].charAt(1) == '{')
@@ -94,15 +95,20 @@ class ErDiags
                let attributes = [];
                for (let i=start; i<end; i++)
                {
-                       let field = { name: lines[i].match(/\w+/)[0] };
-                       if (lines[i].charAt(0) == '#')
+                       let field = { };
+                       let line = lines[i];
+                       if (line.charAt(0) == '#')
+                       {
                                field.isKey = true;
-                       let parenthesis = lines[i].match(/\((.+)\)/);
+                               line = line.slice(1);
+                       }
+                       field.name = line.match(/[^()\s]+/)[0];
+                       let parenthesis = line.match(/\((.+)\)/);
                        if (parenthesis !== null)
                        {
                                let sqlClues = parenthesis[1];
                                let qualifiers = sqlClues;
-                               let firstWord = sqlClues.match(/\w+/)[0];
+                               let firstWord = sqlClues.match(/[^\s]+/)[0];
                                if (ErDiags.TYPES.includes(firstWord))
                                {
                                        field.type = firstWord;
@@ -256,7 +262,7 @@ class ErDiags
                ErDiags.AjaxGet(mcdDot, graphSvg => {
                        this.mcdGraph = graphSvg;
                        element.innerHTML = graphSvg;
-               })
+               });
        }
 
        // "Modèle logique des données"
@@ -268,10 +274,30 @@ class ErDiags
                        element.innerHTML = this.mcdGraph;
                        return;
                }
-               //UNIMPLEMENTED
-               // TODO: analyze cardinalities (eat attributes, create new tables...)
-               // mldDot = ...
+               // Build dot graph input
+               let mldDot = 'graph {\n';
+               // Nodes:
+               Object.keys(this.entities).forEach( name => {
+                       //mld. ... --> devient table
+                       // mldDot = ...
+               });
+               // Relationships:
+               this.associations.forEach( a => {
+                       a.entities.forEach( e => { // e.card e.name ...
+                               // Pass 1 : entites deviennent tables
+                               // Pass 2 : sur les assoces
+                               // multi-arite : sub-loop si 0,1 ou 1,1 : aspiré comme attribut de l'association (phase 1)
+                               // ensuite, que du 0,n ou 1,n : si == 1, OK une table
+                               // si 2 ou + : n tables + 1 pour l'assoce, avec attrs clés étrangères
+                               // clé étrangère NOT NULL si 1,1
+                       });
+               });
                // this.graphMld = ...
+               //console.log(mldDot);
+               ErDiags.AjaxGet(mldDot, graphSvg => {
+                       this.mldGraph = graphSvg;
+                       element.innerHTML = graphSvg;
+               });
        }
 
        fillSql(id)