static get TYPES()
        {
-               // SQLite types without null (TODO: be more general)
+               // SQLite storage classes without null
                return ["integer","real","text","blob"];
        }
 
                {
                        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;
                        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) == '{')
                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;
                ErDiags.AjaxGet(mcdDot, graphSvg => {
                        this.mcdGraph = graphSvg;
                        element.innerHTML = graphSvg;
-               })
+               });
        }
 
        // "Modèle logique des données"
                        });
                });
                // this.graphMld = ...
+               //console.log(mldDot);
+               ErDiags.AjaxGet(mldDot, graphSvg => {
+                       this.mldGraph = graphSvg;
+                       element.innerHTML = graphSvg;
+               });
        }
 
        fillSql(id)